diff options
author | Ben Greear <greearb@candelatech.com> | 2013-02-20 12:41:08 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-02-26 16:47:27 -0500 |
commit | 9b5bd5a4917eeb5eca00d1842a74186cfc8dd1c6 (patch) | |
tree | 091b95a3412105fe1f7c58e54f1717e34d96ad72 /net/mac80211 | |
parent | cb601ffa326bc5c74a6ecd8e72ae9631e5f12f75 (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.c | 14 |
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 | ||
3528 | void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) | 3532 | void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata) |