mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
PCI: microchip: Add missing chained_irq_enter()/exit() calls
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>
This commit is contained in:
parent
c049b4b376
commit
30097efa33
1 changed files with 10 additions and 0 deletions
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue