wifi: ath12k: refactor the rfkill worker
authorKarthikeyan Periyasamy <quic_periyasa@quicinc.com>
Thu, 25 Jan 2024 15:45:55 +0000 (21:15 +0530)
committerKalle Valo <quic_kvalo@quicinc.com>
Fri, 2 Feb 2024 12:38:51 +0000 (14:38 +0200)
Currently, the rfkill worker handler access mac80211 HW from the radio/link
structure. This is will be incorrect for single wiphy model, as they will
hold multiple link/radio structures. To fix this, access mac80211 HW based
on the number of hardware in the SoC/chip. This approach makes the rfkill
worker handler compatible with both multi wiphy and single wiphy models.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1

Signed-off-by: Karthikeyan Periyasamy <quic_periyasa@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20240125154555.3169706-1-quic_periyasa@quicinc.com
drivers/net/wireless/ath/ath12k/core.c

index 0d4640ff8d6fe7dfb41075daf8b7f4aba0ba865f..b82550b35149ae4cccd883626e16357d1c195f1d 100644 (file)
@@ -909,21 +909,29 @@ static void ath12k_rfkill_work(struct work_struct *work)
 {
        struct ath12k_base *ab = container_of(work, struct ath12k_base, rfkill_work);
        struct ath12k *ar;
+       struct ath12k_hw *ah;
        struct ieee80211_hw *hw;
        bool rfkill_radio_on;
-       int i;
+       int i, j;
 
        spin_lock_bh(&ab->base_lock);
        rfkill_radio_on = ab->rfkill_radio_on;
        spin_unlock_bh(&ab->base_lock);
 
-       for (i = 0; i < ab->num_radios; i++) {
-               ar = ab->pdevs[i].ar;
-               if (!ar)
+       for (i = 0; i < ab->num_hw; i++) {
+               ah = ab->ah[i];
+               if (!ah)
                        continue;
 
-               hw = ath12k_ar_to_hw(ar);
-               ath12k_mac_rfkill_enable_radio(ar, rfkill_radio_on);
+               for (j = 0; j < ah->num_radio; j++) {
+                       ar = &ah->radio[j];
+                       if (!ar)
+                               continue;
+
+                       ath12k_mac_rfkill_enable_radio(ar, rfkill_radio_on);
+               }
+
+               hw = ah->hw;
                wiphy_rfkill_set_hw_state(hw->wiphy, !rfkill_radio_on);
        }
 }