mirror of https://gitee.com/openkylin/linux.git
iwlwifi: fix scan race
There is a problem if an "internal short scan" is in progress when a mac80211 requested scan arrives. If this new scan request arrives within the "next_scan_jiffies" period then driver will immediately return success and complete the scan. The problem here is that the scan has not been fully initialized at this time (is_internal_short_scan is still set to true because of the currently running scan), which results in the scan completion never to be sent to mac80211. At this time also, evan though the internal short scan is still running the state (is_internal_short_scan) will be set to false, so when the internal scan does complete then mac80211 will receive a scan completion. Fix this by checking right away if a scan is in progress when a scan request arrives from mac80211. Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
This commit is contained in:
parent
7bfedc59ee
commit
bbcbb9ef97
|
@ -469,21 +469,6 @@ EXPORT_SYMBOL(iwl_init_scan_params);
|
||||||
|
|
||||||
static int iwl_scan_initiate(struct iwl_priv *priv)
|
static int iwl_scan_initiate(struct iwl_priv *priv)
|
||||||
{
|
{
|
||||||
if (!iwl_is_ready_rf(priv)) {
|
|
||||||
IWL_DEBUG_SCAN(priv, "Aborting scan due to not ready.\n");
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_bit(STATUS_SCANNING, &priv->status)) {
|
|
||||||
IWL_DEBUG_SCAN(priv, "Scan already in progress.\n");
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
|
|
||||||
IWL_DEBUG_SCAN(priv, "Scan request while abort pending\n");
|
|
||||||
return -EAGAIN;
|
|
||||||
}
|
|
||||||
|
|
||||||
IWL_DEBUG_INFO(priv, "Starting scan...\n");
|
IWL_DEBUG_INFO(priv, "Starting scan...\n");
|
||||||
set_bit(STATUS_SCANNING, &priv->status);
|
set_bit(STATUS_SCANNING, &priv->status);
|
||||||
priv->is_internal_short_scan = false;
|
priv->is_internal_short_scan = false;
|
||||||
|
@ -515,6 +500,18 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw,
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (test_bit(STATUS_SCANNING, &priv->status)) {
|
||||||
|
IWL_DEBUG_SCAN(priv, "Scan already in progress.\n");
|
||||||
|
ret = -EAGAIN;
|
||||||
|
goto out_unlock;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
|
||||||
|
IWL_DEBUG_SCAN(priv, "Scan request while abort pending\n");
|
||||||
|
ret = -EAGAIN;
|
||||||
|
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
|
* Avoid scanning during possible EAPOL exchange, return
|
||||||
* success immediately.
|
* success immediately.
|
||||||
|
|
Loading…
Reference in New Issue