mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 23:42:43 +00:00
103 lines
3.7 KiB
Diff
103 lines
3.7 KiB
Diff
|
From c362daa213cdeb0a9e7c2ed84849544c24505720 Mon Sep 17 00:00:00 2001
|
||
|
From: Manikanta Pubbisetty <quic_mpubbise@quicinc.com>
|
||
|
Date: Fri, 7 Oct 2022 10:41:30 +0530
|
||
|
Subject: [PATCH 8/9] wifi: ath11k: add support to configure channel dwell time
|
||
|
|
||
|
Add support to configure channel dwell time during scan.
|
||
|
Dwell time help to stay on the channel for a specified duration
|
||
|
during scan and aid userspace in finding WiFi networks. Very
|
||
|
useful in passive scans where longer dwell times are needed
|
||
|
to find the WiFi networks.
|
||
|
|
||
|
Configure channel dwell time from duration of the scan request
|
||
|
received from mac80211 when the duration is non-zero. When the
|
||
|
scan request does not have duration value, use the default ones,
|
||
|
the current implementation.
|
||
|
|
||
|
Advertise corresponding feature flag NL80211_EXT_FEATURE_SET_SCAN_DWELL
|
||
|
to enable the feature.
|
||
|
|
||
|
Change is applicable for all ath11k hardware.
|
||
|
|
||
|
Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1
|
||
|
|
||
|
Signed-off-by: Manikanta Pubbisetty <quic_mpubbise@quicinc.com>
|
||
|
Reviewed-by: Jeff Johnson <quic_jjohnson@quicinc.com>
|
||
|
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
|
||
|
Link: https://lore.kernel.org/r/20221007051130.6067-1-quic_mpubbise@quicinc.com
|
||
|
---
|
||
|
drivers/net/wireless/ath/ath11k/mac.c | 33 +++++++++++++++++++++++----
|
||
|
1 file changed, 29 insertions(+), 4 deletions(-)
|
||
|
|
||
|
--- a/drivers/net/wireless/ath/ath11k/mac.c
|
||
|
+++ b/drivers/net/wireless/ath/ath11k/mac.c
|
||
|
@@ -241,7 +241,10 @@ const struct htt_rx_ring_tlv_filter ath1
|
||
|
#define ath11k_a_rates (ath11k_legacy_rates + 4)
|
||
|
#define ath11k_a_rates_size (ARRAY_SIZE(ath11k_legacy_rates) - 4)
|
||
|
|
||
|
-#define ATH11K_MAC_SCAN_TIMEOUT_MSECS 200 /* in msecs */
|
||
|
+#define ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD 200 /* in msecs */
|
||
|
+
|
||
|
+/* Overhead due to the processing of channel switch events from FW */
|
||
|
+#define ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD 10 /* in msecs */
|
||
|
|
||
|
static const u32 ath11k_smps_map[] = {
|
||
|
[WLAN_HT_CAP_SM_PS_STATIC] = WMI_PEER_SMPS_STATIC,
|
||
|
@@ -3612,6 +3615,7 @@ static int ath11k_mac_op_hw_scan(struct
|
||
|
struct scan_req_params arg;
|
||
|
int ret = 0;
|
||
|
int i;
|
||
|
+ u32 scan_timeout;
|
||
|
|
||
|
mutex_lock(&ar->conf_mutex);
|
||
|
|
||
|
@@ -3681,6 +3685,26 @@ static int ath11k_mac_op_hw_scan(struct
|
||
|
ether_addr_copy(arg.mac_mask.addr, req->mac_addr_mask);
|
||
|
}
|
||
|
|
||
|
+ /* if duration is set, default dwell times will be overwritten */
|
||
|
+ if (req->duration) {
|
||
|
+ arg.dwell_time_active = req->duration;
|
||
|
+ arg.dwell_time_active_2g = req->duration;
|
||
|
+ arg.dwell_time_active_6g = req->duration;
|
||
|
+ arg.dwell_time_passive = req->duration;
|
||
|
+ arg.dwell_time_passive_6g = req->duration;
|
||
|
+ arg.burst_duration = req->duration;
|
||
|
+
|
||
|
+ scan_timeout = min_t(u32, arg.max_rest_time *
|
||
|
+ (arg.num_chan - 1) + (req->duration +
|
||
|
+ ATH11K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
|
||
|
+ arg.num_chan, arg.max_scan_time);
|
||
|
+ } else {
|
||
|
+ scan_timeout = arg.max_scan_time;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* Add a margin to account for event/command processing */
|
||
|
+ scan_timeout += ATH11K_MAC_SCAN_CMD_EVT_OVERHEAD;
|
||
|
+
|
||
|
ret = ath11k_start_scan(ar, &arg);
|
||
|
if (ret) {
|
||
|
ath11k_warn(ar->ab, "failed to start hw scan: %d\n", ret);
|
||
|
@@ -3689,10 +3713,8 @@ static int ath11k_mac_op_hw_scan(struct
|
||
|
spin_unlock_bh(&ar->data_lock);
|
||
|
}
|
||
|
|
||
|
- /* Add a 200ms margin to account for event/command processing */
|
||
|
ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
|
||
|
- msecs_to_jiffies(arg.max_scan_time +
|
||
|
- ATH11K_MAC_SCAN_TIMEOUT_MSECS));
|
||
|
+ msecs_to_jiffies(scan_timeout));
|
||
|
|
||
|
exit:
|
||
|
kfree(arg.chan_list);
|
||
|
@@ -9060,6 +9082,9 @@ static int __ath11k_mac_register(struct
|
||
|
NL80211_EXT_FEATURE_UNSOL_BCAST_PROBE_RESP);
|
||
|
}
|
||
|
|
||
|
+ wiphy_ext_feature_set(ar->hw->wiphy,
|
||
|
+ NL80211_EXT_FEATURE_SET_SCAN_DWELL);
|
||
|
+
|
||
|
ath11k_reg_init(ar);
|
||
|
|
||
|
if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
|