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:
Nick Hibma 2007-03-27 21:03:37 +00:00
parent 5de558219a
commit f29fa1dfa4
9 changed files with 15 additions and 21 deletions

View file

@ -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);

View file

@ -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;
}
}

View file

@ -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));

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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);

View file

@ -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) {

View file

@ -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;
}
}

View file

@ -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 {