On Tue Sep 9, 2025 at 7:53 PM CEST, Marc Kleine-Budde wrote: > The M_CAN IP core has an Interrupt Register (IR) and an Interrupt > Enable (IE) register. An interrupt is triggered if at least 1 bit is > set in the bitwise and of IR and IE. > > Depending on the configuration not all interrupts are enabled in the > IE register. However the m_can_rx_handler() IRQ handler looks at all > interrupts not just the enabled ones. This may lead to handling of not > activated interrupts. > > Fix the problem and mask the irqstatus (IR register) with the > active_interrupts (cached value of IE register). > > Fixes: e0d1f4816f2a ("can: m_can: add Bosch M_CAN controller support") > Signed-off-by: Marc Kleine-Budde > --- > drivers/net/can/m_can/m_can.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c > index fe74dbd2c966..16b38e6c3985 100644 > --- a/drivers/net/can/m_can/m_can.c > +++ b/drivers/net/can/m_can/m_can.c > @@ -1057,6 +1057,7 @@ static int m_can_poll(struct napi_struct *napi, int quota) > u32 irqstatus; > > irqstatus = cdev->irqstatus | m_can_read(cdev, M_CAN_IR); > + irqstatus &= cdev->active_interrupts; > > work_done = m_can_rx_handler(dev, quota, irqstatus); > > @@ -1243,6 +1244,8 @@ static int m_can_interrupt_handler(struct m_can_classdev *cdev) > } > > m_can_coalescing_update(cdev, ir); > + > + ir &= cdev->active_interrupts; m_can_coalescing_update() can change active_interrupts, meaning the interrupt that caused the interrupt handler to run may be disabled in active_interrupts above and then masked in this added line. Would that still work or does it confuse the hardware? Best Markus > if (!ir) > return IRQ_NONE; >