[U-Boot] [PATCH 3/3] nand: Add torture feature

Scott Wood scottwood at freescale.com
Tue Nov 6 01:03:11 CET 2012


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.thebaudeau at advansee.com>
> Cc: Scott Wood <scottwood at 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


More information about the U-Boot mailing list