[PATCH u-boot-marvell v3 13/39] tools: kwboot: Allow non-xmodem text output from BootROM only in a specific case
Stefan Roese
sr at denx.de
Fri Oct 1 08:19:02 CEST 2021
On 24.09.21 23:06, Marek Behún wrote:
> From: Pali Rohár <pali at kernel.org>
>
> When sending image header / image data, BootROM does not send any
> non-xmodem text output. We should therefore interpret unknown bytes in
> the xmodem protocol as errors and resend current packet. This should
> improve the transfer in case there are errors on the UART line.
>
> Text output from BootROM may only happen after whole image header is
> sent and before ACK for the last packet of image header is received.
> In this case BootROM may execute code from the image, which may interact
> with UART (U-Boot SPL, for example, prints stuff on UART).
>
> Print received non-xmodem output from BootROM only in this case.
>
> Signed-off-by: Pali Rohár <pali at kernel.org>
> [ refactored & simplified ]
> Signed-off-by: Marek Behún <marek.behun at nic.cz>
Reviewed-by: Stefan Roese <sr at denx.de>
Thanks,
Stefan
> ---
> tools/kwboot.c | 70 ++++++++++++++++++++++++++++++++++++++------------
> 1 file changed, 53 insertions(+), 17 deletions(-)
>
> diff --git a/tools/kwboot.c b/tools/kwboot.c
> index 2e5684b91c..4636622a6c 100644
> --- a/tools/kwboot.c
> +++ b/tools/kwboot.c
> @@ -382,33 +382,62 @@ _is_xm_reply(char c)
> }
>
> static int
> -kwboot_xm_sendblock(int fd, struct kwboot_block *block)
> +kwboot_xm_recv_reply(int fd, char *c, int allow_non_xm)
> +{
> + int rc;
> +
> + while (1) {
> + rc = kwboot_tty_recv(fd, c, 1, blk_rsp_timeo);
> + if (rc) {
> + if (errno != ETIMEDOUT)
> + return rc;
> + *c = NAK;
> + }
> +
> + /* If received xmodem reply, end. */
> + if (_is_xm_reply(*c))
> + break;
> +
> + /*
> + * If printing non-xmodem text output is allowed and such a byte
> + * was received, print it.
> + */
> + if (allow_non_xm) {
> + putchar(*c);
> + fflush(stdout);
> + }
> + }
> +
> + return 0;
> +}
> +
> +static int
> +kwboot_xm_sendblock(int fd, struct kwboot_block *block, int allow_non_xm,
> + int *done_print)
> {
> int rc, retries;
> char c;
>
> + *done_print = 0;
> +
> retries = 16;
> do {
> rc = kwboot_tty_send(fd, block, sizeof(*block));
> if (rc)
> return rc;
>
> - do {
> - rc = kwboot_tty_recv(fd, &c, 1, blk_rsp_timeo);
> - if (rc) {
> - if (errno != ETIMEDOUT)
> - return rc;
> - c = NAK;
> - }
> -
> - if (!_is_xm_reply(c))
> - printf("%c", c);
> + if (allow_non_xm && !*done_print) {
> + kwboot_progress(100, '.');
> + kwboot_printv("Done\n");
> + *done_print = 1;
> + }
>
> - } while (!_is_xm_reply(c));
> + rc = kwboot_xm_recv_reply(fd, &c, allow_non_xm);
> + if (rc)
> + return rc;
>
> - if (c != ACK)
> + if (!allow_non_xm && c != ACK)
> kwboot_progress(-1, '+');
> -
> } while (c == NAK && retries-- > 0);
>
> rc = -1;
> @@ -435,6 +464,7 @@ static int
> kwboot_xmodem_one(int tty, int *pnum, int header, const uint8_t *data,
> size_t size)
> {
> + int done_print = 0;
> size_t sent, left;
> int rc;
>
> @@ -446,22 +476,28 @@ kwboot_xmodem_one(int tty, int *pnum, int header, const uint8_t *data,
>
> while (sent < size) {
> struct kwboot_block block;
> + int last_block;
> size_t blksz;
>
> blksz = kwboot_xm_makeblock(&block, data, left, (*pnum)++);
> data += blksz;
>
> - rc = kwboot_xm_sendblock(tty, &block);
> + last_block = (left <= blksz);
> +
> + rc = kwboot_xm_sendblock(tty, &block, header && last_block,
> + &done_print);
> if (rc)
> goto out;
>
> sent += blksz;
> left -= blksz;
>
> - kwboot_progress(sent * 100 / size, '.');
> + if (!done_print)
> + kwboot_progress(sent * 100 / size, '.');
> }
>
> - kwboot_printv("Done\n");
> + if (!done_print)
> + kwboot_printv("Done\n");
>
> return 0;
> out:
>
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