rt2x00: handle spurious pci interrupts
authorStanislaw Gruszka <sgruszka@redhat.com>
Wed, 16 Nov 2011 12:58:42 +0000 (13:58 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 17 Nov 2011 19:39:30 +0000 (14:39 -0500)
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: stable@vger.kernel.org
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Acked-by: Ivo van Doorn <IvDoorn@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/rt2x00/rt2400pci.c
drivers/net/wireless/rt2x00/rt2500pci.c
drivers/net/wireless/rt2x00/rt61pci.c

index 3a6b402..676c765 100644 (file)
@@ -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;
index dcc0e1f..d0b627c 100644 (file)
@@ -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;
index bf55b4a..9d83e70 100644 (file)
@@ -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;