[PATCH u-boot-marvell v3 16/39] tools: kwboot: Prevent waiting indefinitely if no xmodem reply is received

Stefan Roese sr at denx.de
Fri Oct 1 08:21:03 CEST 2021


On 24.09.21 23:06, Marek Behún wrote:
> From: Marek Behún <marek.behun at nic.cz>
> 
> Currently if BootROM fails to respond with ACK/NAK to a xmodem block, we
> will be waiting indefinitely for such response.
> 
> Make sure that we only wait at most 1 second (blk_rsp_timeo) for ACK/NAK
> for each block in case non-xmodem text output is not being expected.
> Interpret this timeout expiration as NAK, to try to send the block
> again.
> 
> On the other hand, if timeout expires without ACK while some non-xmodem
> output was already received (DDR training output, for example), we know
> that the block was received, since the code is being executed, so in
> this case exit with ETIMEDOUT.
> 
> Signed-off-by: Marek Behún <marek.behun at nic.cz>

Reviewed-by: Stefan Roese <sr at denx.de>

Thanks,
Stefan

> ---
>   tools/kwboot.c | 14 +++++++++++---
>   1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/tools/kwboot.c b/tools/kwboot.c
> index cf6e32c6fa..8c11dca5ed 100644
> --- a/tools/kwboot.c
> +++ b/tools/kwboot.c
> @@ -407,17 +407,18 @@ static int
>   kwboot_xm_recv_reply(int fd, char *c, int allow_non_xm, int *non_xm_print)
>   {
>   	int timeout = allow_non_xm ? KWBOOT_HDR_RSP_TIMEO : blk_rsp_timeo;
> -	uint64_t recv_until = 0;
> +	uint64_t recv_until = _now() + timeout;
>   	int rc;
>   
> -	*non_xm_print = 0;
> +	if (non_xm_print)
> +		*non_xm_print = 0;
>   
>   	while (1) {
>   		rc = kwboot_tty_recv(fd, c, 1, timeout);
>   		if (rc) {
>   			if (errno != ETIMEDOUT)
>   				return rc;
> -			else if (recv_until && recv_until < _now())
> +			else if (allow_non_xm && *non_xm_print)
>   				return -1;
>   			else
>   				*c = NAK;
> @@ -430,12 +431,19 @@ kwboot_xm_recv_reply(int fd, char *c, int allow_non_xm, int *non_xm_print)
>   		/*
>   		 * If printing non-xmodem text output is allowed and such a byte
>   		 * was received, print it and increase receiving time.
> +		 * Otherwise decrease timeout by time elapsed.
>   		 */
>   		if (allow_non_xm) {
>   			recv_until = _now() + timeout;
>   			putchar(*c);
>   			fflush(stdout);
>   			*non_xm_print = 1;
> +		} else {
> +			timeout = recv_until - _now();
> +			if (timeout < 0) {
> +				errno = ETIMEDOUT;
> +				return -1;
> +			}
>   		}
>   	}
>   
> 


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