[PATCH] spi: spacemit: prepare both DMA descriptors before submitting

Alex Elder elder at riscstar.com
Wed Jul 22 05:14:13 PDT 2026


On 7/21/26 10:41 PM, kr494167 at gmail.com wrote:
> From: surendra <kr494167 at gmail.com>

Do you have a more complete identity?

> k1_spi_dma_one() currently submits the TX DMA descriptor to the DMA engine
> before preparing the RX DMA descriptor. If preparing the RX descriptor
> subsequently fails, the function jumps to the fallback error path without
> canceling or aborting the already submitted TX DMA descriptor.
> 
> Fix this by preparing both the TX and RX descriptors before submitting
> either of them to the DMA engine.
> 
> Fixes: efcd8b9d1111 ("spi: spacemit: introduce SpacemiT K1 SPI controller driver")
> Signed-off-by: surendra <kr494167 at gmail.com>

This looks good to me.

Reviewed-by: Alex Elder <elder at riscstar.com>

> ---
>   drivers/spi/spi-spacemit-k1.c | 22 +++++++++++-----------
>   1 file changed, 11 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/spi/spi-spacemit-k1.c b/drivers/spi/spi-spacemit-k1.c
> index 215fe66d27b4..96b41b67fcbf 100644
> --- a/drivers/spi/spi-spacemit-k1.c
> +++ b/drivers/spi/spi-spacemit-k1.c
> @@ -278,25 +278,25 @@ static int k1_spi_dma_one(struct spi_controller *host, struct spi_device *spi,
>   			  struct spi_transfer *transfer)
>   {
>   	struct k1_spi_driver_data *drv_data = spi_controller_get_devdata(host);
> -	struct dma_async_tx_descriptor *desc;
> +	struct dma_async_tx_descriptor *txdesc, *rxdesc;
>   	u32 val;
>   
> -	/* Prepare the TX descriptor and submit it */
> -	desc = k1_spi_dma_prep(drv_data, transfer, true);
> -	if (!desc)
> +	/* Prepare the TX descriptor */
> +	txdesc = k1_spi_dma_prep(drv_data, transfer, true);
> +	if (!txdesc)
>   		goto fallback;
> -	dmaengine_submit(desc);
>   
> -	/* Prepare the RX descriptor and submit it */
> -	desc = k1_spi_dma_prep(drv_data, transfer, false);
> -	if (!desc)
> +	/* Prepare the RX descriptor */
> +	rxdesc = k1_spi_dma_prep(drv_data, transfer, false);
> +	if (!rxdesc)
>   		goto fallback;
>   
>   	/* When RX is complete we also know TX has completed */
> -	desc->callback = k1_spi_dma_callback;
> -	desc->callback_param = drv_data;
> +	rxdesc->callback = k1_spi_dma_callback;
> +	rxdesc->callback_param = drv_data;
>   
> -	dmaengine_submit(desc);
> +	dmaengine_submit(txdesc);
> +	dmaengine_submit(rxdesc);
>   
>   	val = readl(drv_data->base + SSP_TOP_CTRL);
>   	val |= TOP_TRAIL;		/* Trailing bytes handled by DMA */




More information about the linux-riscv mailing list