Skip to contentSkip to conversation

NAND: add more watchdog resets

PATCH New Scott Wood 2 participants 2 messages Feb 3, 2011

Subsystems (2)
lore
Share & tools
lore

Scott Wood

author
#0 lore raw

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.

---
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
index 70c0593..b9bd394 100644
@@ -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
index 8b4f738..5a6f7ae 100644
@@ -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
#1 lore raw

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 processor

patched ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     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.

---
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
index 70c0593..b9bd394 100644
@@ -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
index 8b4f738..5a6f7ae 100644
@@ -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;