[U-Boot] [PATCH] RFC: dfu: mmc: call fs functions instead of run_command
Simon Goldschmidt
simon.k.r.goldschmidt at gmail.com
Thu Jan 24 18:54:59 UTC 2019
Steven,
Am Do., 24. Jan. 2019, 19:39 hat Simon Goldschmidt <
simon.k.r.goldschmidt at gmail.com> geschrieben:
> This unbreaks dfu mmc_file_op which is currently broken since using the
> load cmd on a buffer from heap is not allowed.
>
> Signed-off-by: Simon Goldschmidt <simon.k.r.goldschmidt at gmail.com>
>
I'd be very thankful if you could test this! It's RFC as I don't know to
test DFU.
Thanks,
Simon
---
>
> drivers/dfu/dfu_mmc.c | 67 ++++++++++++++++++++-----------------------
> 1 file changed, 31 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/dfu/dfu_mmc.c b/drivers/dfu/dfu_mmc.c
> index b45e6dc54c..2585b14328 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[DFU_CMD_BUF_SIZE];
> 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, DFU_CMD_BUF_SIZE, "%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;
> }
>
> --
> 2.17.1
>
>
More information about the U-Boot
mailing list