[PATCH] mtd: spi-nor-core: call WATCHDOG_RESET() in spi_nor_ready()

Rasmus Villemoes rasmus.villemoes at prevas.dk
Thu Mar 19 12:39:09 CET 2020


On 19/03/2020 12.25, Vignesh Raghavendra wrote:
> Hi,
> 
> On 17/03/20 1:48 am, Rasmus Villemoes wrote:
>> I have a board for which doing "sf erase 0x100000 0x80000"
>> consistently causes the external watchdog circuit to reset the
>> board. Make sure to pet the watchdog during slow operations such as
>> erasing or writing large areas of a spi nor flash.
>>
>> Signed-off-by: Rasmus Villemoes <rasmus.villemoes at prevas.dk>
>> ---
>>  drivers/mtd/spi/spi-nor-core.c | 2 ++
>>  1 file changed, 2 insertions(+)
>>
>> diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c
>> index 4076646225..b7f7aa7b28 100644
>> --- a/drivers/mtd/spi/spi-nor-core.c
>> +++ b/drivers/mtd/spi/spi-nor-core.c
>> @@ -20,6 +20,7 @@
>>  #include <linux/mtd/spi-nor.h>
>>  #include <spi-mem.h>
>>  #include <spi.h>
>> +#include <watchdog.h>
>>  
>>  #include "sf_internal.h"
>>  
>> @@ -399,6 +400,7 @@ static int spi_nor_ready(struct spi_nor *nor)
>>  {
>>  	int sr, fsr;
>>  
>> +	WATCHDOG_RESET();
> 
> Is it necessary to reset watchdog for every status register read? How
> small is the timeout? Resetting too often will impact performance
> depending on overhead of this call.
> 
> Is it not sufficient to reset watchdog once per page write (in
> spi_nor_write()) and once per sector erase (in spi_nor_erase())?
> 

Probably, yes. I was a bit torn between putting the call here or in
spi_nor_wait_till_ready(). That should do it once per erase/page write
which should be fine (well, if the busy-looping for spi_nor_ready takes
more than the watchdog timeout, the board will reset, but I don't think
the flash is that bad).

I'll test that, but I just found out I'll need something in the read
path as well. Reading 1MB works fine, reading 2MB resets:

[2020-03-19 12:31:11.923] => echo a ; sf read $loadaddr 0 0x100000 ; echo b
[2020-03-19 12:31:32.724] a
[2020-03-19 12:31:32.724] device 0 offset 0x0, size 0x100000
[2020-03-19 12:31:33.586] SF: 1048576 bytes @ 0x0 Read: OK
[2020-03-19 12:31:33.586] b
[2020-03-19 12:31:33.586] => echo a ; sf read $loadaddr 0 0x200000 ; echo b
[2020-03-19 12:31:40.771] a
[2020-03-19 12:31:40.771] device 0 offset 0x0, size 0x200000
[2020-03-19 12:31:42.666]
[2020-03-19 12:31:42.666] U-Boot SPL 2020.01-00078-g058da1a-dirty (Mar
17 2020 - 16:27:58 +0000)

Rasmus


More information about the U-Boot mailing list