|
Packit |
db01ca |
/*
|
|
Packit |
db01ca |
*
|
|
Packit |
db01ca |
* Copyright (c) 2003,2004 by FORCE Computers.
|
|
Packit |
db01ca |
* Copyright (c) 2005 by ESO Technologies.
|
|
Packit |
db01ca |
*
|
|
Packit |
db01ca |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
db01ca |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
db01ca |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This
|
|
Packit |
db01ca |
* file and program are licensed under a BSD style license. See
|
|
Packit |
db01ca |
* the Copying file included with the OpenHPI distribution for
|
|
Packit |
db01ca |
* full licensing terms.
|
|
Packit |
db01ca |
*
|
|
Packit |
db01ca |
* Authors:
|
|
Packit |
db01ca |
* Thomas Kanngieser <thomas.kanngieser@fci.com>
|
|
Packit |
db01ca |
* Pierre Sangouard <psangouard@eso-tech.com>
|
|
Packit |
db01ca |
*/
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
#include <stdlib.h>
|
|
Packit |
db01ca |
#include <string.h>
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
#include "ipmi_utils.h"
|
|
Packit |
db01ca |
#include "ipmi.h"
|
|
Packit |
db01ca |
#include "ipmi_sensor_hotswap.h"
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
static const char *hotswap_states[] =
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
"inactive",
|
|
Packit |
db01ca |
"insertion_pending",
|
|
Packit |
db01ca |
"active",
|
|
Packit |
db01ca |
"extraction_pending",
|
|
Packit |
db01ca |
"not_present"
|
|
Packit |
db01ca |
};
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
static int hotswap_states_num = sizeof( hotswap_states ) / sizeof( char * );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
const char *
|
|
Packit |
db01ca |
HotswapStateToString( SaHpiHsStateT state )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
if ( state >= hotswap_states_num )
|
|
Packit |
db01ca |
return "invalid";
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return hotswap_states[state];
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfGetHotswapState( cIpmiResource *res, SaHpiHsStateT &state )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
// get hotswap sensor
|
|
Packit |
db01ca |
cIpmiSensorHotswap *hs = res->GetHotswapSensor();
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( !hs )
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_PARAMS;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// get hotswap state
|
|
Packit |
db01ca |
return hs->GetHpiState( state );
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// state == SAHPI_HS_STATE_ACTIVE
|
|
Packit |
db01ca |
// => M2 -> M3
|
|
Packit |
db01ca |
// => M5 -> M4
|
|
Packit |
db01ca |
// state == SAHPI_HS_STATE_INACTIVE
|
|
Packit |
db01ca |
// => M5 -> M6
|
|
Packit |
db01ca |
// => M2 -> M1
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfSetHotswapState( cIpmiResource *res, SaHpiHsStateT state )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
if ( !m_is_tca )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "ATCA not supported by SI !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_CMD;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (res->PolicyCanceled() != true)
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_REQUEST;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruActivation );
|
|
Packit |
db01ca |
msg.m_data_len = 3;
|
|
Packit |
db01ca |
msg.m_data[0] = dIpmiPicMgId;
|
|
Packit |
db01ca |
msg.m_data[1] = res->FruId();
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( state == SAHPI_HS_STATE_ACTIVE )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
msg.m_data[2] = dIpmiActivateFru;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
else
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
msg.m_data[2] = dIpmiDeactivateFru;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
cIpmiMsg rsp;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT r = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( r != SA_OK )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfSetHotSwapState: could not send set FRU activation: " << r << " !\n";
|
|
Packit |
db01ca |
return r;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 2
|
|
Packit |
db01ca |
|| rsp.m_data[0] != eIpmiCcOk
|
|
Packit |
db01ca |
|| rsp.m_data[1] != dIpmiPicMgId )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfSetHotSwapState: IPMI error set FRU activation: "
|
|
Packit |
db01ca |
<< rsp.m_data[0] << " !\n";
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_ERR_HPI_INTERNAL_ERROR;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// act == SAHPI_HS_ACTION_INSERTION => M1->M2
|
|
Packit |
db01ca |
// act == SAHPI_HS_ACTION_EXTRACTION => M4->M5
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfRequestHotswapAction( cIpmiResource *res,
|
|
Packit |
db01ca |
SaHpiHsActionT act )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
if ( !m_is_tca )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "ATCA not supported by SI !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_REQUEST;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruActivationPolicy );
|
|
Packit |
db01ca |
msg.m_data_len = 4;
|
|
Packit |
db01ca |
msg.m_data[0] = dIpmiPicMgId;
|
|
Packit |
db01ca |
msg.m_data[1] = res->FruId();
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( act == SAHPI_HS_ACTION_INSERTION )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
// m1 -> m2
|
|
Packit |
db01ca |
msg.m_data[2] = 1; // M1->M2 lock bit
|
|
Packit |
db01ca |
msg.m_data[3] = 0; // clear locked bit M1->M2
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
else
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
msg.m_data[2] = 2; // M4->M5 lock bit
|
|
Packit |
db01ca |
msg.m_data[3] = 0; // clear lock bit M4->M5
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
cIpmiMsg rsp;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT r = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( r != SA_OK )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfRequestHotswapAction: could not send set FRU activation policy: "
|
|
Packit |
db01ca |
<< r << " !\n";
|
|
Packit |
db01ca |
return r;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data_len != 2
|
|
Packit |
db01ca |
|| rsp.m_data[0] != eIpmiCcOk
|
|
Packit |
db01ca |
|| rsp.m_data[1] != dIpmiPicMgId )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfRequestHotswapAction: set FRU activation: " << rsp.m_data[0] << " !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_CMD;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfHotswapPolicyCancel( cIpmiResource *res,
|
|
Packit |
db01ca |
SaHpiTimeoutT timeout )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
if ( !m_is_tca )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "ATCA not supported by SI !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_REQUEST;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
res->PolicyCanceled() = true;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfSetAutoInsertTimeout( SaHpiTimeoutT timeout )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
if ( !m_is_tca )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "ATCA not supported by SI !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_REQUEST;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
InsertTimeout() = timeout;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfGetAutoExtractTimeout( cIpmiResource *res, SaHpiTimeoutT &timeout )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
if ( !m_is_tca )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "ATCA not supported by SI !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_REQUEST;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
timeout = res->ExtractTimeout();
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfSetAutoExtractTimeout( cIpmiResource *res, SaHpiTimeoutT timeout )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
if ( !m_is_tca )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "ATCA not supported by SI !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_REQUEST;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
res->ExtractTimeout() = timeout;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfGetPowerState( cIpmiResource *res, SaHpiPowerStateT &state )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
if (res->Mc()->IsRmsBoard()) {
|
|
Packit |
db01ca |
cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdGetChassisStatus );
|
|
Packit |
db01ca |
cIpmiMsg rsp;
|
|
Packit |
db01ca |
msg.m_data_len = 0;
|
|
Packit |
db01ca |
SaErrorT rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
if (rv != SA_OK) {
|
|
Packit |
db01ca |
stdlog << "IfGetPowerState: error " << rv << "\n";
|
|
Packit |
db01ca |
} else if (rsp.m_data[0] != eIpmiCcOk) {
|
|
Packit |
db01ca |
stdlog << "IfGetPowerState: ccode " << rsp.m_data[0] << "\n";
|
|
Packit |
db01ca |
return (SA_ERR_HPI_INVALID_DATA);
|
|
Packit |
db01ca |
} else {
|
|
Packit |
db01ca |
if (rsp.m_data[1] & 0x01) state = SAHPI_POWER_ON;
|
|
Packit |
db01ca |
else state = SAHPI_POWER_OFF;
|
|
Packit |
db01ca |
// if ((rsp.mdata[1] & 0x1E) != 0) /*power fault*/;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// get power level
|
|
Packit |
db01ca |
cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetPowerLevel );
|
|
Packit |
db01ca |
cIpmiMsg rsp;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
msg.m_data[0] = dIpmiPicMgId;
|
|
Packit |
db01ca |
msg.m_data[1] = res->FruId();
|
|
Packit |
db01ca |
msg.m_data[2] = 0x01; // desired steady power
|
|
Packit |
db01ca |
msg.m_data_len = 3;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rv != SA_OK )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "cannot send get power level: " << rv << " !\n";
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 3
|
|
Packit |
db01ca |
|| rsp.m_data[0] != eIpmiCcOk
|
|
Packit |
db01ca |
|| rsp.m_data[0] != dIpmiPicMgId )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "cannot get power level: " << rsp.m_data[0] << " !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_CMD;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
unsigned char power_level = rsp.m_data[2] & 0x1f;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// get current power level
|
|
Packit |
db01ca |
msg.m_data[2] = 0; // steady state power
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rv != SA_OK )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfGetPowerState: could not send get power level: " << rv << " !\n";
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 6
|
|
Packit |
db01ca |
|| rsp.m_data[0] != eIpmiCcOk
|
|
Packit |
db01ca |
|| rsp.m_data[1] != dIpmiPicMgId )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfGetPowerState: IPMI error get power level: " << rsp.m_data[0] << " !\n";
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_CMD;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
unsigned char current_power_level = rsp.m_data[2] & 0x1f;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( current_power_level >= power_level )
|
|
Packit |
db01ca |
state = SAHPI_POWER_ON;
|
|
Packit |
db01ca |
else
|
|
Packit |
db01ca |
state = SAHPI_POWER_OFF;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfSetPowerState( cIpmiResource *res, SaHpiPowerStateT state )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
SaErrorT rv;
|
|
Packit |
db01ca |
unsigned int power_level = 0;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (res->Mc()->IsRmsBoard()) {
|
|
Packit |
db01ca |
unsigned char power_state = 0;
|
|
Packit |
db01ca |
switch (state) {
|
|
Packit |
db01ca |
case SAHPI_POWER_CYCLE: power_state = 0x02; break;
|
|
Packit |
db01ca |
case SAHPI_POWER_ON: power_state = 0x01; break;
|
|
Packit |
db01ca |
case SAHPI_POWER_OFF: power_state = 0x00; break;
|
|
Packit |
db01ca |
default: power_state = 0x02; break;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdChassisControl );
|
|
Packit |
db01ca |
msg.m_data[0] = power_state;
|
|
Packit |
db01ca |
msg.m_data_len = 1;
|
|
Packit |
db01ca |
cIpmiMsg rsp;
|
|
Packit |
db01ca |
rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
if (rv != SA_OK)
|
|
Packit |
db01ca |
stdlog << "IfSetPowerState: state " << power_state << " error " << rv << "\n";
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetPowerLevel );
|
|
Packit |
db01ca |
msg.m_data[0] = dIpmiPicMgId;
|
|
Packit |
db01ca |
msg.m_data[1] = res->FruId();
|
|
Packit |
db01ca |
cIpmiMsg rsp;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( state == SAHPI_POWER_CYCLE )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
// power off
|
|
Packit |
db01ca |
msg.m_cmd = eIpmiCmdSetPowerLevel;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
msg.m_data[2] = power_level;
|
|
Packit |
db01ca |
msg.m_data[3] = 0x01; // copy desierd level to present level
|
|
Packit |
db01ca |
msg.m_data_len = 4;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rv != SA_OK )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "cannot send set power level: " << rv << " !\n";
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 2
|
|
Packit |
db01ca |
|| rsp.m_data[0] != eIpmiCcOk
|
|
Packit |
db01ca |
|| rsp.m_data[1] != dIpmiPicMgId )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "cannot set power level: " << rsp.m_data[0] << " !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_CMD;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// power on
|
|
Packit |
db01ca |
state = SAHPI_POWER_ON;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( state == SAHPI_POWER_ON )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
// get power level
|
|
Packit |
db01ca |
msg.m_cmd = eIpmiCmdGetPowerLevel;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
msg.m_data[2] = 0x01; // desired steady power
|
|
Packit |
db01ca |
msg.m_data_len = 3;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rv != SA_OK )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "cannot send get power level: " << rv << " !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_CMD;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 3
|
|
Packit |
db01ca |
|| rsp.m_data[0] != eIpmiCcOk
|
|
Packit |
db01ca |
|| rsp.m_data[1] != dIpmiPicMgId )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "cannot get power level: " << rsp.m_data[0] << " !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_CMD;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
power_level = rsp.m_data[2] & 0x1f;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
else if ( state != SAHPI_POWER_OFF )
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_PARAMS;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// set power level
|
|
Packit |
db01ca |
msg.m_cmd = eIpmiCmdSetPowerLevel;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
msg.m_data[2] = power_level;
|
|
Packit |
db01ca |
msg.m_data[3] = 0x01; // copy desierd level to present level
|
|
Packit |
db01ca |
msg.m_data_len = 4;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rv != SA_OK )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "cannot send set power level: " << rv << "! \n";
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 2
|
|
Packit |
db01ca |
|| rsp.m_data[0] != eIpmiCcOk
|
|
Packit |
db01ca |
|| rsp.m_data[1] != dIpmiPicMgId )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "cannot set power level: " << rsp.m_data[0] << " !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_CMD;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfGetIndicatorState( cIpmiResource *res, SaHpiHsIndicatorStateT &state )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFruLedState );
|
|
Packit |
db01ca |
cIpmiMsg rsp;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
msg.m_data_len = 3;
|
|
Packit |
db01ca |
msg.m_data[0] = dIpmiPicMgId;
|
|
Packit |
db01ca |
msg.m_data[1] = res->FruId();
|
|
Packit |
db01ca |
msg.m_data[2] = 0; // blue led;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rv != SA_OK )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfGetIndicatorState: could not send get FRU LED state: " << rv << " !\n";
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 6
|
|
Packit |
db01ca |
|| rsp.m_data[0] != 0
|
|
Packit |
db01ca |
|| rsp.m_data[1] != dIpmiPicMgId )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfGetIndicatorState: IPMI error set FRU LED state: "
|
|
Packit |
db01ca |
<< rsp.m_data[0] << " !\n";
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_DATA;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// lamp test
|
|
Packit |
db01ca |
if ( rsp.m_data[2] & 4 )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 10 )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfGetIndicatorState: IPMI error (lamp test) message to short: "
|
|
Packit |
db01ca |
<< rsp.m_data_len << " !\n";
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_DATA;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
state = SAHPI_HS_INDICATOR_ON;
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// overwrite state
|
|
Packit |
db01ca |
if ( rsp.m_data[2] & 2 )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 9 )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfGetIndicatorState: IPMI error (overwrite) message to short: "
|
|
Packit |
db01ca |
<< rsp.m_data_len << " !\n";
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_DATA;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data[6] == 0 )
|
|
Packit |
db01ca |
state = SAHPI_HS_INDICATOR_OFF;
|
|
Packit |
db01ca |
else
|
|
Packit |
db01ca |
state = SAHPI_HS_INDICATOR_ON;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
// local control state
|
|
Packit |
db01ca |
if ( rsp.m_data[3] == 0 )
|
|
Packit |
db01ca |
state = SAHPI_HS_INDICATOR_OFF;
|
|
Packit |
db01ca |
else
|
|
Packit |
db01ca |
state = SAHPI_HS_INDICATOR_ON;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfSetIndicatorState( cIpmiResource *res, SaHpiHsIndicatorStateT state )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruLedState );
|
|
Packit |
db01ca |
msg.m_data_len = 6;
|
|
Packit |
db01ca |
msg.m_data[0] = dIpmiPicMgId;
|
|
Packit |
db01ca |
msg.m_data[1] = res->FruId();
|
|
Packit |
db01ca |
msg.m_data[2] = 0; // blue led;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
msg.m_data[3] = (state == SAHPI_HS_INDICATOR_ON) ? 0xff : 0;
|
|
Packit |
db01ca |
msg.m_data[4] = 0;
|
|
Packit |
db01ca |
msg.m_data[5] = 1; // blue
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
cIpmiMsg rsp;
|
|
Packit |
db01ca |
SaErrorT rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rv != SA_OK )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfGetIndicatorState: could not send get FRU LED state: "
|
|
Packit |
db01ca |
<< rv << " !\n";
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 2
|
|
Packit |
db01ca |
|| rsp.m_data[0] != 0
|
|
Packit |
db01ca |
|| rsp.m_data[1] != dIpmiPicMgId )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfGetIndicatorState: IPMI error set FRU LED state: "
|
|
Packit |
db01ca |
<< rsp.m_data[0] << " !\n";
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_DATA;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfGetResetState( cIpmiResource * /*res*/, SaHpiResetActionT &state )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
state = SAHPI_RESET_DEASSERT;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
SaErrorT
|
|
Packit |
db01ca |
cIpmi::IfSetResetState( cIpmiResource *res, SaHpiResetActionT state )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
unsigned char reset_state;
|
|
Packit |
db01ca |
unsigned char chassis_state;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
switch( state )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
case SAHPI_COLD_RESET:
|
|
Packit |
db01ca |
reset_state = 0x00;
|
|
Packit |
db01ca |
chassis_state = 0x02;
|
|
Packit |
db01ca |
break;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
case SAHPI_WARM_RESET:
|
|
Packit |
db01ca |
// There is no way to know whether an ATCA FRU supports
|
|
Packit |
db01ca |
// warm reset -> Let's use cold reset all the time for now
|
|
Packit |
db01ca |
reset_state = 0x00;
|
|
Packit |
db01ca |
chassis_state = 0x03;
|
|
Packit |
db01ca |
break;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
case SAHPI_RESET_DEASSERT:
|
|
Packit |
db01ca |
// Reset is *always* deasserted on ATCA
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
default:
|
|
Packit |
db01ca |
stdlog << "IfSetResetState: unsupported state " << state << " !\n";
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_CMD;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if (res->Mc()->IsRmsBoard()) {
|
|
Packit |
db01ca |
cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdChassisControl );
|
|
Packit |
db01ca |
msg.m_data[0] = chassis_state;
|
|
Packit |
db01ca |
msg.m_data_len = 1;
|
|
Packit |
db01ca |
cIpmiMsg rsp;
|
|
Packit |
db01ca |
SaErrorT rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
if (rv != SA_OK)
|
|
Packit |
db01ca |
stdlog << "IfSetResetState: could not send Chassis Reset: " << rv << "\n";
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdFruControl );
|
|
Packit |
db01ca |
msg.m_data[0] = dIpmiPicMgId;
|
|
Packit |
db01ca |
msg.m_data[1] = res->FruId();
|
|
Packit |
db01ca |
msg.m_data[2] = reset_state;
|
|
Packit |
db01ca |
msg.m_data_len = 3;
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
cIpmiMsg rsp;
|
|
Packit |
db01ca |
SaErrorT rv = res->SendCommandReadLock( msg, rsp );
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rv != SA_OK )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfSetResetState: could not send FRU control: " << rv << " !\n";
|
|
Packit |
db01ca |
return rv;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
if ( rsp.m_data_len < 2
|
|
Packit |
db01ca |
|| rsp.m_data[0] != 0
|
|
Packit |
db01ca |
|| rsp.m_data[1] != dIpmiPicMgId )
|
|
Packit |
db01ca |
{
|
|
Packit |
db01ca |
stdlog << "IfSetResetState: IPMI error FRU control: "
|
|
Packit |
db01ca |
<< rsp.m_data[0] << " !\n";
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_ERR_HPI_INVALID_CMD;
|
|
Packit |
db01ca |
}
|
|
Packit |
db01ca |
|
|
Packit |
db01ca |
return SA_OK;
|
|
Packit |
db01ca |
}
|