From 65d1b0a623d43d710b7f80fd990116d0014ced70 Mon Sep 17 00:00:00 2001 From: John Blair Date: Mon, 1 May 2006 23:57:01 +0000 Subject: [PATCH] ipmi_sdr.c: Fix ipmi_sdr_get_sensor_reading_ipmb() to keep track of device lun. ipmi_sdr.c: Better error handling to avoid coredump when sensor description is missing. ipmi_sensor.c: use new ipmi_sdr_get_sensor_reading_ipmb() interface ipmi_sunoem.c: keep track of device lun ipmi_sel.h: add "OEM Specific" device description ipmi_sdr.h: modify ipmi_sdr_get_sensor_reading_ipmb() prototype --- ipmitool/include/ipmitool/ipmi_sdr.h | 3 +- ipmitool/include/ipmitool/ipmi_sel.h | 2 +- ipmitool/lib/ipmi_sdr.c | 66 +++++++++++++++++++--------- ipmitool/lib/ipmi_sensor.c | 12 +++-- ipmitool/lib/ipmi_sunoem.c | 2 + 5 files changed, 58 insertions(+), 27 deletions(-) diff --git a/ipmitool/include/ipmitool/ipmi_sdr.h b/ipmitool/include/ipmitool/ipmi_sdr.h index f9b77be..0128d62 100644 --- a/ipmitool/include/ipmitool/ipmi_sdr.h +++ b/ipmitool/include/ipmitool/ipmi_sdr.h @@ -803,7 +803,8 @@ struct ipmi_rs *ipmi_sdr_get_sensor_reading(struct ipmi_intf *intf, uint8_t sensor); struct ipmi_rs *ipmi_sdr_get_sensor_reading_ipmb(struct ipmi_intf *intf, uint8_t sensor, - uint8_t target); + uint8_t target, + uint8_t lun); struct ipmi_rs *ipmi_sdr_get_sensor_thresholds(struct ipmi_intf *intf, uint8_t sensor); struct ipmi_rs *ipmi_sdr_get_sensor_hysteresis(struct ipmi_intf *intf, diff --git a/ipmitool/include/ipmitool/ipmi_sel.h b/ipmitool/include/ipmitool/ipmi_sel.h index 6301ca8..0e8eefc 100644 --- a/ipmitool/include/ipmitool/ipmi_sel.h +++ b/ipmitool/include/ipmitool/ipmi_sel.h @@ -516,7 +516,7 @@ static struct ipmi_event_sensor_types sensor_specific_types[] __attribute__((unu { 0xF2, 0x01, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Module Hot Swap", "Module Handle Opened" }, { 0xF2, 0x02, 0xff, IPMI_EVENT_CLASS_DISCRETE, "Module Hot Swap", "Quiesced" }, - { 0xC0, 0x00, 0xff, 0x00, "OEM", NULL }, + { 0xC0, 0x00, 0xff, 0x00, "OEM", "OEM Specific" }, { 0x00, 0x00, 0x00, 0x00, NULL, NULL }, }; diff --git a/ipmitool/lib/ipmi_sdr.c b/ipmitool/lib/ipmi_sdr.c index 5729878..9f87209 100644 --- a/ipmitool/lib/ipmi_sdr.c +++ b/ipmitool/lib/ipmi_sdr.c @@ -278,12 +278,13 @@ ipmi_sdr_get_sensor_reading(struct ipmi_intf *intf, uint8_t sensor) * @intf: ipmi interface * @sensor: sensor id * @target: IPMB target address + * @lun: sensor lun * * returns ipmi response structure */ struct ipmi_rs * ipmi_sdr_get_sensor_reading_ipmb(struct ipmi_intf *intf, uint8_t sensor, - uint8_t target) + uint8_t target, uint8_t lun) { struct ipmi_rq req; struct ipmi_rs *rsp; @@ -1449,13 +1450,27 @@ ipmi_sdr_print_discrete_state(const char *desc, } if (evt->offset > 7) { - if ((1 << (evt->offset - 8)) & state2) - printf(" [%s]\n", - evt->desc); + if ((1 << (evt->offset - 8)) & state2) { + if (evt->desc) { + printf(" " + "[%s]\n", + evt->desc); + } else { + printf(" " + "[no description]\n"); + } + } } else { - if ((1 << evt->offset) & state1) - printf(" [%s]\n", - evt->desc); + if ((1 << evt->offset) & state1) { + if (evt->desc) { + printf(" " + "[%s]\n", + evt->desc); + } else { + printf(" " + "[no description]\n"); + } + } } c++; } @@ -1490,21 +1505,30 @@ ipmi_sdr_print_sensor_compact(struct ipmi_intf *intf, desc, sensor->keys.sensor_num); validread = 0; } - else if (rsp->ccode > 0 && rsp->ccode != 0xcd) { - /* completion code 0xcd is special case */ - lprintf(LOG_DEBUG, "Error reading sensor %s (#%02x): %s", - desc, sensor->keys.sensor_num, - val2str(rsp->ccode, completion_code_vals)); - validread = 0; + + else if (rsp->ccode > 0) { + /* completion code 0xcd is special case */ + if (rsp->ccode == 0xcd) { + /* sensor not found */ + validread = 0; + } else { + lprintf(LOG_DEBUG, "Error reading sensor %s (#%02x): %s", + desc, sensor->keys.sensor_num, + val2str(rsp->ccode, completion_code_vals)); + validread = 0; + } + } else { + if (IS_READING_UNAVAILABLE(rsp->data[1])) { + /* sensor reading unavailable */ + validread = 0; + } else if (IS_SCANNING_DISABLED(rsp->data[1])) { + validread = 0; + /* check for sensor scanning disabled bit */ + lprintf(LOG_DEBUG, "Sensor %s (#%02x) scanning disabled", + desc, sensor->keys.sensor_num); + } } - - /* check for sensor scanning disabled bit */ - if (rsp && IS_SCANNING_DISABLED(rsp->data[1])) { - lprintf(LOG_DEBUG, "Sensor %s (#%02x) scanning disabled", - desc, sensor->keys.sensor_num); - validread = 0; - } - + if (verbose) { printf("Sensor ID : %s (0x%x)\n", (sensor->id_code) ? desc : "", sensor->keys.sensor_num); diff --git a/ipmitool/lib/ipmi_sensor.c b/ipmitool/lib/ipmi_sensor.c index 998ed8b..d7f37a2 100644 --- a/ipmitool/lib/ipmi_sensor.c +++ b/ipmitool/lib/ipmi_sensor.c @@ -102,7 +102,8 @@ ipmi_sensor_print_full_discrete(struct ipmi_intf *intf, */ rsp = ipmi_sdr_get_sensor_reading_ipmb(intf, sensor->keys.sensor_num, - sensor->keys.owner_id); + sensor->keys.owner_id, + sensor->keys.lun); if (rsp == NULL) { lprintf(LOG_ERR, "Error reading sensor %s (#%02x)", id, sensor->keys.sensor_num); @@ -181,7 +182,8 @@ ipmi_sensor_print_full_analog(struct ipmi_intf *intf, */ rsp = ipmi_sdr_get_sensor_reading_ipmb(intf, sensor->keys.sensor_num, - sensor->keys.owner_id); + sensor->keys.owner_id, + sensor->keys.lun); if (rsp == NULL) { lprintf(LOG_ERR, "Error reading sensor %s (#%02x)", id, sensor->keys.sensor_num); @@ -417,7 +419,8 @@ ipmi_sensor_print_compact(struct ipmi_intf *intf, */ rsp = ipmi_sdr_get_sensor_reading_ipmb(intf, sensor->keys.sensor_num, - sensor->keys.owner_id); + sensor->keys.owner_id, + sensor->keys.lun); if (rsp == NULL) { lprintf(LOG_ERR, "Error reading sensor %s (#%02x)", id, sensor->keys.sensor_num); @@ -758,7 +761,8 @@ ipmi_sensor_get_reading(struct ipmi_intf *intf, int argc, char **argv) } rsp = ipmi_sdr_get_sensor_reading_ipmb(intf, sdr->record.full->keys.sensor_num, - sdr->record.full->keys.owner_id); + sdr->record.full->keys.owner_id, + sdr->record.full->keys.lun); if (rsp == NULL) { lprintf(LOG_ERR, "Error reading sensor \"%s\"", argv[i]); rc = -1; diff --git a/ipmitool/lib/ipmi_sunoem.c b/ipmitool/lib/ipmi_sunoem.c index 67c0257..acc1720 100644 --- a/ipmitool/lib/ipmi_sunoem.c +++ b/ipmitool/lib/ipmi_sunoem.c @@ -221,6 +221,7 @@ sunoem_led_get(struct ipmi_intf * intf, req.msg.netfn = IPMI_NETFN_SUNOEM; req.msg.cmd = IPMI_SUNOEM_LED_GET; + req.msg.lun = dev->lun; req.msg.data = rqdata; req.msg.data_len = rqdata_len; @@ -273,6 +274,7 @@ sunoem_led_set(struct ipmi_intf * intf, req.msg.netfn = IPMI_NETFN_SUNOEM; req.msg.cmd = IPMI_SUNOEM_LED_SET; + req.msg.lun = dev->lun; req.msg.data = rqdata; req.msg.data_len = rqdata_len;