iwlwifi: don't fail if scan is issued too early
authorTomas Winkler <tomas.winkler@intel.com>
Wed, 24 Sep 2008 05:57:46 +0000 (13:57 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 13 Nov 2008 17:56:01 +0000 (09:56 -0800)
commit 8d09a5e1c36d0dec5728e6c8b0bb5412de09b27b upstream

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: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-scan.c

index 87c42a572a548a110f30cdf8068b25c58424be49..da589fc8ca78f2cc4c60f269769ea4b9ff53dc4c 100644 (file)
@@ -3213,20 +3213,26 @@ static int iwl4965_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len)
                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 &&
            time_after(priv->next_scan_jiffies, jiffies)) {
                IWL_DEBUG_SCAN("scan rejected: within next scan period\n");
-               rc = -EAGAIN;
+               queue_work(priv->workqueue, &priv->scan_completed);
+               rc = 0;
                goto out_unlock;
        }
        /* if we just finished scan ask for delay */
        if (iwl_is_associated(priv) && priv->last_scan_jiffies &&
            time_after(priv->last_scan_jiffies + IWL_DELAY_NEXT_SCAN, jiffies)) {
                IWL_DEBUG_SCAN("scan rejected: within previous scan period\n");
-               rc = -EAGAIN;
+               queue_work(priv->workqueue, &priv->scan_completed);
+               rc = 0;
                goto out_unlock;
        }
+
        if (len) {
                IWL_DEBUG_SCAN("direct scan for %s [%d]\n ",
                               iwl_escape_essid(ssid, len), (int)len);
index 6c8ac3a87d547f5ca2c4ad1543ec530e180dd467..3a90a678f37d6c3c24bb41e74605c77adedb8c6a 100644 (file)
@@ -464,11 +464,6 @@ void iwl_init_scan_params(struct iwl_priv *priv)
 
 int iwl_scan_initiate(struct iwl_priv *priv)
 {
-       if (priv->iw_mode == IEEE80211_IF_TYPE_AP) {
-               IWL_ERROR("APs don't scan.\n");
-               return 0;
-       }
-
        if (!iwl_is_ready_rf(priv)) {
                IWL_DEBUG_SCAN("Aborting scan due to not ready.\n");
                return -EIO;
@@ -480,8 +475,7 @@ int iwl_scan_initiate(struct iwl_priv *priv)
        }
 
        if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
-               IWL_DEBUG_SCAN("Scan request while abort pending.  "
-                              "Queuing.\n");
+               IWL_DEBUG_SCAN("Scan request while abort pending\n");
                return -EAGAIN;
        }