From: Oza Pawandeep <poza@xxxxxxxxxxxxxx> The DPC driver was acknowledging the DPC interrupt status in deferred work. That works for edge triggered interrupts, but causes an interrupt storm with level triggered legacy interrupts. This patch fixes that by clearing the interrupt status in interrupt handler. Signed-off-by: Oza Pawandeep <poza@xxxxxxxxxxxxxx> [changelog] Reviewed-by: Keith Busch <keith.busch@xxxxxxxxx> --- drivers/pci/pcie/pcie-dpc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/pci/pcie/pcie-dpc.c b/drivers/pci/pcie/pcie-dpc.c index a9be6938417f..82644245cb4d 100644 --- a/drivers/pci/pcie/pcie-dpc.c +++ b/drivers/pci/pcie/pcie-dpc.c @@ -112,7 +112,7 @@ static void dpc_work(struct work_struct *work) } pci_write_config_word(pdev, cap + PCI_EXP_DPC_STATUS, - PCI_EXP_DPC_STATUS_TRIGGER | PCI_EXP_DPC_STATUS_INTERRUPT); + PCI_EXP_DPC_STATUS_TRIGGER); pci_read_config_word(pdev, cap + PCI_EXP_DPC_CTL, &ctl); pci_write_config_word(pdev, cap + PCI_EXP_DPC_CTL, @@ -222,6 +222,9 @@ static irqreturn_t dpc_irq(int irq, void *context) if (dpc->rp_extensions && reason == 3 && ext_reason == 0) dpc_process_rp_pio_error(dpc); + pci_write_config_word(pdev, cap + PCI_EXP_DPC_STATUS, + PCI_EXP_DPC_STATUS_INTERRUPT); + schedule_work(&dpc->work); return IRQ_HANDLED; -- 2.14.3