diff options
| -rw-r--r-- | src/include/usr/ipmi/ipmi_reasoncodes.H | 3 | ||||
| -rw-r--r-- | src/include/usr/ipmi/ipmisensor.H | 15 | ||||
| -rw-r--r-- | src/usr/ipmi/ipmisensor.C | 39 |
3 files changed, 55 insertions, 2 deletions
diff --git a/src/include/usr/ipmi/ipmi_reasoncodes.H b/src/include/usr/ipmi/ipmi_reasoncodes.H index e0d01146f..1717619e5 100644 --- a/src/include/usr/ipmi/ipmi_reasoncodes.H +++ b/src/include/usr/ipmi/ipmi_reasoncodes.H @@ -5,7 +5,7 @@ /* */ /* OpenPOWER HostBoot Project */ /* */ -/* Contributors Listed Below - COPYRIGHT 2014,2015 */ +/* Contributors Listed Below - COPYRIGHT 2014,2016 */ /* [+] International Business Machines Corp. */ /* */ /* */ @@ -37,6 +37,7 @@ namespace IPMI MOD_IPMIDCMI = 0x04, // IPMI::sensor MOD_IPMIRT = 0x05, // rt IPMI::send/IPMI::sendrecv MOD_IPMISRV_POSTEVENT = 0x06, // IpmiRP::postEvent + MOD_IPMI_PROG_SENSOR = 0x07, // IPMI::FirmwareProgressSensor }; enum IPMIReasonCode diff --git a/src/include/usr/ipmi/ipmisensor.H b/src/include/usr/ipmi/ipmisensor.H index 9f57d4ded..f82a3aaf1 100644 --- a/src/include/usr/ipmi/ipmisensor.H +++ b/src/include/usr/ipmi/ipmisensor.H @@ -376,7 +376,7 @@ namespace SENSOR * @return Errorlog handle * */ - errlHndl_t sendSetSensorReading( + virtual errlHndl_t sendSetSensorReading( setSensorReadingRequest * i_data); /** @@ -495,6 +495,19 @@ namespace SENSOR errlHndl_t setBootProgressPhase( INITSERVICE::firmwareProgressPhase i_phase); + + /** + * + * @brief Synchronous implementation of sendSetSensor Reading used for + * avoiding a race condition. + * + * @param[in] i_data - the ipmi message data + * + * @return Errorlog handle + */ + errlHndl_t sendSetSensorReading( + setSensorReadingRequest * i_data ); + private: // @enum firmwareProgressOfsets // diff --git a/src/usr/ipmi/ipmisensor.C b/src/usr/ipmi/ipmisensor.C index 4aa1c9f4b..d4eb6560f 100644 --- a/src/usr/ipmi/ipmisensor.C +++ b/src/usr/ipmi/ipmisensor.C @@ -540,6 +540,45 @@ namespace SENSOR }; // + // sendSetSensorReading + // + errlHndl_t FirmwareProgressSensor::sendSetSensorReading( + setSensorReadingRequest * i_data ) + { + size_t l_len = sizeof( setSensorReadingRequest ); + IPMI::completion_code cc = IPMI::CC_UNKBAD; + + //i_data will hold the response when this returns + errlHndl_t l_err = sendrecv(IPMI::set_sensor_reading(), + cc, + l_len, + (uint8_t*&)i_data ); + // If no error, check completion code + if( (l_err == NULL) && (cc != IPMI::CC_OK) ) + { + TRACFCOMP(g_trac_ipmi, "bad completion code from BMC=0x%x",cc); + + /*@ + * @errortype ERRL_SEV_INFORMATIONAL + * @moduleid IPMI::MOD_IPMI_PROG_SENSOR + * @reasoncode IPMI::RC_SET_SENSOR_FAILURE + * @userdata1 BMC IPMI Completion code. + * @devdesc Request to set the firmware progress + * sensor failed. + */ + l_err = new ERRORLOG::ErrlEntry( + ERRORLOG::ERRL_SEV_INFORMATIONAL, + IPMI::MOD_IPMI_PROG_SENSOR, + IPMI::RC_SET_SENSOR_FAILURE, + static_cast<uint64_t>(cc), + 0, + true ); + l_err->collectTrace(IPMI_COMP_NAME); + } + return l_err; + } + + // // RebootCountSensor constructor - uses system target // RebootCountSensor::RebootCountSensor() |

