lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Sat, 20 Sep 2014 07:08:22 -0700 From: Guenter Roeck <linux@...ck-us.net> To: Jisheng Zhang <jszhang@...vell.com>, wim@...ana.be CC: linux-watchdog@...r.kernel.org, linux-kernel@...r.kernel.org, linux-arm-kernel@...ts.infradead.org Subject: Re: [PATCH 2/2] watchdog: dw_wdt: add restart handler support On 09/19/2014 08:07 PM, Guenter Roeck wrote: > On 09/18/2014 11:29 PM, Jisheng Zhang wrote: >> The kernel core now provides an API to trigger a system restart. >> Register with it to support restarting the system via. watchdog. >> >> Signed-off-by: Jisheng Zhang <jszhang@...vell.com> >> --- >> drivers/watchdog/dw_wdt.c | 27 +++++++++++++++++++++++++++ >> 1 file changed, 27 insertions(+) >> >> diff --git a/drivers/watchdog/dw_wdt.c b/drivers/watchdog/dw_wdt.c >> index ad0619d..4ca41e9 100644 >> --- a/drivers/watchdog/dw_wdt.c >> +++ b/drivers/watchdog/dw_wdt.c >> @@ -29,9 +29,11 @@ >> #include <linux/miscdevice.h> >> #include <linux/module.h> >> #include <linux/moduleparam.h> >> +#include <linux/notifier.h> >> #include <linux/of.h> >> #include <linux/pm.h> >> #include <linux/platform_device.h> >> +#include <linux/reboot.h> >> #include <linux/spinlock.h> >> #include <linux/timer.h> >> #include <linux/uaccess.h> >> @@ -62,6 +64,7 @@ static struct { >> unsigned long next_heartbeat; >> struct timer_list timer; >> int expect_close; >> + struct notifier_block restart_handler; >> } dw_wdt; >> >> static inline int dw_wdt_is_enabled(void) >> @@ -119,6 +122,22 @@ static void dw_wdt_keepalive(void) >> WDOG_COUNTER_RESTART_REG_OFFSET); >> } >> >> +static int dw_wdt_restart_handle(struct notifier_block *this, >> + unsigned long mode, void *cmd) >> +{ >> + u32 val; >> + >> + writel(0, dw_wdt.regs + WDOG_TIMEOUT_RANGE_REG_OFFSET); >> + val = readl(dw_wdt.regs + WDOG_CONTROL_REG_OFFSET); >> + if (val & WDOG_CONTROL_REG_WDT_EN_MASK) >> + writel(WDOG_COUNTER_RESTART_KICK_VALUE, dw_wdt.regs + >> + WDOG_COUNTER_RESTART_REG_OFFSET); >> + else >> + writel(WDOG_CONTROL_REG_WDT_EN_MASK, >> + dw_wdt.regs + WDOG_CONTROL_REG_OFFSET); > > Don't you have to write WDOG_COUNTER_RESTART_KICK_VALUE into > WDOG_COUNTER_RESTART_REG_OFFSET in the else case as well ? > According to the datasheet, it should be sufficient to - Write 0 into WDOG_TIMEOUT_RANGE_REG_OFFSET to select the minimum timeout period - Write 0x1 into WDOG_CONTROL_REG_OFFSET to enable the watchdog and select reset as desired action. This can be unconditional. Writing into the restart register should not be necessary. Thanks, Guenter -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists