Due to the watchdog file descriptor check in both watchdog_timeout and
watchdog_frequency it's impossible to set the timeout/frequency via ubus
in case the watchdog was stopped.
Fix this by removing the watchdog file descriptor check in both functions
and by caching locally the set watchdog driver timeout value. The latter
will be used to set the watchdog driver timeout value in case the
watchdog is active or when the watchdog is started.
In addition when parsing the watchdog ubus call check if timeout
attribute is set so the correct value is used when doing the frequency
sanity check.
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
blobmsg_parse(watchdog_policy, __WDT_MAX, tb, blob_data(msg), blob_len(msg));
if (tb[WDT_FREQUENCY]) {
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) {
unsigned int freq = blobmsg_get_u32(tb[WDT_FREQUENCY]);
if (freq) {
static struct uloop_timeout wdt_timeout;
static int wdt_fd = -1;
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;
static int wdt_frequency = 5;
static bool wdt_magicclose = false;
+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;
void watchdog_set_magicclose(bool val)
{
wdt_magicclose = val;
}
else {
watchdog_open(true);
}
else {
watchdog_open(true);
+ watchdog_set_drv_timeout();
watchdog_timeout_cb(&wdt_timeout);
}
}
watchdog_timeout_cb(&wdt_timeout);
}
}
int watchdog_timeout(int timeout)
{
int watchdog_timeout(int timeout)
{
- if (wdt_fd < 0)
- return 0;
-
if (timeout) {
DEBUG(4, "Set watchdog timeout: %ds\n", timeout);
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 wdt_drv_timeout;
}
int watchdog_frequency(int frequency)
{
}
int watchdog_frequency(int frequency)
{
- if (wdt_fd < 0)
- return 0;
-
if (frequency) {
DEBUG(4, "Set watchdog frequency: %ds\n", frequency);
wdt_frequency = frequency;
if (frequency) {
DEBUG(4, "Set watchdog frequency: %ds\n", frequency);
wdt_frequency = frequency;
return;
LOG("- watchdog -\n");
return;
LOG("- watchdog -\n");
+ watchdog_set_drv_timeout();
watchdog_timeout_cb(&wdt_timeout);
DEBUG(4, "Opened watchdog with timeout %ds\n", watchdog_timeout(0));
watchdog_timeout_cb(&wdt_timeout);
DEBUG(4, "Opened watchdog with timeout %ds\n", watchdog_timeout(0));