Message ID | 20231211094923.31967-1-jianjun.wang@mediatek.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Krzysztof Wilczyński |
Headers | show |
Series | [v4] PCI: mediatek: Clear interrupt status before dispatching handler | expand |
Hello, > We found a failure when used iperf tool for wifi performance testing, > there are some MSIs received while clearing the interrupt status, > these MSIs cannot be serviced. > > The interrupt status can be cleared even the MSI status still remaining, > as an edge-triggered interrupts, its interrupt status should be cleared > before dispatching to the handler of device. Applied to controller/mediatek, thank you! [1/1] PCI: mediatek: Clear interrupt status before dispatching handler https://git.kernel.org/pci/pci/c/4fea201e110e Krzysztof
diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c index 66a8f73296fc..3fb7f08de061 100644 --- a/drivers/pci/controller/pcie-mediatek.c +++ b/drivers/pci/controller/pcie-mediatek.c @@ -617,12 +617,17 @@ static void mtk_pcie_intr_handler(struct irq_desc *desc) if (status & MSI_STATUS){ unsigned long imsi_status; + /* + * The interrupt status can be cleared even the MSI + * status still remaining, hence as an edge-triggered + * interrupts, its interrupt status should be cleared + * before dispatching handler. + */ + writel(MSI_STATUS, port->base + PCIE_INT_STATUS); while ((imsi_status = readl(port->base + PCIE_IMSI_STATUS))) { for_each_set_bit(bit, &imsi_status, MTK_MSI_IRQS_NUM) generic_handle_domain_irq(port->inner_domain, bit); } - /* Clear MSI interrupt status */ - writel(MSI_STATUS, port->base + PCIE_INT_STATUS); } }