wifi: ath12k: support get_survey mac op for single wiphy
authorSriram R <quic_srirrama@quicinc.com>
Tue, 9 Apr 2024 11:49:35 +0000 (14:49 +0300)
committerKalle Valo <quic_kvalo@quicinc.com>
Wed, 10 Apr 2024 14:12:16 +0000 (17:12 +0300)
The radio for which the survey info needs to be collected
depends on the channel idx which could be based on the band.
Use the idx to identify the appropriate sband since multiple
bands could be combined for single wiphy case.

Also use the channel idx and sband to identify the corresponding
radio on which the survey results needs to be populated.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: Sriram R <quic_srirrama@quicinc.com>
Signed-off-by: Rameshkumar Sundaram <quic_ramess@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20240405194519.1337906-13-quic_ramess@quicinc.com
drivers/net/wireless/ath/ath12k/mac.c

index 72495136022bcece58411ed8a3e21bac5333c769..f15dcd75157d0a761648dc51a5740f030767be75 100644 (file)
@@ -7851,21 +7851,13 @@ ath12k_mac_update_bss_chan_survey(struct ath12k *ar,
 static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
                                    struct survey_info *survey)
 {
-       struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
        struct ath12k *ar;
        struct ieee80211_supported_band *sband;
        struct survey_info *ar_survey;
-       int ret = 0;
 
        if (idx >= ATH12K_NUM_CHANS)
                return -ENOENT;
 
-       ar = ath12k_ah_to_ar(ah, 0);
-
-       ar_survey = &ar->survey[idx];
-
-       mutex_lock(&ar->conf_mutex);
-
        sband = hw->wiphy->bands[NL80211_BAND_2GHZ];
        if (sband && idx >= sband->n_channels) {
                idx -= sband->n_channels;
@@ -7875,11 +7867,22 @@ static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
        if (!sband)
                sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
 
-       if (!sband || idx >= sband->n_channels) {
-               ret = -ENOENT;
-               goto exit;
+       if (!sband || idx >= sband->n_channels)
+               return -ENOENT;
+
+       ar = ath12k_mac_get_ar_by_chan(hw, &sband->channels[idx]);
+       if (!ar) {
+               if (sband->channels[idx].flags & IEEE80211_CHAN_DISABLED) {
+                       memset(survey, 0, sizeof(*survey));
+                       return 0;
+               }
+               return -ENOENT;
        }
 
+       ar_survey = &ar->survey[idx];
+
+       mutex_lock(&ar->conf_mutex);
+
        ath12k_mac_update_bss_chan_survey(ar, &sband->channels[idx]);
 
        spin_lock_bh(&ar->data_lock);
@@ -7891,10 +7894,8 @@ static int ath12k_mac_op_get_survey(struct ieee80211_hw *hw, int idx,
        if (ar->rx_channel == survey->channel)
                survey->filled |= SURVEY_INFO_IN_USE;
 
-exit:
        mutex_unlock(&ar->conf_mutex);
-
-       return ret;
+       return 0;
 }
 
 static void ath12k_mac_op_sta_statistics(struct ieee80211_hw *hw,