NAND: add more watchdog resets
Subsystems (2)
PATCH 1/1 NAND: add more watchdog resets
Poke the watchdog in a variety of looping constructs, which could take a long time to complete.
Signed-off-by Scott Wood <[email protected]>
---
Jaap, does this resolve the watchdog problems you were seeing?
drivers/mtd/nand/nand_base.c | 6 ++++++ drivers/mtd/nand/nand_util.c | 2 ++ 2 files changed, 8 insertions(+), 0 deletions(-)
drivers/mtd/nand/nand_base.c +6 -0
@@ -1156,6 +1156,8 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, oob = ops->oobbuf;while (1 ) { +WATCHDOG_RESET (); + bytes =min (mtd->writesize - col, readlen); aligned = (bytes == mtd->writesize);
@@ -1485,6 +1487,7 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from, page = realpage & chip->pagemask;while (1 ) { +WATCHDOG_RESET (); sndcmd = chip->ecc.read_oob (mtd, chip, page, sndcmd); len =min (len, readlen);
@@ -1884,6 +1887,8 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,memset (chip->oob_poi,0xff , mtd->oobsize);while (1 ) { +WATCHDOG_RESET (); +int bytes = mtd->writesize;int cached = writelen > bytes && page != blockmask;uint8_t *wbuf = buf;
@@ -2215,6 +2220,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, instr->state =MTD_ERASING ;while (len) { +WATCHDOG_RESET ();/* * heck if we have a bad block, we do not erase bad blocks ! */
drivers/mtd/nand/nand_util.c +2 -0
@@ -542,6 +542,8 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, pages = write_size / pagesize_oob;for (page =0 ; page < pages; page++) { +WATCHDOG_RESET (); + ops.datbuf = p_buffer; ops.oobbuf = ops.datbuf + pagesize;
Signature · 1 line
1.7.1
PATCH 1/1 NAND: add more watchdog resets
My testresults:
unpatched ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nand read 0x20000000 0x00100000 0x03000000
no problem
nand write 0x20000000 0x00100000 0x00c00000
no problem
nand write 0x20000000 0x00100000 0x00d00000
the watchdog will reset the processorpatched ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nand read 0x20000000 0x00100000 0x03000000
no problem
nand write 0x20000000 0x00100000 0x07f00000
no problem~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
So, reading was never a problem, only writing.
And that is fixed now!
Thanks!
Quoted 62 lines · Scott Wood
Poke the watchdog in a variety of looping constructs, which could take a long time to complete.
Signed-off-by Scott Wood<[email protected]>---
Jaap, does this resolve the watchdog problems you were seeing?drivers/mtd/nand/nand_base.c | 6 ++++++ drivers/mtd/nand/nand_util.c | 2 ++ 2 files changed, 8 insertions(+), 0 deletions(-)drivers/mtd/nand/nand_base.c +6
-0@@ -1156,6 +1156,8 @@ static int nand_do_read_ops(struct mtd_info *mtd, loff_t from, oob = ops->oobbuf;while (1 ) { +WATCHDOG_RESET (); + bytes =min (mtd->writesize - col, readlen); aligned = (bytes == mtd->writesize);@@ -1485,6 +1487,7 @@ static int nand_do_read_oob(struct mtd_info *mtd, loff_t from, page = realpage& chip->pagemask;while (1 ) { +WATCHDOG_RESET (); sndcmd = chip->ecc.read_oob (mtd, chip, page, sndcmd); len =min (len, readlen);@@ -1884,6 +1887,8 @@ static int nand_do_write_ops(struct mtd_info *mtd, loff_t to,memset (chip->oob_poi,0xff , mtd->oobsize);while (1 ) { +WATCHDOG_RESET (); +int bytes = mtd->writesize;int cached = writelen> bytes&& page != blockmask;uint8_t *wbuf = buf;@@ -2215,6 +2220,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr, instr->state =MTD_ERASING ;while (len) { +WATCHDOG_RESET ();/* * heck if we have a bad block, we do not erase bad blocks ! */ drivers/mtd/nand/nand_util.c +2
-0@@ -542,6 +542,8 @@ int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, pages = write_size / pagesize_oob;for (page =0 ; page< pages; page++) { +WATCHDOG_RESET (); + ops.datbuf = p_buffer; ops.oobbuf = ops.datbuf + pagesize;