diff mbox series

[PATCHv3] wlcore: clean-up clearing of WL1271_FLAG_IRQ_RUNNING

Message ID 20191009165006.41567-1-tony@atomide.com (mailing list archive)
State New, archived
Headers show
Series [PATCHv3] wlcore: clean-up clearing of WL1271_FLAG_IRQ_RUNNING | expand

Commit Message

Tony Lindgren Oct. 9, 2019, 4:50 p.m. UTC
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(-)

Comments

Kalle Valo Oct. 11, 2019, 8:56 a.m. UTC | #1
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 mbox series

Patch

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;
 }