[U-Boot] [PATCH] dfu: Handle large transfers correctly
Marek Vasut
marex at denx.de
Thu Nov 29 07:26:51 CET 2012
Dear Pantelis Antoniou,
> The sequence number is a 16 bit counter; make sure we
> handle rollover correctly. This fixes the wrong transfers for
> large (> 256MB) images.
>
> Signed-off-by: Pantelis Antoniou <panto at antoniou-consulting.com>
> ---
> drivers/dfu/dfu.c | 28 +++++++++++++++++++++++-----
> drivers/dfu/dfu_mmc.c | 3 +++
> include/dfu.h | 2 ++
> 3 files changed, 28 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/dfu/dfu.c b/drivers/dfu/dfu.c
> index 1260c55..2483018 100644
> --- a/drivers/dfu/dfu.c
> +++ b/drivers/dfu/dfu.c
> @@ -82,7 +82,7 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int
> size, int blk_seq_num) __func__, dfu->name, buf, size, blk_seq_num,
> dfu->offset, dfu->i_buf - dfu->i_buf_start);
>
> - if (blk_seq_num == 0) {
> + if (dfu->do_init) {
If you were to change this to dfu->inited, I think it'd be a bit more intuitive
;)
> /* initial state */
> dfu->crc = 0;
> dfu->offset = 0;
> @@ -90,6 +90,8 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int
> size, int blk_seq_num) dfu->i_buf_start = dfu_buf;
> dfu->i_buf_end = dfu_buf + sizeof(dfu_buf);
> dfu->i_buf = dfu->i_buf_start;
> +
> + dfu->do_init = 0;
> }
>
> if (dfu->i_blk_seq_num != blk_seq_num) {
> @@ -97,7 +99,8 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int
> size, int blk_seq_num) __func__, dfu->i_blk_seq_num, blk_seq_num);
> return -1;
> }
> - dfu->i_blk_seq_num++;
> + /* handle rollover */
> + dfu->i_blk_seq_num = (dfu->i_blk_seq_num + 1) & 0xffff;
>
> /* flush buffer if overflow */
> if ((dfu->i_buf + size) > dfu->i_buf_end) {
> @@ -106,6 +109,13 @@ int dfu_write(struct dfu_entity *dfu, void *buf, int
> size, int blk_seq_num) ret = tret;
> }
>
> + /* we should be in buffer now (if not then size too large) */
I can't make much sense from this comment :(
> + if ((dfu->i_buf + size) > dfu->i_buf_end) {
> + printf("%s: Wrong size! [%d] [%d] - \n",
And you should really make this output a bit more human readable please.
> + __func__, dfu->i_blk_seq_num, blk_seq_num, size);
> + return -1;
> + }
> +
[...]
More information about the U-Boot
mailing list