mac80211: fix cleanup if driver suspend callback fails
authorEyal Shapira <eyal@wizery.com>
Wed, 20 Jun 2012 10:10:14 +0000 (13:10 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 20 Jun 2012 15:39:51 +0000 (17:39 +0200)
In case the driver suspend callback fails, mac80211 is left
with stopped queues which prevents any further traffic as well
as all STAs are left marked with WLAN_STA_BLOCK_BA which will
cause any further ADDBA requests to be declined. Fix it by
undoing both before returning from __iee80211_suspend.

Reported-by: Vitaly Wool <vitalywool@gmail.com>
Signed-off-by: Eyal Shapira <eyal@wizery.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/pm.c

index 98c128be3827a7ada93624cd10a6905d0665584a..5c572e7a1a71dc76949b993f9f57e79223533f49 100644 (file)
@@ -78,6 +78,16 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan)
                if (err < 0) {
                        local->quiescing = false;
                        local->wowlan = false;
+                       if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) {
+                               mutex_lock(&local->sta_mtx);
+                               list_for_each_entry(sta,
+                                                   &local->sta_list, list) {
+                                       clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
+                               }
+                               mutex_unlock(&local->sta_mtx);
+                       }
+                       ieee80211_wake_queues_by_reason(hw,
+                                       IEEE80211_QUEUE_STOP_REASON_SUSPEND);
                        return err;
                } else if (err > 0) {
                        WARN_ON(err != 1);