* [PATCH 3.19] ath9k: fix race condition in irq processing during hardware reset
@ 2015-01-14 13:17 Felix Fietkau
2015-01-15 9:09 ` Sujith Manoharan
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Felix Fietkau @ 2015-01-14 13:17 UTC (permalink / raw)
To: linux-wireless; +Cc: kvalo
To fix invalid hardware accesses, the commit
"ath9k: do not access hardware on IRQs during reset" made the irq
handler ignore interrupts emitted after queueing a hardware reset (which
disables the IRQ). This left a small time window for the IRQ to get
re-enabled by the tasklet, which caused IRQ storms.
Instead of returning IRQ_NONE when ATH_OP_HW_RESET is set, disable the
IRQ entirely for the duration of the reset.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
---
drivers/net/wireless/ath/ath9k/main.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 9a72640..62b0bf4 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -285,6 +285,7 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan)
__ath_cancel_work(sc);
+ disable_irq(sc->irq);
tasklet_disable(&sc->intr_tq);
tasklet_disable(&sc->bcon_tasklet);
spin_lock_bh(&sc->sc_pcu_lock);
@@ -331,6 +332,7 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan)
r = -EIO;
out:
+ enable_irq(sc->irq);
spin_unlock_bh(&sc->sc_pcu_lock);
tasklet_enable(&sc->bcon_tasklet);
tasklet_enable(&sc->intr_tq);
@@ -512,9 +514,6 @@ irqreturn_t ath_isr(int irq, void *dev)
if (!ah || test_bit(ATH_OP_INVALID, &common->op_flags))
return IRQ_NONE;
- if (!AR_SREV_9100(ah) && test_bit(ATH_OP_HW_RESET, &common->op_flags))
- return IRQ_NONE;
-
/* shared irq, not for us */
if (!ath9k_hw_intrpend(ah))
return IRQ_NONE;
@@ -529,7 +528,7 @@ irqreturn_t ath_isr(int irq, void *dev)
ath9k_debug_sync_cause(sc, sync_cause);
status &= ah->imask; /* discard unasked-for bits */
- if (AR_SREV_9100(ah) && test_bit(ATH_OP_HW_RESET, &common->op_flags))
+ if (test_bit(ATH_OP_HW_RESET, &common->op_flags))
return IRQ_HANDLED;
/*
--
2.1.2
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH 3.19] ath9k: fix race condition in irq processing during hardware reset
2015-01-14 13:17 [PATCH 3.19] ath9k: fix race condition in irq processing during hardware reset Felix Fietkau
@ 2015-01-15 9:09 ` Sujith Manoharan
2015-01-15 9:46 ` Felix Fietkau
[not found] ` <1459283661.83111.1421395216463.JavaMail.zimbra@neratec.com>
2015-01-19 12:36 ` Kalle Valo
2 siblings, 1 reply; 8+ messages in thread
From: Sujith Manoharan @ 2015-01-15 9:09 UTC (permalink / raw)
To: Felix Fietkau; +Cc: linux-wireless, kvalo
Felix Fietkau wrote:
> To fix invalid hardware accesses, the commit
> "ath9k: do not access hardware on IRQs during reset" made the irq
> handler ignore interrupts emitted after queueing a hardware reset (which
> disables the IRQ). This left a small time window for the IRQ to get
> re-enabled by the tasklet, which caused IRQ storms.
> Instead of returning IRQ_NONE when ATH_OP_HW_RESET is set, disable the
> IRQ entirely for the duration of the reset.
Doesn't this make the kill_interrupts() that was added in the earlier
commit unnecessary now ?
Sujith
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH 3.19] ath9k: fix race condition in irq processing during hardware reset
2015-01-15 9:09 ` Sujith Manoharan
@ 2015-01-15 9:46 ` Felix Fietkau
0 siblings, 0 replies; 8+ messages in thread
From: Felix Fietkau @ 2015-01-15 9:46 UTC (permalink / raw)
To: Sujith Manoharan; +Cc: linux-wireless, kvalo
On 2015-01-15 10:09, Sujith Manoharan wrote:
> Felix Fietkau wrote:
>> To fix invalid hardware accesses, the commit
>> "ath9k: do not access hardware on IRQs during reset" made the irq
>> handler ignore interrupts emitted after queueing a hardware reset (which
>> disables the IRQ). This left a small time window for the IRQ to get
>> re-enabled by the tasklet, which caused IRQ storms.
>> Instead of returning IRQ_NONE when ATH_OP_HW_RESET is set, disable the
>> IRQ entirely for the duration of the reset.
>
> Doesn't this make the kill_interrupts() that was added in the earlier
> commit unnecessary now ?
I think it's still a good idea to try to silence interrupts between
queueing a reset and actually performing it.
- Felix
^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <1459283661.83111.1421395216463.JavaMail.zimbra@neratec.com>]
* Re: [PATCH 3.19] ath9k: fix race condition in irq processing during hardware reset
[not found] ` <1459283661.83111.1421395216463.JavaMail.zimbra@neratec.com>
@ 2015-01-16 8:00 ` Rico Derrer
2015-01-16 10:41 ` Felix Fietkau
0 siblings, 1 reply; 8+ messages in thread
From: Rico Derrer @ 2015-01-16 8:00 UTC (permalink / raw)
To: Felix Fietkau; +Cc: linux-wireless, kvalo
Hi Felix
Felix Fietkau wrote:
> diff --git a/drivers/net/wireless/ath/ath9k/main.c
> b/drivers/net/wireless/ath/ath9k/main.c
> index 9a72640..62b0bf4 100644
> --- a/drivers/net/wireless/ath/ath9k/main.c
> +++ b/drivers/net/wireless/ath/ath9k/main.c
> @@ -285,6 +285,7 @@ static int ath_reset_internal(struct ath_softc *sc, struct
> ath9k_channel *hchan)
>
> __ath_cancel_work(sc);
>
> + disable_irq(sc->irq);
> tasklet_disable(&sc->intr_tq);
> tasklet_disable(&sc->bcon_tasklet);
> spin_lock_bh(&sc->sc_pcu_lock);
> @@ -331,6 +332,7 @@ static int ath_reset_internal(struct ath_softc *sc, struct
> ath9k_channel *hchan)
> r = -EIO;
>
> out:
> + enable_irq(sc->irq);
> spin_unlock_bh(&sc->sc_pcu_lock);
> tasklet_enable(&sc->bcon_tasklet);
> tasklet_enable(&sc->intr_tq);
This part completely blocks the system on a AR9350. Loading the module works but configuring it hangs the system until watchdog restarts it.
Regards
Rico
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH 3.19] ath9k: fix race condition in irq processing during hardware reset
2015-01-16 8:00 ` Rico Derrer
@ 2015-01-16 10:41 ` Felix Fietkau
[not found] ` <1998405401.90208.1421656011302.JavaMail.zimbra@neratec.com>
0 siblings, 1 reply; 8+ messages in thread
From: Felix Fietkau @ 2015-01-16 10:41 UTC (permalink / raw)
To: Rico Derrer; +Cc: linux-wireless, kvalo
On 2015-01-16 09:00, Rico Derrer wrote:
> Hi Felix
>
> Felix Fietkau wrote:
>> diff --git a/drivers/net/wireless/ath/ath9k/main.c
>> b/drivers/net/wireless/ath/ath9k/main.c
>> index 9a72640..62b0bf4 100644
>> --- a/drivers/net/wireless/ath/ath9k/main.c
>> +++ b/drivers/net/wireless/ath/ath9k/main.c
>> @@ -285,6 +285,7 @@ static int ath_reset_internal(struct ath_softc *sc, struct
>> ath9k_channel *hchan)
>>
>> __ath_cancel_work(sc);
>>
>> + disable_irq(sc->irq);
>> tasklet_disable(&sc->intr_tq);
>> tasklet_disable(&sc->bcon_tasklet);
>> spin_lock_bh(&sc->sc_pcu_lock);
>> @@ -331,6 +332,7 @@ static int ath_reset_internal(struct ath_softc *sc, struct
>> ath9k_channel *hchan)
>> r = -EIO;
>>
>> out:
>> + enable_irq(sc->irq);
>> spin_unlock_bh(&sc->sc_pcu_lock);
>> tasklet_enable(&sc->bcon_tasklet);
>> tasklet_enable(&sc->intr_tq);
>
> This part completely blocks the system on a AR9350. Loading the
> module works but configuring it hangs the system until watchdog restarts it.
What kernel/software are you running on there? When I committed this
patch to OpenWrt, it uncovered IRQ handling bugs in MIPS kernel code
(both generic and in the ath79 platform code).
You can find the fixes that I've made here:
http://git.openwrt.org/?p=openwrt.git;a=blob_plain;f=target/linux/generic/patches-3.14/130-mips_cpu_irq_disable.patch
http://git.openwrt.org/?p=openwrt.git;a=blob_plain;f=target/linux/ar71xx/patches-3.14/736-MIPS-ath79-fix-chained-irq-disable.patch
I've already submitted the first one to linux-mips.
- Felix
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 3.19] ath9k: fix race condition in irq processing during hardware reset
2015-01-14 13:17 [PATCH 3.19] ath9k: fix race condition in irq processing during hardware reset Felix Fietkau
2015-01-15 9:09 ` Sujith Manoharan
[not found] ` <1459283661.83111.1421395216463.JavaMail.zimbra@neratec.com>
@ 2015-01-19 12:36 ` Kalle Valo
2 siblings, 0 replies; 8+ messages in thread
From: Kalle Valo @ 2015-01-19 12:36 UTC (permalink / raw)
To: Felix Fietkau; +Cc: linux-wireless
Felix Fietkau <nbd@openwrt.org> writes:
> To fix invalid hardware accesses, the commit
> "ath9k: do not access hardware on IRQs during reset" made the irq
> handler ignore interrupts emitted after queueing a hardware reset (which
> disables the IRQ). This left a small time window for the IRQ to get
> re-enabled by the tasklet, which caused IRQ storms.
> Instead of returning IRQ_NONE when ATH_OP_HW_RESET is set, disable the
> IRQ entirely for the duration of the reset.
>
> Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Thanks, applied to wireless-drivers.git. I made a small change and added
the commit id to the commit log:
commit e3f31175a3eeb492a6ab788e4fa136c19b43aab4
Author: Felix Fietkau <nbd@openwrt.org>
Date: Wed Jan 14 14:17:36 2015 +0100
ath9k: fix race condition in irq processing during hardware reset
To fix invalid hardware accesses, the commit 872b5d814f99 ("ath9k: do not
access hardware on IRQs during reset") made the irq handler ignore interrupts
emitted after queueing a hardware reset (which disables the IRQ). This left a
small time window for the IRQ to get re-enabled by the tasklet, which caused
IRQ storms. Instead of returning IRQ_NONE when ATH_OP_HW_RESET is set, disable
the IRQ entirely for the duration of the reset.
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
--
Kalle Valo
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2015-01-19 12:37 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-01-14 13:17 [PATCH 3.19] ath9k: fix race condition in irq processing during hardware reset Felix Fietkau
2015-01-15 9:09 ` Sujith Manoharan
2015-01-15 9:46 ` Felix Fietkau
[not found] ` <1459283661.83111.1421395216463.JavaMail.zimbra@neratec.com>
2015-01-16 8:00 ` Rico Derrer
2015-01-16 10:41 ` Felix Fietkau
[not found] ` <1998405401.90208.1421656011302.JavaMail.zimbra@neratec.com>
2015-01-19 8:26 ` Rico Derrer
2015-01-19 12:37 ` Kalle Valo
2015-01-19 12:36 ` Kalle Valo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).