mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 08:43:19 -04:00
Revisit the watchdogs: Resetting the error to EINVAL after failing to set the
watchdog might hide the succesful arming of an earlier one. Accept that on failing to arm any watchdog (because of non-supported timeouts) EOPNOTSUPP is returned instead of the more appropriate EINVAL. MFC after: 3 days
This commit is contained in:
parent
5de558219a
commit
f29fa1dfa4
9 changed files with 15 additions and 21 deletions
|
|
@ -171,13 +171,11 @@ at91st_watchdog(void *argp, u_int cmd, int *error)
|
|||
int t;
|
||||
|
||||
t = cmd & WD_INTERVAL;
|
||||
if (cmd > 0 && t >= 22 && t <= 37) {
|
||||
if (t >= 22 && t <= 37) {
|
||||
wdog = (1 << (t - 22)) | ST_WDMR_RSTEN;
|
||||
*error = 0;
|
||||
} else {
|
||||
wdog = 0;
|
||||
if (cmd > 0)
|
||||
*error = EINVAL;
|
||||
}
|
||||
WR4(ST_WDMR, wdog);
|
||||
WR4(ST_CR, ST_CR_WDRST);
|
||||
|
|
|
|||
|
|
@ -111,18 +111,15 @@ iopwdog_watchdog_fn(void *private, u_int cmd, int *error)
|
|||
|
||||
cmd &= WD_INTERVAL;
|
||||
if (cmd > 0 && cmd <= 63
|
||||
&& (uint64_t)1 << (cmd & WD_INTERVAL) <=
|
||||
(uint64_t)sc->wdog_period * 1000000000) {
|
||||
&& (uint64_t)1<<cmd <= (uint64_t)sc->wdog_period * 1000000000) {
|
||||
/* Valid value -> Enable watchdog */
|
||||
iopwdog_tickle(sc);
|
||||
sc->armed = 1;
|
||||
*error = 0;
|
||||
} else {
|
||||
/* XXX Can't disable this watchdog? */
|
||||
/* Can't disable this watchdog! */
|
||||
if (sc->armed)
|
||||
*error = EOPNOTSUPP;
|
||||
else if (cmd > 0)
|
||||
*error = EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ ixp425_watchdog(void *arg, u_int cmd, int *error)
|
|||
u_int u = cmd & WD_INTERVAL;
|
||||
|
||||
WR4(sc, IXP425_OST_WDOG_KEY, OST_WDOG_KEY_MAJICK);
|
||||
if (cmd && 4 <= u && u <= 35) {
|
||||
if (4 <= u && u <= 35) {
|
||||
WR4(sc, IXP425_OST_WDOG_ENAB, 0);
|
||||
/* approximate 66.66MHz cycles */
|
||||
WR4(sc, IXP425_OST_WDOG, 2<<(u - 4));
|
||||
|
|
|
|||
|
|
@ -194,8 +194,6 @@ ichwd_event(void *arg, unsigned int cmd, int *error)
|
|||
} else {
|
||||
if (sc->active)
|
||||
ichwd_tmr_disable(sc);
|
||||
if (cmd > 0)
|
||||
*error = EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -656,8 +656,6 @@ ipmi_wd_event(void *arg, unsigned int cmd, int *error)
|
|||
*error = 0;
|
||||
} else {
|
||||
ipmi_set_watchdog(sc, 0);
|
||||
if (cmd > 0)
|
||||
*error = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -295,9 +295,9 @@ mk48txx_watchdog(void *arg, u_int cmd, int *error)
|
|||
dev = arg;
|
||||
sc = device_get_softc(dev);
|
||||
|
||||
wdog = 0;
|
||||
t = cmd & WD_INTERVAL;
|
||||
if (cmd > 0 && t >= 26 && t <= 37) {
|
||||
if (t >= 26 && t <= 37) {
|
||||
wdog = 0;
|
||||
if (t <= WD_TO_2SEC) {
|
||||
wdog |= MK48TXX_WDOG_RB_1_16;
|
||||
t -= 26;
|
||||
|
|
@ -317,8 +317,8 @@ mk48txx_watchdog(void *arg, u_int cmd, int *error)
|
|||
if (sc->sc_flag & MK48TXX_WDOG_ENABLE_WDS)
|
||||
wdog |= MK48TXX_WDOG_WDS;
|
||||
*error = 0;
|
||||
} else if (cmd > 0) {
|
||||
*error = EINVAL;
|
||||
} else {
|
||||
wdog = 0;
|
||||
}
|
||||
mtx_lock(&sc->sc_mtx);
|
||||
(*sc->sc_nvwr)(dev, sc->sc_clkoffset + MK48TXX_WDOG, wdog);
|
||||
|
|
|
|||
|
|
@ -55,6 +55,8 @@ wd_ioctl(struct cdev *dev __unused, u_long cmd, caddr_t data,
|
|||
return (EINVAL);
|
||||
if ((u & (WD_ACTIVE | WD_PASSIVE)) == (WD_ACTIVE | WD_PASSIVE))
|
||||
return (EINVAL);
|
||||
if ((u & (WD_ACTIVE | WD_PASSIVE)) == 0 && (u & WD_INTERVAL) > 0)
|
||||
return (EINVAL);
|
||||
if (u & WD_PASSIVE)
|
||||
return (ENOSYS); /* XXX Not implemented yet */
|
||||
if ((u & WD_INTERVAL) == WD_TO_NEVER) {
|
||||
|
|
|
|||
|
|
@ -412,8 +412,6 @@ elan_watchdog(void *foo __unused, u_int spec, int *error)
|
|||
elan_mmcr->WDTMRCTL = w; /* XXX What does this statement do? */
|
||||
elan_mmcr->GPECHO = w;
|
||||
cur = 0;
|
||||
if (u > 0)
|
||||
*error = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -136,7 +136,7 @@ geode_watchdog(void *foo __unused, u_int cmd, int *error)
|
|||
u_int u, p, r;
|
||||
|
||||
u = cmd & WD_INTERVAL;
|
||||
if (cmd && u >= 14 && u <= 43) {
|
||||
if (u >= 14 && u <= 43) {
|
||||
u -= 14;
|
||||
if (u > 16) {
|
||||
p = u - 16;
|
||||
|
|
@ -165,7 +165,10 @@ geode_watchdog(void *foo __unused, u_int cmd, int *error)
|
|||
static void
|
||||
advantech_watchdog(void *foo __unused, u_int cmd, int *error)
|
||||
{
|
||||
if (cmd && (cmd & WD_INTERVAL) <= WD_TO_1SEC) {
|
||||
u_int u;
|
||||
|
||||
u = cmd & WD_INTERVAL;
|
||||
if (u > 0 && u <= WD_TO_1SEC) {
|
||||
outb(0x0443, 1);
|
||||
*error = 0;
|
||||
} else {
|
||||
|
|
|
|||
Loading…
Reference in a new issue