On Fri, Dec 29, 2017 at 05:11:31PM +0530, Vignesh R wrote: > It is possible that more than one legacy IRQ may be set at the same > time, therefore iterate and handle all the pending INTx interrupts > before clearing the status and exiting the IRQ handler. Otherwise, some > interrupts would be lost. > > Signed-off-by: Vignesh R <vigneshr@xxxxxx> > --- > drivers/pci/dwc/pci-dra7xx.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) Applied to pci/dwc for v4.16, thanks. Lorenzo > diff --git a/drivers/pci/dwc/pci-dra7xx.c b/drivers/pci/dwc/pci-dra7xx.c > index 892f93910012..48c6ae535847 100644 > --- a/drivers/pci/dwc/pci-dra7xx.c > +++ b/drivers/pci/dwc/pci-dra7xx.c > @@ -257,7 +257,8 @@ static irqreturn_t dra7xx_pcie_msi_irq_handler(int irq, void *arg) > struct dra7xx_pcie *dra7xx = arg; > struct dw_pcie *pci = dra7xx->pci; > struct pcie_port *pp = &pci->pp; > - u32 reg; > + unsigned long reg; > + u32 virq, bit; > > reg = dra7xx_pcie_readl(dra7xx, PCIECTRL_DRA7XX_CONF_IRQSTATUS_MSI); > > @@ -269,8 +270,11 @@ static irqreturn_t dra7xx_pcie_msi_irq_handler(int irq, void *arg) > case INTB: > case INTC: > case INTD: > - generic_handle_irq(irq_find_mapping(dra7xx->irq_domain, > - ffs(reg) - 1)); > + for_each_set_bit(bit, ®, PCI_NUM_INTX) { > + virq = irq_find_mapping(dra7xx->irq_domain, bit); > + if (virq) > + generic_handle_irq(virq); > + } > break; > } > > -- > 2.15.1 >