PCI: microchip: Fix potential race in interrupt handling
[platform/kernel/linux-rpi.git] / drivers / pci / controller / pcie-microchip-host.c
index 329f930..fa209ad 100644 (file)
@@ -416,6 +416,7 @@ static void mc_handle_msi(struct irq_desc *desc)
 
        status = readl_relaxed(bridge_base_addr + ISTATUS_LOCAL);
        if (status & PM_MSI_INT_MSI_MASK) {
+               writel_relaxed(status & PM_MSI_INT_MSI_MASK, bridge_base_addr + ISTATUS_LOCAL);
                status = readl_relaxed(bridge_base_addr + ISTATUS_MSI);
                for_each_set_bit(bit, &status, msi->num_vectors) {
                        ret = generic_handle_domain_irq(msi->dev_domain, bit);
@@ -432,13 +433,8 @@ static void mc_msi_bottom_irq_ack(struct irq_data *data)
        void __iomem *bridge_base_addr =
                port->axi_base_addr + MC_PCIE_BRIDGE_ADDR;
        u32 bitpos = data->hwirq;
-       unsigned long status;
 
        writel_relaxed(BIT(bitpos), bridge_base_addr + ISTATUS_MSI);
-       status = readl_relaxed(bridge_base_addr + ISTATUS_MSI);
-       if (!status)
-               writel_relaxed(BIT(PM_MSI_INT_MSI_SHIFT),
-                              bridge_base_addr + ISTATUS_LOCAL);
 }
 
 static void mc_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)