[U-Boot] [PATCH] watchdog petting during autoboot delay

Watchdog resets were experienced during autoboot delay. Petting the watchdog during abortboot() function solve the issue.
Signed-off-by: Nicolas Ferre nicolas.ferre@atmel.com --- common/main.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
diff --git a/common/main.c b/common/main.c index f7e7c1c..ea040aa 100644 --- a/common/main.c +++ b/common/main.c @@ -159,6 +159,7 @@ static __inline__ int abortboot(int bootdelay) * when catch up. */ do { + WATCHDOG_RESET(); /* Trigger watchdog, if needed */ if (tstc()) { if (presskey_len < presskey_max) { presskey [presskey_len ++] = getc(); @@ -251,6 +252,7 @@ static __inline__ int abortboot(int bootdelay) # endif break; } + WATCHDOG_RESET(); /* Trigger watchdog, if needed */ udelay(10000); }

On Wednesday 26 May 2010 06:34:49 Nicolas Ferre wrote:
--- a/common/main.c +++ b/common/main.c @@ -159,6 +159,7 @@ static __inline__ int abortboot(int bootdelay) * when catch up. */ do {
if (tstc()) { if (presskey_len < presskey_max) { presskey [presskey_len ++] = getc();WATCHDOG_RESET(); /* Trigger watchdog, if needed */
@@ -251,6 +252,7 @@ static __inline__ int abortboot(int bootdelay) # endif break; }
}WATCHDOG_RESET(); /* Trigger watchdog, if needed */ udelay(10000);
if your udelay() implementation isnt calling WATCHDOG_RESET(), it is broken. yes, this is undocumented, but search the mailing archives for examples.
i believe the same goes for serial devices and their tstc() function. -mike

Le 26/05/2010 20:13, Mike Frysinger :
On Wednesday 26 May 2010 06:34:49 Nicolas Ferre wrote:
--- a/common/main.c +++ b/common/main.c @@ -159,6 +159,7 @@ static __inline__ int abortboot(int bootdelay) * when catch up. */ do {
if (tstc()) { if (presskey_len < presskey_max) { presskey [presskey_len ++] = getc();WATCHDOG_RESET(); /* Trigger watchdog, if needed */
@@ -251,6 +252,7 @@ static __inline__ int abortboot(int bootdelay) # endif break; }
}WATCHDOG_RESET(); /* Trigger watchdog, if needed */ udelay(10000);
if your udelay() implementation isnt calling WATCHDOG_RESET(), it is broken. yes, this is undocumented, but search the mailing archives for examples.
Yes, for sure, udelay() is calling WATCHDOG_RESET().
i believe the same goes for serial devices and their tstc() function.
True, this is where the problem resides. I will try to modify the atmel_serial tstc() function.
Best regards,

Le 26/05/2010 20:13, Mike Frysinger :
On Wednesday 26 May 2010 06:34:49 Nicolas Ferre wrote:
--- a/common/main.c +++ b/common/main.c @@ -159,6 +159,7 @@ static __inline__ int abortboot(int bootdelay) * when catch up. */ do {
if (tstc()) { if (presskey_len < presskey_max) { presskey [presskey_len ++] = getc();WATCHDOG_RESET(); /* Trigger watchdog, if needed */
@@ -251,6 +252,7 @@ static __inline__ int abortboot(int bootdelay) # endif break; }
}WATCHDOG_RESET(); /* Trigger watchdog, if needed */ udelay(10000);
if your udelay() implementation isnt calling WATCHDOG_RESET(), it is broken. yes, this is undocumented, but search the mailing archives for examples.
i believe the same goes for serial devices and their tstc() function.
Well, after more checking, it seems that resetting the watchdog in tstc function is not so common: only serial_pl01x.c is doing it. So I guess that my first addition may be needed for other chips...
Best regards,

On Thu, Jun 3, 2010 at 1:39 PM, Nicolas Ferre wrote:
Le 26/05/2010 20:13, Mike Frysinger :
On Wednesday 26 May 2010 06:34:49 Nicolas Ferre wrote:
--- a/common/main.c +++ b/common/main.c @@ -159,6 +159,7 @@ static __inline__ int abortboot(int bootdelay) * when catch up. */ do {
- WATCHDOG_RESET(); /* Trigger watchdog, if needed */
if (tstc()) { if (presskey_len < presskey_max) { presskey [presskey_len ++] = getc(); @@ -251,6 +252,7 @@ static __inline__ int abortboot(int bootdelay) # endif break; }
- WATCHDOG_RESET(); /* Trigger watchdog, if needed */
udelay(10000); }
if your udelay() implementation isnt calling WATCHDOG_RESET(), it is broken. yes, this is undocumented, but search the mailing archives for examples.
i believe the same goes for serial devices and their tstc() function.
Well, after more checking, it seems that resetting the watchdog in tstc function is not so common: only serial_pl01x.c is doing it. So I guess that my first addition may be needed for other chips...
i think you're looking at the multi-serial drivers and not the cpu-serial drivers ? i.e. cpu/*/serial.c and such vs drivers/serial/* ?
the former category tends to be more trend setting than the latter. -mike

Watchdog resets were experienced during autoboot delay. Petting the watchdog during putc() and tstc() functions solve the issue.
Signed-off-by: Nicolas Ferre nicolas.ferre@atmel.com --- drivers/serial/atmel_usart.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/drivers/serial/atmel_usart.c b/drivers/serial/atmel_usart.c index cad3412..fcaee5d 100644 --- a/drivers/serial/atmel_usart.c +++ b/drivers/serial/atmel_usart.c @@ -80,7 +80,8 @@ void serial_putc(char c) if (c == '\n') serial_putc('\r');
- while (!(usart3_readl(CSR) & USART3_BIT(TXRDY))) ; + while (!(usart3_readl(CSR) & USART3_BIT(TXRDY))) + WATCHDOG_RESET(); usart3_writel(THR, c); }
@@ -99,5 +100,6 @@ int serial_getc(void)
int serial_tstc(void) { + WATCHDOG_RESET(); return (usart3_readl(CSR) & USART3_BIT(RXRDY)) != 0; }

On Thu, Jun 10, 2010 at 10:57 AM, Nicolas Ferre wrote:
--- a/drivers/serial/atmel_usart.c +++ b/drivers/serial/atmel_usart.c @@ -80,7 +80,8 @@ void serial_putc(char c) if (c == '\n') serial_putc('\r');
- while (!(usart3_readl(CSR) & USART3_BIT(TXRDY))) ;
- while (!(usart3_readl(CSR) & USART3_BIT(TXRDY)))
- WATCHDOG_RESET();
usart3_writel(THR, c); }
i think you'd want to call it before the while() loop, but not in it ... -mike
participants (2)
-
Mike Frysinger
-
Nicolas Ferre