Message ID | 20191009165006.41567-1-tony@atomide.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 4633d30b61ac1415817b954c3d4d241ca7439a7c |
Delegated to: | Kalle Valo |
Headers | show |
Series | [PATCHv3] wlcore: clean-up clearing of WL1271_FLAG_IRQ_RUNNING | expand |
Tony Lindgren <tony@atomide.com> wrote: > We set WL1271_FLAG_IRQ_RUNNING in the beginning of wlcore_irq(), but clear > it before interrupt handling is done in wlcore_irq_locked(). > > Let's move the clearing to the end of wlcore_irq() where it gets set, > and remove the old comments about hardirq. That's no longer the case as > we're using request_threaded_irq(). > > Note that the WL1271_FLAG_IRQ_RUNNING should never race between the > interrupt handler and wlcore_runtime_resume() as because of autosuspend > timeout we cannot enter idle between wlcore_irq_locked() and the end of > wlcore_irq(). > > Cc: Anders Roxell <anders.roxell@linaro.org> > Cc: Eyal Reizer <eyalr@ti.com> > Cc: Guy Mishol <guym@ti.com> > Cc: John Stultz <john.stultz@linaro.org> > Cc: Ulf Hansson <ulf.hansson@linaro.org> > Signed-off-by: Tony Lindgren <tony@atomide.com> Patch applied to wireless-drivers-next.git, thanks. 4633d30b61ac wlcore: clean-up clearing of WL1271_FLAG_IRQ_RUNNING
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c --- a/drivers/net/wireless/ti/wlcore/main.c +++ b/drivers/net/wireless/ti/wlcore/main.c @@ -544,11 +544,6 @@ static int wlcore_irq_locked(struct wl1271 *wl) } while (!done && loopcount--) { - /* - * In order to avoid a race with the hardirq, clear the flag - * before acknowledging the chip. - */ - clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags); smp_mb__after_atomic(); ret = wlcore_fw_status(wl, wl->fw_status); @@ -668,7 +663,7 @@ static irqreturn_t wlcore_irq(int irq, void *cookie) disable_irq_nosync(wl->irq); pm_wakeup_event(wl->dev, 0); spin_unlock_irqrestore(&wl->wl_lock, flags); - return IRQ_HANDLED; + goto out_handled; } spin_unlock_irqrestore(&wl->wl_lock, flags); @@ -692,6 +687,11 @@ static irqreturn_t wlcore_irq(int irq, void *cookie) mutex_unlock(&wl->mutex); +out_handled: + spin_lock_irqsave(&wl->wl_lock, flags); + clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags); + spin_unlock_irqrestore(&wl->wl_lock, flags); + return IRQ_HANDLED; }
We set WL1271_FLAG_IRQ_RUNNING in the beginning of wlcore_irq(), but clear it before interrupt handling is done in wlcore_irq_locked(). Let's move the clearing to the end of wlcore_irq() where it gets set, and remove the old comments about hardirq. That's no longer the case as we're using request_threaded_irq(). Note that the WL1271_FLAG_IRQ_RUNNING should never race between the interrupt handler and wlcore_runtime_resume() as because of autosuspend timeout we cannot enter idle between wlcore_irq_locked() and the end of wlcore_irq(). Cc: Anders Roxell <anders.roxell@linaro.org> Cc: Eyal Reizer <eyalr@ti.com> Cc: Guy Mishol <guym@ti.com> Cc: John Stultz <john.stultz@linaro.org> Cc: Ulf Hansson <ulf.hansson@linaro.org> Signed-off-by: Tony Lindgren <tony@atomide.com> Changes since v2: - Downgraded to clean-up from a fix as the race should never happen Changes since v1: - Add locking around clear_bit like we do elsewhere in the driver --- drivers/net/wireless/ti/wlcore/main.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)