@ -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 ;