提交 30097efa 编写于 作者: C Conor Dooley 提交者: Lorenzo Pieralisi

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.comSigned-off-by: NConor Dooley <conor.dooley@microchip.com>
Signed-off-by: NLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
上级 c049b4b3
...@@ -406,6 +406,7 @@ static void mc_pcie_enable_msi(struct mc_pcie *port, void __iomem *base) ...@@ -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) static void mc_handle_msi(struct irq_desc *desc)
{ {
struct mc_pcie *port = irq_desc_get_handler_data(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 device *dev = port->dev;
struct mc_msi *msi = &port->msi; struct mc_msi *msi = &port->msi;
void __iomem *bridge_base_addr = void __iomem *bridge_base_addr =
...@@ -414,6 +415,8 @@ static void mc_handle_msi(struct irq_desc *desc) ...@@ -414,6 +415,8 @@ static void mc_handle_msi(struct irq_desc *desc)
u32 bit; u32 bit;
int ret; int ret;
chained_irq_enter(chip, desc);
status = readl_relaxed(bridge_base_addr + ISTATUS_LOCAL); status = readl_relaxed(bridge_base_addr + ISTATUS_LOCAL);
if (status & PM_MSI_INT_MSI_MASK) { if (status & PM_MSI_INT_MSI_MASK) {
status = readl_relaxed(bridge_base_addr + ISTATUS_MSI); status = readl_relaxed(bridge_base_addr + ISTATUS_MSI);
...@@ -424,6 +427,8 @@ static void mc_handle_msi(struct irq_desc *desc) ...@@ -424,6 +427,8 @@ static void mc_handle_msi(struct irq_desc *desc)
bit); bit);
} }
} }
chained_irq_exit(chip, desc);
} }
static void mc_msi_bottom_irq_ack(struct irq_data *data) 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) ...@@ -563,6 +568,7 @@ static int mc_allocate_msi_domains(struct mc_pcie *port)
static void mc_handle_intx(struct irq_desc *desc) static void mc_handle_intx(struct irq_desc *desc)
{ {
struct mc_pcie *port = irq_desc_get_handler_data(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 device *dev = port->dev;
void __iomem *bridge_base_addr = void __iomem *bridge_base_addr =
port->axi_base_addr + MC_PCIE_BRIDGE_ADDR; port->axi_base_addr + MC_PCIE_BRIDGE_ADDR;
...@@ -570,6 +576,8 @@ static void mc_handle_intx(struct irq_desc *desc) ...@@ -570,6 +576,8 @@ static void mc_handle_intx(struct irq_desc *desc)
u32 bit; u32 bit;
int ret; int ret;
chained_irq_enter(chip, desc);
status = readl_relaxed(bridge_base_addr + ISTATUS_LOCAL); status = readl_relaxed(bridge_base_addr + ISTATUS_LOCAL);
if (status & PM_MSI_INT_INTX_MASK) { if (status & PM_MSI_INT_INTX_MASK) {
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) ...@@ -581,6 +589,8 @@ static void mc_handle_intx(struct irq_desc *desc)
bit); bit);
} }
} }
chained_irq_exit(chip, desc);
} }
static void mc_ack_intx_irq(struct irq_data *data) static void mc_ack_intx_irq(struct irq_data *data)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册