PCI: dwc: Clear MSI interrupt status after it is handled, not before
authorFaiz Abbas <faiz_abbas@ti.com>
Thu, 10 Aug 2017 11:24:55 +0000 (16:54 +0530)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 22 Aug 2017 20:49:33 +0000 (15:49 -0500)
If the interrupt status is cleared before it is handled, it is possible
that another interrupt will trigger while servicing the previous one.  This
is causing timeouts in some wireless lan cards which use PCIe.

Clear MSI interrupt status after it gets serviced instead of before calling
generic_handler.

Signed-off-by: Faiz Abbas <faiz_abbas@ti.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-By: Joao Pinto <jpinto@synopsys.com>
drivers/pci/dwc/pcie-designware-host.c

index 1576211..99cb70b 100644 (file)
@@ -71,9 +71,9 @@ irqreturn_t dw_handle_msi_irq(struct pcie_port *pp)
                while ((pos = find_next_bit((unsigned long *) &val, 32,
                                            pos)) != 32) {
                        irq = irq_find_mapping(pp->irq_domain, i * 32 + pos);
+                       generic_handle_irq(irq);
                        dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_STATUS + i * 12,
                                            4, 1 << pos);
-                       generic_handle_irq(irq);
                        pos++;
                }
        }