This is a note to let you know that I've just added the patch titled i3c: master: svc: fix ibi may not return mandatory data byte to the 5.15-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: i3c-master-svc-fix-ibi-may-not-return-mandatory-data-byte.patch and it can be found in the queue-5.15 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From c85e209b799f12d18a90ae6353b997b1bb1274a5 Mon Sep 17 00:00:00 2001 From: Frank Li <Frank.Li@xxxxxxx> Date: Mon, 23 Oct 2023 12:16:55 -0400 Subject: i3c: master: svc: fix ibi may not return mandatory data byte From: Frank Li <Frank.Li@xxxxxxx> commit c85e209b799f12d18a90ae6353b997b1bb1274a5 upstream. MSTATUS[RXPEND] is only updated after the data transfer cycle started. This creates an issue when the I3C clock is slow, and the CPU is running fast enough that MSTATUS[RXPEND] may not be updated when the code reaches checking point. As a result, mandatory data can be missed. Add a wait for MSTATUS[COMPLETE] to ensure that all mandatory data is already in FIFO. It also works without mandatory data. Fixes: dd3c52846d59 ("i3c: master: svc: Add Silvaco I3C master driver") Cc: <stable@xxxxxxxxxxxxxxx> Reviewed-by: Miquel Raynal <miquel.raynal@xxxxxxxxxxx> Signed-off-by: Frank Li <Frank.Li@xxxxxxx> Link: https://lore.kernel.org/r/20231023161658.3890811-4-Frank.Li@xxxxxxx Signed-off-by: Alexandre Belloni <alexandre.belloni@xxxxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- drivers/i3c/master/svc-i3c-master.c | 8 ++++++++ 1 file changed, 8 insertions(+) --- a/drivers/i3c/master/svc-i3c-master.c +++ b/drivers/i3c/master/svc-i3c-master.c @@ -294,6 +294,7 @@ static int svc_i3c_master_handle_ibi(str struct i3c_ibi_slot *slot; unsigned int count; u32 mdatactrl; + int ret, val; u8 *buf; slot = i3c_generic_ibi_get_free_slot(data->ibi_pool); @@ -303,6 +304,13 @@ static int svc_i3c_master_handle_ibi(str slot->len = 0; buf = slot->data; + ret = readl_relaxed_poll_timeout(master->regs + SVC_I3C_MSTATUS, val, + SVC_I3C_MSTATUS_COMPLETE(val), 0, 1000); + if (ret) { + dev_err(master->dev, "Timeout when polling for COMPLETE\n"); + return ret; + } + while (SVC_I3C_MSTATUS_RXPEND(readl(master->regs + SVC_I3C_MSTATUS)) && slot->len < SVC_I3C_FIFO_SIZE) { mdatactrl = readl(master->regs + SVC_I3C_MDATACTRL); Patches currently in stable-queue which might be from Frank.Li@xxxxxxx are queue-5.15/i3c-master-svc-fix-wrong-data-return-when-ibi-happen-during-start-frame.patch queue-5.15/i3c-master-svc-fix-sda-keep-low-when-polling-ibiwon-timeout-happen.patch queue-5.15/i3c-master-svc-fix-ibi-may-not-return-mandatory-data-byte.patch queue-5.15/i3c-master-svc-fix-check-wrong-status-register-in-irq-handler.patch queue-5.15/i3c-master-svc-fix-race-condition-in-ibi-work-thread.patch