wl1251: fix elp_work race condition
While working on PS I've noticed elp_work is kicking rather often, and sometimes the chip is put to sleep before 5ms delay expires. This seems to happen because by the time wl1251_ps_elp_wakeup is called elp_work might still be pending. After wakeup is done, the processing may take some time, during which 5ms might expire and elp_work might get scheduled. In this case, ss soon as 1st thread finishes work and releases the mutex, elp_work will then put the device to sleep without 5ms delay. In addition 1st thread will queue additional elp_work needlessly. Fix this by cancelling work in wl1251_ps_elp_wakeup instead. Signed-off-by: Grazvydas Ignotas <notasas@gmail.com> Acked-by: Kalle Valo <kvalo@adurom.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
d0c331aff9
commit
5f6722ee63
1 changed files with 3 additions and 1 deletions
|
@ -58,7 +58,6 @@ void wl1251_ps_elp_sleep(struct wl1251 *wl)
|
|||
unsigned long delay;
|
||||
|
||||
if (wl->psm) {
|
||||
cancel_delayed_work(&wl->elp_work);
|
||||
delay = msecs_to_jiffies(ELP_ENTRY_DELAY);
|
||||
ieee80211_queue_delayed_work(wl->hw, &wl->elp_work, delay);
|
||||
}
|
||||
|
@ -69,6 +68,9 @@ int wl1251_ps_elp_wakeup(struct wl1251 *wl)
|
|||
unsigned long timeout, start;
|
||||
u32 elp_reg;
|
||||
|
||||
if (delayed_work_pending(&wl->elp_work))
|
||||
cancel_delayed_work(&wl->elp_work);
|
||||
|
||||
if (!wl->elp)
|
||||
return 0;
|
||||
|
||||
|
|
Reference in a new issue