File: ipmi_control_sun_led.cpp

package info (click to toggle)
openhpi 3.8.0-2.3
  • links: PTS
  • area: main
  • in suites: sid, trixie
  • size: 31,888 kB
  • sloc: ansic: 225,326; cpp: 63,687; java: 16,472; cs: 15,161; python: 11,884; sh: 11,508; makefile: 4,945; perl: 1,529; xml: 36; asm: 13
file content (129 lines) | stat: -rw-r--r-- 3,740 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 * Copyright (c) 2009 by Sun Microsystems, Inc.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  This
 * file and program are licensed under a BSD style license.  See
 * the Copying file included with the OpenHPI distribution for
 * full licensing terms.
 *
 * Authors:
 *     Chris Rinaldo <chris.rinaldo@sun.com>
 */

#include "ipmi_control_sun_led.h"
#include "ipmi_resource.h"

cIpmiControlSunLed::cIpmiControlSunLed(cIpmiMc* mc, unsigned int num,
    uint8_t dev_access_addr, uint8_t dev_slave_addr, uint8_t entity_id,
    uint8_t entity_inst, uint8_t oem, SaHpiBoolT read_only) :
    cIpmiControl(mc, num, SAHPI_CTRL_LED, SAHPI_CTRL_TYPE_OEM),
    m_dev_access_addr(dev_access_addr), m_dev_slave_addr(dev_slave_addr),
    m_entity_id(entity_id), m_entity_inst(entity_inst), m_oem(oem),
    m_read_only(read_only)
{
}

cIpmiControlSunLed::~cIpmiControlSunLed()
{
}

bool
cIpmiControlSunLed::CreateRdr(SaHpiRptEntryT& resource, SaHpiRdrT& rdr)
{
  if (cIpmiControl::CreateRdr(resource, rdr) == false)
    return false;

  rdr.RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED;
  rdr.RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_OEM;
  rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.MId = 0x2a;
  rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.ConfigData[0] = m_oem;
  rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.MId = 0x2a;
  rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.BodyLength = 1;
  rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[0] = 0;
  rdr.RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO;
  rdr.RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = m_read_only;
  rdr.RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE;

  return true;
}

SaErrorT
cIpmiControlSunLed::GetState(SaHpiCtrlModeT& mode, SaHpiCtrlStateT& state)
{
  mode = SAHPI_CTRL_MODE_AUTO;

  state.Type = SAHPI_CTRL_TYPE_OEM;

  cIpmiMsg ledmsg(eIpmiNetfnOem, eIpmiCmdSunOemLedGet);
  ledmsg.m_data[0] = m_dev_slave_addr;
  ledmsg.m_data[1] = m_oem;
  ledmsg.m_data[2] = m_dev_access_addr;
  ledmsg.m_data[3] = m_oem;
  ledmsg.m_data[4] = m_entity_id;
  ledmsg.m_data[5] = m_entity_inst;
  ledmsg.m_data[6] = 0;
  ledmsg.m_data_len = 7;

  cIpmiMsg ledrsp;
  SaErrorT rv = Resource()->SendCommandReadLock(this, ledmsg, ledrsp);

  if (rv != SA_OK)
    return rv;

  if (ledrsp.m_data_len != 2 || ledrsp.m_data[0] != eIpmiCcOk)
    return SA_ERR_HPI_ERROR;

  state.StateUnion.Oem.MId = 0x2a;
  state.StateUnion.Oem.BodyLength = 1;
  state.StateUnion.Oem.Body[0] = ledrsp.m_data[1];

  return SA_OK;
}

SaErrorT
cIpmiControlSunLed::SetState(const SaHpiCtrlModeT& mode,
	const SaHpiCtrlStateT& state)
{
  if (state.StateUnion.Oem.Body[0] > eLedStateFastBlink)
  {
    return SA_ERR_HPI_INVALID_DATA;
  }

  cIpmiMsg ledmsg(eIpmiNetfnOem, eIpmiCmdSunOemLedSet);
  ledmsg.m_data[0] = m_dev_slave_addr;
  ledmsg.m_data[1] = m_oem;
  ledmsg.m_data[2] = m_dev_access_addr;
  ledmsg.m_data[3] = m_oem;
  ledmsg.m_data[4] = state.StateUnion.Oem.Body[0]; // mode
  ledmsg.m_data[5] = m_entity_id;
  ledmsg.m_data[6] = m_entity_inst;
  ledmsg.m_data[7] = 0; // force
  ledmsg.m_data[8] = 0; // role
  ledmsg.m_data_len = 9;

  cIpmiMsg ledrsp;
  SaErrorT rv = Resource()->SendCommandReadLock(this, ledmsg, ledrsp);

  if (rv != SA_OK)
    return rv;

  if (ledrsp.m_data[0] == eIpmiCcInvalidCmd)
    return SA_ERR_HPI_UNSUPPORTED_PARAMS;

  if (ledrsp.m_data[0] == eIpmiCcInsufficientPrivilege)
    return SA_ERR_HPI_READ_ONLY;

  if (ledrsp.m_data[0] != eIpmiCcOk)
    return SA_ERR_HPI_ERROR;

  return SA_OK;
}

void
cIpmiControlSunLed::Dump(cIpmiLog& dump, const char* name) const
{
  dump.Begin("Sun LED", name);
  dump.End();
}