diff mbox series

[v1] ath9k: fix intr_txqs setting

Message ID 20211116220720.30145-1-ps.report@gmx.net (mailing list archive)
State Accepted
Commit 5125b9a9c420ee91e2c258ea96a8261a49e7449d
Delegated to: Kalle Valo
Headers show
Series [v1] ath9k: fix intr_txqs setting | expand

Commit Message

Peter Seiderer Nov. 16, 2021, 10:07 p.m. UTC
The struct ath_hw member intr_txqs is never reset/assigned outside
of ath9k_hw_init_queues() and with the used bitwise-or in the interrupt
handling ar9002_hw_get_isr() accumulates all ever set interrupt flags.

Fix this by using a pure assign instead of bitwise-or for the
first line (note: intr_txqs is only evaluated in case ATH9K_INT_TX bit
is set).

Signed-off-by: Peter Seiderer <ps.report@gmx.net>
---
Note:
  - the ath5k_hw member ah_txq_isr_txok_all in ath5k_hw_get_isr()
    (see drivers/net/wireless/ath/ath5k/dma.c) sufferes from the
    same problem and can be fixed by an assignment to zero before
    furhter usage (but I lack suitable hardware for testing)
---
 drivers/net/wireless/ath/ath9k/ar9002_mac.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Kalle Valo Nov. 17, 2021, 8:47 a.m. UTC | #1
Peter Seiderer <ps.report@gmx.net> wrote:

> The struct ath_hw member intr_txqs is never reset/assigned outside
> of ath9k_hw_init_queues() and with the used bitwise-or in the interrupt
> handling ar9002_hw_get_isr() accumulates all ever set interrupt flags.
> 
> Fix this by using a pure assign instead of bitwise-or for the
> first line (note: intr_txqs is only evaluated in case ATH9K_INT_TX bit
> is set).
> 
> Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>

How did you test this? I'm getting way too many ath9k patches which have not
been tested on a real device.
Peter Seiderer Nov. 17, 2021, 7:07 p.m. UTC | #2
Hello Kalle,

On Wed, 17 Nov 2021 08:47:40 +0000 (UTC), Kalle Valo <kvalo@codeaurora.org> wrote:

> Peter Seiderer <ps.report@gmx.net> wrote:
>
> > The struct ath_hw member intr_txqs is never reset/assigned outside
> > of ath9k_hw_init_queues() and with the used bitwise-or in the interrupt
> > handling ar9002_hw_get_isr() accumulates all ever set interrupt flags.
> >
> > Fix this by using a pure assign instead of bitwise-or for the
> > first line (note: intr_txqs is only evaluated in case ATH9K_INT_TX bit
> > is set).
> >
> > Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> > Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
>
> How did you test this? I'm getting way too many ath9k patches which have not
> been tested on a real device.
>

Did test it with an Compex WLE200NX 7A card (AR9280) running IBSS mode
against one older (madwifi) and one newer (ath10k) Atheros card using
ping and iperf traffic (investigating some performance degradation
compared to two older cards...., but getting better with the latest
rc80211_minstrel/rc80211_minstrel_ht changes), checked via printk
debugging intr_txqs is not cleared when entering ar9002_hw_get_isr(),
and checked wifi is still working after the change...., can provide more
info and/or debug traces if needed...

Regards,
Peter
Kalle Valo Nov. 18, 2021, 4:18 a.m. UTC | #3
Peter Seiderer <ps.report@gmx.net> writes:

> On Wed, 17 Nov 2021 08:47:40 +0000 (UTC), Kalle Valo <kvalo@codeaurora.org> wrote:
>
>> Peter Seiderer <ps.report@gmx.net> wrote:
>>
>> > The struct ath_hw member intr_txqs is never reset/assigned outside
>> > of ath9k_hw_init_queues() and with the used bitwise-or in the interrupt
>> > handling ar9002_hw_get_isr() accumulates all ever set interrupt flags.
>> >
>> > Fix this by using a pure assign instead of bitwise-or for the
>> > first line (note: intr_txqs is only evaluated in case ATH9K_INT_TX bit
>> > is set).
>> >
>> > Signed-off-by: Peter Seiderer <ps.report@gmx.net>
>> > Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
>>
>> How did you test this? I'm getting way too many ath9k patches which have not
>> been tested on a real device.
>>
>
> Did test it with an Compex WLE200NX 7A card (AR9280) running IBSS mode
> against one older (madwifi) and one newer (ath10k) Atheros card using
> ping and iperf traffic (investigating some performance degradation
> compared to two older cards...., but getting better with the latest
> rc80211_minstrel/rc80211_minstrel_ht changes), checked via printk
> debugging intr_txqs is not cleared when entering ar9002_hw_get_isr(),
> and checked wifi is still working after the change...., can provide more
> info and/or debug traces if needed...

Perfect, thanks!
Kalle Valo Nov. 19, 2021, 8:07 a.m. UTC | #4
Peter Seiderer <ps.report@gmx.net> wrote:

> The struct ath_hw member intr_txqs is never reset/assigned outside
> of ath9k_hw_init_queues() and with the used bitwise-or in the interrupt
> handling ar9002_hw_get_isr() accumulates all ever set interrupt flags.
> 
> Fix this by using a pure assign instead of bitwise-or for the
> first line (note: intr_txqs is only evaluated in case ATH9K_INT_TX bit
> is set).
> 
> Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>

Patch applied to ath-next branch of ath.git, thanks.

5125b9a9c420 ath9k: fix intr_txqs setting
diff mbox series

Patch

diff --git a/drivers/net/wireless/ath/ath9k/ar9002_mac.c b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
index ce9a0a53771e..fba5a847c3bb 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
@@ -120,7 +120,7 @@  static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked,
 					 AR_ISR_TXEOL);
 			}
 
-			ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK);
+			ah->intr_txqs = MS(s0_s, AR_ISR_S0_QCU_TXOK);
 			ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC);
 			ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR);
 			ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL);