aboutsummaryrefslogtreecommitdiff
path: root/drivers/dfu/dfu_mmc.c
diff options
context:
space:
mode:
authorSimon Goldschmidt2019-01-25 19:58:01 +0100
committerTom Rini2019-01-30 21:22:53 -0500
commit1f92c074cbb53debc7ad31073dc7895d8a2aa44e (patch)
treee3a15bd7ba85b3e4467cbc44dd6344332c753d4c /drivers/dfu/dfu_mmc.c
parent552452f80caf1e1069e547b6605987427e93111b (diff)
dfu: mmc: call fs functions instead of run_command
This unbreaks dfu mmc_file_op which is currently broken since using the load cmd on a buffer from heap is not allowed - added with commit aa3c609e2be5 ("fs: prevent overwriting reserved memory") Fixes: commit aa3c609e2be5 ("fs: prevent overwriting reserved memory") Reported-by: Stephen Warren <swarren@wwwdotorg.org> Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com> Tested-by: Stephen Warren <swarren@nvidia.com> Acked-by: Lukasz Majewski <lukma@denx.de>
Diffstat (limited to 'drivers/dfu/dfu_mmc.c')
-rw-r--r--drivers/dfu/dfu_mmc.c67
1 files changed, 31 insertions, 36 deletions
diff --git a/drivers/dfu/dfu_mmc.c b/drivers/dfu/dfu_mmc.c
index b45e6dc54ca..403fd5351d7 100644
--- a/drivers/dfu/dfu_mmc.c
+++ b/drivers/dfu/dfu_mmc.c
@@ -108,17 +108,17 @@ static int mmc_file_buffer(struct dfu_entity *dfu, void *buf, long *len)
static int mmc_file_op(enum dfu_op op, struct dfu_entity *dfu,
void *buf, u64 *len)
{
- const char *fsname, *opname;
- char cmd_buf[DFU_CMD_BUF_SIZE];
- char *str_env;
+ char dev_part_str[8];
int ret;
+ int fstype;
+ loff_t size = 0;
switch (dfu->layout) {
case DFU_FS_FAT:
- fsname = "fat";
+ fstype = FS_TYPE_FAT;
break;
case DFU_FS_EXT4:
- fsname = "ext4";
+ fstype = FS_TYPE_EXT;
break;
default:
printf("%s: Layout (%s) not (yet) supported!\n", __func__,
@@ -126,48 +126,43 @@ static int mmc_file_op(enum dfu_op op, struct dfu_entity *dfu,
return -1;
}
+ snprintf(dev_part_str, sizeof(dev_part_str), "%d:%d",
+ dfu->data.mmc.dev, dfu->data.mmc.part);
+
+ ret = fs_set_blk_dev("mmc", dev_part_str, fstype);
+ if (ret) {
+ puts("dfu: fs_set_blk_dev error!\n");
+ return ret;
+ }
+
switch (op) {
case DFU_OP_READ:
- opname = "load";
+ ret = fs_read(dfu->name, (size_t)buf, 0, 0, &size);
+ if (ret) {
+ puts("dfu: fs_read error!\n");
+ return ret;
+ }
+ *len = size;
break;
case DFU_OP_WRITE:
- opname = "write";
+ ret = fs_write(dfu->name, (size_t)buf, 0, *len, &size);
+ if (ret) {
+ puts("dfu: fs_write error!\n");
+ return ret;
+ }
break;
case DFU_OP_SIZE:
- opname = "size";
+ ret = fs_size(dfu->name, &size);
+ if (ret) {
+ puts("dfu: fs_size error!\n");
+ return ret;
+ }
+ *len = size;
break;
default:
return -1;
}
- sprintf(cmd_buf, "%s%s mmc %d:%d", fsname, opname,
- dfu->data.mmc.dev, dfu->data.mmc.part);
-
- if (op != DFU_OP_SIZE)
- sprintf(cmd_buf + strlen(cmd_buf), " %p", buf);
-
- sprintf(cmd_buf + strlen(cmd_buf), " %s", dfu->name);
-
- if (op == DFU_OP_WRITE)
- sprintf(cmd_buf + strlen(cmd_buf), " %llx", *len);
-
- debug("%s: %s 0x%p\n", __func__, cmd_buf, cmd_buf);
-
- ret = run_command(cmd_buf, 0);
- if (ret) {
- puts("dfu: Read error!\n");
- return ret;
- }
-
- if (op != DFU_OP_WRITE) {
- str_env = env_get("filesize");
- if (str_env == NULL) {
- puts("dfu: Wrong file size!\n");
- return -1;
- }
- *len = simple_strtoul(str_env, NULL, 16);
- }
-
return ret;
}