[U-Boot] xyz-modem: Change getc timeout loop waiting
Alexander Sverdlin
alexander.sverdlin at gmail.com
Wed Aug 1 00:15:07 UTC 2018
Hello!
On Mon, 21 Nov 2016 10:18:51 +0200
Tomas Melin <tomas.melin at vaisala.com> wrote:
> This fixes the loop delay when using a hw watchdog.
>
> In case a watchdog is used that accesses CPU registers,
> the defined delay of 20us in a tight loop will cause a
> huge delay in the actual timeout seen. This is caused
> by the fact that udelay will inheritantly call WATCHDOG_RESET.
> Together with the omap wdt implementation, the seen timeout increases up to
> around 30s. This makes the loop very slow and causes long
> delays when using the modem.
>
> Instead, implement the 2 sec loop by using the timer interface to know
> when to break out of the timeout loop. Watchdog kicking is taken care of
> by getc().
>
> Signed-off-by: Tomas Melin <tomas.melin at vaisala.com>
This commit breaks YMODEM SPL->U-Boot boot on Beagle Bone,
transfer is aborted (because of timeout) after 497kb
(u-boot.img is around 570kb).
Reverting the commit repairs YMODEM boot.
> ---
> common/xyzModem.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/common/xyzModem.c b/common/xyzModem.c
> index 5656aac..e0d87db 100644
> --- a/common/xyzModem.c
> +++ b/common/xyzModem.c
> @@ -71,12 +71,12 @@ typedef int cyg_int32;
> static int
> CYGACC_COMM_IF_GETC_TIMEOUT (char chan, char *c)
> {
> -#define DELAY 20
> - unsigned long counter = 0;
> - while (!tstc () && (counter < xyzModem_CHAR_TIMEOUT * 1000 / DELAY))
> +
> + ulong now = get_timer(0);
> + while (!tstc ())
> {
> - udelay (DELAY);
> - counter++;
> + if (get_timer(now) > xyzModem_CHAR_TIMEOUT)
> + break;
> }
> if (tstc ())
> {
--
Alexander Sverdlin.
More information about the U-Boot
mailing list