[U-Boot] [PATCH v2 2/2] nand: extend nand torture

Max Krummenacher max.oss.09 at gmail.com
Tue Jun 7 13:46:20 CEST 2016


nand torture currently works on exactly one nand block which is specified
by giving the byteoffset to the beginning of the block.

Extend this by allowing for a second parameter specifying the byte size
to be tested.

e.g.
==> nand torture 1000000

NAND torture: device 0 offset 0x1000000 size 0x20000 (nand block size 0x20000)
passed 1, failed 0

==> nand torture 1000000 40000

NAND torture: device 0 offset 0x1000000 size 0x40000 (nand block size 0x20000)
passed 2, failed 0

Signed-off-by: Max Krummenacher <max.krummenacher at toradex.com>

---

Changes in v2:
- findings from Benoît:
  - change interface to be offset/size
  - change the output to include both 'size tested' and 'nand block size'
  - updated doc/README.nand accordingly
  - I did not implement the suggestion to move the code into the
    nand_torture() function. Likely one uses the extended functionality
    only during HW bringup interactively. If one would want to test
    multiple blocks from code one would also want to know the testresult
    of each individual block rather than only having a return parameter
    indicating a 'all good' or 'at least one block failed'.

 cmd/nand.c      | 34 ++++++++++++++++++++++++++--------
 doc/README.nand |  6 +++++-
 2 files changed, 31 insertions(+), 9 deletions(-)

diff --git a/cmd/nand.c b/cmd/nand.c
index 583a18f..8ade5e2 100644
--- a/cmd/nand.c
+++ b/cmd/nand.c
@@ -647,6 +647,8 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 
 #ifdef CONFIG_CMD_NAND_TORTURE
 	if (strcmp(cmd, "torture") == 0) {
+		loff_t endoff;
+		unsigned failed = 0, passed = 0;
 		if (argc < 3)
 			goto usage;
 
@@ -654,13 +656,28 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 			puts("Offset is not a valid number\n");
 			return 1;
 		}
-
-		printf("\nNAND torture: device %d offset 0x%llx size 0x%x\n",
-			dev, off, mtd->erasesize);
-		ret = nand_torture(mtd, off);
-		printf(" %s\n", ret ? "Failed" : "Passed");
-
-		return ret == 0 ? 0 : 1;
+		size = mtd->erasesize;
+		if (argc > 3)
+			if (!str2off(argv[3], &size)) {
+				puts("Size is not a valid number\n");
+				return 1;
+			}
+		printf("\nNAND torture: device %d offset 0x%llx size 0x%llx (nand block size 0x%x)\n",
+		       dev, off, size, mtd->erasesize);
+
+		endoff = off + size;
+		while (off < endoff) {
+			ret = nand_torture(mtd, off);
+			if (ret) {
+				failed++;
+				printf(" off 0x%llx %s\n", off, "Failed");
+			} else {
+				passed++;
+			}
+			off += mtd->erasesize;
+		}
+		printf("passed %u, failed %u\n", passed, failed);
+		return failed == 0 ? 0 : 1;
 	}
 #endif
 
@@ -775,7 +792,8 @@ static char nand_help_text[] =
 	"nand bad - show bad blocks\n"
 	"nand dump[.oob] off - dump page\n"
 #ifdef CONFIG_CMD_NAND_TORTURE
-	"nand torture off - torture block at offset\n"
+	"nand torture off - torture one block at offset\n"
+	"nand torture off size - torture blocks from off to off+size\n"
 #endif
 	"nand scrub [-y] off size | scrub.part partition | scrub.chip\n"
 	"    really clean NAND erasing bad blocks (UNSAFE)\n"
diff --git a/doc/README.nand b/doc/README.nand
index 96ffc48..5136f31 100644
--- a/doc/README.nand
+++ b/doc/README.nand
@@ -307,7 +307,7 @@ Miscellaneous and testing commands:
   DANGEROUS!!! Factory set bad blocks will be lost. Use only
   to remove artificial bad blocks created with the "markbad" command.
 
-  "torture offset"
+  "torture offset [size]"
   Torture block to determine if it is still reliable.
   Enabled by the CONFIG_CMD_NAND_TORTURE configuration option.
   This command returns 0 if the block is still reliable, else 1.
@@ -324,6 +324,10 @@ Miscellaneous and testing commands:
   automate actions following a nand->write() error. This would e.g. be required
   in order to program or update safely firmware to NAND, especially for the UBI
   part of such firmware.
+  Optionally a second parameter size can be given to test multiple blocks with
+  one call. If size is not a multiple of the NAND's erasesize then the block
+  which contains offset + size will be tested in full. If used with size this
+  command returns 0 if all tested blocks have been found reliable, else 1.
 
 
 NAND locking command (for chips with active LOCKPRE pin)
-- 
2.5.5



More information about the U-Boot mailing list