aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorBen Greear <greearb@candelatech.com>2013-02-20 12:41:08 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-02-26 16:47:27 -0500
commit9b5bd5a4917eeb5eca00d1842a74186cfc8dd1c6 (patch)
tree091b95a3412105fe1f7c58e54f1717e34d96ad72 /net/mac80211
parentcb601ffa326bc5c74a6ecd8e72ae9631e5f12f75 (diff)
mac80211: stop timers before canceling work items
Re-order the quiesce code so that timers are always stopped before work-items are flushed. This was not the problem I saw, but I think it may still be more correct. Signed-off-by: Ben Greear <greearb@candelatech.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/mlme.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 9f6464f3e05f..6044c6d87e4c 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -3503,6 +3503,14 @@ void ieee80211_sta_quiesce(struct ieee80211_sub_if_data *sdata)
3503 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; 3503 struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3504 3504
3505 /* 3505 /*
3506 * Stop timers before deleting work items, as timers
3507 * could race and re-add the work-items. They will be
3508 * re-established on connection.
3509 */
3510 del_timer_sync(&ifmgd->conn_mon_timer);
3511 del_timer_sync(&ifmgd->bcn_mon_timer);
3512
3513 /*
3506 * we need to use atomic bitops for the running bits 3514 * we need to use atomic bitops for the running bits
3507 * only because both timers might fire at the same 3515 * only because both timers might fire at the same
3508 * time -- the code here is properly synchronised. 3516 * time -- the code here is properly synchronised.
@@ -3516,13 +3524,9 @@ void ieee80211_sta_quiesce(struct ieee80211_sub_if_data *sdata)
3516 if (del_timer_sync(&ifmgd->timer)) 3524 if (del_timer_sync(&ifmgd->timer))
3517 set_bit(TMR_RUNNING_TIMER, &ifmgd->timers_running); 3525 set_bit(TMR_RUNNING_TIMER, &ifmgd->timers_running);
3518 3526
3519 cancel_work_sync(&ifmgd->chswitch_work);
3520 if (del_timer_sync(&ifmgd->chswitch_timer)) 3527 if (del_timer_sync(&ifmgd->chswitch_timer))
3521 set_bit(TMR_RUNNING_CHANSW, &ifmgd->timers_running); 3528 set_bit(TMR_RUNNING_CHANSW, &ifmgd->timers_running);
3522 3529 cancel_work_sync(&ifmgd->chswitch_work);
3523 /* these will just be re-established on connection */
3524 del_timer_sync(&ifmgd->conn_mon_timer);
3525 del_timer_sync(&ifmgd->bcn_mon_timer);
3526} 3530}
3527 3531
3528void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) 3532void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata)