diff options
| author | Oliver Metz <oliver@freetz.org> | 2013-08-30 00:56:02 +0200 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2013-09-06 13:09:08 -0400 | 
| commit | e387efbd6535724051364fd78469ef611165e489 (patch) | |
| tree | 0e306df1e9abc1314ad7a00496f14c5aa2a7f0d6 /tools/env/fw_env.c | |
| parent | 23ef62d741911e75f23bfa500005bf08044be0a2 (diff) | |
| download | olio-uboot-2014.01-e387efbd6535724051364fd78469ef611165e489.tar.xz olio-uboot-2014.01-e387efbd6535724051364fd78469ef611165e489.zip | |
fw_env: fix writing environment for mtd devices
Signed-off-by: Oliver Metz <oliver@freetz.org>
Tested-by: Luka Perkov <luka@openwrt.org>
Diffstat (limited to 'tools/env/fw_env.c')
| -rw-r--r-- | tools/env/fw_env.c | 70 | 
1 files changed, 42 insertions, 28 deletions
| diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 65be5f3fb..577ce2de4 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -727,27 +727,39 @@ static int flash_write_buf (int dev, int fd, void *buf, size_t count,  				   MEMGETBADBLOCK needs 64 bits */  	int rc; -	blocklen = DEVESIZE (dev); +	/* +	 * For mtd devices only offset and size of the environment do matter +	 */ +	if (mtd_type == MTD_ABSENT) { +		blocklen = count; +		top_of_range = offset + count; +		erase_len = blocklen; +		blockstart = offset; +		block_seek = 0; +		write_total = blocklen; +	} else { +		blocklen = DEVESIZE(dev); -	top_of_range = ((DEVOFFSET(dev) / blocklen) + -					ENVSECTORS (dev)) * blocklen; +		top_of_range = ((DEVOFFSET(dev) / blocklen) + +					ENVSECTORS(dev)) * blocklen; -	erase_offset = (offset / blocklen) * blocklen; +		erase_offset = (offset / blocklen) * blocklen; -	/* Maximum area we may use */ -	erase_len = top_of_range - erase_offset; +		/* Maximum area we may use */ +		erase_len = top_of_range - erase_offset; -	blockstart = erase_offset; -	/* Offset inside a block */ -	block_seek = offset - erase_offset; +		blockstart = erase_offset; +		/* Offset inside a block */ +		block_seek = offset - erase_offset; -	/* -	 * Data size we actually have to write: from the start of the block -	 * to the start of the data, then count bytes of data, and to the -	 * end of the block -	 */ -	write_total = ((block_seek + count + blocklen - 1) / -						blocklen) * blocklen; +		/* +		 * Data size we actually write: from the start of the block +		 * to the start of the data, then count bytes of data, and +		 * to the end of the block +		 */ +		write_total = ((block_seek + count + blocklen - 1) / +							blocklen) * blocklen; +	}  	/*  	 * Support data anywhere within erase sectors: read out the complete @@ -818,17 +830,18 @@ static int flash_write_buf (int dev, int fd, void *buf, size_t count,  			continue;  		} -		erase.start = blockstart; -		ioctl (fd, MEMUNLOCK, &erase); -		/* These do not need an explicit erase cycle */ -		if (mtd_type != MTD_ABSENT && -		    mtd_type != MTD_DATAFLASH) -			if (ioctl (fd, MEMERASE, &erase) != 0) { -				fprintf (stderr, "MTD erase error on %s: %s\n", -					 DEVNAME (dev), -					 strerror (errno)); -				return -1; -			} +		if (mtd_type != MTD_ABSENT) { +			erase.start = blockstart; +			ioctl(fd, MEMUNLOCK, &erase); +			/* These do not need an explicit erase cycle */ +			if (mtd_type != MTD_DATAFLASH) +				if (ioctl(fd, MEMERASE, &erase) != 0) { +					fprintf(stderr, +						"MTD erase error on %s: %s\n", +						DEVNAME(dev), strerror(errno)); +					return -1; +				} +		}  		if (lseek (fd, blockstart, SEEK_SET) == -1) {  			fprintf (stderr, @@ -847,7 +860,8 @@ static int flash_write_buf (int dev, int fd, void *buf, size_t count,  			return -1;  		} -		ioctl (fd, MEMLOCK, &erase); +		if (mtd_type != MTD_ABSENT) +			ioctl(fd, MEMLOCK, &erase);  		processed  += blocklen;  		block_seek = 0; |