Re: [PATCH] i2c: ls2x-v2: return IRQ_HANDLED after servicing an error
From: Binbin Zhou
Date: Wed May 06 2026 - 06:12:31 EST
Hi all:
On 2026/5/6 17:11, Andy Shevchenko wrote:
On Wed, May 06, 2026 at 05:48:18AM +0100, David Carlier wrote:
The event ISR reads SR1 and, when an error flag (ARLO/AF/BERR) is set,Have you exhibited this on a real HW?
calls loongson2_i2c_isr_error() which clears the offending flag, issues
STOP for the AF case, records msg->result, masks every CR2 interrupt
enable and completes the waiter. The handler then returns IRQ_NONE,
declaring to the IRQ core that the device did not interrupt.
That report is wrong. The device did interrupt and the handler fully
serviced it. Because the IRQ is requested with IRQF_SHARED, the genirq
spurious-IRQ tracker counts each error as unhandled. A bus that emits
sporadic NACKs, arbitration losses or bus errors will therefore march
toward the spurious-IRQ threshold and the line can end up disabled,
wedging the controller.
Return IRQ_HANDLED on this path. The other IRQ_NONE site, taken whenHmm... This sounds logical, but we need the Loongson folks to confirm as this
neither an event nor an error bit is set, remains correct.
is sensitive code and changes like this may affect existing work flows.
I will try to test this boundary case in the next couple of days.
Thanks.
1 file changed, 1 insertion(+), 1 deletion(-)P.S.
diff --git a/drivers/i2c/busses/i2c-ls2x-v2.c b/drivers/i2c/busses/i2c-ls2x-v2.c
index 517760d70169..9df73557ecc4 100644
--- a/drivers/i2c/busses/i2c-ls2x-v2.c
+++ b/drivers/i2c/busses/i2c-ls2x-v2.c
@@ -304,7 +304,7 @@ static irqreturn_t loongson2_i2c_isr_event(int irq, void *data)
regmap_read(priv->regmap, LOONGSON2_I2C_SR1, &status);
if (status & LOONGSON2_I2C_SR1_ITERREN_MASK) {
loongson2_i2c_isr_error(status, data);
- return IRQ_NONE;
+ return IRQ_HANDLED;
}
regmap_read(priv->regmap, LOONGSON2_I2C_CR2, &cr2);
Is the analysis and/or commit message AI assisted?
Binbin