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);
+}
+
+static void watchdog_print_status(void)
+{
+ struct watchdog_info wdt_info;
+ int bootstatus;
+
+ if (wdt_fd < 0)
+ return;
+
+ if (ioctl(wdt_fd, WDIOC_GETSUPPORT, &wdt_info)) {
+ DEBUG(2, "Watchdog GETSUPPORT failed\n");
+ return;
+ }
+
+ if (!(wdt_info.options & WDIOF_CARDRESET)) {
+ DEBUG(2, "Watchdog does not have CARDRESET support\n");
+ return;
+ }
+
+ if (ioctl(wdt_fd, WDIOC_GETBOOTSTATUS, &bootstatus)) {
+ DEBUG(2, "Watchdog GETBOOTSTATUS failed\n");
+ return;
+ }
+
+ if (bootstatus & WDIOF_CARDRESET)
+ LOG("Watchdog has previously reset the system\n");
+ else
+ DEBUG(2, "Watchdog did not previously reset the system\n");
+}
+
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;
char* watchdog_fd(void)
{
- static char fd_buf[3];
+ static char fd_buf[12];
if (wdt_fd < 0)
return NULL;
+
snprintf(fd_buf, sizeof(fd_buf), "%d", wdt_fd);
return fd_buf;
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));
+
+ watchdog_print_status();
}