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>
master
Max Krummenacher 8 years ago committed by Scott Wood
parent e1c29086d5
commit 1866be7d28
  1. 41
      cmd/nand.c
  2. 6
      doc/README.nand

@ -647,6 +647,9 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
#ifdef CONFIG_CMD_NAND_TORTURE #ifdef CONFIG_CMD_NAND_TORTURE
if (strcmp(cmd, "torture") == 0) { if (strcmp(cmd, "torture") == 0) {
loff_t endoff;
unsigned int failed = 0, passed = 0;
if (argc < 3) if (argc < 3)
goto usage; goto usage;
@ -655,12 +658,37 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return 1; return 1;
} }
printf("\nNAND torture: device %d offset 0x%llx size 0x%x\n", size = mtd->erasesize;
dev, off, mtd->erasesize); if (argc > 3) {
ret = nand_torture(mtd, off); if (!str2off(argv[3], &size)) {
printf(" %s\n", ret ? "Failed" : "Passed"); 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 #endif
@ -775,7 +803,8 @@ static char nand_help_text[] =
"nand bad - show bad blocks\n" "nand bad - show bad blocks\n"
"nand dump[.oob] off - dump page\n" "nand dump[.oob] off - dump page\n"
#ifdef CONFIG_CMD_NAND_TORTURE #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 #endif
"nand scrub [-y] off size | scrub.part partition | scrub.chip\n" "nand scrub [-y] off size | scrub.part partition | scrub.chip\n"
" really clean NAND erasing bad blocks (UNSAFE)\n" " really clean NAND erasing bad blocks (UNSAFE)\n"

@ -307,7 +307,7 @@ Miscellaneous and testing commands:
DANGEROUS!!! Factory set bad blocks will be lost. Use only DANGEROUS!!! Factory set bad blocks will be lost. Use only
to remove artificial bad blocks created with the "markbad" command. to remove artificial bad blocks created with the "markbad" command.
"torture offset" "torture offset [size]"
Torture block to determine if it is still reliable. Torture block to determine if it is still reliable.
Enabled by the CONFIG_CMD_NAND_TORTURE configuration option. Enabled by the CONFIG_CMD_NAND_TORTURE configuration option.
This command returns 0 if the block is still reliable, else 1. 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 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 in order to program or update safely firmware to NAND, especially for the UBI
part of such firmware. 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) NAND locking command (for chips with active LOCKPRE pin)

Loading…
Cancel
Save