diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2024-01-15 12:10:38 -0600 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2024-01-15 12:10:38 -0600 |
commit | 1b6069f51ef02618f89fc20a630762ac38420a8d (patch) | |
tree | 441cde4cdd319f99b3c19460cfd90ac601319cbc /drivers/pci/controller/pcie-mediatek.c | |
parent | 1800c660b08f3f1ab365063dcfe842b5d45d079c (diff) | |
parent | 9ccc1318cf4bd90601f221268e42c3374703d681 (diff) | |
download | linux-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.c | 10 |
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); } } |