Commit be8cce96 authored by Pradeep Kumar Chitrapu's avatar Pradeep Kumar Chitrapu Committed by Kalle Valo

ath10k: add support to configure channel dwell time

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.

Corresponding flag NL80211_EXT_FEATURE_SET_SCAN_DWELL is
advertized.

Supported Chipsets:
 -QCA988X/QCA9887 PCI
 -QCA99X0/QCA9984/QCA9888/QCA4019 PCI
 -QCA6174/QCA9377 PCI/USB/SDIO
 -WCN3990 SNOC

Tested on QCA9984 with firmware ver 10.4-3.6-0010
Signed-off-by: default avatarPradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 46dbf98c
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#define WO(_f) ((_f##_OFFSET) >> 2) #define WO(_f) ((_f##_OFFSET) >> 2)
#define ATH10K_SCAN_ID 0 #define ATH10K_SCAN_ID 0
#define ATH10K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD 10 /* msec */
#define WMI_READY_TIMEOUT (5 * HZ) #define WMI_READY_TIMEOUT (5 * HZ)
#define ATH10K_FLUSH_TIMEOUT_HZ (5 * HZ) #define ATH10K_FLUSH_TIMEOUT_HZ (5 * HZ)
#define ATH10K_CONNECTION_LOSS_HZ (3 * HZ) #define ATH10K_CONNECTION_LOSS_HZ (3 * HZ)
......
...@@ -5675,6 +5675,7 @@ static int ath10k_hw_scan(struct ieee80211_hw *hw, ...@@ -5675,6 +5675,7 @@ static int ath10k_hw_scan(struct ieee80211_hw *hw,
struct wmi_start_scan_arg arg; struct wmi_start_scan_arg arg;
int ret = 0; int ret = 0;
int i; int i;
u32 scan_timeout;
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
...@@ -5736,6 +5737,22 @@ static int ath10k_hw_scan(struct ieee80211_hw *hw, ...@@ -5736,6 +5737,22 @@ static int ath10k_hw_scan(struct ieee80211_hw *hw,
arg.channels[i] = req->channels[i]->center_freq; arg.channels[i] = req->channels[i]->center_freq;
} }
/* if duration is set, default dwell times will be overwritten */
if (req->duration) {
arg.dwell_time_active = req->duration;
arg.dwell_time_passive = req->duration;
arg.burst_duration_ms = req->duration;
scan_timeout = min_t(u32, arg.max_rest_time *
(arg.n_channels - 1) + (req->duration +
ATH10K_SCAN_CHANNEL_SWITCH_WMI_EVT_OVERHEAD) *
arg.n_channels, arg.max_scan_time + 200);
} else {
/* Add a 200ms margin to account for event/command processing */
scan_timeout = arg.max_scan_time + 200;
}
ret = ath10k_start_scan(ar, &arg); ret = ath10k_start_scan(ar, &arg);
if (ret) { if (ret) {
ath10k_warn(ar, "failed to start hw scan: %d\n", ret); ath10k_warn(ar, "failed to start hw scan: %d\n", ret);
...@@ -5744,10 +5761,8 @@ static int ath10k_hw_scan(struct ieee80211_hw *hw, ...@@ -5744,10 +5761,8 @@ static int ath10k_hw_scan(struct ieee80211_hw *hw,
spin_unlock_bh(&ar->data_lock); 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, ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
msecs_to_jiffies(arg.max_scan_time + msecs_to_jiffies(scan_timeout));
200));
exit: exit:
mutex_unlock(&ar->conf_mutex); mutex_unlock(&ar->conf_mutex);
...@@ -8364,6 +8379,8 @@ int ath10k_mac_register(struct ath10k *ar) ...@@ -8364,6 +8379,8 @@ int ath10k_mac_register(struct ath10k *ar)
} }
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS); wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_VHT_IBSS);
wiphy_ext_feature_set(ar->hw->wiphy,
NL80211_EXT_FEATURE_SET_SCAN_DWELL);
/* /*
* on LL hardware queues are managed entirely by the FW * on LL hardware queues are managed entirely by the FW
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment