Device-specific interrupts are handled, if no M_CAN core interrupts were handled in the ISR call. The patch also improves the flow at the start of m_can_isr(), removing a conditional which always evaluates to true, and improves comments. Signed-off-by: Torin Cooper-Bennun <torin@xxxxxxxxxxxxxxxxxx> --- drivers/net/can/m_can/m_can.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c index fa853201d2c4..3bc957da06f7 100644 --- a/drivers/net/can/m_can/m_can.c +++ b/drivers/net/can/m_can/m_can.c @@ -1033,17 +1033,24 @@ static irqreturn_t m_can_isr(int irq, void *dev_id) struct net_device *dev = (struct net_device *)dev_id; struct m_can_classdev *cdev = netdev_priv(dev); u32 ir; + irqreturn_t irq_ret = IRQ_NONE; if (pm_runtime_suspended(cdev->dev)) return IRQ_NONE; + ir = m_can_read(cdev, M_CAN_IR); - if (!ir) - return IRQ_NONE; - /* ACK all irqs */ - if (ir & IR_ALL_INT) - m_can_write(cdev, M_CAN_IR, ir); + if (!ir) { + /* Handle device-specific interrupts */ + if (cdev->ops->handle_dev_interrupts) + irq_ret = cdev->ops->handle_dev_interrupts(cdev, false); + return irq_ret; + } + + /* ACK M_CAN interrupts */ + m_can_write(cdev, M_CAN_IR, ir); + /* ACK device-specific interrupts */ if (cdev->ops->handle_dev_interrupts) cdev->ops->handle_dev_interrupts(cdev, true); -- 2.30.2