diff options
Diffstat (limited to 'common/cmd_nand.c')
| -rw-r--r-- | common/cmd_nand.c | 40 | 
1 files changed, 26 insertions, 14 deletions
| diff --git a/common/cmd_nand.c b/common/cmd_nand.c index 886212aa0..04ab0f19b 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -42,6 +42,7 @@ 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; +	int ret = 0;  	if (repeat)  		off = last + nand->writesize; @@ -49,11 +50,17 @@ static int nand_dump(nand_info_t *nand, ulong off, int only_oob, int repeat)  	last = off;  	datbuf = memalign(ARCH_DMA_MINALIGN, nand->writesize); -	oobbuf = memalign(ARCH_DMA_MINALIGN, nand->oobsize); -	if (!datbuf || !oobbuf) { +	if (!datbuf) {  		puts("No memory for page buffer\n");  		return 1;  	} + +	oobbuf = memalign(ARCH_DMA_MINALIGN, nand->oobsize); +	if (!oobbuf) { +		puts("No memory for page buffer\n"); +		ret = 1; +		goto free_dat; +	}  	off &= ~(nand->writesize - 1);  	loff_t addr = (loff_t) off;  	struct mtd_oob_ops ops; @@ -66,23 +73,25 @@ static int nand_dump(nand_info_t *nand, ulong off, int only_oob, int repeat)  	i = mtd_read_oob(nand, addr, &ops);  	if (i < 0) {  		printf("Error (%d) reading page %08lx\n", i, off); -		free(datbuf); -		free(oobbuf); -		return 1; +		ret = 1; +		goto free_all;  	}  	printf("Page %08lx dump:\n", off); -	i = nand->writesize >> 4; -	p = datbuf; -	while (i--) { -		if (!only_oob) +	if (!only_oob) { +		i = nand->writesize >> 4; +		p = datbuf; + +		while (i--) {  			printf("\t%02x %02x %02x %02x %02x %02x %02x %02x"  			       "  %02x %02x %02x %02x %02x %02x %02x %02x\n",  			       p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],  			       p[8], p[9], p[10], p[11], p[12], p[13], p[14],  			       p[15]); -		p += 16; +			p += 16; +		}  	} +  	puts("OOB:\n");  	i = nand->oobsize >> 3;  	p = oobbuf; @@ -91,10 +100,13 @@ static int nand_dump(nand_info_t *nand, ulong off, int only_oob, int repeat)  		       p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]);  		p += 8;  	} -	free(datbuf); + +free_all:  	free(oobbuf); +free_dat: +	free(datbuf); -	return 0; +	return ret;  }  /* ------------------------------------------------------------------------- */ @@ -604,11 +616,11 @@ static int do_nand(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  					opts.scrub = 1;  				else {  					puts("scrub aborted\n"); -					return -1; +					return 1;  				}  			} else {  				puts("scrub aborted\n"); -				return -1; +				return 1;  			}  		}  		ret = nand_erase_opts(nand, &opts); |