| From 73ba34b74551c5f61a1f2c93f48a7f59cb576cd6 Mon Sep 17 00:00:00 2001 |
| From: Jim Yuan <jim.yuan@supermicro.com> |
| Date: Tue, 11 Oct 2016 10:26:14 -0700 |
| Subject: [PATCH 06/14] send board ID to ipmi |
| |
| Signed-off-by: Jim Yuan <jim.yuan@supermicro.com> |
| --- |
| src/include/usr/ipmi/ipmiif.H | 6 ++++- |
| src/include/usr/ipmi/ipmipowerstate.H | 2 +- |
| .../initservice/istepdispatcher/istepdispatcher.C | 11 ++++++++ |
| src/usr/ipmiext/ipmipowerstate.C | 29 ++++++++++++++++++++++ |
| 4 files changed, 46 insertions(+), 2 deletions(-) |
| |
| diff --git a/src/include/usr/ipmi/ipmiif.H b/src/include/usr/ipmi/ipmiif.H |
| index 4b41cb3bc..8039adbf7 100644 |
| --- a/src/include/usr/ipmi/ipmiif.H |
| +++ b/src/include/usr/ipmi/ipmiif.H |
| @@ -299,7 +299,11 @@ namespace IPMI |
| // user defined power limit from the BMC. |
| inline const command_t get_power_limit(void) |
| { return std::make_pair(NETFUN_GRPEXT, 0x03); } |
| - |
| + |
| + //SMC |
| + inline const command_t set_board_id(void) |
| + { return std::make_pair(NETFUN_NONE, 0x20); } |
| + |
| // Some helper messages |
| // Used to create an empty message for reception |
| inline const command_t no_command(void) |
| diff --git a/src/include/usr/ipmi/ipmipowerstate.H b/src/include/usr/ipmi/ipmipowerstate.H |
| index b65275075..e943e8b66 100644 |
| --- a/src/include/usr/ipmi/ipmipowerstate.H |
| +++ b/src/include/usr/ipmi/ipmipowerstate.H |
| @@ -78,7 +78,7 @@ enum ACPI_DEVICE_POWER_STATE_TO_SET |
| */ |
| errlHndl_t setACPIPowerState(); |
| |
| - |
| +errlHndl_t SmcsetBoardId(); |
| } // namespace |
| |
| #endif |
| diff --git a/src/usr/initservice/istepdispatcher/istepdispatcher.C b/src/usr/initservice/istepdispatcher/istepdispatcher.C |
| index 16f1c8a01..0f9731094 100644 |
| --- a/src/usr/initservice/istepdispatcher/istepdispatcher.C |
| +++ b/src/usr/initservice/istepdispatcher/istepdispatcher.C |
| @@ -284,6 +284,17 @@ void IStepDispatcher::init(errlHndl_t &io_rtaskRetErrl) |
| err_ipmi->collectTrace("INITSVC", 1024); |
| errlCommit(err_ipmi, INITSVC_COMP_ID ); |
| } |
| + //send board ID |
| + errlHndl_t err_ipmi1 = IPMI::SmcsetBoardId(); |
| + |
| + if(err_ipmi1) |
| + { |
| + TRACFCOMP(g_trac_initsvc, |
| + "init: ERROR: IPMI set Board Id Failed"); |
| + err_ipmi->collectTrace("INITSVC", 1024); |
| + errlCommit(err_ipmi1, INITSVC_COMP_ID ); |
| + } |
| + |
| #endif |
| |
| |
| diff --git a/src/usr/ipmiext/ipmipowerstate.C b/src/usr/ipmiext/ipmipowerstate.C |
| index 30c2a70ef..f8e61f82b 100644 |
| --- a/src/usr/ipmiext/ipmipowerstate.C |
| +++ b/src/usr/ipmiext/ipmipowerstate.C |
| @@ -50,6 +50,35 @@ namespace IPMI |
| /******************************************************************************/ |
| // Functions |
| /******************************************************************************/ |
| +errlHndl_t SmcsetBoardId() |
| +{ |
| + errlHndl_t err_ipmi = NULL; |
| + |
| + size_t len = 10; |
| + |
| + //create request data buffer |
| + uint8_t* data = new uint8_t[len]; |
| + |
| + IPMI::completion_code cc = IPMI::CC_UNKBAD; |
| + //P8DTU board ID 0933 |
| + data[0] = 0x33; |
| + data[1] = 0x9; |
| + memset(&data[2], 0, 8); |
| + err_ipmi = IPMI::sendrecv(IPMI::set_board_id(), cc, len, data); |
| + |
| + //cleanup buffer |
| + delete[] data; |
| + |
| + if(cc != IPMI::CC_OK) |
| + { |
| + IPMI_TRAC("Set board id: BMC returned not ok CC[%x]",cc); |
| + // should we log error and then retry? |
| + // what happens if the communication is broken |
| + // reset will try and set it again. |
| + } |
| + |
| + return err_ipmi; |
| +} |
| |
| errlHndl_t setACPIPowerState() |
| { |
| -- |
| 2.16.2.windows.1 |
| |