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 --- 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