On 11/05/2012 02:16:30 PM, Benoît Thébaudeau wrote:
This patch adds a NAND Flash torture feature, which is useful as a
block stress
test to determine if a block is still good and reliable (or should be
marked as
bad), e.g. after a write error.
This code is ported from mtd-utils' lib/libmtd.c.
Signed-off-by: Benoît Thébaudeau <benoit.thebaud...@advansee.com>
Cc: Scott Wood <scottw...@freescale.com>
---
.../common/cmd_nand.c | 18 ++++
.../doc/README.nand | 3 +
.../drivers/mtd/nand/nand_util.c | 107
++++++++++++++++++++
.../include/nand.h | 1 +
4 files changed, 129 insertions(+)
Please define and document a CONFIG symbol to selectively enable this
feature.
diff --git u-boot-nand-flash-9c60e75.orig/common/cmd_nand.c
u-boot-nand-flash-9c60e75/common/cmd_nand.c
index 9c6dabe..fe5c28c 100644
--- u-boot-nand-flash-9c60e75.orig/common/cmd_nand.c
+++ u-boot-nand-flash-9c60e75/common/cmd_nand.c
@@ -701,6 +701,23 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int
argc, char * const argv[])
return ret == 0 ? 0 : 1;
}
+ if (strcmp(cmd, "torture") == 0) {
+ if (argc < 3)
+ goto usage;
+
+ if (!str2off(argv[2], &off)) {
+ puts("Offset is not a valid number\n");
+ 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");
+
+ return ret == 0 ? 0 : 1;
+ }
+
if (strcmp(cmd, "markbad") == 0) {
argc -= 2;
argv += 2;
@@ -812,6 +829,7 @@ U_BOOT_CMD(
"nand erase.chip [clean] - erase entire chip'\n"
"nand bad - show bad blocks\n"
"nand dump[.oob] off - dump page\n"
+ "nand torture off - torture block at offset\n"
"nand scrub [-y] off size | scrub.part partition | scrub.chip\n"
" really clean NAND erasing bad blocks (UNSAFE)\n"
"nand markbad off [...] - mark bad block(s) at offset
(UNSAFE)\n"
diff --git u-boot-nand-flash-9c60e75.orig/doc/README.nand
u-boot-nand-flash-9c60e75/doc/README.nand
index c130189..8a17d11 100644
--- u-boot-nand-flash-9c60e75.orig/doc/README.nand
+++ u-boot-nand-flash-9c60e75/doc/README.nand
@@ -213,6 +213,9 @@ 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 block to determine if it is still reliable
Please elaborate -- for example, what is the return code in the case
where it is reliable versus when it is not? Does the block
automatically
get marked bad if it is unreliable? How many erase cycles does this put
the block through?
What's the intended use of this? Manual inquiries by a curious user, or
something automated?
+ /* Make sure the block contains only 0xff bytes */
+ res = nand->read(nand, offset, nand->erasesize,
&retlen, buf);
+ if ((res && res != -EUCLEAN) || retlen !=
nand->erasesize)
+ goto out;
+
+ res = check_pattern(buf, 0xff, nand->erasesize);
+ if (!res) {
+ printf("Erased block at 0x%llx, but a non-0xff
byte "
+ "was found\n", offset);
+ ret = -EIO;
+ goto out;
+ }
+
+ /* Write a pattern and check it */
+ memset(buf, patterns[i], nand->erasesize);
+ ret = nand->write(nand, offset, nand->erasesize,
&retlen, buf);
+ if (ret || retlen != nand->erasesize)
+ goto out;
+
+ res = nand->read(nand, offset, nand->erasesize,
&retlen, buf);
+ if ((res && res != -EUCLEAN) || retlen !=
nand->erasesize)
+ goto out;
Shouldn't you print an error message if the read, write, or erase fails?
-Scott
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot