ipmi(4) has checked thresholds of some sensing values and reported false
alarms.  This patch reverts those checks.

This also changes ipmi(4) to handle disabled sensors while allowing them to
supply readings if they want.

>From Jonathan Matthew.

OK?

diff --git a/sys/dev/ipmi.c b/sys/dev/ipmi.c
index d88b7c1..1bac603 100644
--- a/sys/dev/ipmi.c
+++ b/sys/dev/ipmi.c
@@ -108,6 +108,7 @@ int ipmi_enabled = 0;
 #define IPMI_ENTITY_PWRSUPPLY          0x0A
 
 #define IPMI_INVALID_SENSOR            (1L << 5)
+#define IPMI_DISABLED_SENSOR           (1L << 6)
 
 #define IPMI_SDR_TYPEFULL              1
 #define IPMI_SDR_TYPECOMPACT           2
@@ -175,7 +176,6 @@ void        ipmi_unmap_regs(struct ipmi_softc *);
 
 void   *scan_sig(long, long, int, int, const void *);
 
-int    ipmi_test_threshold(u_int8_t, u_int8_t, u_int8_t, u_int8_t, int);
 int    ipmi_sensor_status(struct ipmi_softc *, struct ipmi_sensor *,
     u_int8_t *);
 
@@ -1222,26 +1222,11 @@ ipmi_convert(u_int8_t v, struct sdrtype1 *s1, long adj)
 }
 
 int
-ipmi_test_threshold(u_int8_t v, u_int8_t valid, u_int8_t hi, u_int8_t lo,
-    int sign)
-{
-       dbg_printf(10, "thresh: %.2x %.2x %.2x %d %d\n", v, lo, hi,valid, sign);
-       if (sign)
-               return ((valid & 1 && lo != 0x00 && (int8_t)v <= (int8_t)lo) ||
-                   (valid & 8 && hi != 0xFF && (int8_t)v >= (int8_t)hi));
-
-       return ((valid & 1 && lo != 0x00 && v <= lo) ||
-           (valid & 8 && hi != 0xFF && v >= hi));
-}
-
-int
 ipmi_sensor_status(struct ipmi_softc *sc, struct ipmi_sensor *psensor,
     u_int8_t *reading)
 {
-       u_int8_t        data[32];
        struct sdrtype1 *s1 = (struct sdrtype1 *)psensor->i_sdr;
-       int             rxlen, etype;
-       int             sign = s1->units1 >> 7 & 1;
+       int             etype;
 
        /* Get reading of sensor */
        switch (psensor->i_sensor.type) {
@@ -1269,28 +1254,12 @@ ipmi_sensor_status(struct ipmi_softc *sc, struct 
ipmi_sensor *psensor,
        case IPMI_SENSOR_TYPE_TEMP:
        case IPMI_SENSOR_TYPE_VOLT:
        case IPMI_SENSOR_TYPE_FAN:
-               data[0] = psensor->i_num;
-               if (ipmi_sendcmd(sc, s1->owner_id, s1->owner_lun,
-                   SE_NETFN, SE_GET_SENSOR_THRESHOLD, 1, data) ||
-                   ipmi_recvcmd(sc, sizeof(data), &rxlen, data))
-                       return (SENSOR_S_UNKNOWN);
-
-               dbg_printf(25, "recvdata: %.2x %.2x %.2x %.2x %.2x %.2x %.2x\n",
-                   data[0], data[1], data[2], data[3], data[4], data[5],
-                   data[6]);
-
-               if (ipmi_test_threshold(*reading, data[0] >> 2 ,
-                   data[6], data[3], sign))
+               if (reading[2] & ((1 << 5) | (1 << 2)))
                        return (SENSOR_S_CRIT);
-
-               if (ipmi_test_threshold(*reading, data[0] >> 1,
-                   data[5], data[2], sign))
+               else if (reading[2] & ((1 << 4) | (1 << 1)))
                        return (SENSOR_S_CRIT);
-
-               if (ipmi_test_threshold(*reading, data[0] ,
-                   data[4], data[1], sign))
+               else if (reading[2] & ((1 << 3) | (1 << 0)))
                        return (SENSOR_S_WARN);
-
                break;
 
        case IPMI_SENSOR_TYPE_INTRUSION:
@@ -1342,10 +1311,9 @@ read_sensor(struct ipmi_softc *sc, struct ipmi_sensor 
*psensor)
        dbg_printf(10, "values=%.2x %.2x %.2x %.2x %s\n",
            data[0],data[1],data[2],data[3], psensor->i_sensor.desc);
        psensor->i_sensor.flags &= ~SENSOR_FINVALID;
-       if (data[1] & IPMI_INVALID_SENSOR) {
-               /* Check if sensor is valid */
+       if ((data[1] & IPMI_INVALID_SENSOR) ||
+           ((data[1] & IPMI_DISABLED_SENSOR) == 0 && data[0] == 0))
                psensor->i_sensor.flags |= SENSOR_FINVALID;
-       }
        psensor->i_sensor.status = ipmi_sensor_status(sc, psensor, data);
        rv = 0;
 done:

Reply via email to