[PATCH v4 07/11] wifi: ath12k: properly handling the state variables of monitor mode
Kang Yang
quic_kangyang at quicinc.com
Wed Oct 16 20:10:52 PDT 2024
Now monitor mode has some status variables, such as monitor_started,
monitor_vdev_created. They are not always handled correctly.
For monitor_started, it should be true when driver works in monitor
mode, and should be false at other times.
For monitor_vdev_id, it should be -1 when driver doesn't work in monitor
mode.
For monitor_vdev_created, it should be true after monitor vdev is
created successfully and should be false at other times.
For monitor_conf_enabled, it should be true when mac80211 sets
IEEE80211_CONF_MONITOR, and should be false at other times.
Handle those state variables according to above descriptions.
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3
Signed-off-by: Kang Yang <quic_kangyang at quicinc.com>
---
drivers/net/wireless/ath/ath12k/core.c | 5 +++++
drivers/net/wireless/ath/ath12k/mac.c | 10 ++++++++++
2 files changed, 15 insertions(+)
diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c
index c57322221e1d..655894506cd2 100644
--- a/drivers/net/wireless/ath/ath12k/core.c
+++ b/drivers/net/wireless/ath/ath12k/core.c
@@ -1060,6 +1060,11 @@ static void ath12k_core_pre_reconfigure_recovery(struct ath12k_base *ab)
ath12k_mac_tx_mgmt_pending_free, ar);
idr_destroy(&ar->txmgmt_idr);
wake_up(&ar->txmgmt_empty_waitq);
+
+ ar->monitor_vdev_id = -1;
+ ar->monitor_started = false;
+ ar->monitor_vdev_created = false;
+ ar->monitor_conf_enabled = false;
}
}
diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
index f5f96a8b1d61..f60219cc01aa 100644
--- a/drivers/net/wireless/ath/ath12k/mac.c
+++ b/drivers/net/wireless/ath/ath12k/mac.c
@@ -7008,6 +7008,9 @@ int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
goto err_peer_del;
}
break;
+ case WMI_VDEV_TYPE_MONITOR:
+ ar->monitor_vdev_created = true;
+ break;
default:
break;
}
@@ -7056,6 +7059,8 @@ int ath12k_mac_vdev_create(struct ath12k *ar, struct ath12k_link_vif *arvif)
err_vdev_del:
ath12k_wmi_vdev_delete(ar, arvif->vdev_id);
ar->num_created_vdevs--;
+ ar->monitor_vdev_created = false;
+ ar->monitor_vdev_id = -1;
arvif->is_created = false;
arvif->ar = NULL;
ar->allocated_vdev_map &= ~(1LL << arvif->vdev_id);
@@ -9827,6 +9832,11 @@ static void ath12k_mac_setup(struct ath12k *ar)
INIT_WORK(&ar->wmi_mgmt_tx_work, ath12k_mgmt_over_wmi_tx_work);
skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
+
+ ar->monitor_vdev_id = -1;
+ ar->monitor_started = false;
+ ar->monitor_vdev_created = false;
+ ar->monitor_conf_enabled = false;
}
int ath12k_mac_register(struct ath12k_base *ab)
--
2.34.1
More information about the ath12k
mailing list