[U-Boot] [PATCH v2] mtd: spi: Improve spi_nor_write_data() implementation

Vignesh Raghavendra vigneshr at ti.com
Wed Apr 17 12:47:37 UTC 2019



On 16/04/19 5:29 PM, Rajat Srivastava wrote:
> Maximum write size in a single write operation in
> spi_nor_write_data() function can be equal to slave
> tx buffer, which is adjusted in spi_mem_adjust_op_size()
> and write operation gets fragmented.
> 
> Previously data write for the above fragmentation
> didn't incorporate write enable and status checks.
> It was sent to flash at page offsets only.
> 
> Signed-off-by: Rajat Srivastava <rajat.srivastava at nxp.com>
> ---
> Changes in v2:
>   Incorporating review comments given by Vignesh.
>   [PATCH v1]: https://patchwork.ozlabs.org/patch/1078183/

Changes look good as such, but I cannot seem to apply these patch 
locally as mbox for testing. Looking at mail source, it seems to be sent 
in binary format instead of plain text. Could you resend in plain text?	

> 
>   drivers/mtd/spi/spi-nor-core.c | 28 ++++++++++------------------
>   1 file changed, 10 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c
> index c4e2f6a08f..8e754d445d 100644
> --- a/drivers/mtd/spi/spi-nor-core.c
> +++ b/drivers/mtd/spi/spi-nor-core.c
> @@ -116,7 +116,6 @@ static ssize_t spi_nor_write_data(struct spi_nor *nor, loff_t to, size_t len,
>   				   SPI_MEM_OP_ADDR(nor->addr_width, to, 1),
>   				   SPI_MEM_OP_NO_DUMMY,
>   				   SPI_MEM_OP_DATA_OUT(len, buf, 1));
> -	size_t remaining = len;
>   	int ret;
>   
>   	/* get transfer protocols. */
> @@ -127,22 +126,19 @@ static ssize_t spi_nor_write_data(struct spi_nor *nor, loff_t to, size_t len,
>   	if (nor->program_opcode == SPINOR_OP_AAI_WP && nor->sst_write_second)
>   		op.addr.nbytes = 0;
>   
> -	while (remaining) {
> -		op.data.nbytes = remaining < UINT_MAX ? remaining : UINT_MAX;
> -		ret = spi_mem_adjust_op_size(nor->spi, &op);
> -		if (ret)
> -			return ret;
> +	op.data.nbytes = len < UINT_MAX ? len : UINT_MAX;
> +	ret = spi_mem_adjust_op_size(nor->spi, &op);
> +	if (ret)
> +		return ret;
>   
> -		ret = spi_mem_exec_op(nor->spi, &op);
> -		if (ret)
> -			return ret;
> +	ret = spi_mem_exec_op(nor->spi, &op);
> +	if (ret)
> +		return ret;
>   
> -		op.addr.val += op.data.nbytes;
> -		remaining -= op.data.nbytes;
> -		op.data.buf.out += op.data.nbytes;
> -	}
> +	op.addr.val += op.data.nbytes;
> +	op.data.buf.out += op.data.nbytes;
>   
> -	return len;
> +	return op.data.nbytes;
>   }
>   
>   /*
> @@ -1101,10 +1097,6 @@ static int spi_nor_write(struct mtd_info *mtd, loff_t to, size_t len,
>   			goto write_err;
>   		*retlen += written;
>   		i += written;
> -		if (written != page_remain) {
> -			ret = -EIO;
> -			goto write_err;
> -		}
>   	}
>   
>   write_err:
> 


More information about the U-Boot mailing list