PCI: xilinx: Clear interrupt register for invalid interrupt
authorBharat Kumar Gogada <bharat.kumar.gogada@xilinx.com>
Thu, 1 Sep 2016 10:14:42 +0000 (15:44 +0530)
committerBjorn Helgaas <bhelgaas@google.com>
Tue, 13 Sep 2016 15:38:19 +0000 (10:38 -0500)
The interrupt decode register is not being cleared if an invalid interrupt
arises.  Clear the decode register in this case.

Signed-off-by: Bharat Kumar Gogada <bharatku@xilinx.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Michal Simek <michal.simek@xilinx.com>
drivers/pci/host/pcie-xilinx.c

index bd646772b001deb4ae240cc1b1451e8ce5be582f..de1c758d17d778ad2c98a67bcc968472fca6cc87 100644 (file)
@@ -434,7 +434,7 @@ static irqreturn_t xilinx_pcie_intr_handler(int irq, void *data)
                /* Check whether interrupt valid */
                if (!(val & XILINX_PCIE_RPIFR1_INTR_VALID)) {
                        dev_warn(port->dev, "RP Intr FIFO1 read error\n");
-                       return IRQ_HANDLED;
+                       goto error;
                }
 
                if (!(val & XILINX_PCIE_RPIFR1_MSI_INTR)) {
@@ -456,7 +456,7 @@ static irqreturn_t xilinx_pcie_intr_handler(int irq, void *data)
 
                if (!(val & XILINX_PCIE_RPIFR1_INTR_VALID)) {
                        dev_warn(port->dev, "RP Intr FIFO1 read error\n");
-                       return IRQ_HANDLED;
+                       goto error;
                }
 
                if (val & XILINX_PCIE_RPIFR1_MSI_INTR) {
@@ -501,6 +501,7 @@ static irqreturn_t xilinx_pcie_intr_handler(int irq, void *data)
        if (status & XILINX_PCIE_INTR_MST_ERRP)
                dev_warn(port->dev, "Master error poison\n");
 
+error:
        /* Clear the Interrupt Decode register */
        pcie_write(port, status, XILINX_PCIE_REG_IDR);