Merge commit '4e6ce4dc7ce71d0886908d55129d5d6482a27ff9' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
This commit is contained in:
@@ -777,10 +777,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);
|
||||
|
||||
/*
|
||||
@@ -911,6 +913,8 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
||||
list_del(&sdata->u.vlan.list);
|
||||
mutex_unlock(&local->mtx);
|
||||
RCU_INIT_POINTER(sdata->vif.chanctx_conf, NULL);
|
||||
/* see comment in the default case below */
|
||||
ieee80211_free_keys(sdata, true);
|
||||
/* no need to tell driver */
|
||||
break;
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
@@ -936,17 +940,16 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
||||
/*
|
||||
* When we get here, the interface is marked down.
|
||||
* Free the remaining keys, if there are any
|
||||
* (shouldn't be, except maybe in WDS mode?)
|
||||
* (which can happen in AP mode if userspace sets
|
||||
* keys before the interface is operating, and maybe
|
||||
* also in WDS mode)
|
||||
*
|
||||
* Force the key freeing to always synchronize_net()
|
||||
* to wait for the RX path in case it is using this
|
||||
* interface enqueuing frames * at this very time on
|
||||
* interface enqueuing frames at this very time on
|
||||
* another CPU.
|
||||
*/
|
||||
ieee80211_free_keys(sdata, true);
|
||||
|
||||
/* fall through */
|
||||
case NL80211_IFTYPE_AP:
|
||||
skb_queue_purge(&sdata->skb_queue);
|
||||
}
|
||||
|
||||
@@ -1004,6 +1007,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);
|
||||
|
||||
|
Reference in New Issue
Block a user