mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-23 13:56:20 +00:00
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 commitaa3c609e2b
("fs: prevent overwriting reserved memory") Fixes: commitaa3c609e2b
("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>
This commit is contained in:
parent
552452f80c
commit
1f92c074cb
2 changed files with 34 additions and 40 deletions
|
@ -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,
|
static int mmc_file_op(enum dfu_op op, struct dfu_entity *dfu,
|
||||||
void *buf, u64 *len)
|
void *buf, u64 *len)
|
||||||
{
|
{
|
||||||
const char *fsname, *opname;
|
char dev_part_str[8];
|
||||||
char cmd_buf[DFU_CMD_BUF_SIZE];
|
|
||||||
char *str_env;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
int fstype;
|
||||||
|
loff_t size = 0;
|
||||||
|
|
||||||
switch (dfu->layout) {
|
switch (dfu->layout) {
|
||||||
case DFU_FS_FAT:
|
case DFU_FS_FAT:
|
||||||
fsname = "fat";
|
fstype = FS_TYPE_FAT;
|
||||||
break;
|
break;
|
||||||
case DFU_FS_EXT4:
|
case DFU_FS_EXT4:
|
||||||
fsname = "ext4";
|
fstype = FS_TYPE_EXT;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("%s: Layout (%s) not (yet) supported!\n", __func__,
|
printf("%s: Layout (%s) not (yet) supported!\n", __func__,
|
||||||
|
@ -126,46 +126,41 @@ static int mmc_file_op(enum dfu_op op, struct dfu_entity *dfu,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (op) {
|
snprintf(dev_part_str, sizeof(dev_part_str), "%d:%d",
|
||||||
case DFU_OP_READ:
|
|
||||||
opname = "load";
|
|
||||||
break;
|
|
||||||
case DFU_OP_WRITE:
|
|
||||||
opname = "write";
|
|
||||||
break;
|
|
||||||
case DFU_OP_SIZE:
|
|
||||||
opname = "size";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(cmd_buf, "%s%s mmc %d:%d", fsname, opname,
|
|
||||||
dfu->data.mmc.dev, dfu->data.mmc.part);
|
dfu->data.mmc.dev, dfu->data.mmc.part);
|
||||||
|
|
||||||
if (op != DFU_OP_SIZE)
|
ret = fs_set_blk_dev("mmc", dev_part_str, fstype);
|
||||||
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) {
|
if (ret) {
|
||||||
puts("dfu: Read error!\n");
|
puts("dfu: fs_set_blk_dev error!\n");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (op != DFU_OP_WRITE) {
|
switch (op) {
|
||||||
str_env = env_get("filesize");
|
case DFU_OP_READ:
|
||||||
if (str_env == NULL) {
|
ret = fs_read(dfu->name, (size_t)buf, 0, 0, &size);
|
||||||
puts("dfu: Wrong file size!\n");
|
if (ret) {
|
||||||
return -1;
|
puts("dfu: fs_read error!\n");
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
*len = simple_strtoul(str_env, NULL, 16);
|
*len = size;
|
||||||
|
break;
|
||||||
|
case DFU_OP_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:
|
||||||
|
ret = fs_size(dfu->name, &size);
|
||||||
|
if (ret) {
|
||||||
|
puts("dfu: fs_size error!\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
*len = size;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -80,7 +80,6 @@ struct sf_internal_data {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DFU_NAME_SIZE 32
|
#define DFU_NAME_SIZE 32
|
||||||
#define DFU_CMD_BUF_SIZE 128
|
|
||||||
#ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE
|
#ifndef CONFIG_SYS_DFU_DATA_BUF_SIZE
|
||||||
#define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */
|
#define CONFIG_SYS_DFU_DATA_BUF_SIZE (1024*1024*8) /* 8 MiB */
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue