mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 23:42:43 +00:00
930e702d72
Synchronize the ath11k backports with the current ath-next tree. This replaces the management TLV pending fix with the upstreamed one, fixes traffic flooding when AP and monitor modes are used at the same time, fixes QCN9074 always showing -95 dBm for station RSSI in dumps, fixes potential crash on boot if spectral scan is enabled due to writing to unitialized memory and adds 11d scan offloading for WCN6750 and WCN6855. Signed-off-by: Robert Marko <robimarko@gmail.com>
102 lines
4.2 KiB
Diff
102 lines
4.2 KiB
Diff
From 8b4d2f080afbd4280ecca0f4b3ceea943a7a86d0 Mon Sep 17 00:00:00 2001
|
|
From: Manikanta Pubbisetty <quic_mpubbise@quicinc.com>
|
|
Date: Thu, 23 Mar 2023 11:39:13 +0530
|
|
Subject: [PATCH] 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.com
|
|
---
|
|
drivers/net/wireless/ath/ath11k/mac.c | 25 +++++++++++++++++++++++--
|
|
drivers/net/wireless/ath/ath11k/wmi.h | 4 ++++
|
|
2 files changed, 27 insertions(+), 2 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
|
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
|
@@ -3819,8 +3819,29 @@ static int ath11k_mac_op_hw_scan(struct
|
|
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) {
|
|
--- a/drivers/net/wireless/ath/ath11k/wmi.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/wmi.h
|
|
@@ -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,
|