blobmsg_parse(watchdog_policy, __WDT_MAX, tb, blob_data(msg), blob_len(msg));
if (tb[WDT_FREQUENCY]) {
- unsigned int timeout = watchdog_timeout(0);
+ unsigned int timeout = tb[WDT_TIMEOUT] ? blobmsg_get_u32(tb[WDT_TIMEOUT]) :
+ watchdog_timeout(0);
unsigned int freq = blobmsg_get_u32(tb[WDT_FREQUENCY]);
if (freq) {
static struct uloop_timeout wdt_timeout;
static int wdt_fd = -1;
+static int wdt_drv_timeout = 30;
static int wdt_frequency = 5;
static bool wdt_magicclose = false;
wdt_fd = -1;
}
+static int watchdog_set_drv_timeout(void)
+{
+ if (wdt_fd < 0)
+ return -1;
+
+ return ioctl(wdt_fd, WDIOC_SETTIMEOUT, &wdt_drv_timeout);
+}
+
void watchdog_set_magicclose(bool val)
{
wdt_magicclose = val;
}
else {
watchdog_open(true);
+ watchdog_set_drv_timeout();
watchdog_timeout_cb(&wdt_timeout);
}
}
int watchdog_timeout(int timeout)
{
- if (wdt_fd < 0)
- return 0;
-
if (timeout) {
DEBUG(4, "Set watchdog timeout: %ds\n", timeout);
- ioctl(wdt_fd, WDIOC_SETTIMEOUT, &timeout);
+ wdt_drv_timeout = timeout;
+
+ if (wdt_fd >= 0)
+ watchdog_set_drv_timeout();
}
- ioctl(wdt_fd, WDIOC_GETTIMEOUT, &timeout);
- return timeout;
+ return wdt_drv_timeout;
}
int watchdog_frequency(int frequency)
{
- if (wdt_fd < 0)
- return 0;
-
if (frequency) {
DEBUG(4, "Set watchdog frequency: %ds\n", frequency);
wdt_frequency = frequency;
return;
LOG("- watchdog -\n");
- watchdog_timeout(30);
+ watchdog_set_drv_timeout();
watchdog_timeout_cb(&wdt_timeout);
DEBUG(4, "Opened watchdog with timeout %ds\n", watchdog_timeout(0));