diff options
| author | Rob Johnston <rob.johnston@joyent.com> | 2019-03-18 21:13:23 +0000 |
|---|---|---|
| committer | Gordon Ross <gwr@nexenta.com> | 2019-05-14 15:00:56 -0400 |
| commit | 881aaecd29563bc45bf78a3c8f1e534275021925 (patch) | |
| tree | e7f84984c290b5e8c3dd4e3c2d8f4d1d13717ded | |
| parent | cfbda96766a25458b8ad2be1a09a59ce247a25d8 (diff) | |
| download | illumos-joyent-881aaecd29563bc45bf78a3c8f1e534275021925.tar.gz | |
10897 topo_sensor_state_name() needs work
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Approved by: Gordon Ross <gwr@nexenta.com>
| -rw-r--r-- | usr/src/lib/fm/topo/libtopo/common/topo_subr.c | 15 | ||||
| -rw-r--r-- | usr/src/lib/fm/topo/modules/common/fac_prov_ipmi/fac_prov_ipmi.c | 29 |
2 files changed, 35 insertions, 9 deletions
diff --git a/usr/src/lib/fm/topo/libtopo/common/topo_subr.c b/usr/src/lib/fm/topo/libtopo/common/topo_subr.c index 94693e2a5f..a7afb3297a 100644 --- a/usr/src/lib/fm/topo/libtopo/common/topo_subr.c +++ b/usr/src/lib/fm/topo/libtopo/common/topo_subr.c @@ -534,14 +534,21 @@ topo_sensor_state_name(uint32_t sensor_type, uint8_t state, char *buf, (void) snprintf(buf, len, "0x%02x", state); return; } + if (state == 0) { + (void) snprintf(buf, len, "NO_STATES_ASSERTED"); + return; + } + buf[0] = '\0'; for (; ntp->int_name != NULL; ntp++) { - if (ntp->int_value == state) { - (void) strlcpy(buf, ntp->int_name, len); - return; + if (state & ntp->int_value) { + if (buf[0] != '\0') + (void) strlcat(buf, "|", len); + (void) strlcat(buf, ntp->int_name, len); } } - (void) snprintf(buf, len, "0x%02x", state); + if (buf[0] == '\0') + (void) snprintf(buf, len, "0x%02x", state); } static const topo_pgroup_info_t sys_pgroup = { diff --git a/usr/src/lib/fm/topo/modules/common/fac_prov_ipmi/fac_prov_ipmi.c b/usr/src/lib/fm/topo/modules/common/fac_prov_ipmi/fac_prov_ipmi.c index 434790fd65..64309245b0 100644 --- a/usr/src/lib/fm/topo/modules/common/fac_prov_ipmi/fac_prov_ipmi.c +++ b/usr/src/lib/fm/topo/modules/common/fac_prov_ipmi/fac_prov_ipmi.c @@ -23,7 +23,7 @@ * Use is subject to license terms. */ /* - * Copyright (c) 2018, Joyent, Inc. + * Copyright (c) 2019, Joyent, Inc. */ #include <unistd.h> #include <stdio.h> @@ -347,14 +347,14 @@ static int ipmi_sensor_state(topo_mod_t *mod, tnode_t *node, topo_version_t vers, nvlist_t *in, nvlist_t **out) { - char **entity_refs; + char **entity_refs, *sensor_class; uint_t nelems; ipmi_sdr_t *sdr = NULL; ipmi_sensor_reading_t *reading; ipmi_handle_t *hdl; int err, i; uint8_t sensor_num; - uint32_t e_id, e_inst; + uint32_t e_id, e_inst, state; ipmi_sdr_full_sensor_t *fsensor; ipmi_sdr_compact_sensor_t *csensor; nvlist_t *nvl; @@ -430,12 +430,31 @@ ipmi_sensor_state(topo_mod_t *mod, tnode_t *node, topo_version_t vers, strarr_free(mod, entity_refs, nelems); topo_mod_ipmi_rele(mod); + if (topo_prop_get_string(node, TOPO_PGROUP_FACILITY, TOPO_SENSOR_CLASS, + &sensor_class, &err) != 0) { + topo_mod_dprintf(mod, "Failed to lookup prop %s/%s on node %s ", + "(%s)", TOPO_PGROUP_FACILITY, TOPO_SENSOR_CLASS, + topo_node_name(node), topo_strerror(err)); + return (topo_mod_seterrno(mod, EMOD_UKNOWN_ENUM)); + } + /* + * Mask off bits that are marked as reserved in the IPMI spec. + * For threshold sensors, bits 6:7 are reserved. + * For discrete sensors, bit 15 is reserved. + */ + state = reading->isr_state; + if (strcmp(sensor_class, TOPO_SENSOR_CLASS_THRESHOLD) == 0) + state = state & 0x3F; + else + state = state & 0x7FFF; + + topo_mod_strfree(mod, sensor_class); + if (topo_mod_nvalloc(mod, &nvl, NV_UNIQUE_NAME) != 0 || nvlist_add_string(nvl, TOPO_PROP_VAL_NAME, TOPO_SENSOR_STATE) != 0 || nvlist_add_uint32(nvl, TOPO_PROP_VAL_TYPE, TOPO_TYPE_UINT32) != 0 || - nvlist_add_uint32(nvl, TOPO_PROP_VAL_VAL, reading->isr_state) - != 0) { + nvlist_add_uint32(nvl, TOPO_PROP_VAL_VAL, state) != 0) { topo_mod_dprintf(mod, "Failed to allocate 'out' nvlist\n"); nvlist_free(nvl); return (topo_mod_seterrno(mod, EMOD_NOMEM)); |
