iwlwifi: mvm: notify scan completed even if no fw_restart
authorDavid Spinadel <david.spinadel@intel.com>
Thu, 9 Jan 2014 12:22:55 +0000 (14:22 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 3 Feb 2014 20:23:34 +0000 (22:23 +0200)
Notify scan completed if fw_restart flow isn't going to be run.
Otherwise, the scan will stay stack forever and mac80211 will
not be able to remove the interface.

Signed-off-by: David Spinadel <david.spinadel@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/mvm/ops.c
drivers/net/wireless/iwlwifi/mvm/scan.c

index 734b022d339aa38763fe94f6a02ed71072185d86..fdadfe95d3148b0b6c6494085b4ac3782479d33a 100644 (file)
@@ -713,6 +713,29 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
 {
        iwl_abort_notification_waits(&mvm->notif_wait);
 
+       /*
+        * This is a bit racy, but worst case we tell mac80211 about
+        * a stopped/aborted scan when that was already done which
+        * is not a problem. It is necessary to abort any os scan
+        * here because mac80211 requires having the scan cleared
+        * before restarting.
+        * We'll reset the scan_status to NONE in restart cleanup in
+        * the next start() call from mac80211. If restart isn't called
+        * (no fw restart) scan status will stay busy.
+        */
+       switch (mvm->scan_status) {
+       case IWL_MVM_SCAN_NONE:
+               break;
+       case IWL_MVM_SCAN_OS:
+               ieee80211_scan_completed(mvm->hw, true);
+               break;
+       case IWL_MVM_SCAN_SCHED:
+               /* Sched scan will be restarted by mac80211 in restart_hw. */
+               if (!mvm->restart_fw)
+                       ieee80211_sched_scan_stopped(mvm->hw);
+               break;
+       }
+
        /*
         * If we're restarting already, don't cycle restarts.
         * If INIT fw asserted, it will likely fail again.
@@ -744,26 +767,6 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
                INIT_WORK(&reprobe->work, iwl_mvm_reprobe_wk);
                schedule_work(&reprobe->work);
        } else if (mvm->cur_ucode == IWL_UCODE_REGULAR && mvm->restart_fw) {
-               /*
-                * This is a bit racy, but worst case we tell mac80211 about
-                * a stopped/aborted (sched) scan when that was already done
-                * which is not a problem. It is necessary to abort any scan
-                * here because mac80211 requires having the scan cleared
-                * before restarting.
-                * We'll reset the scan_status to NONE in restart cleanup in
-                * the next start() call from mac80211.
-                */
-               switch (mvm->scan_status) {
-               case IWL_MVM_SCAN_NONE:
-                       break;
-               case IWL_MVM_SCAN_OS:
-                       ieee80211_scan_completed(mvm->hw, true);
-                       break;
-               case IWL_MVM_SCAN_SCHED:
-                       /* Sched scan will be restarted by mac80211. */
-                       break;
-               }
-
                if (mvm->restart_fw > 0)
                        mvm->restart_fw--;
                ieee80211_restart_hw(mvm->hw);
index 0e0007960612e7866b332e27a1f19af9c5847afc..6c5c17397f7ee205fdca007663a313b4bb552ad1 100644 (file)
@@ -487,7 +487,7 @@ void iwl_mvm_cancel_scan(struct iwl_mvm *mvm)
        ret = iwl_mvm_send_cmd_pdu(mvm, SCAN_ABORT_CMD, CMD_SYNC, 0, NULL);
        if (ret) {
                IWL_ERR(mvm, "Couldn't send SCAN_ABORT_CMD: %d\n", ret);
-               /* mac80211's state will be cleaned in the fw_restart flow */
+               /* mac80211's state will be cleaned in the nic_restart flow */
                goto out_remove_notif;
        }