[PATCH] RFC: mtd/spi-nor: add checking for the spi_nor_read

Michal Suchanek hramrach at gmail.com
Fri Jul 31 05:13:20 PDT 2015


Hello,

On 31 July 2015 at 12:35, Hou Zhiqiang <B48286 at freescale.com> wrote:
> Hi Shijie and Brian,
>
> Do you have any comment?
>
>> -----Original Message-----
>> From: Zhiqiang Hou [mailto:B48286 at freescale.com]
>> Sent: 2015年7月21日 19:57
>> To: linux-mtd at lists.infradead.org; computersforpeace at gmail.com;
>> dwmw2 at infradead.org
>> Cc: Hu Mingkai-B21284; Hou Zhiqiang-B48286
>> Subject: [PATCH] RFC: mtd/spi-nor: add checking for the spi_nor_read
>>
>> From: Hou Zhiqiang <B48286 at freescale.com>
>>
>> Compare the var retlen with len to ensure the read operation successful.
>>
>> There are some SPI controllers that have a maximum transfer length, e.g.
>> Freescale eSPI controller is able to transfer 0x10000 Bytes each time.
>> If the spi_nor_read diliver a transaction length that excced the ability
>> of the SPI controller, there should be multiple read operation to make
>> sure this transaction completion.
>>
>> Signed-off-by: Hou Zhiqiang <B48286 at freescale.com>
>> ---
>>  drivers/mtd/spi-nor/spi-nor.c | 14 ++++++++++++--
>>  1 file changed, 12 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-
>> nor.c index fbc5035..ec10cd1 100644
>> --- a/drivers/mtd/spi-nor/spi-nor.c
>> +++ b/drivers/mtd/spi-nor/spi-nor.c
>> @@ -715,6 +715,8 @@ static int spi_nor_read(struct mtd_info *mtd, loff_t
>> from, size_t len,  {
>>       struct spi_nor *nor = mtd_to_spi_nor(mtd);
>>       int ret;
>> +     size_t cnt = 0;
>> +     u_char *cur = buf;
>>
>>       dev_dbg(nor->dev, "from 0x%08x, len %zd\n", (u32)from, len);
>>
>> @@ -722,8 +724,16 @@ static int spi_nor_read(struct mtd_info *mtd, loff_t
>> from, size_t len,
>>       if (ret)
>>               return ret;
>>
>> -     ret = nor->read(nor, from, len, retlen, buf);
>> -
>> +     *retlen = 0;
>> +     while (len > 0) {
>> +             ret = nor->read(nor, from, len, &cnt, cur);
>> +             if (ret < 0)
>> +                     break;
>> +             len -= cnt;
>> +             cur += cnt;
>> +             *retlen += cnt;
>> +             from += cnt;
>> +     }
>>       spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ);
>>       return ret;
>>  }
>> --
>> 2.1.0.27.g96db324
>
> Thanks,
> Zhiqiang
> ______________________________________________________
> Linux MTD discussion mailing list
> http://lists.infradead.org/mailman/listinfo/linux-mtd/


It appears that nor->read() always returns 0.

Also see https://www.mail-archive.com/linux-kernel%40vger.kernel.org/msg942729.html

Thanks

Michal



More information about the linux-mtd mailing list