Commit 8d09a5e1 authored by Tomas Winkler's avatar Tomas Winkler Committed by John W. Linville

iwlwifi: don't fail if scan is issued too early

This patch returns success and empty scan on scans requests that were
rejected because issued too early. The cached bss list from previous
scanning will be returned by mac80211.
Signed-off-by: default avatarTomas Winkler <tomas.winkler@intel.com>
Signed-off-by: default avatarZhu Yi <yi.zhu@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 55d6a3cd
...@@ -3190,9 +3190,9 @@ static void iwl4965_bss_info_changed(struct ieee80211_hw *hw, ...@@ -3190,9 +3190,9 @@ static void iwl4965_bss_info_changed(struct ieee80211_hw *hw,
static int iwl_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t ssid_len) static int iwl_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t ssid_len)
{ {
int ret;
unsigned long flags; unsigned long flags;
struct iwl_priv *priv = hw->priv; struct iwl_priv *priv = hw->priv;
int ret;
IWL_DEBUG_MAC80211("enter\n"); IWL_DEBUG_MAC80211("enter\n");
...@@ -3211,20 +3211,27 @@ static int iwl_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t ssid_len) ...@@ -3211,20 +3211,27 @@ static int iwl_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t ssid_len)
goto out_unlock; goto out_unlock;
} }
/* we don't schedule scan within next_scan_jiffies period */ /* We don't schedule scan within next_scan_jiffies period.
* Avoid scanning during possible EAPOL exchange, return
* success immediately.
*/
if (priv->next_scan_jiffies && if (priv->next_scan_jiffies &&
time_after(priv->next_scan_jiffies, jiffies)) { time_after(priv->next_scan_jiffies, jiffies)) {
IWL_DEBUG_SCAN("scan rejected: within next scan period\n"); IWL_DEBUG_SCAN("scan rejected: within next scan period\n");
ret = -EAGAIN; queue_work(priv->workqueue, &priv->scan_completed);
ret = 0;
goto out_unlock; goto out_unlock;
} }
/* if we just finished scan ask for delay */ /* if we just finished scan ask for delay */
if (iwl_is_associated(priv) && priv->last_scan_jiffies && if (iwl_is_associated(priv) && priv->last_scan_jiffies &&
time_after(priv->last_scan_jiffies + IWL_DELAY_NEXT_SCAN, jiffies)) { time_after(priv->last_scan_jiffies + IWL_DELAY_NEXT_SCAN, jiffies)) {
IWL_DEBUG_SCAN("scan rejected: within previous scan period\n"); IWL_DEBUG_SCAN("scan rejected: within previous scan period\n");
ret = -EAGAIN; queue_work(priv->workqueue, &priv->scan_completed);
ret = 0;
goto out_unlock; goto out_unlock;
} }
if (ssid_len) { if (ssid_len) {
priv->one_direct_scan = 1; priv->one_direct_scan = 1;
priv->direct_ssid_len = min_t(u8, ssid_len, IW_ESSID_MAX_SIZE); priv->direct_ssid_len = min_t(u8, ssid_len, IW_ESSID_MAX_SIZE);
......
...@@ -463,11 +463,6 @@ void iwl_init_scan_params(struct iwl_priv *priv) ...@@ -463,11 +463,6 @@ void iwl_init_scan_params(struct iwl_priv *priv)
int iwl_scan_initiate(struct iwl_priv *priv) int iwl_scan_initiate(struct iwl_priv *priv)
{ {
if (priv->iw_mode == NL80211_IFTYPE_AP) {
IWL_ERROR("APs don't scan.\n");
return 0;
}
if (!iwl_is_ready_rf(priv)) { if (!iwl_is_ready_rf(priv)) {
IWL_DEBUG_SCAN("Aborting scan due to not ready.\n"); IWL_DEBUG_SCAN("Aborting scan due to not ready.\n");
return -EIO; return -EIO;
...@@ -479,8 +474,7 @@ int iwl_scan_initiate(struct iwl_priv *priv) ...@@ -479,8 +474,7 @@ int iwl_scan_initiate(struct iwl_priv *priv)
} }
if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) { if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
IWL_DEBUG_SCAN("Scan request while abort pending. " IWL_DEBUG_SCAN("Scan request while abort pending\n");
"Queuing.\n");
return -EAGAIN; return -EAGAIN;
} }
......
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