wifi: ath11k: Optimize 6 GHz scan time
authorManikanta Pubbisetty <quic_mpubbise@quicinc.com>
Thu, 23 Mar 2023 06:09:13 +0000 (11:39 +0530)
committerKalle Valo <quic_kvalo@quicinc.com>
Wed, 12 Apr 2023 09:57:27 +0000 (12:57 +0300)
Currently, time taken to scan all supported channels on WCN6750
is ~8 seconds and connection time is almost 10 seconds. WCN6750
supports three Wi-Fi bands (i.e., 2.4/5/6 GHz) and the numbers of
channels for scan come around ~100 channels (default case).
Since the chip doesn't have support for DBS (Dual Band Simultaneous),
scans cannot be parallelized resulting in longer scan times.

Among the 100 odd channels, ~60 channels are in 6 GHz band. Therefore,
optimizing the scan for 6 GHz channels will bring down the overall
scan time.

WCN6750 firmware has support to scan a 6 GHz channel based on co-located
AP information i.e., RNR IE which is found in the legacy 2.4/5 GHz scan
results. When a scan request with all supported channel list is enqueued
to the firmware, then based on WMI_SCAN_CHAN_FLAG_SCAN_ONLY_IF_RNR_FOUND
scan channel flag, firmware will scan only those 6 GHz channels for which
RNR IEs are found in the legacy scan results.

In the proposed design, based on NL80211_SCAN_FLAG_COLOCATED_6GHZ scan
flag, driver will set the WMI_SCAN_CHAN_FLAG_SCAN_ONLY_IF_RNR_FOUND flag
for non-PSC channels. Since there is high probability to find 6 GHz APs
on PSC channels, these channels are always scanned. Only non-PSC channels
are selectively scanned based on cached RNR information from the legacy
scan results.

If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set in the scan flags,
then scan will happen on all supported channels (default behavior).

With these optimizations, scan time is improved by 1.5-1.8 seconds on
WCN6750. Similar savings have been observed on WCN6855.

Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1
Tested-on: WCN6855 hw2.1 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.16

Signed-off-by: Manikanta Pubbisetty <quic_mpubbise@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20230323060913.10097-1-quic_mpubbise@quicinc.com
drivers/net/wireless/ath/ath11k/mac.c
drivers/net/wireless/ath/ath11k/wmi.h

index cad832e0e6b805a1f9029c2a69bf99f88ae2b0dd..c81b238d0d91e21b37feb3ce34252bd441283e08 100644 (file)
@@ -3819,8 +3819,29 @@ static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
                        goto exit;
                }
 
-               for (i = 0; i < arg->num_chan; i++)
-                       arg->chan_list[i] = req->channels[i]->center_freq;
+               for (i = 0; i < arg->num_chan; i++) {
+                       if (test_bit(WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL,
+                                    ar->ab->wmi_ab.svc_map)) {
+                               arg->chan_list[i] =
+                                       u32_encode_bits(req->channels[i]->center_freq,
+                                                       WMI_SCAN_CONFIG_PER_CHANNEL_MASK);
+
+                               /* If NL80211_SCAN_FLAG_COLOCATED_6GHZ is set in scan
+                                * flags, then scan all PSC channels in 6 GHz band and
+                                * those non-PSC channels where RNR IE is found during
+                                * the legacy 2.4/5 GHz scan.
+                                * If NL80211_SCAN_FLAG_COLOCATED_6GHZ is not set,
+                                * then all channels in 6 GHz will be scanned.
+                                */
+                               if (req->channels[i]->band == NL80211_BAND_6GHZ &&
+                                   req->flags & NL80211_SCAN_FLAG_COLOCATED_6GHZ &&
+                                   !cfg80211_channel_is_psc(req->channels[i]))
+                                       arg->chan_list[i] |=
+                                               WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND;
+                       } else {
+                               arg->chan_list[i] = req->channels[i]->center_freq;
+                       }
+               }
        }
 
        if (req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) {
index b23b7a22bc9af1f06f5d24144c1ac846dde6553a..86b22f2cec1291713b5652845c7255b939e07433 100644 (file)
@@ -2100,6 +2100,7 @@ enum wmi_tlv_service {
 
        /* The second 128 bits */
        WMI_MAX_EXT_SERVICE = 256,
+       WMI_TLV_SERVICE_SCAN_CONFIG_PER_CHANNEL = 265,
        WMI_TLV_SERVICE_REG_CC_EXT_EVENT_SUPPORT = 281,
        WMI_TLV_SERVICE_BIOS_SAR_SUPPORT = 326,
 
@@ -3249,6 +3250,9 @@ struct  wmi_start_scan_cmd {
 #define WMI_SCAN_DWELL_MODE_SHIFT        21
 #define WMI_SCAN_FLAG_EXT_PASSIVE_SCAN_START_TIME_ENHANCE   0x00000800
 
+#define WMI_SCAN_CONFIG_PER_CHANNEL_MASK       GENMASK(19, 0)
+#define WMI_SCAN_CH_FLAG_SCAN_ONLY_IF_RNR_FOUND        BIT(20)
+
 enum {
        WMI_SCAN_DWELL_MODE_DEFAULT      = 0,
        WMI_SCAN_DWELL_MODE_CONSERVATIVE = 1,