diff options
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/nand.c | 41 |
1 files changed, 35 insertions, 6 deletions
@@ -647,6 +647,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; @@ -655,12 +658,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, mtd->erasesize); - ret = nand_torture(mtd, off); - printf(" %s\n", ret ? "Failed" : "Passed"); + size = mtd->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 > mtd->size) { + puts("Arguments beyond end of NAND\n"); + return 1; + } + + off = round_down(off, mtd->erasesize); + endoff = round_up(endoff, mtd->erasesize); + size = endoff - off; + printf("\nNAND torture: device %d offset 0x%llx size 0x%llx (block size 0x%x)\n", + dev, off, size, mtd->erasesize); + while (off < endoff) { + ret = nand_torture(mtd, off); + if (ret) { + failed++; + printf(" block at 0x%llx failed\n", off); + } else { + passed++; + } + off += mtd->erasesize; + } + printf(" Passed: %u, failed: %u\n", passed, failed); + return failed != 0; } #endif @@ -775,7 +803,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" |