diff options
| -rw-r--r-- | common/cmd_nand.c | 21 | 
1 files changed, 13 insertions, 8 deletions
| diff --git a/common/cmd_nand.c b/common/cmd_nand.c index dcccc1979..8a812379a 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -37,10 +37,16 @@ int find_dev_and_part(const char *id, struct mtd_device **dev,  		      u8 *part_num, struct part_info **part);  #endif -static int nand_dump(nand_info_t *nand, ulong off, int only_oob) +static int nand_dump(nand_info_t *nand, ulong off, int only_oob, int repeat)  {  	int i;  	u_char *datbuf, *oobbuf, *p; +	static loff_t last; + +	if (repeat) +		off = last + nand->writesize; + +	last = off;  	datbuf = malloc(nand->writesize + nand->oobsize);  	oobbuf = malloc(nand->oobsize); @@ -381,6 +387,7 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])  #endif  	const char *quiet_str = getenv("quiet");  	int dev = nand_curr_device; +	int repeat = flag & CMD_FLAG_REPEAT;  	/* at least two arguments please */  	if (argc < 2) @@ -391,6 +398,10 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])  	cmd = argv[1]; +	/* Only "dump" is repeatable. */ +	if (repeat && strcmp(cmd, "dump")) +		return 0; +  	if (strcmp(cmd, "info") == 0) {  		putc('\n'); @@ -532,16 +543,10 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])  		if (argc < 3)  			goto usage; -		s = strchr(cmd, '.');  		off = (int)simple_strtoul(argv[2], NULL, 16); - -		if (s != NULL && strcmp(s, ".oob") == 0) -			ret = nand_dump(nand, off, 1); -		else -			ret = nand_dump(nand, off, 0); +		ret = nand_dump(nand, off, !strcmp(&cmd[4], ".oob"), repeat);  		return ret == 0 ? 1 : 0; -  	}  	if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) { |