diff options
author | Max Krummenacher <max.oss.09@gmail.com> | 2016-06-13 10:15:48 +0200 |
---|---|---|
committer | Marcel Ziswiler <marcel.ziswiler@toradex.com> | 2016-09-29 06:03:15 +0200 |
commit | c345927696d18c8c00d0f1d1820d2c21dee32a09 (patch) | |
tree | 9750827a3cf6fa9cb1737cda8ea37c15b5cac5de | |
parent | fd714a5cdeb8e13cbe66d2dfe262a738c8940ff8 (diff) |
nand: extend nand torture
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 (block size 0x20000)
Passed: 1, failed: 0
==> nand torture 1000000 40000
NAND torture: device 0 offset 0x1000000 size 0x40000 (block size 0x20000)
Passed: 2, failed: 0
Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
Reviewed-by: Benoît Thébaudeau <benoit.thebaudeau.dev@gmail.com>
[scottwood: fix usage to show size as optional, and add misssing braces]
Signed-off-by: Scott Wood <oss@buserror.net>
(cherry picked from commit 1866be7d28ce807397e4aedd93f70564ac8bebc0)
-rw-r--r-- | common/cmd_nand.c | 41 | ||||
-rw-r--r-- | doc/README.nand | 6 |
2 files changed, 40 insertions, 7 deletions
diff --git a/common/cmd_nand.c b/common/cmd_nand.c index dadf6e925ed..86b471c8989 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -732,6 +732,9 @@ 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 int failed = 0, passed = 0; + if (argc < 3) goto usage; @@ -740,12 +743,37 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 1; } - printf("\nNAND torture: device %d offset 0x%llx size 0x%x\n", - dev, off, nand->erasesize); - ret = nand_torture(nand, off); - printf(" %s\n", ret ? "Failed" : "Passed"); + size = nand->erasesize; + if (argc > 3) { + if (!str2off(argv[3], &size)) { + puts("Size is not a valid number\n"); + return 1; + } + } - return ret == 0 ? 0 : 1; + endoff = off + size; + if (endoff > nand->size) { + puts("Arguments beyond end of NAND\n"); + return 1; + } + + off = round_down(off, nand->erasesize); + endoff = round_up(endoff, nand->erasesize); + size = endoff - off; + printf("\nNAND torture: device %d offset 0x%llx size 0x%llx (block size 0x%x)\n", + dev, off, size, nand->erasesize); + while (off < endoff) { + ret = nand_torture(nand, off); + if (ret) { + failed++; + printf(" block at 0x%llx failed\n", off); + } else { + passed++; + } + off += nand->erasesize; + } + printf(" Passed: %u, failed: %u\n", passed, failed); + return failed != 0; } #endif @@ -856,7 +884,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 0ff56331d5f..a6925bd0d08 100644 --- a/doc/README.nand +++ b/doc/README.nand @@ -310,7 +310,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. @@ -327,6 +327,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 erase size, then the block + that 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) |