> Date: Mon, 21 Dec 2015 22:47:19 +0900
> From: Masao Uebayashi <[email protected]>
>
> 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?
Sorry, but I don't understand what the problem is here.
Is the code wrong? Or did you encounter a machine that has bogus
thresholds?
> 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:
>
>