When user attempted to perform a raw write using DFU (vide
dfu_fill_entity_mmc) with MMC interface not initialized before,
get_mmc_blk_size() reported invalid (zero) block size - it wasn't
possible to write ie. a new u-boot image.

This commit fixes that by initializing device in get_mmc_blk_size() when
needed.

Tested on Samsung Goni.

Signed-off-by: Mateusz Zalega <m.zal...@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.p...@samsung.com>
Acked-by: Lukasz Majewski <l.majew...@samsung.com>
Cc: Minkyu Kang <mk7.k...@samsung.com>
---
 drivers/dfu/dfu_mmc.c        | 106 ++++++++++++++++++++++++++-----------------
 include/configs/am335x_evm.h |   8 ++--
 include/configs/trats.h      |   2 +-
 include/configs/trats2.h     |   2 +-
 include/dfu.h                |   5 --
 5 files changed, 70 insertions(+), 53 deletions(-)

diff --git a/drivers/dfu/dfu_mmc.c b/drivers/dfu/dfu_mmc.c
index 0816f46..75ff373 100644
--- a/drivers/dfu/dfu_mmc.c
+++ b/drivers/dfu/dfu_mmc.c
@@ -167,66 +167,88 @@ int dfu_read_medium_mmc(struct dfu_entity *dfu, u64 
offset, void *buf,
        return ret;
 }
 
