Commit 526c101d authored by Hou Zhiqiang's avatar Hou Zhiqiang Committed by Lorenzo Pieralisi
Browse files

PCI: mobiveil: Fix infinite-loop in the INTx handling function



In the loop handling INTx interrupts in mobiveil_pcie_isr(), there is
no code to update the loop control variable, which is causing an
infinite loop.

Fix the code by reading the interrupt status registers inside the
loop.

Fixes: 9af6bcb1 ("PCI: mobiveil: Add Mobiveil PCIe Host Bridge IP driver")
Signed-off-by: default avatarHou Zhiqiang <Zhiqiang.Hou@nxp.com>
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Reviewed-by: default avatarMinghuan Lian <Minghuan.Lian@nxp.com>
Reviewed-by: default avatarSubrahmanya Lingappa <l.subrahmanya@mobiveil.co.in>
Acked-by: default avatarKarthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
Tested-by: default avatarKarthikeyan Mitran <m.karthikeyan@mobiveil.co.in>
parent fe83fa7e
Loading
Loading
Loading
Loading
+9 −3
Original line number Diff line number Diff line
@@ -358,8 +358,9 @@ static void mobiveil_pcie_isr(struct irq_desc *desc)

	/* Handle INTx */
	if (intr_status & PAB_INTP_INTX_MASK) {
		shifted_status = csr_readl(pcie, PAB_INTP_AMBA_MISC_STAT) >>
					   PAB_INTX_START;
		shifted_status = csr_readl(pcie, PAB_INTP_AMBA_MISC_STAT);
		shifted_status &= PAB_INTP_INTX_MASK;
		shifted_status >>= PAB_INTX_START;
		do {
			for_each_set_bit(bit, &shifted_status, PCI_NUM_INTX) {
				virq = irq_find_mapping(pcie->intx_domain,
@@ -375,7 +376,12 @@ static void mobiveil_pcie_isr(struct irq_desc *desc)
					   shifted_status << PAB_INTX_START,
					   PAB_INTP_AMBA_MISC_STAT);
			}
		} while ((shifted_status >> PAB_INTX_START) != 0);

			shifted_status = csr_readl(pcie,
						   PAB_INTP_AMBA_MISC_STAT);
			shifted_status &= PAB_INTP_INTX_MASK;
			shifted_status >>= PAB_INTX_START;
		} while (shifted_status != 0);
	}

	/* read extra MSI status register */