mac80211: cancel/restart all timers across suspend/resume
We forgot to cancel all timers in mac80211 when suspending. In particular we forgot to deal with some things that can cause hardware reconfiguration -- while it is down. While at it we go ahead and add a warning in ieee80211_sta_work() if its run while the suspend->resume cycle is in effect. This should not happen and if it does it would indicate there is a bug lurking in either mac80211 or mac80211 drivers. With this now wpa_supplicant doesn't blink when I go to suspend and resume where as before there where issues with some timers running during the suspend->resume cycle. This caused a lot of incorrect assumptions and would at times bring back the device in an incoherent, but mostly recoverable, state. Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com> Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:

committed by
John W. Linville

parent
cc32abd494
commit
5bb644a0fd
@@ -293,6 +293,7 @@ struct ieee80211_if_managed {
|
||||
int auth_tries; /* retries for auth req */
|
||||
int assoc_tries; /* retries for assoc req */
|
||||
|
||||
unsigned long timers_running; /* used for quiesce/restart */
|
||||
bool powersave; /* powersave requested for this iface */
|
||||
|
||||
unsigned long request;
|
||||
@@ -333,6 +334,9 @@ struct ieee80211_if_ibss {
|
||||
|
||||
unsigned long request;
|
||||
unsigned long last_scan_completed;
|
||||
|
||||
bool timer_running;
|
||||
|
||||
bool fixed_bssid;
|
||||
bool fixed_channel;
|
||||
|
||||
@@ -358,6 +362,8 @@ struct ieee80211_if_mesh {
|
||||
struct timer_list mesh_path_timer;
|
||||
struct sk_buff_head skb_queue;
|
||||
|
||||
unsigned long timers_running;
|
||||
|
||||
bool housekeeping;
|
||||
|
||||
u8 mesh_id[IEEE80211_MAX_MESH_ID_LEN];
|
||||
@@ -609,6 +615,21 @@ struct ieee80211_local {
|
||||
unsigned int filter_flags; /* FIF_* */
|
||||
struct iw_statistics wstats;
|
||||
bool tim_in_locked_section; /* see ieee80211_beacon_get() */
|
||||
|
||||
/*
|
||||
* suspended is true if we finished all the suspend _and_ we have
|
||||
* not yet come up from resume. This is to be used by mac80211
|
||||
* to ensure driver sanity during suspend and mac80211's own
|
||||
* sanity. It can eventually be used for WoW as well.
|
||||
*/
|
||||
bool suspended;
|
||||
|
||||
/*
|
||||
* quiescing is true during the suspend process _only_ to
|
||||
* ease timer cancelling etc.
|
||||
*/
|
||||
bool quiescing;
|
||||
|
||||
int tx_headroom; /* required headroom for hardware/radiotap */
|
||||
|
||||
/* Tasklet and skb queue to process calls from IRQ mode. All frames
|
||||
@@ -937,6 +958,8 @@ int ieee80211_max_network_latency(struct notifier_block *nb,
|
||||
void ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
|
||||
struct ieee80211_channel_sw_ie *sw_elem,
|
||||
struct ieee80211_bss *bss);
|
||||
void ieee80211_sta_quiesce(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata);
|
||||
|
||||
/* IBSS code */
|
||||
void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local);
|
||||
@@ -949,6 +972,8 @@ struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
|
||||
int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
|
||||
struct cfg80211_ibss_params *params);
|
||||
int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_ibss_quiesce(struct ieee80211_sub_if_data *sdata);
|
||||
void ieee80211_ibss_restart(struct ieee80211_sub_if_data *sdata);
|
||||
|
||||
/* scan/BSS handling */
|
||||
void ieee80211_scan_work(struct work_struct *work);
|
||||
@@ -959,6 +984,7 @@ int ieee80211_request_scan(struct ieee80211_sub_if_data *sdata,
|
||||
int ieee80211_scan_results(struct ieee80211_local *local,
|
||||
struct iw_request_info *info,
|
||||
char *buf, size_t len);
|
||||
void ieee80211_scan_cancel(struct ieee80211_local *local);
|
||||
ieee80211_rx_result
|
||||
ieee80211_scan_rx(struct ieee80211_sub_if_data *sdata,
|
||||
struct sk_buff *skb,
|
||||
|
Reference in New Issue
Block a user