From 1225f03eaae14cb42fe62e1cf8c8a5c050447cd2 Mon Sep 17 00:00:00 2001 From: Joseph Chen Date: Wed, 27 Dec 2017 16:57:57 +0800 Subject: [PATCH] rockchip: fix blk_dread return value check error blk_dread returns negtive error code or blocks number that read successfully. Change-Id: I0f2afe98cfb64fe8e83a065fa64b91481856f5be Signed-off-by: Joseph Chen --- arch/arm/mach-rockchip/resource_img.c | 8 +++++--- common/boot_rkimg.c | 16 +++++++++++++--- disk/part_rkparm.c | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/arch/arm/mach-rockchip/resource_img.c b/arch/arm/mach-rockchip/resource_img.c index 2f026dc624..16eac39052 100644 --- a/arch/arm/mach-rockchip/resource_img.c +++ b/arch/arm/mach-rockchip/resource_img.c @@ -215,7 +215,7 @@ static int init_resource_list(struct resource_img_hdr *hdr) hdr = (void *)andr_hdr; ret = blk_dread(dev_desc, offset, 1, hdr); - if (ret < 0) + if (ret != 1) goto out; ret = resource_image_check_header(hdr); if (ret < 0) @@ -228,7 +228,7 @@ static int init_resource_list(struct resource_img_hdr *hdr) } ret = blk_dread(dev_desc, offset + hdr->c_offset, hdr->e_blks * hdr->e_nums, content); - if (ret < 0) + if (ret != (hdr->e_blks * hdr->e_nums)) goto err; init_list: @@ -300,7 +300,9 @@ int rockchip_read_resource_file(void *buf, const char *name, dev_desc = rockchip_get_bootdev(); ret = blk_dread(dev_desc, file->rsce_base + file->f_offset + offset, blks, buf); - if (!ret) + if (ret != blks) + ret = -EIO; + else ret = len; return ret; diff --git a/common/boot_rkimg.c b/common/boot_rkimg.c index 5bd8a80c5c..54d3f6fb79 100644 --- a/common/boot_rkimg.c +++ b/common/boot_rkimg.c @@ -97,8 +97,11 @@ static int read_rockchip_image(struct blk_desc *dev_desc, /* read first block with header imformation */ ret = blk_dread(dev_desc, part_info->start, 1, img); - if (ret < 0) + if (ret != 1) { + ret = -EIO; goto err; + } + if (img->tag != TAG_KERNEL) { printf("%s: invalid image tag(0x%x)\n", part_info->name, img->tag); ret = -EINVAL; @@ -113,8 +116,13 @@ static int read_rockchip_image(struct blk_desc *dev_desc, cnt = DIV_ROUND_UP(img->size + 8 + 4, RK_BLK_SIZE); ret = blk_dread(dev_desc, part_info->start + 1, cnt - 1, dst + RK_BLK_SIZE - header_len); - if (!ret) + if (ret != (cnt - 1)) { + printf("%s try to read %d blocks failed, only read %d blocks\n", + part_info->name, cnt - 1, ret); + ret = -EIO; + } else { ret = img->size; + } #ifdef CONFIG_ROCKCHIP_CRC printf("%s image CRC32 verify... ", part_info->name); @@ -192,8 +200,10 @@ int rockchip_get_boot_mode(void) ret = blk_dread(dev_desc, part_info.start + BOOTLOADER_MESSAGE_BLK_OFFSET, size >> 9, bmsg); - if (ret < 0) + if (ret != (size >> 9)) { + ret = -EIO; goto err; + } if (!strcmp(bmsg->command, "boot-recovery")) { printf("boot mode: recovery\n"); diff --git a/disk/part_rkparm.c b/disk/part_rkparm.c index a9af237a1e..b2c04e527d 100644 --- a/disk/part_rkparm.c +++ b/disk/part_rkparm.c @@ -94,7 +94,7 @@ static int rkparm_init_param(struct blk_desc *dev_desc, ret = blk_dread(dev_desc, RK_PARAM_OFFSET, MAX_PARAM_SIZE >> 9, (ulong *)param); - if (ret < 0) { + if (ret != (MAX_PARAM_SIZE >> 9)) { printf("%s param read fail\n", __func__); return -EINVAL; }