watchdog: at91sam9_wdt: avoid spurious watchdog reset during init
Use the min_heartbeat value instead of the calculated heartbeat value for the first watchdog reset to avoid spurious watchdog reset. Resetting the watchdog counter during init might lead to a watchdog fault reset because the watchdog counter has to be running for at least min_heartbeat. Resetting the watchdog counter after heartbeat might lead to a watchdog timeout reset because the watchdog counter is running for more than max_heartbeat time. Using min_heartbeat instead of heartbeat does not guarantee that the watchdog won't trigger a reset, but at least it reduces the chances to be in such a case. Signed-off-by: Boris BREZILLON <b.brezillon@overkiz.com> Reviewed-by: Guenter Roeck <linux@roeck-us.net> Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
This commit is contained in:
parent
1444797fc1
commit
a04c3f01d3
|
@ -213,7 +213,15 @@ static int at91_wdt_init(struct platform_device *pdev, struct at91wdt *wdt)
|
|||
tmp & wdt->mr_mask, wdt->mr & wdt->mr_mask);
|
||||
|
||||
setup_timer(&wdt->timer, at91_ping, (unsigned long)wdt);
|
||||
mod_timer(&wdt->timer, jiffies + wdt->heartbeat);
|
||||
|
||||
/*
|
||||
* Use min_heartbeat the first time to avoid spurious watchdog reset:
|
||||
* we don't know for how long the watchdog counter is running, and
|
||||
* - resetting it right now might trigger a watchdog fault reset
|
||||
* - waiting for heartbeat time might lead to a watchdog timeout
|
||||
* reset
|
||||
*/
|
||||
mod_timer(&wdt->timer, jiffies + min_heartbeat);
|
||||
|
||||
/* Try to set timeout from device tree first */
|
||||
if (watchdog_init_timeout(&wdt->wdd, 0, dev))
|
||||
|
|
Loading…
Reference in New Issue