[PATCH ath-next 2/2] wifi: ath12k: move is_authorized flag to ath12k_sta
Aishwarya R
aishwarya.r at oss.qualcomm.com
Tue Sep 1 01:56:16 PDT 2026
Authorization state is shared across all link peers that belong to the
station level property. Storing is_authorized in struct
ath12k_dp_link_peer duplicates the same state for every link and
requires all copies to be updated whenever the authorization state
changes.
Move is_authorized to ath12k_sta and update the authorize/unauthorize
handlers to set it there directly. ath12k_bss_assoc() only reads the
flag to decide whether to re-authorize the BSS peer after vdev up, so
read it from ahsta instead of looking up the dp_peer.
Previously, is_authorized was protected by dp_lock. After moving it to
ath12k_sta, all accesses are serialized by the wiphy mutex, so the flag
is now protected by the wiphy lock instead.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.6-01243-QCAHKSWPL_SILICONZ-1
Signed-off-by: Aishwarya R <aishwarya.r at oss.qualcomm.com>
---
drivers/net/wireless/ath/ath12k/core.h | 2 ++
drivers/net/wireless/ath/ath12k/dp_peer.h | 1 -
drivers/net/wireless/ath/ath12k/mac.c | 36 ++---------------------
3 files changed, 5 insertions(+), 34 deletions(-)
diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h
index a98fc6e0699d..a04757a038f2 100644
--- a/drivers/net/wireless/ath/ath12k/core.h
+++ b/drivers/net/wireless/ath/ath12k/core.h
@@ -529,6 +529,8 @@ struct ath12k_sta {
enum ieee80211_sta_state state;
bool enable_4addr;
+
+ bool is_authorized;
};
#define ATH12K_HALF_20MHZ_BW 10
diff --git a/drivers/net/wireless/ath/ath12k/dp_peer.h b/drivers/net/wireless/ath/ath12k/dp_peer.h
index 256fc79d714e..d01ef1aea48b 100644
--- a/drivers/net/wireless/ath/ath12k/dp_peer.h
+++ b/drivers/net/wireless/ath/ath12k/dp_peer.h
@@ -80,7 +80,6 @@ struct ath12k_dp_link_peer {
struct ppdu_user_delayba ppdu_stats_delayba;
bool delayba_flag;
- bool is_authorized;
bool mlo;
/* protected by ab->data_lock */
diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
index 5ddd60e0a1f5..4ec2ee1b17fc 100644
--- a/drivers/net/wireless/ath/ath12k/mac.c
+++ b/drivers/net/wireless/ath/ath12k/mac.c
@@ -3914,11 +3914,8 @@ static void ath12k_bss_assoc(struct ath12k *ar,
struct ath12k_link_sta *arsta;
struct ieee80211_sta *ap_sta;
struct ath12k_sta *ahsta;
- struct ath12k_dp_link_peer *peer;
- bool is_auth = false;
u32 hemode = 0;
int ret;
- struct ath12k_dp *dp = ath12k_ab_to_dp(ar->ab);
lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
@@ -4022,17 +4019,8 @@ static void ath12k_bss_assoc(struct ath12k *ar,
"mac vdev %d up (associated) bssid %pM aid %d\n",
arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
- spin_lock_bh(&dp->dp_lock);
-
- peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id,
- arvif->bssid);
- if (peer && peer->is_authorized)
- is_auth = true;
-
- spin_unlock_bh(&dp->dp_lock);
-
/* Authorize BSS Peer */
- if (is_auth) {
+ if (ahsta->is_authorized) {
ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
arvif->vdev_id,
WMI_PEER_AUTHORIZE,
@@ -7020,20 +7008,11 @@ static int ath12k_mac_station_unauthorize(struct ath12k *ar,
struct ath12k_link_vif *arvif,
struct ath12k_link_sta *arsta)
{
- struct ath12k_dp_link_peer *peer;
int ret;
- struct ath12k_dp *dp = ath12k_ab_to_dp(ar->ab);
lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
- spin_lock_bh(&dp->dp_lock);
-
- peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id,
- arsta->addr);
- if (peer)
- peer->is_authorized = false;
-
- spin_unlock_bh(&dp->dp_lock);
+ arsta->ahsta->is_authorized = false;
/* Driver must clear the keys during the state change from
* IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after
@@ -7055,21 +7034,12 @@ static int ath12k_mac_station_authorize(struct ath12k *ar,
struct ath12k_link_vif *arvif,
struct ath12k_link_sta *arsta)
{
- struct ath12k_dp_link_peer *peer;
struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
int ret;
- struct ath12k_dp *dp = ath12k_ab_to_dp(ar->ab);
lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
- spin_lock_bh(&dp->dp_lock);
-
- peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id,
- arsta->addr);
- if (peer)
- peer->is_authorized = true;
-
- spin_unlock_bh(&dp->dp_lock);
+ arsta->ahsta->is_authorized = true;
if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
--
2.34.1
More information about the ath12k
mailing list