Blame plugins/ipmidirect/hotswap.cpp

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
}