Commit 76544bee authored by Marc Kleine-Budde's avatar Marc Kleine-Budde
Browse files

can: sun4i_can: sun4i_can_interrupt(): fix max irq loop handling



Reading the interrupt register `SUN4I_REG_INT_ADDR` causes all of its bits
to be reset. If we ever reach the condition of handling more than
`SUN4I_CAN_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: 0738eff1 ("can: Allwinner A10/A20 CAN Controller support - Kernel module")
Cc: stable@vger.kernel.org
Co-developed-by: default avatarThomas Mühlbacher <tmuehlbacher@posteo.net>
Signed-off-by: default avatarThomas Mühlbacher <tmuehlbacher@posteo.net>
Acked-by: default avatarJernej Skrabec <jernej.skrabec@gmail.com>
Link: https://patch.msgid.link/20251116-sun4i-fix-loop-v1-1-3d76d3f81950@pengutronix.de


Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent 6d547995
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -657,8 +657,8 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
	u8 isrc, status;
	int n = 0;

	while ((isrc = readl(priv->base + SUN4I_REG_INT_ADDR)) &&
	       (n < SUN4I_CAN_MAX_IRQ)) {
	while ((n < SUN4I_CAN_MAX_IRQ) &&
	       (isrc = readl(priv->base + SUN4I_REG_INT_ADDR))) {
		n++;
		status = readl(priv->base + SUN4I_REG_STA_ADDR);