2011-11-16 12:57:04

by Stanislaw Gruszka

[permalink] [raw]
Subject: [PATCH] rt2x00: handle spurious pci interrupts

We have documented case of very bad performance issue on rt2800pci
device, because it generate spurious interrupt, what cause irq line
is disabled: https://bugzilla.redhat.com/show_bug.cgi?id=658451

We already address that problem in separate patch by returning
IRQ_HANDLED from interrupt handler. We think similar fix is needed for
other rt2x00 PCI devices, because users report performance problems on
these devices too.

Cc: [email protected]
Signed-off-by: Stanislaw Gruszka <[email protected]>
---
drivers/net/wireless/rt2x00/rt2400pci.c | 2 +-
drivers/net/wireless/rt2x00/rt2500pci.c | 2 +-
drivers/net/wireless/rt2x00/rt61pci.c | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 3a6b402..676c765 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1380,7 +1380,7 @@ static irqreturn_t rt2400pci_interrupt(int irq, void *dev_instance)
rt2x00pci_register_write(rt2x00dev, CSR7, reg);

if (!reg)
- return IRQ_NONE;
+ return IRQ_HANDLED;

if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
return IRQ_HANDLED;
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index dcc0e1f..d0b627c 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1512,7 +1512,7 @@ static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)
rt2x00pci_register_write(rt2x00dev, CSR7, reg);

if (!reg)
- return IRQ_NONE;
+ return IRQ_HANDLED;

if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
return IRQ_HANDLED;
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index bf55b4a..9d83e70 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -2337,7 +2337,7 @@ static irqreturn_t rt61pci_interrupt(int irq, void *dev_instance)
rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg);

if (!reg && !reg_mcu)
- return IRQ_NONE;
+ return IRQ_HANDLED;

if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
return IRQ_HANDLED;
--
1.7.1



2011-11-16 13:02:53

by Ivo Van Doorn

[permalink] [raw]
Subject: Re: [PATCH] rt2x00: handle spurious pci interrupts

On Wed, Nov 16, 2011 at 1:58 PM, Stanislaw Gruszka <[email protected]> wrote:
> We have documented case of very bad performance issue on rt2800pci
> device, because it generate spurious interrupt, what cause irq line
> is disabled: https://bugzilla.redhat.com/show_bug.cgi?id=658451
>
> We already address that problem in separate patch by returning
> IRQ_HANDLED from interrupt handler. We think similar fix is needed for
> other rt2x00 PCI devices, because users report performance problems on
> these devices too.
>
> Cc: [email protected]
> Signed-off-by: Stanislaw Gruszka <[email protected]>

Acked-by: Ivo van Doorn <[email protected]>

> ---
> ?drivers/net/wireless/rt2x00/rt2400pci.c | ? ?2 +-
> ?drivers/net/wireless/rt2x00/rt2500pci.c | ? ?2 +-
> ?drivers/net/wireless/rt2x00/rt61pci.c ? | ? ?2 +-
> ?3 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
> index 3a6b402..676c765 100644
> --- a/drivers/net/wireless/rt2x00/rt2400pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2400pci.c
> @@ -1380,7 +1380,7 @@ static irqreturn_t rt2400pci_interrupt(int irq, void *dev_instance)
> ? ? ? ?rt2x00pci_register_write(rt2x00dev, CSR7, reg);
>
> ? ? ? ?if (!reg)
> - ? ? ? ? ? ? ? return IRQ_NONE;
> + ? ? ? ? ? ? ? return IRQ_HANDLED;
>
> ? ? ? ?if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
> ? ? ? ? ? ? ? ?return IRQ_HANDLED;
> diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
> index dcc0e1f..d0b627c 100644
> --- a/drivers/net/wireless/rt2x00/rt2500pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2500pci.c
> @@ -1512,7 +1512,7 @@ static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance)
> ? ? ? ?rt2x00pci_register_write(rt2x00dev, CSR7, reg);
>
> ? ? ? ?if (!reg)
> - ? ? ? ? ? ? ? return IRQ_NONE;
> + ? ? ? ? ? ? ? return IRQ_HANDLED;
>
> ? ? ? ?if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
> ? ? ? ? ? ? ? ?return IRQ_HANDLED;
> diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
> index bf55b4a..9d83e70 100644
> --- a/drivers/net/wireless/rt2x00/rt61pci.c
> +++ b/drivers/net/wireless/rt2x00/rt61pci.c
> @@ -2337,7 +2337,7 @@ static irqreturn_t rt61pci_interrupt(int irq, void *dev_instance)
> ? ? ? ?rt2x00pci_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
>
> ? ? ? ?if (!reg && !reg_mcu)
> - ? ? ? ? ? ? ? return IRQ_NONE;
> + ? ? ? ? ? ? ? return IRQ_HANDLED;
>
> ? ? ? ?if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
> ? ? ? ? ? ? ? ?return IRQ_HANDLED;
> --
> 1.7.1
>
>