diff options
| author | Wolfgang Denk <wd@denx.de> | 2009-05-24 17:34:33 +0200 | 
|---|---|---|
| committer | Scott Wood <scottwood@freescale.com> | 2009-07-07 17:58:05 -0500 | 
| commit | 8360b66bac9567701027a0087274d0c9b2fe8d6b (patch) | |
| tree | 6278f88b25ecfd5b12eb9a68e93d8bd2dd77d8f4 | |
| parent | cd84423a09f3a08029fe41c1db96168debd0b51f (diff) | |
| download | olio-uboot-2014.01-8360b66bac9567701027a0087274d0c9b2fe8d6b.tar.xz olio-uboot-2014.01-8360b66bac9567701027a0087274d0c9b2fe8d6b.zip | |
nand/onenand: Fix missing argument checking for "markbad" command
The "nand markbad" and "onenand markbad" commands did not check if an
argument was passed; if this was forgotten, no error was raised but
block 0 was marked as bad.
While fixing this bug, clean up the code a bit and allow to pass more
than one block address, thus allowing to mark several blocks as bad
in a single command invocation.
Signed-off-by: Wolfgang Denk <wd@denx.de>
Signed-off-by: Scott Wood <scottwood@freescale.com>
| -rw-r--r-- | common/cmd_nand.c | 31 | ||||
| -rw-r--r-- | common/cmd_onenand.c | 35 | 
2 files changed, 44 insertions, 22 deletions
| diff --git a/common/cmd_nand.c b/common/cmd_nand.c index 94514160b..2f7052122 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -414,18 +414,29 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])  	}  	if (strcmp(cmd, "markbad") == 0) { -		addr = (ulong)simple_strtoul(argv[2], NULL, 16); +		argc -= 2; +		argv += 2; -		int ret = nand->block_markbad(nand, addr); -		if (ret == 0) { -			printf("block 0x%08lx successfully marked as bad\n", -			       (ulong) addr); -			return 0; -		} else { -			printf("block 0x%08lx NOT marked as bad! ERROR %d\n", -			       (ulong) addr, ret); +		if (argc <= 0) +			goto usage; + +		while (argc > 0) { +			addr = simple_strtoul(*argv, NULL, 16); + +			if (nand->block_markbad(nand, addr)) { +				printf("block 0x%08lx NOT marked " +					"as bad! ERROR %d\n", +					addr, ret); +				ret = 1; +			} else { +				printf("block 0x%08lx successfully " +					"marked as bad\n", +					addr); +			} +			--argc; +			++argv;  		} -		return 1; +		return ret;  	}  	if (strcmp(cmd, "biterr") == 0) { diff --git a/common/cmd_onenand.c b/common/cmd_onenand.c index 85bd2cb68..9090940ae 100644 --- a/common/cmd_onenand.c +++ b/common/cmd_onenand.c @@ -340,7 +340,7 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])  	int blocksize;  	ulong addr, ofs;  	size_t len, retlen = 0; -	int ret; +	int ret = 0;  	char *cmd, *s;  	mtd = &onenand_mtd; @@ -434,18 +434,29 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])  		}  		if (strcmp(cmd, "markbad") == 0) { -			addr = (ulong)simple_strtoul(argv[2], NULL, 16); +			argc -= 2; +			argv += 2; -			int ret = mtd->block_markbad(mtd, addr); -			if (ret == 0) { -				printf("block 0x%08lx successfully marked as bad\n", -						(ulong) addr); -				return 0; -			} else { -				printf("block 0x%08lx NOT marked as bad! ERROR %d\n", -						(ulong) addr, ret); +			if (argc <= 0) +				goto usage; + +			while (argc > 0) { +				addr = simple_strtoul(*argv, NULL, 16); + +				if (mtd->block_markbad(mtd, addr)) { +					printf("block 0x%08lx NOT marked " +						"as bad! ERROR %d\n", +						addr, ret); +					ret = 1; +				} else { +					printf("block 0x%08lx successfully " +						"marked as bad\n", +						addr); +				} +				--argc; +				++argv;  			} -			return 1; +			return ret;  		}  		if (strncmp(cmd, "dump", 4) == 0) { @@ -474,7 +485,7 @@ usage:  }  U_BOOT_CMD( -	onenand,	6,	1,	do_onenand, +	onenand,	CONFIG_SYS_MAXARGS,	1,	do_onenand,  	"OneNAND sub-system",  	"info - show available OneNAND devices\n"  	"onenand bad - show bad blocks\n" |