aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHarro Haan <[email protected]>2013-12-12 19:29:03 +0100
committerBjorn Helgaas <[email protected]>2013-12-20 09:03:48 -0700
commitca1658921b63e5771423603367c5bee528acc977 (patch)
tree0dc4397dc683b381e7da2494f792a2cac729f84f
parent0b8cfb6aa3aabc96177b1e68ef13d2eb5c686606 (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.c4
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);
}
}