mirror of
https://github.com/torvalds/linux
synced 2024-10-20 18:28:21 +00:00
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: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
This commit is contained in:
parent
46dbf98c69
commit
be8cce96f1
|
@ -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,
|
||||||
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,
|
||||||
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,
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
|
|
Loading…
Reference in a new issue