|
@@ -766,10 +766,12 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
|
int i, flushed;
|
|
|
struct ps_data *ps;
|
|
|
struct cfg80211_chan_def chandef;
|
|
|
+ bool cancel_scan;
|
|
|
|
|
|
clear_bit(SDATA_STATE_RUNNING, &sdata->state);
|
|
|
|
|
|
- if (rcu_access_pointer(local->scan_sdata) == sdata)
|
|
|
+ cancel_scan = rcu_access_pointer(local->scan_sdata) == sdata;
|
|
|
+ if (cancel_scan)
|
|
|
ieee80211_scan_cancel(local);
|
|
|
|
|
|
/*
|
|
@@ -992,6 +994,9 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
|
|
|
|
ieee80211_recalc_ps(local, -1);
|
|
|
|
|
|
+ if (cancel_scan)
|
|
|
+ flush_delayed_work(&local->scan_work);
|
|
|
+
|
|
|
if (local->open_count == 0) {
|
|
|
ieee80211_stop_device(local);
|
|
|
|