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

Vignesh Raghavendra vigneshr at ti.com
Fri May 17 14:34:39 UTC 2019


Hi Ashish,

> Hi Vignesh
> 

> Is this taken care now, plain text version was posted here
> http://patchwork.ozlabs.org/patch/1090121/
> 

A similar patch[1] was proposed in meantime which has been merged to
mainline U-Boot. So this issue must now be resolved. Let me know if the
issue still persists.


[1]
commit 60e2bf46784ebbd30ff29b3d3c7c97e56b11e86a
Author: Weijie Gao <weijie.gao at mediatek.com>
Date:   Fri Apr 26 17:22:19 2019 +0800

    mtd: spi-nor: fix page program issue when using spi-mem driver



> Regards
> Ashish 
> 
>>
>>>
>>>   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