[PATCH u-boot-marvell v3 17/39] tools: kwboot: Properly finish xmodem transfer
Stefan Roese
sr at denx.de
Fri Oct 1 08:21:19 CEST 2021
On 24.09.21 23:06, Marek Behún wrote:
> From: Pali Rohár <pali at kernel.org>
>
> After kwboot sends EOT, BootROM sends back ACK. Add code for handling
> this and retry sending EOT on error.
>
> Signed-off-by: Pali Rohár <pali at kernel.org>
> [ refactored ]
> Signed-off-by: Marek Behún <marek.behun at nic.cz>
Reviewed-by: Stefan Roese <sr at denx.de>
Thanks,
Stefan
> ---
> tools/kwboot.c | 62 ++++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 45 insertions(+), 17 deletions(-)
>
> diff --git a/tools/kwboot.c b/tools/kwboot.c
> index 8c11dca5ed..ad91afd075 100644
> --- a/tools/kwboot.c
> +++ b/tools/kwboot.c
> @@ -403,6 +403,29 @@ _is_xm_reply(char c)
> return c == ACK || c == NAK || c == CAN;
> }
>
> +static int
> +_xm_reply_to_error(int c)
> +{
> + int rc = -1;
> +
> + switch (c) {
> + case ACK:
> + rc = 0;
> + break;
> + case NAK:
> + errno = EBADMSG;
> + break;
> + case CAN:
> + errno = ECANCELED;
> + break;
> + default:
> + errno = EPROTO;
> + break;
> + }
> +
> + return rc;
> +}
> +
> static int
> kwboot_xm_recv_reply(int fd, char *c, int allow_non_xm, int *non_xm_print)
> {
> @@ -483,24 +506,29 @@ kwboot_xm_sendblock(int fd, struct kwboot_block *block, int allow_non_xm,
> if (non_xm_print)
> kwboot_printv("\n");
>
> - rc = -1;
> + return _xm_reply_to_error(c);
> +}
>
> - switch (c) {
> - case ACK:
> - rc = 0;
> - break;
> - case NAK:
> - errno = EBADMSG;
> - break;
> - case CAN:
> - errno = ECANCELED;
> - break;
> - default:
> - errno = EPROTO;
> - break;
> - }
> +static int
> +kwboot_xm_finish(int fd)
> +{
> + int rc, retries;
> + char c;
>
> - return rc;
> + kwboot_printv("Finishing transfer\n");
> +
> + retries = 16;
> + do {
> + rc = kwboot_tty_send_char(fd, EOT);
> + if (rc)
> + return rc;
> +
> + rc = kwboot_xm_recv_reply(fd, &c, 0, NULL);
> + if (rc)
> + return rc;
> + } while (c == NAK && retries-- > 0);
> +
> + return _xm_reply_to_error(c);
> }
>
> static int
> @@ -577,7 +605,7 @@ kwboot_xmodem(int tty, const void *_img, size_t size)
> if (rc)
> return rc;
>
> - return kwboot_tty_send_char(tty, EOT);
> + return kwboot_xm_finish(tty);
> }
>
> static int
>
Viele Grüße,
Stefan
--
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-51 Fax: (+49)-8142-66989-80 Email: sr at denx.de
More information about the U-Boot
mailing list