devm_pse_irq_helper() keeps the IRQ number in pcdev->irq even when the IRQ request failed. The failed probe then runs pse_controller_unregister(), which calls disable_irq() on that line. If another device owns it, that device stops getting interrupts. Clear pcdev->irq when the request fails. It is now set before the request, because pse_isr() can run as soon as the IRQ is enabled and pse_pw_d_is_sw_pw_control() reads it. Fixes: ffef61d6d273 ("net: pse-pd: Add support for budget evaluation strategies") Signed-off-by: Carlo Szelinsky --- drivers/net/pse-pd/pse_core.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/net/pse-pd/pse_core.c b/drivers/net/pse-pd/pse_core.c index 1710f9bb7d27..65a41c517b35 100644 --- a/drivers/net/pse-pd/pse_core.c +++ b/drivers/net/pse-pd/pse_core.c @@ -1348,14 +1348,20 @@ int devm_pse_irq_helper(struct pse_controller_dev *pcdev, int irq, if (!h->notifs_mask) return -ENOMEM; + /* pse_isr() can run as soon as the IRQ is enabled, and + * pse_pw_d_is_sw_pw_control() reads pcdev->irq. + */ + pcdev->irq = irq; ret = devm_request_threaded_irq(dev, irq, NULL, pse_isr, IRQF_ONESHOT | irq_flags, irq_name, h); - if (ret) + if (ret) { + pcdev->irq = 0; dev_err(pcdev->dev, "Failed to request IRQ %d\n", irq); + return ret; + } - pcdev->irq = irq; - return ret; + return 0; } EXPORT_SYMBOL_GPL(devm_pse_irq_helper); -- 2.43.0