diff options
| -rw-r--r-- | net/mac80211/ieee80211_i.h | 1 | ||||
| -rw-r--r-- | net/mac80211/mlme.c | 25 | ||||
| -rw-r--r-- | net/mac80211/util.c | 7 | 
3 files changed, 33 insertions, 0 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 158e6eb188d..44be28cfc6c 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -1267,6 +1267,7 @@ void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata);  void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata);  void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata,  				  __le16 fc, bool acked); +void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata);  /* IBSS code */  void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local); diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 29620bfc7a6..8a948ca55d8 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c @@ -3623,6 +3623,31 @@ static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)  	}  } +#ifdef CONFIG_PM +void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) +{ +	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; + +	mutex_lock(&ifmgd->mtx); +	if (!ifmgd->associated) { +		mutex_unlock(&ifmgd->mtx); +		return; +	} + +	if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) { +		sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME; +		mlme_dbg(sdata, "driver requested disconnect after resume\n"); +		ieee80211_sta_connection_lost(sdata, +					      ifmgd->associated->bssid, +					      WLAN_REASON_UNSPECIFIED, +					      true); +		mutex_unlock(&ifmgd->mtx); +		return; +	} +	mutex_unlock(&ifmgd->mtx); +} +#endif +  /* interface setup */  void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)  { diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 3f87fa468b1..27e07150eb4 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c @@ -1740,6 +1740,13 @@ int ieee80211_reconfig(struct ieee80211_local *local)  	mb();  	local->resuming = false; +	list_for_each_entry(sdata, &local->interfaces, list) { +		if (!ieee80211_sdata_running(sdata)) +			continue; +		if (sdata->vif.type == NL80211_IFTYPE_STATION) +			ieee80211_sta_restart(sdata); +	} +  	mod_timer(&local->sta_cleanup, jiffies + 1);  #else  	WARN_ON(1);  |