summaryrefslogtreecommitdiffstats
path: root/drivers/pci/controller/pcie-mediatek.c
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2024-01-15 12:10:38 -0600
committerBjorn Helgaas <bhelgaas@google.com>2024-01-15 12:10:38 -0600
commit1b6069f51ef02618f89fc20a630762ac38420a8d (patch)
tree441cde4cdd319f99b3c19460cfd90ac601319cbc /drivers/pci/controller/pcie-mediatek.c
parent1800c660b08f3f1ab365063dcfe842b5d45d079c (diff)
parent9ccc1318cf4bd90601f221268e42c3374703d681 (diff)
downloadlinux-stable-1b6069f51ef02618f89fc20a630762ac38420a8d.tar.gz
linux-stable-1b6069f51ef02618f89fc20a630762ac38420a8d.tar.bz2
linux-stable-1b6069f51ef02618f89fc20a630762ac38420a8d.zip
Merge branch 'pci/controller/mediatek'
- Clear MSI interrupt status before handler to avoid missing MSIs that occur after the handler (qizhong cheng) - Update mediatek-gen3 translation window setup to handle MMIO space that is not a power of two in size (Jianjun Wang) * pci/controller/mediatek: PCI: mediatek-gen3: Fix translation window size calculation PCI: mediatek: Clear interrupt status before dispatching handler
Diffstat (limited to 'drivers/pci/controller/pcie-mediatek.c')
-rw-r--r--drivers/pci/controller/pcie-mediatek.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c
index 66a8f73296fc..48372013f26d 100644
--- a/drivers/pci/controller/pcie-mediatek.c
+++ b/drivers/pci/controller/pcie-mediatek.c
@@ -617,12 +617,18 @@ 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 if the
+ * MSI status remains pending. As such, given the
+ * edge-triggered interrupt type, its status should
+ * be cleared before being dispatched to the
+ * handler of the underlying device.
+ */
+ 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);
}
}