Reflected kettenis@'s comments:
- Initialize sc_wdog_period before use.
- Define less stupid register names.

*

When stopping wdog, not only disabling reboot, but also stop timer.

diff --git a/sys/dev/ipmi.c b/sys/dev/ipmi.c
index c837234..d579987 100644
--- a/sys/dev/ipmi.c
+++ b/sys/dev/ipmi.c
@@ -1681,6 +1681,8 @@ ipmi_activate(struct device *self, int act)
        return (0);
 }
 
+#define                MIN_PERIOD      10
+
 int
 ipmi_watchdog(void *arg, int period)
 {
@@ -1700,8 +1702,9 @@ ipmi_watchdog(void *arg, int period)
                return (period);
        }
 
-       if (period < 10 && period > 0)
-               period = 10;
+       if (period < MIN_PERIOD && period > 0)
+               period = MIN_PERIOD;
+       sc->sc_wdog_period = period;
 
        s = splsoftclock();
        /* XXX what to do if poking wdog fails? */
@@ -1709,13 +1712,15 @@ ipmi_watchdog(void *arg, int period)
            APP_GET_WATCHDOG_TIMER, 0, NULL);
        rc = ipmi_recvcmd(sc, IPMI_GET_WDOG_MAX, &len, wdog);
 
+       wdog[IPMI_SET_WDOG_TIMER] &= ~IPMI_WDOG_TIMER_DONTSTOP;
+       wdog[IPMI_SET_WDOG_TIMER] |= (sc->sc_wdog_period == 0) ?
+           0 : IPMI_WDOG_TIMER_DONTSTOP;
+       wdog[IPMI_SET_WDOG_ACTION] &= ~IPMI_WDOG_ACTION_TOACT_MASK;
+       wdog[IPMI_SET_WDOG_ACTION] |= (sc->sc_wdog_period == 0) ?
+           IPMI_WDOG_ACTION_TOACT_DISABLED : IPMI_WDOG_ACTION_TOACT_REBOOT;
        /* Period is 10ths/sec */
        uint16_t timo = htole16(period * 10);
-
        memcpy(&wdog[IPMI_SET_WDOG_TIMOL], &timo, 2);
-       wdog[IPMI_SET_WDOG_ACTION] &= ~IPMI_WDOG_MASK;
-       wdog[IPMI_SET_WDOG_ACTION] |= (period == 0) ? IPMI_WDOG_DISABLED :
-           IPMI_WDOG_REBOOT;
 
        rc = ipmi_sendcmd(sc, BMC_SA, BMC_LUN, APP_NETFN,
            APP_SET_WATCHDOG_TIMER, IPMI_SET_WDOG_MAX, wdog);
@@ -1723,6 +1728,7 @@ ipmi_watchdog(void *arg, int period)
 
        splx(s);
 
-       sc->sc_wdog_period = period;
+       printf("%s: watchdog %sabled\n", DEVNAME(sc),
+           (sc->sc_wdog_period == 0) ? "dis" : "en");
        return (period);
 }
diff --git a/sys/dev/ipmivar.h b/sys/dev/ipmivar.h
index c0ae492..9939f79 100644
--- a/sys/dev/ipmivar.h
+++ b/sys/dev/ipmivar.h
@@ -106,11 +106,15 @@ struct ipmi_thread {
        volatile int        running;
 };
 
-#define IPMI_WDOG_MASK         0x03
-#define IPMI_WDOG_DISABLED     0x00
-#define IPMI_WDOG_REBOOT       0x01
-#define IPMI_WDOG_PWROFF       0x02
-#define IPMI_WDOG_PWRCYCLE     0x03
+#define IPMI_WDOG_TIMER_DONTLOG                        0x80
+#define IPMI_WDOG_TIMER_DONTSTOP               0x40
+#define IPMI_WDOG_TIMER_USE_MASK               0x07
+
+#define IPMI_WDOG_ACTION_TOACT_MASK            0x03
+#define IPMI_WDOG_ACTION_TOACT_DISABLED                0x00
+#define IPMI_WDOG_ACTION_TOACT_REBOOT          0x01
+#define IPMI_WDOG_ACTION_TOACT_PWROFF          0x02
+#define IPMI_WDOG_ACTION_TOACT_PWRCYCLE                0x03
 
 #define IPMI_WDOG_PRE_DISABLED 0x00
 #define IPMI_WDOG_PRE_SMI      0x01
-- 
2.6.3

Reply via email to