lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 207/772] PCI: microchip: Add missing chained_irq_enter()/exit() calls
    Date
    From: Conor Dooley <conor.dooley@microchip.com>

    [ Upstream commit 30097efa334a706f9021b9aee6efcddcfa44a78a ]

    Two of the chained IRQ handlers miss their
    chained_irq_enter()/chained_irq_exit() calls, so add them in to avoid
    potentially lost interrupts.

    Reported by: Bjorn Helgaas <bhelgaas@google.com>
    Link: https://lore.kernel.org/linux-pci/87h76b8nxc.wl-maz@kernel.org
    Link: https://lore.kernel.org/r/20220511095504.2273799-1-conor.dooley@microchip.com
    Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/pci/controller/pcie-microchip-host.c | 10 ++++++++++
    1 file changed, 10 insertions(+)

    diff --git a/drivers/pci/controller/pcie-microchip-host.c b/drivers/pci/controller/pcie-microchip-host.c
    index 29d8e81e4181..8175abed0f05 100644
    --- a/drivers/pci/controller/pcie-microchip-host.c
    +++ b/drivers/pci/controller/pcie-microchip-host.c
    @@ -406,6 +406,7 @@ static void mc_pcie_enable_msi(struct mc_pcie *port, void __iomem *base)
    static void mc_handle_msi(struct irq_desc *desc)
    {
    struct mc_pcie *port = irq_desc_get_handler_data(desc);
    + struct irq_chip *chip = irq_desc_get_chip(desc);
    struct device *dev = port->dev;
    struct mc_msi *msi = &port->msi;
    void __iomem *bridge_base_addr =
    @@ -414,6 +415,8 @@ static void mc_handle_msi(struct irq_desc *desc)
    u32 bit;
    int ret;

    + chained_irq_enter(chip, desc);
    +
    status = readl_relaxed(bridge_base_addr + ISTATUS_LOCAL);
    if (status & PM_MSI_INT_MSI_MASK) {
    status = readl_relaxed(bridge_base_addr + ISTATUS_MSI);
    @@ -424,6 +427,8 @@ static void mc_handle_msi(struct irq_desc *desc)
    bit);
    }
    }
    +
    + chained_irq_exit(chip, desc);
    }

    static void mc_msi_bottom_irq_ack(struct irq_data *data)
    @@ -563,6 +568,7 @@ static int mc_allocate_msi_domains(struct mc_pcie *port)
    static void mc_handle_intx(struct irq_desc *desc)
    {
    struct mc_pcie *port = irq_desc_get_handler_data(desc);
    + struct irq_chip *chip = irq_desc_get_chip(desc);
    struct device *dev = port->dev;
    void __iomem *bridge_base_addr =
    port->axi_base_addr + MC_PCIE_BRIDGE_ADDR;
    @@ -570,6 +576,8 @@ static void mc_handle_intx(struct irq_desc *desc)
    u32 bit;
    int ret;

    + chained_irq_enter(chip, desc);
    +
    status = readl_relaxed(bridge_base_addr + ISTATUS_LOCAL);
    if (status & PM_MSI_INT_INTX_MASK) {
    status &= PM_MSI_INT_INTX_MASK;
    @@ -581,6 +589,8 @@ static void mc_handle_intx(struct irq_desc *desc)
    bit);
    }
    }
    +
    + chained_irq_exit(chip, desc);
    }

    static void mc_ack_intx_irq(struct irq_data *data)
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-07 22:54    [W:4.194 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site