diff options
Diffstat (limited to 'tools/env/fw_env.c')
| -rw-r--r-- | tools/env/fw_env.c | 34 | 
1 files changed, 24 insertions, 10 deletions
| diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index 37b60b80a..bf3023419 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -836,9 +836,9 @@ static int flash_write_buf (int dev, int fd, void *buf, size_t count,  		erase.start = blockstart;  		ioctl (fd, MEMUNLOCK, &erase); - -		/* Dataflash does not need an explicit erase cycle */ -		if (mtd_type != MTD_DATAFLASH) +		/* 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), @@ -949,19 +949,33 @@ static int flash_write (int fd_current, int fd_target, int dev_target)  static int flash_read (int fd)  {  	struct mtd_info_user mtdinfo; +	struct stat st;  	int rc; -	rc = ioctl (fd, MEMGETINFO, &mtdinfo); +	rc = fstat(fd, &st);  	if (rc < 0) { -		perror ("Cannot get MTD information"); +		fprintf(stderr, "Cannot stat the file %s\n", +			DEVNAME(dev_current));  		return -1;  	} -	if (mtdinfo.type != MTD_NORFLASH && -	    mtdinfo.type != MTD_NANDFLASH && -	    mtdinfo.type != MTD_DATAFLASH) { -		fprintf (stderr, "Unsupported flash type %u\n", mtdinfo.type); -		return -1; +	if (S_ISCHR(st.st_mode)) { +		rc = ioctl(fd, MEMGETINFO, &mtdinfo); +		if (rc < 0) { +			fprintf(stderr, "Cannot get MTD information for %s\n", +				DEVNAME(dev_current)); +			return -1; +		} +		if (mtdinfo.type != MTD_NORFLASH && +		    mtdinfo.type != MTD_NANDFLASH && +		    mtdinfo.type != MTD_DATAFLASH) { +			fprintf (stderr, "Unsupported flash type %u on %s\n", +				 mtdinfo.type, DEVNAME(dev_current)); +			return -1; +		} +	} else { +		memset(&mtdinfo, 0, sizeof(mtdinfo)); +		mtdinfo.type = MTD_ABSENT;  	}  	DEVTYPE(dev_current) = mtdinfo.type; |