return true;
 }
 
-void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
+static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
 {
        struct ieee80211_local *local = hw_to_local(hw);
        bool was_hw_scan;
 
-       trace_api_scan_completed(local, aborted);
-
        mutex_lock(&local->mtx);
 
        /*
        ieee80211_mesh_notify_scan_completed(local);
        ieee80211_queue_work(&local->hw, &local->work_work);
 }
+
+void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
+{
+       struct ieee80211_local *local = hw_to_local(hw);
+
+       trace_api_scan_completed(local, aborted);
+
+       set_bit(SCAN_COMPLETED, &local->scanning);
+       if (aborted)
+               set_bit(SCAN_ABORTED, &local->scanning);
+       ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0);
+}
 EXPORT_SYMBOL(ieee80211_scan_completed);
 
 static int ieee80211_start_sw_scan(struct ieee80211_local *local)
 
        /* if no more bands/channels left, complete scan and advance to the idle state */
        if (local->scan_channel_idx >= local->scan_req->n_channels) {
-               ieee80211_scan_completed(&local->hw, false);
+               __ieee80211_scan_completed(&local->hw, false);
                return 1;
        }
 
        struct ieee80211_sub_if_data *sdata = local->scan_sdata;
        unsigned long next_delay = 0;
 
+       if (test_and_clear_bit(SCAN_COMPLETED, &local->scanning)) {
+               bool aborted;
+
+               aborted = test_and_clear_bit(SCAN_ABORTED, &local->scanning);
+               __ieee80211_scan_completed(&local->hw, aborted);
+               return;
+       }
+
        mutex_lock(&local->mtx);
        if (!sdata || !local->scan_req) {
                mutex_unlock(&local->mtx);
                int rc = drv_hw_scan(local, sdata, local->hw_scan_req);
                mutex_unlock(&local->mtx);
                if (rc)
-                       ieee80211_scan_completed(&local->hw, true);
+                       __ieee80211_scan_completed(&local->hw, true);
                return;
        }
 
                mutex_unlock(&local->mtx);
 
                if (rc)
-                       ieee80211_scan_completed(&local->hw, true);
+                       __ieee80211_scan_completed(&local->hw, true);
                return;
        }
 
         * Avoid re-scheduling when the sdata is going away.
         */
        if (!ieee80211_sdata_running(sdata)) {
-               ieee80211_scan_completed(&local->hw, true);
+               __ieee80211_scan_completed(&local->hw, true);
                return;
        }
 
        mutex_unlock(&local->mtx);
 
        if (abortscan)
-               ieee80211_scan_completed(&local->hw, true);
+               __ieee80211_scan_completed(&local->hw, true);
 }