Skip to content

Commit

Permalink
mac80211: tear down BA sessions properly on suspend
Browse files Browse the repository at this point in the history
Currently, the code to tear down BA sessions will
execute after queues are stopped, but attempt to
send frames, so those frames will just get queued,
which isn't intended. Move this code to before to
tear down the sessions properly.

Additionally, after stopping queues, flush the TX
queues in the driver driver to make sure all the
frames went out.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Apr 25, 2011
1 parent 31d291a commit ca45de7
Showing 1 changed file with 11 additions and 5 deletions.
16 changes: 11 additions & 5 deletions net/mac80211/pm.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,23 @@ int __ieee80211_suspend(struct ieee80211_hw *hw)

ieee80211_scan_cancel(local);

if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) {
mutex_lock(&local->sta_mtx);
list_for_each_entry(sta, &local->sta_list, list) {
set_sta_flags(sta, WLAN_STA_BLOCK_BA);
ieee80211_sta_tear_down_BA_sessions(sta, true);
}
mutex_unlock(&local->sta_mtx);
}

ieee80211_stop_queues_by_reason(hw,
IEEE80211_QUEUE_STOP_REASON_SUSPEND);

/* flush out all packets */
synchronize_net();

drv_flush(local, false);

local->quiescing = true;
/* make quiescing visible to timers everywhere */
mb();
Expand All @@ -43,11 +54,6 @@ int __ieee80211_suspend(struct ieee80211_hw *hw)
/* 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, true);
}

if (sta->uploaded) {
sdata = sta->sdata;
if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
Expand Down

0 comments on commit ca45de7

Please sign in to comment.