[PATCH] wifi: ath11k: add support to configure channel dwell time
Jeff Johnson
quic_jjohnson at quicinc.com
Fri Oct 7 14:17:10 PDT 2022
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 <quic_mpubbise at quicinc.com>
Reviewed-by: Jeff Johnson <quic_jjohnson at quicinc.com>
> ---
> 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
More information about the ath11k
mailing list