Message ID | 1421871574-18789-1-git-send-email-luca@coelho.fi (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Johannes Berg |
Headers | show |
On Wed, 2015-01-21 at 22:19 +0200, Luca Coelho wrote: > From: Luciano Coelho <luciano.coelho@intel.com> > > In normal cases (i.e. when we are fully associated), cfg80211 takes > care of removing all the stations before calling suspend in mac80211. > > But in the corner case when we suspend during authentication or > association, mac80211 needs to roll back the station states. But we > shouldn't roll back the station states in the suspend function, > because this is taken care of in other parts of the code, except for > WDS interfaces. For AP types of interfaces, cfg80211 takes care of > disconnecting all stations before calling the driver's suspend code. > For station interfaces, this is done in the quiesce code. > > For WDS interfaces we still need to do it here, so move the code into > a new switch case for WDS. Applied. johannes -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index 8c8c678..ca405b6 100644 --- a/net/mac80211/pm.c +++ b/net/mac80211/pm.c @@ -86,20 +86,6 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) } } - /* tear down aggregation sessions and remove STAs */ - mutex_lock(&local->sta_mtx); - list_for_each_entry(sta, &local->sta_list, list) { - if (sta->uploaded) { - enum ieee80211_sta_state state; - - state = sta->sta_state; - for (; state > IEEE80211_STA_NOTEXIST; state--) - WARN_ON(drv_sta_state(local, sta->sdata, sta, - state, state - 1)); - } - } - mutex_unlock(&local->sta_mtx); - /* remove all interfaces that were created in the driver */ list_for_each_entry(sdata, &local->interfaces, list) { if (!ieee80211_sdata_running(sdata)) @@ -111,6 +97,21 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) case NL80211_IFTYPE_STATION: ieee80211_mgd_quiesce(sdata); break; + case NL80211_IFTYPE_WDS: + /* tear down aggregation sessions and remove STAs */ + mutex_lock(&local->sta_mtx); + sta = sdata->u.wds.sta; + if (sta && sta->uploaded) { + enum ieee80211_sta_state state; + + state = sta->sta_state; + for (; state > IEEE80211_STA_NOTEXIST; state--) + WARN_ON(drv_sta_state(local, sta->sdata, + sta, state, + state - 1)); + } + mutex_unlock(&local->sta_mtx); + break; default: break; }