[PATCH v2] i3c: dw: Prevent premature transfer completion on IBI
From: Rui Wang
Date: Thu Nov 12 2026 - 04:13:42 EST
An IBI threshold interrupt can arrive while a transfer is pending and
before its command responses are ready. The IRQ handler calls
dw_i3c_master_end_xfer_locked() even for an IBI-only interrupt. If the
response queue is empty, the function completes the transfer with a
return value of zero. Later responses can remain unconsumed and keep the
response-ready interrupt asserted.
Only call the transfer completion handler when INTR_MASTER_MASK
indicates that responses are ready or a transfer error has occurred.
An IBI-only interrupt leaves the transfer pending.
The fix was tested successfully on FPGA hardware.
Fixes: e389b1d72a624 ("i3c: dw: Add support for in-band interrupts")
Signed-off-by: Rui Wang <wr574332525@xxxxxxx>
---
Changes in v2
- Use Rui Wang in the author and sign-off fields.
The possible queue stall reported by Sashiko is in the timeout recovery
path and predates this patch. If I can reproduce it, I'll send a
separate fix.
drivers/i3c/master/dw-i3c-master.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/i3c/master/dw-i3c-master.c b/drivers/i3c/master/dw-i3c-master.c
index 34aa8f8..19735ec 100644
--- a/drivers/i3c/master/dw-i3c-master.c
+++ b/drivers/i3c/master/dw-i3c-master.c
@@ -1527,7 +1527,8 @@ static irqreturn_t dw_i3c_master_irq_handler(int irq, void *dev_id)
}
spin_lock(&master->xferqueue.lock);
- dw_i3c_master_end_xfer_locked(master, status);
+ if (status & INTR_MASTER_MASK)
+ dw_i3c_master_end_xfer_locked(master, status);
if (status & INTR_TRANSFER_ERR_STAT)
writel(INTR_TRANSFER_ERR_STAT, master->regs + INTR_STATUS);
spin_unlock(&master->xferqueue.lock);
base-commit: 7475ea8b58616b33c04afb976cf0fbaad9dd63fb
--
2.53.0.windows.2