]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
can: sja1000: fix max irq loop handling
authorThomas Mühlbacher <tmuehlbacher@posteo.net>
Sat, 15 Nov 2025 15:34:56 +0000 (15:34 +0000)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sun, 16 Nov 2025 15:34:41 +0000 (16:34 +0100)
Reading the interrupt register `SJA1000_IR` causes all of its bits to be
reset. If we ever reach the condition of handling more than
`SJA1000_MAX_IRQ` IRQs, we will have read the register and reset all its
bits but without actually handling the interrupt inside of the loop
body.

This may, among other issues, cause us to never `netif_wake_queue()`
again after a transmission interrupt.

Fixes: 429da1cc841b ("can: Driver for the SJA1000 CAN controller")
Cc: stable@vger.kernel.org
Signed-off-by: Thomas Mühlbacher <tmuehlbacher@posteo.net>
Acked-by: Oliver Hartkopp <socketcan@hartkopp.net>
Link: https://patch.msgid.link/20251115153437.11419-1-tmuehlbacher@posteo.net
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/sja1000/sja1000.c

index 4d245857ef1cec0ae1ee82008b96912bbb1f2638..83476af8adb5a1eae1513a927044d70db599d2d0 100644 (file)
@@ -548,8 +548,8 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id)
        if (priv->read_reg(priv, SJA1000_IER) == IRQ_OFF)
                goto out;
 
-       while ((isrc = priv->read_reg(priv, SJA1000_IR)) &&
-              (n < SJA1000_MAX_IRQ)) {
+       while ((n < SJA1000_MAX_IRQ) &&
+              (isrc = priv->read_reg(priv, SJA1000_IR))) {
 
                status = priv->read_reg(priv, SJA1000_SR);
                /* check for absent controller due to hw unplug */