]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: ath12k: handle ath12k_mac_ieee80211_sta_bw_to_wmi() for link sta
authorAditya Kumar Singh <quic_adisi@quicinc.com>
Thu, 9 Jan 2025 18:43:13 +0000 (00:13 +0530)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Mon, 3 Feb 2025 22:43:28 +0000 (14:43 -0800)
Currently ath12k_mac_ieee80211_sta_bw_to_wmi() handles the bandwidth from
sta's deflink member. This works only for non-ML station. Now that MLO
support is there, extend this function to use link sta instead of deflink.

Additionally, in ath12k_mac_handle_link_sta_state(), the link sta structure
is not accessible, making it difficult to fetch the bandwidth there.
However, ath12k_mac_station_assoc() does reference the link sta structure.
Therefore, move the initial assignment of the arsta bandwidth member to
ath12k_mac_station_assoc().

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1

Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
Acked-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
Link: https://patch.msgid.link/20250110-fix_link_sta_bandwidth_update-v1-2-61b6f3ef2ea3@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/mac.c

index 55d4f3fb5cd111431468538ef5e72069dd3c5ba2..aadace85dc117344cc561e1a13af07bccf60cad1 100644 (file)
@@ -3219,11 +3219,11 @@ static int ath12k_setup_peer_smps(struct ath12k *ar, struct ath12k_link_vif *arv
 }
 
 static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
-                                             struct ieee80211_sta *sta)
+                                             struct ieee80211_link_sta *link_sta)
 {
-       u32 bw = WMI_PEER_CHWIDTH_20MHZ;
+       u32 bw;
 
-       switch (sta->deflink.bandwidth) {
+       switch (link_sta->bandwidth) {
        case IEEE80211_STA_RX_BW_20:
                bw = WMI_PEER_CHWIDTH_20MHZ;
                break;
@@ -3240,8 +3240,8 @@ static u32 ath12k_mac_ieee80211_sta_bw_to_wmi(struct ath12k *ar,
                bw = WMI_PEER_CHWIDTH_320MHZ;
                break;
        default:
-               ath12k_warn(ar->ab, "Invalid bandwidth %d in rc update for %pM\n",
-                           sta->deflink.bandwidth, sta->addr);
+               ath12k_warn(ar->ab, "Invalid bandwidth %d for link station %pM\n",
+                           link_sta->bandwidth, link_sta->addr);
                bw = WMI_PEER_CHWIDTH_20MHZ;
                break;
        }
@@ -5020,6 +5020,11 @@ static int ath12k_mac_station_assoc(struct ath12k *ar,
                return -EINVAL;
        }
 
+       spin_lock_bh(&ar->data_lock);
+       arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
+       arsta->bw_prev = link_sta->bandwidth;
+       spin_unlock_bh(&ar->data_lock);
+
        if (link_sta->vht_cap.vht_supported && num_vht_rates == 1) {
                ret = ath12k_mac_set_peer_vht_fixed_rate(arvif, arsta, mask,
                                                         band);
@@ -5609,7 +5614,6 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
                                            enum ieee80211_sta_state new_state)
 {
        struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
-       struct ieee80211_sta *sta = ath12k_ahsta_to_sta(arsta->ahsta);
        struct ath12k *ar = arvif->ar;
        int ret = 0;
 
@@ -5652,13 +5656,6 @@ static int ath12k_mac_handle_link_sta_state(struct ieee80211_hw *hw,
                        ath12k_warn(ar->ab, "Failed to associate station: %pM\n",
                                    arsta->addr);
 
-               spin_lock_bh(&ar->data_lock);
-
-               arsta->bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
-               arsta->bw_prev = sta->deflink.bandwidth;
-
-               spin_unlock_bh(&ar->data_lock);
-
        /* IEEE80211_STA_ASSOC -> IEEE80211_STA_AUTHORIZED: set peer status as
         * authorized
         */
@@ -5926,7 +5923,7 @@ static void ath12k_mac_op_link_sta_rc_update(struct ieee80211_hw *hw,
        spin_lock_bh(&ar->data_lock);
 
        if (changed & IEEE80211_RC_BW_CHANGED) {
-               bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, sta);
+               bw = ath12k_mac_ieee80211_sta_bw_to_wmi(ar, link_sta);
                arsta->bw_prev = arsta->bw;
                arsta->bw = bw;
        }