Re: [PATCH] PCI: iproc: Restore map_irq

From: Ray Jui

Date: Mon May 04 2026 - 11:30:14 EST




On Wed, Apr 29, 2026 at 7:16 PM Mark Tomlinson <mark.tomlinson@xxxxxxxxxxxxxxxxxxx> wrote:
Some time back, the PCI bridge map_irq and swizzle_irq were set up with
default functions. The iproc PCIe driver was broken by this change, with
the mapping function ending up being set to NULL. Restore the original
(and intended) behaviour to use the default functions.

The iproc pcie kept the mapping function in a private data structure,
which was then copied into the pci_host_bridge structure. As the private
data was initialised to NULL, the NULL would end up being copied. The
fix is not to keep the mapping function in the private data, but just
set the function pointer directly when needed.

Fixes: b64aa11eb2dd ("PCI: Set bridge map_irq and swizzle_irq to default functions")
Signed-off-by: Mark Tomlinson <mark.tomlinson@xxxxxxxxxxxxxxxxxxx>
---
 drivers/pci/controller/pcie-iproc-bcma.c     | 2 +-
 drivers/pci/controller/pcie-iproc-platform.c | 2 +-
 drivers/pci/controller/pcie-iproc.c          | 1 -
 drivers/pci/controller/pcie-iproc.h          | 2 --
 4 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/pci/controller/pcie-iproc-bcma.c b/drivers/pci/controller/pcie-iproc-bcma.c
index 99a99900444d..593418c2bc3a 100644
--- a/drivers/pci/controller/pcie-iproc-bcma.c
+++ b/drivers/pci/controller/pcie-iproc-bcma.c
@@ -64,7 +64,7 @@ static int iproc_bcma_pcie_probe(struct bcma_device *bdev)
        if (ret)
                return ret;

-       pcie->map_irq = iproc_bcma_pcie_map_irq;
+       bridge->map_irq = iproc_bcma_pcie_map_irq;

        bcma_set_drvdata(bdev, pcie);

diff --git a/drivers/pci/controller/pcie-iproc-platform.c b/drivers/pci/controller/pcie-iproc-platform.c
index 0cb78c583c7e..4c9a0c4bb923 100644
--- a/drivers/pci/controller/pcie-iproc-platform.c
+++ b/drivers/pci/controller/pcie-iproc-platform.c
@@ -98,7 +98,7 @@ static int iproc_pltfm_pcie_probe(struct platform_device *pdev)
        switch (pcie->type) {
        case IPROC_PCIE_PAXC:
        case IPROC_PCIE_PAXC_V2:
-               pcie->map_irq = NULL;
+               bridge->map_irq = NULL;
                break;
        default:
                break;
diff --git a/drivers/pci/controller/pcie-iproc.c b/drivers/pci/controller/pcie-iproc.c
index ccf71993ea35..c22d0aecaaac 100644
--- a/drivers/pci/controller/pcie-iproc.c
+++ b/drivers/pci/controller/pcie-iproc.c
@@ -1502,7 +1502,6 @@ int iproc_pcie_setup(struct iproc_pcie *pcie, struct list_head *res)

        host->ops = &iproc_pcie_ops;
        host->sysdata = pcie;
-       host->map_irq = pcie->map_irq;

        ret = pci_host_probe(host);
        if (ret < 0) {
diff --git a/drivers/pci/controller/pcie-iproc.h b/drivers/pci/controller/pcie-iproc.h
index 969ded03b8c2..c4443f236ca3 100644
--- a/drivers/pci/controller/pcie-iproc.h
+++ b/drivers/pci/controller/pcie-iproc.h
@@ -61,7 +61,6 @@ struct iproc_msi;
  * @base_addr: PCIe host controller register base physical address
  * @mem: host bridge memory window resource
  * @phy: optional PHY device that controls the Serdes
- * @map_irq: function callback to map interrupts
  * @ep_is_internal: indicates an internal emulated endpoint device is connected
  * @iproc_cfg_read: indicates the iProc config read function should be used
  * @rej_unconfig_pf: indicates the root complex needs to detect and reject
@@ -91,7 +90,6 @@ struct iproc_pcie {
        phys_addr_t base_addr;
        struct resource mem;
        struct phy *phy;
-       int (*map_irq)(const struct pci_dev *, u8, u8);
        bool ep_is_internal;
        bool iproc_cfg_read;
        bool rej_unconfig_pf;
--
2.54.0


Thanks for the fix.

Acked-by: Ray Jui <ray.jui@xxxxxxxxxxxx

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature