[PATCH V3 07/16] i3c: mipi-i3c-hci: Complete transfer lists immediately on error
Frank Li
Frank.li at nxp.com
Tue May 12 09:46:52 PDT 2026
On Mon, May 04, 2026 at 02:33:43PM +0300, Adrian Hunter wrote:
> In DMA mode, transfer lists are currently completed only when the final
> transfer in the list completes. If an earlier transfer fails, the list is
> left incomplete and callers wait until timeout.
>
> There is no need to wait for a timeout, as the completion path in
> i3c_hci_process_xfer() already checks for error status. Complete the
> transfer list as soon as any transfer in the list reports an error.
>
> This avoids unnecessary delays and spurious timeouts on error.
>
> Complete a transfer list completion immediately there is an error.
>
> Signed-off-by: Adrian Hunter <adrian.hunter at intel.com>
> ---
Reviewed-by: Frank Li <Frank.Li at nxp.com>
>
>
> Changes in V3:
>
> None
>
> Changes in V2:
>
> Renamed completing_xfer to final_xfer
>
>
> drivers/i3c/master/mipi-i3c-hci/dma.c | 6 ++++--
> drivers/i3c/master/mipi-i3c-hci/hci.h | 1 +
> 2 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/i3c/master/mipi-i3c-hci/dma.c b/drivers/i3c/master/mipi-i3c-hci/dma.c
> index 28e4d38f55d3..899fdf6555a8 100644
> --- a/drivers/i3c/master/mipi-i3c-hci/dma.c
> +++ b/drivers/i3c/master/mipi-i3c-hci/dma.c
> @@ -502,6 +502,8 @@ static int hci_dma_queue_xfer(struct i3c_hci *hci,
> struct hci_xfer *xfer = xfer_list + i;
> u32 *ring_data = rh->xfer + rh->xfer_struct_sz * enqueue_ptr;
>
> + xfer->final_xfer = xfer_list + n - 1;
> +
> /* store cmd descriptor */
> *ring_data++ = xfer->cmd_desc[0];
> *ring_data++ = xfer->cmd_desc[1];
> @@ -576,8 +578,8 @@ static void hci_dma_xfer_done(struct i3c_hci *hci, struct hci_rh_data *rh)
> tid, xfer->cmd_tid);
> /* TODO: do something about it? */
> }
> - if (xfer->completion)
> - complete(xfer->completion);
> + if (xfer == xfer->final_xfer || RESP_STATUS(resp))
> + complete(xfer->final_xfer->completion);
> if (RESP_STATUS(resp))
> hci->enqueue_blocked = true;
> }
> diff --git a/drivers/i3c/master/mipi-i3c-hci/hci.h b/drivers/i3c/master/mipi-i3c-hci/hci.h
> index d630400ec945..f07fc627d4d2 100644
> --- a/drivers/i3c/master/mipi-i3c-hci/hci.h
> +++ b/drivers/i3c/master/mipi-i3c-hci/hci.h
> @@ -104,6 +104,7 @@ struct hci_xfer {
> struct {
> /* DMA specific */
> struct i3c_dma *dma;
> + struct hci_xfer *final_xfer;
> int ring_number;
> int ring_entry;
> };
> --
> 2.51.0
>
More information about the linux-i3c
mailing list