[PATCH] spi: amlogic: spifc-a4: Fix DMA mapping error handling

Xianwei Zhao xianwei.zhao at amlogic.com
Thu Mar 5 17:42:15 PST 2026



On 2026/3/6 01:24, Felix Gu wrote:
> Fix three bugs in aml_sfc_dma_buffer_setup() error paths:
> 1. Unnecessary goto: When the first DMA mapping (sfc->daddr) fails,
>     nothing needs cleanup. Use direct return instead of goto.
> 2. Double-unmap bug: When info DMA mapping failed, the code would
>     unmap sfc->daddr inline, then fall through to out_map_data which
>     would unmap it again, causing a double-unmap.
> 3. Wrong unmap size: The out_map_info label used datalen instead of
>     infolen when unmapping sfc->iaddr, which could lead to incorrect
>     DMA sync behavior.
> 
> Fixes: 4670db6f32e9 ("spi: amlogic: add driver for Amlogic SPI Flash Controller")
> Signed-off-by: Felix Gu<ustc.gu at gmail.com>
> ---
>   drivers/spi/spi-amlogic-spifc-a4.c | 5 ++---
>   1 file changed, 2 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/spi/spi-amlogic-spifc-a4.c b/drivers/spi/spi-amlogic-spifc-a4.c
> index 2aef528cfc1b..3956869cfec1 100644
> --- a/drivers/spi/spi-amlogic-spifc-a4.c
> +++ b/drivers/spi/spi-amlogic-spifc-a4.c
> @@ -411,7 +411,7 @@ static int aml_sfc_dma_buffer_setup(struct aml_sfc *sfc, void *databuf,
>          ret = dma_mapping_error(sfc->dev, sfc->daddr);
>          if (ret) {
>                  dev_err(sfc->dev, "DMA mapping error\n");
> -               goto out_map_data;
> +               return ret;
>          }
> 
>          cmd = CMD_DATA_ADDRL(sfc->daddr);
> @@ -429,7 +429,6 @@ static int aml_sfc_dma_buffer_setup(struct aml_sfc *sfc, void *databuf,
>                  ret = dma_mapping_error(sfc->dev, sfc->iaddr);
>                  if (ret) {
>                          dev_err(sfc->dev, "DMA mapping error\n");
> -                       dma_unmap_single(sfc->dev, sfc->daddr, datalen, dir);
>                          goto out_map_data;
>                  }
> 
> @@ -448,7 +447,7 @@ static int aml_sfc_dma_buffer_setup(struct aml_sfc *sfc, void *databuf,
>          return 0;
> 
>   out_map_info:
> -       dma_unmap_single(sfc->dev, sfc->iaddr, datalen, dir);
> +       dma_unmap_single(sfc->dev, sfc->iaddr, infolen, dir);
>   out_map_data:
>          dma_unmap_single(sfc->dev, sfc->daddr, datalen, dir);
> 
> 

Reviewed-by: Xianwei Zhao <xianwei.zhao at amlogic.com>

> ---
> base-commit: 3f9cd19e764b782706dbaacc69e502099cb014ba
> change-id: 20260306-spifc-a4-d40f84506d6a
> 
> Best regards,
> --
> Felix Gu<ustc.gu at gmail.com>



More information about the linux-amlogic mailing list