In certain cases, memory device is present as flat file or block device (via
mmc or mtdblock layer). Do not attempt MTD operations against it.

Signed-off-by: Lubomir Rintel <lkund...@v3.sk>
---
Changes for v2:
   - Coding Style cleanup
   - Clarified an error message
Changes for v3:
   - Used MTD_ABSENT macro to represent non-MTD devices
   - Cleaned up places when zero was used instead of MTD_ABSENT

 tools/env/fw_env.c      |   32 ++++++++++++++++++++++----------
 tools/env/fw_env.config |    3 +++
 2 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c
index 37b60b8..94a790d 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,31 @@ 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");
+               perror("Cannot access the device file");
                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) {
+                       perror("Cannot get MTD information");
+                       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;
+               }
+       } else {
+               memset(&mtdinfo, 0, sizeof(mtdinfo));
+               mtdinfo.type = MTD_ABSENT;
        }
 
        DEVTYPE(dev_current) = mtdinfo.type;
diff --git a/tools/env/fw_env.config b/tools/env/fw_env.config
index 8e21d5a..c086512 100644
--- a/tools/env/fw_env.config
+++ b/tools/env/fw_env.config
@@ -17,3 +17,6 @@
 
 # NAND example
 #/dev/mtd0             0x4000          0x4000          0x20000                 
2
+
+# Block device example
+#/dev/mmcblk0          0xc0000         0x20000
-- 
1.7.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to