+/*
+ * @param s Parameter string containing space-separated arguments:
+ *     1st:
+ *             raw     (raw read/write)
+ *             fat     (files)
+ *             ext4    (^)
+ *             part    (partition image)
+ *     2nd and 3rd:
+ *             lba_start and lba_size, for raw write
+ *             mmc_dev and mmc_part, for filesystems and part
+ */
 int dfu_fill_entity_mmc(struct dfu_entity *dfu, char *s)
 {
-       int dev, part;
-       struct mmc *mmc;
-       block_dev_desc_t *blk_dev;
-       disk_partition_t partinfo;
-       char *st;
-
-       dfu->dev_type = DFU_DEV_MMC;
-       st = strsep(&s, " ");
-       if (!strcmp(st, "mmc")) {
-               dfu->layout = DFU_RAW_ADDR;
-               dfu->data.mmc.lba_start = simple_strtoul(s, &s, 16);
-               dfu->data.mmc.lba_size = simple_strtoul(++s, &s, 16);
-               dfu->data.mmc.lba_blk_size = get_mmc_blk_size(dfu->dev_num);
-       } else if (!strcmp(st, "fat")) {
-               dfu->layout = DFU_FS_FAT;
-       } else if (!strcmp(st, "ext4")) {
-               dfu->layout = DFU_FS_EXT4;
-       } else if (!strcmp(st, "part")) {
+       const char *argv[3];
+       const char **parg = argv;
+       for (; parg < argv + sizeof(argv) / sizeof(*argv); ++parg) {
+               *parg = strsep(&s, " ");
+               if (*parg == NULL) {
+                       error("Invalid number of arguments.\n");
+                       return -ENODEV;
+               }
+       }
 
-               dfu->layout = DFU_RAW_ADDR;
+       const char *entity_type = argv[0];
+       /*
+        * Base 0 means we'll accept (prefixed with 0x or 0) base 16, 8,
+        * with default 10.
+        */
+       size_t second_arg = simple_strtoul(argv[1], NULL, 0);
+       size_t third_arg = simple_strtoul(argv[2], NULL, 0);
 
-               dev = simple_strtoul(s, &s, 10);
-               s++;
-               part = simple_strtoul(s, &s, 10);
+       struct mmc *mmc = find_mmc_device(dfu->dev_num);
+       if (mmc == NULL) {
+               error("Couldn't find MMC device no. %d.\n", dfu->dev_num);
+               return -ENODEV;
+       }
 
-               mmc = find_mmc_device(dev);
-               if (mmc == NULL || mmc_init(mmc)) {
-                       printf("%s: could not find mmc device #%d!\n",
-                              __func__, dev);
-                       return -ENODEV;
-               }
+       if (mmc_init(mmc)) {
+               error("Couldn't init MMC device.\n");
+               return -ENODEV;
+       }
 
-               blk_dev = &mmc->block_dev;
-               if (get_partition_info(blk_dev, part, &partinfo) != 0) {
-                       printf("%s: could not find partition #%d on mmc device 
#%d!\n",
-                              __func__, part, dev);
+       if (!strcmp(entity_type, "raw")) {
+               dfu->layout                     = DFU_RAW_ADDR;
+               dfu->data.mmc.lba_start         = second_arg;
+               dfu->data.mmc.lba_size          = third_arg;
+               dfu->data.mmc.lba_blk_size      = mmc->read_bl_len;
+       } else if (!strcmp(entity_type, "part")) {
+               disk_partition_t partinfo;
+               block_dev_desc_t *blk_dev = &mmc->block_dev;
+               int mmcdev = second_arg;
+               int mmcpart = third_arg;
+
+               if (get_partition_info(blk_dev, mmcpart, &partinfo) != 0) {
+                       error("Couldn't find part #%d on mmc device #%d\n",
+                             mmcpart, mmcdev);
                        return -ENODEV;
                }
 
-               dfu->data.mmc.lba_start = partinfo.start;
-               dfu->data.mmc.lba_size = partinfo.size;
-               dfu->data.mmc.lba_blk_size = partinfo.blksz;
-
+               dfu->layout                     = DFU_RAW_ADDR;
+               dfu->data.mmc.lba_start         = partinfo.start;
+               dfu->data.mmc.lba_size          = partinfo.size;
+               dfu->data.mmc.lba_blk_size      = partinfo.blksz;
+       } else if (!strcmp(entity_type, "fat")) {
+               dfu->layout = DFU_FS_FAT;
+       } else if (!strcmp(entity_type, "ext4")) {
+               dfu->layout = DFU_FS_EXT4;
        } else {
-               printf("%s: Memory layout (%s) not supported!\n", __func__, st);
+               error("Memory layout (%s) not supported!\n", entity_type);
                return -ENODEV;
        }
 
-       if (dfu->layout == DFU_FS_EXT4 || dfu->layout == DFU_FS_FAT) {
-               dfu->data.mmc.dev = simple_strtoul(s, &s, 10);
-               dfu->data.mmc.part = simple_strtoul(++s, &s, 10);
+       /* if it's NOT a raw write */
+       if (strcmp(entity_type, "raw")) {
+               dfu->data.mmc.dev = second_arg;
+               dfu->data.mmc.part = third_arg;
        }
 
+       dfu->dev_type = DFU_DEV_MMC;
        dfu->read_medium = dfu_read_medium_mmc;
        dfu->write_medium = dfu_write_medium_mmc;
        dfu->flush_medium = dfu_flush_medium_mmc;
-
-       /* initial state */
        dfu->inited = 0;
 
        return 0;
diff --git a/include/configs/am335x_evm.h b/include/configs/am335x_evm.h
index c1f2abf..2aeb80c 100644
--- a/include/configs/am335x_evm.h
+++ b/include/configs/am335x_evm.h
@@ -324,10 +324,10 @@
        "boot part 0 1;" \
        "rootfs part 0 2;" \
        "MLO fat 0 1;" \
-       "MLO.raw mmc 100 100;" \
-       "u-boot.img.raw mmc 300 400;" \
-       "spl-os-args.raw mmc 80 80;" \
-       "spl-os-image.raw mmc 900 2000;" \
+       "MLO.raw mmc 0x100 0x100;" \
+       "u-boot.img.raw mmc 0x300 0x400;" \
+       "spl-os-args.raw mmc 0x80 0x80;" \
+       "spl-os-image.raw mmc 0x900 0x2000;" \
        "spl-os-args fat 0 1;" \
        "spl-os-image fat 0 1;" \
        "u-boot.img fat 0 1;" \
diff --git a/include/configs/trats.h b/include/configs/trats.h
index 84c71ce..64cbe10 100644
--- a/include/configs/trats.h
+++ b/include/configs/trats.h
@@ -101,7 +101,7 @@
        "name="PARTS_UMS",size=-,uuid=${uuid_gpt_"PARTS_UMS"}\0" \
 
 #define CONFIG_DFU_ALT \
-       "u-boot mmc 80 400;" \
+       "u-boot raw 0x80 0x400;" \
        "uImage ext4 0 2;" \
        "modem.bin ext4 0 2;" \
        "exynos4210-trats.dtb ext4 0 2;" \
diff --git a/include/configs/trats2.h b/include/configs/trats2.h
index 823a8ae..5334e2d 100644
--- a/include/configs/trats2.h
+++ b/include/configs/trats2.h
@@ -91,7 +91,7 @@
        "name="PARTS_UMS",size=-,uuid=${uuid_gpt_"PARTS_UMS"}\0" \
 
 #define CONFIG_DFU_ALT \
-       "u-boot mmc 80 800;" \
+       "u-boot raw 0x80 0x800;" \
        "uImage ext4 0 2;" \
        "modem.bin ext4 0 2;" \
        "exynos4412-trats2.dtb ext4 0 2;" \
diff --git a/include/dfu.h b/include/dfu.h
index 9956636..6fd75d0 100644
--- a/include/dfu.h
+++ b/include/dfu.h
@@ -64,11 +64,6 @@ struct ram_internal_data {
        unsigned int    size;
 };
 
-static inline unsigned int get_mmc_blk_size(int dev)
-{
-       return find_mmc_device(dev)->read_bl_len;
-}
-
 #define DFU_NAME_SIZE                  32
 #define DFU_CMD_BUF_SIZE               128
 #ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE
-- 
1.9.0

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

Reply via email to