diff options
Diffstat (limited to 'net/mac80211/pm.c')
| -rw-r--r-- | net/mac80211/pm.c | 18 | 
1 files changed, 6 insertions, 12 deletions
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index 75202b295a4..d287fde0431 100644 --- a/net/mac80211/pm.c +++ b/net/mac80211/pm.c @@ -40,22 +40,14 @@ int __ieee80211_suspend(struct ieee80211_hw *hw)  	list_for_each_entry(sdata, &local->interfaces, list)  		ieee80211_disable_keys(sdata); -	/* Tear down aggregation sessions */ - -	rcu_read_lock(); - -	if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) { -		list_for_each_entry_rcu(sta, &local->sta_list, list) { +	/* tear down aggregation sessions and remove STAs */ +	mutex_lock(&local->sta_mtx); +	list_for_each_entry(sta, &local->sta_list, list) { +		if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) {  			set_sta_flags(sta, WLAN_STA_BLOCK_BA);  			ieee80211_sta_tear_down_BA_sessions(sta);  		} -	} -	rcu_read_unlock(); - -	/* remove STAs */ -	mutex_lock(&local->sta_mtx); -	list_for_each_entry(sta, &local->sta_list, list) {  		if (sta->uploaded) {  			sdata = sta->sdata;  			if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN) @@ -72,6 +64,8 @@ int __ieee80211_suspend(struct ieee80211_hw *hw)  	/* remove all interfaces */  	list_for_each_entry(sdata, &local->interfaces, list) { +		cancel_work_sync(&sdata->work); +  		switch(sdata->vif.type) {  		case NL80211_IFTYPE_STATION:  			ieee80211_sta_quiesce(sdata);  |