diff options
| author | Scott Wood <scottwood@freescale.com> | 2008-10-29 14:20:26 -0500 | 
|---|---|---|
| committer | Scott Wood <scottwood@freescale.com> | 2008-10-29 14:20:26 -0500 | 
| commit | bd78bc6b2aebf5566aac464f936b88dfd97ab0bd (patch) | |
| tree | e0ce1d6170b2286bc9fef6390b08c8035774afd3 /drivers/mtd/nand/nand_util.c | |
| parent | f7fe57c09866b44692d18c8cf22828bd137ec58d (diff) | |
| download | olio-uboot-2014.01-bd78bc6b2aebf5566aac464f936b88dfd97ab0bd.tar.xz olio-uboot-2014.01-bd78bc6b2aebf5566aac464f936b88dfd97ab0bd.zip | |
NAND: Properly create JFFS2 cleanmarkers.
As reported by Ilko Iliev <iliev@ronetix.at>, the "nand erase clean"
command is currently broken, and among other things causes all blocks
to be marked bad.
This implements it properly using MTD_OOB_AUTO, along with some
indentation fixes.
Signed-off-by: Scott Wood <scottwood@freescale.com>
Diffstat (limited to 'drivers/mtd/nand/nand_util.c')
| -rw-r--r-- | drivers/mtd/nand/nand_util.c | 30 | 
1 files changed, 11 insertions, 19 deletions
| diff --git a/drivers/mtd/nand/nand_util.c b/drivers/mtd/nand/nand_util.c index 52b3d21b8..149af83ab 100644 --- a/drivers/mtd/nand/nand_util.c +++ b/drivers/mtd/nand/nand_util.c @@ -78,9 +78,7 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)  	const char *mtd_device = meminfo->name;  	struct mtd_oob_ops oob_opts;  	struct nand_chip *chip = meminfo->priv; -	uint8_t buf[64]; -	memset(buf, 0, sizeof(buf));  	memset(&erase, 0, sizeof(erase));  	memset(&oob_opts, 0, sizeof(oob_opts)); @@ -89,13 +87,9 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)  	erase.addr = opts->offset;  	erase_length = opts->length; -  	cleanmarker.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK);  	cleanmarker.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER);  	cleanmarker.totlen = cpu_to_je32(8); -	cleanmarker.hdr_crc = cpu_to_je32( -	crc32_no_comp(0, (unsigned char *) &cleanmarker, -	sizeof(struct jffs2_unknown_node) - 4));  	/* scrub option allows to erase badblock. To prevent internal  	 * check from erase() method, set block check method to dummy @@ -154,23 +148,21 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)  		}  		/* format for JFFS2 ? */ -		if (opts->jffs2) { - -			chip->ops.len = chip->ops.ooblen = 64; +		if (opts->jffs2 && chip->ecc.layout->oobavail >= 8) { +			chip->ops.ooblen = 8;  			chip->ops.datbuf = NULL; -			chip->ops.oobbuf = buf; -			chip->ops.ooboffs = chip->badblockpos & ~0x01; +			chip->ops.oobbuf = (uint8_t *)&cleanmarker; +			chip->ops.ooboffs = 0; +			chip->ops.mode = MTD_OOB_AUTO;  			result = meminfo->write_oob(meminfo, -							erase.addr + meminfo->oobsize, -							&chip->ops); +			                            erase.addr, +			                            &chip->ops);  			if (result != 0) {  				printf("\n%s: MTD writeoob failure: %d\n", -				mtd_device, result); +				       mtd_device, result);  				continue;  			} -			else -				printf("%s: MTD writeoob at 0x%08x\n",mtd_device, erase.addr + meminfo->oobsize );  		}  		if (!opts->quiet) { @@ -190,11 +182,11 @@ int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)  				percent_complete = percent;  				printf("\rErasing at 0x%x -- %3d%% complete.", -				erase.addr, percent); +				       erase.addr, percent);  				if (opts->jffs2 && result == 0) -				printf(" Cleanmarker written at 0x%x.", -				erase.addr); +					printf(" Cleanmarker written at 0x%x.", +					       erase.addr);  			}  		}  	} |