wifi: ath11k: Optimize 6 GHz scan time
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.compull/795/merge
parent
1be3640cbb
commit
8b4d2f080a
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue