[U-Boot] [PATCH] dfu:mmc: When doing block operations, operate on the given length

Lukasz Majewski l.majewski at samsung.com
Fri Mar 8 16:41:22 CET 2013


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.majewski at samsung.com>
> Signed-off-by: Tom Rini <trini at 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.majewski at samsung.com>

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


-- 
Best regards,

Lukasz Majewski

Samsung R&D Poland (SRPOL) | Linux Platform Group


More information about the U-Boot mailing list