[U-Boot] [PATCH v3 1/2] nand: nand torture: follow sync with linux v4.6

follow parameter name change (nand to mtd) to fix compiler error.
Signed-off-by: Max Krummenacher max.krummenacher@toradex.com
---
Changes in v3: - none
Changes in v2: - Patch v1 1/1 went into master, but Scott's patch series syncing with kernel v4.6 introduced an additional compile time error.
drivers/mtd/nand/nand_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 5bba66a..e8bcc34 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -820,7 +820,7 @@ int nand_torture(struct mtd_info *mtd, loff_t offset) { u_char patterns[] = {0xa5, 0x5a, 0x00}; struct erase_info instr = { - .mtd = nand, + .mtd = mtd, .addr = offset, .len = mtd->erasesize, };

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
---
Changes in v3: - findings from Benoît: - aligned offset and endoffset to nand blocks - checked nand area tested against nand size - print actual used values after aligning - clarifications to doc/README.nand
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 | 40 ++++++++++++++++++++++++++++++++++------ doc/README.nand | 6 +++++- 2 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/cmd/nand.c b/cmd/nand.c index 583a18f..6d239a3 100644 --- a/cmd/nand.c +++ b/cmd/nand.c @@ -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,36 @@ 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 +802,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..4ecf9de 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 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)

Hi Max,
On Mon, Jun 13, 2016 at 10:15 AM, Max Krummenacher max.oss.09@gmail.com wrote:
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
Changes in v3:
- findings from Benoît:
- aligned offset and endoffset to nand blocks
- checked nand area tested against nand size
- print actual used values after aligning
- clarifications to doc/README.nand
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 | 40 ++++++++++++++++++++++++++++++++++------ doc/README.nand | 6 +++++- 2 files changed, 39 insertions(+), 7 deletions(-)
diff --git a/cmd/nand.c b/cmd/nand.c index 583a18f..6d239a3 100644 --- a/cmd/nand.c +++ b/cmd/nand.c @@ -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,36 @@ 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 +802,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..4ecf9de 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 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)
2.5.5
Reviewed-by: Benoît Thébaudeau benoit.thebaudeau.dev@gmail.com
Best regards, Benoît

On Mon, Jun 13, 2016 at 10:15:48AM +0200, Max Krummenacher wrote:
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
Applying with these changes:
diff --git a/cmd/nand.c b/cmd/nand.c index 6d239a3..ffdeea4 100644 --- a/cmd/nand.c +++ b/cmd/nand.c @@ -659,11 +659,12 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) }
size = mtd->erasesize; - if (argc > 3) + if (argc > 3) { if (!str2off(argv[3], &size)) { puts("Size is not a valid number\n"); return 1; } + }
endoff = off + size; if (endoff > mtd->size) { @@ -803,7 +804,7 @@ static char nand_help_text[] = "nand dump[.oob] off - dump page\n" #ifdef CONFIG_CMD_NAND_TORTURE "nand torture off - torture one block at offset\n" - "nand torture off size - torture blocks from off to off+size\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"
-Scott
participants (3)
-
Benoît Thébaudeau
-
Max Krummenacher
-
Scott Wood