[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