Hi Tom,

> When working on RAW partitions, it's possible that the whole area
> is larger than DDR.  So what we need to do is make sure that the
> length we are given is aligned with the LBA block size, then pass
> that length in as our count of LBA blocks to operate on.  In doing
> this, we no longer need to modify *len on read operations.
> 
> Cc: Lukasz Majewski <l.majew...@samsung.com>
> Signed-off-by: Tom Rini <tr...@ti.com>
> ---
>  drivers/dfu/dfu_mmc.c |   21 ++++++++++++++-------
>  1 file changed, 14 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/dfu/dfu_mmc.c b/drivers/dfu/dfu_mmc.c
> index 083d745..0bed405 100644
> --- a/drivers/dfu/dfu_mmc.c
> +++ b/drivers/dfu/dfu_mmc.c
> @@ -34,14 +34,21 @@ static int mmc_block_op(enum dfu_mmc_op op,
> struct dfu_entity *dfu, {
>       char cmd_buf[DFU_CMD_BUF_SIZE];
>  
> -     sprintf(cmd_buf, "mmc %s 0x%x %x %x",
> -             op == DFU_OP_READ ? "read" : "write",
> -             (unsigned int) buf,
> -             dfu->data.mmc.lba_start,
> -             dfu->data.mmc.lba_size);
> +     /*
> +      * We must ensure that we read in lba_blk_size chunks, so
> ALIGN
> +      * this value.
> +      */
> +     *len = ALIGN(*len, dfu->data.mmc.lba_blk_size);
> +
> +     if (*len > (dfu->data.mmc.lba_size *
> dfu->data.mmc.lba_blk_size)) {
> +             puts("Request would exceed designated area!\n");
> +             return -EINVAL;
> +     }
>  
> -     if (op == DFU_OP_READ)
> -             *len = dfu->data.mmc.lba_blk_size *
> dfu->data.mmc.lba_size;
> +     sprintf(cmd_buf, "mmc %s 0x%x %x %lx",
> +             op == DFU_OP_READ ? "read" : "write",
> +             (unsigned int) buf, dfu->data.mmc.lba_start,
> +             *len / dfu->data.mmc.lba_blk_size);
>  
>       debug("%s: %s 0x%p\n", __func__, cmd_buf, cmd_buf);
>       return run_command(cmd_buf, 0);

Acked-by: Lukasz Majewski <l.majew...@samsung.com>

Tested-at: TRATS (Exynos4210)
Tested-by: Lukasz Majewski <l.majew...@samsung.com>


-- 
Best regards,

Lukasz Majewski

Samsung R&D Poland (SRPOL) | Linux Platform Group
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to