iwlwifi: delay ROC if doing internal reset scan
authorJohannes Berg <johannes.berg@intel.com>
Thu, 14 Jun 2012 19:22:17 +0000 (21:22 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 18 Jun 2012 11:47:07 +0000 (13:47 +0200)
When the device is doing an internal radio reset
scan, ROC can be rejected to the supplicant with
busy status which confuses it.

One option would be to queue the ROC and handle
it later, but since the radio reset scan is very
quick we can just wait for it to finish instead.

Also add a warning since we shouldn't run into
the case of having a scan active when requesting
a ROC in any other case since mac80211 will not
scan while ROC or ROC while scanning.

Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/iwlwifi/dvm/mac80211.c

index 9d23748623142c8373ee973debbf85b85fc755a7..c57726348ffe758ffc8d4c671c8a26a71504deb9 100644 (file)
@@ -1036,8 +1036,18 @@ static int iwlagn_mac_remain_on_channel(struct ieee80211_hw *hw,
        mutex_lock(&priv->mutex);
 
        if (test_bit(STATUS_SCAN_HW, &priv->status)) {
-               err = -EBUSY;
-               goto out;
+               /* mac80211 should not scan while ROC or ROC while scanning */
+               if (WARN_ON_ONCE(priv->scan_type != IWL_SCAN_RADIO_RESET)) {
+                       err = -EBUSY;
+                       goto out;
+               }
+
+               iwl_scan_cancel_timeout(priv, 100);
+
+               if (test_bit(STATUS_SCAN_HW, &priv->status)) {
+                       err = -EBUSY;
+                       goto out;
+               }
        }
 
        priv->hw_roc_channel = channel;