2022-10-07 05:14:37

by Manikanta Pubbisetty

[permalink] [raw]
Subject: [PATCH] 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 orresponding 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 <[email protected]>
---
drivers/net/wireless/ath/ath11k/mac.c | 33 +++++++++++++++++++++++----
1 file changed, 29 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
index 84d956ad4093..0da136916e0e 100644
--- 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 ath11k_mac_mon_status_filter_default = {
#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,
@@ -3611,6 +3614,7 @@ static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
struct scan_req_params arg;
int ret = 0;
int i;
+ u32 scan_timeout;

mutex_lock(&ar->conf_mutex);

@@ -3680,6 +3684,26 @@ static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
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);
@@ -3688,10 +3712,8 @@ static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
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);
@@ -9013,6 +9035,9 @@ static int __ath11k_mac_register(struct ath11k *ar)
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)) {

base-commit: 023baf1318ef21442fab3842bf03883bc81223e0
--
2.38.0


2022-10-07 21:19:44

by Jeff Johnson

[permalink] [raw]
Subject: Re: [PATCH] wifi: ath11k: add support to configure channel dwell time

On 10/6/2022 10:11 PM, Manikanta Pubbisetty wrote:
> 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 orresponding feature flag NL80211_EXT_FEATURE_SET_SCAN_DWELL

s/orresponding/corresponding/
Kalle can fix that when he merges so don't repost for that

> 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 <[email protected]>

Reviewed-by: Jeff Johnson <[email protected]>

> ---
> drivers/net/wireless/ath/ath11k/mac.c | 33 +++++++++++++++++++++++----
> 1 file changed, 29 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
> index 84d956ad4093..0da136916e0e 100644
> --- 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 ath11k_mac_mon_status_filter_default = {
> #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,
> @@ -3611,6 +3614,7 @@ static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
> struct scan_req_params arg;
> int ret = 0;
> int i;
> + u32 scan_timeout;
>
> mutex_lock(&ar->conf_mutex);
>
> @@ -3680,6 +3684,26 @@ static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
> 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);
> @@ -3688,10 +3712,8 @@ static int ath11k_mac_op_hw_scan(struct ieee80211_hw *hw,
> 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);
> @@ -9013,6 +9035,9 @@ static int __ath11k_mac_register(struct ath11k *ar)
> 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)) {
>
> base-commit: 023baf1318ef21442fab3842bf03883bc81223e0

2022-10-12 06:43:05

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH] wifi: ath11k: add support to configure channel dwell time

Manikanta Pubbisetty <[email protected]> wrote:

> 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 <[email protected]>
> Reviewed-by: Jeff Johnson <[email protected]>
> Signed-off-by: Kalle Valo <[email protected]>

Patch applied to ath-next branch of ath.git, thanks.

c362daa213cd wifi: ath11k: add support to configure channel dwell time

--
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches