diff options
author | Harro Haan <[email protected]> | 2013-12-12 19:29:03 +0100 |
---|---|---|
committer | Bjorn Helgaas <[email protected]> | 2013-12-20 09:03:48 -0700 |
commit | ca1658921b63e5771423603367c5bee528acc977 (patch) | |
tree | 0dc4397dc683b381e7da2494f792a2cac729f84f | |
parent | 0b8cfb6aa3aabc96177b1e68ef13d2eb5c686606 (diff) |
PCI: designware: Fix missing MSI IRQs
The interrupts were cleared after the IRQ handler was called. This means
that new interrupts that occur after the handler handled the previous IRQ
but before the interrupt is cleared will be missed.
Tested-by: Marek Vasut <[email protected]>
Tested-by: Matthias Mann <[email protected]>
Signed-off-by: Harro Haan <[email protected]>
Signed-off-by: Bjorn Helgaas <[email protected]>
Acked-by: Jingoo Han <[email protected]>
Acked-by: Mohit Kumar <[email protected]>
Cc: Richard Zhu <[email protected]>
Cc: Shawn Guo <[email protected]>
Cc: Pratyush Anand <[email protected]>
Cc: Tim Harvey <[email protected]>
Cc: Juergen Beisert <[email protected]>
Cc: Arnd Bergmann <[email protected]>
Cc: Siva Reddy Kallam <[email protected]>
Cc: Srikanth T Shivanand <[email protected]>
Cc: Sean Cross <[email protected]>
-rw-r--r-- | drivers/pci/host/pcie-designware.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index 1c92833a4ed3..c85cac009583 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c @@ -167,11 +167,13 @@ void dw_handle_msi_irq(struct pcie_port *pp) while ((pos = find_next_bit(&val, 32, pos)) != 32) { irq = irq_find_mapping(pp->irq_domain, i * 32 + pos); + dw_pcie_wr_own_conf(pp, + PCIE_MSI_INTR0_STATUS + i * 12, + 4, 1 << pos); generic_handle_irq(irq); pos++; } } - dw_pcie_wr_own_conf(pp, PCIE_MSI_INTR0_STATUS + i * 12, 4, val); } } |