4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
29 #include "ipmi_impl.h"
32 ipmi_get_deviceid(ipmi_handle_t
*ihp
)
34 ipmi_cmd_t cmd
, *resp
;
37 if (ihp
->ih_deviceid
!= NULL
)
38 return (ihp
->ih_deviceid
);
40 cmd
.ic_netfn
= IPMI_NETFN_APP
;
42 cmd
.ic_cmd
= IPMI_CMD_GET_DEVICEID
;
46 if ((resp
= ipmi_send(ihp
, &cmd
)) == NULL
)
49 if (resp
->ic_dlen
< sizeof (ipmi_deviceid_t
)) {
50 (void) ipmi_set_error(ihp
, EIPMI_BAD_RESPONSE_LENGTH
, NULL
);
55 * The devid response data may include additional data beyond the end of
56 * the normal structure, so we copy the entire response.
58 if ((ihp
->ih_deviceid
= ipmi_alloc(ihp
, resp
->ic_dlen
)) == NULL
)
61 (void) memcpy(ihp
->ih_deviceid
, resp
->ic_data
, resp
->ic_dlen
);
62 id_prod
= LE_IN16(&ihp
->ih_deviceid
->id_product
);
63 (void) memcpy(&ihp
->ih_deviceid
->id_product
, &id_prod
,
65 ihp
->ih_deviceid_len
= resp
->ic_dlen
;
67 return (ihp
->ih_deviceid
);
71 * Returns the firmware revision as a string. This does the work of converting
72 * the deviceid data into a human readable string (decoding the BCD values).
73 * It also encodes the fact that Sun ILOM includes the additional micro revision
74 * at the end of the deviceid information.
77 ipmi_firmware_version(ipmi_handle_t
*ihp
)
85 if (ihp
->ih_firmware_rev
!= NULL
)
86 return (ihp
->ih_firmware_rev
);
88 if ((dp
= ipmi_get_deviceid(ihp
)) == NULL
)
92 * Start with the major an minor revision numbers
94 (void) snprintf(rev
, sizeof (rev
), "%d.%d", dp
->id_firm_major
,
95 ipmi_convert_bcd(dp
->id_firm_minor
));
97 if (ipmi_is_sun_ilom(dp
) &&
98 ihp
->ih_deviceid_len
>= sizeof (ipmi_deviceid_t
) + 4) {
100 * With Sun ILOM we have the micro revision at the end of the
101 * deviceid. The first two bytes of the aux revision field are
102 * the platform version and release version.
104 auxrev
= (uint8_t *)dp
+ sizeof (ipmi_deviceid_t
);
105 for (i
= 0; i
< 2; i
++) {
110 (void) snprintf(rev
+ len
, sizeof (rev
) - len
, ".%u",
115 if ((ihp
->ih_firmware_rev
= ipmi_strdup(ihp
, rev
)) == NULL
)
118 return (ihp
->ih_firmware_rev
);
122 * IPMI Get Channel Authentication Capabilities Command
125 * Caller is responsible for free'ing returned ipmi_channel_auth_caps_t
127 ipmi_channel_auth_caps_t
*
128 ipmi_get_channel_auth_caps(ipmi_handle_t
*ihp
, uint8_t channel
, uint8_t priv
)
130 ipmi_cmd_t cmd
, *resp
;
132 ipmi_channel_auth_caps_t
*caps
;
135 (void) ipmi_set_error(ihp
, EIPMI_INVALID_REQUEST
, NULL
);
139 msg_data
[0] = channel
;
142 cmd
.ic_netfn
= IPMI_NETFN_APP
;
143 cmd
.ic_cmd
= IPMI_CMD_GET_CHANNEL_AUTH_CAPS
;
144 cmd
.ic_data
= msg_data
;
145 cmd
.ic_dlen
= sizeof (msg_data
);
148 if ((resp
= ipmi_send(ihp
, &cmd
)) == NULL
)
151 if (resp
->ic_dlen
< sizeof (ipmi_channel_auth_caps_t
)) {
152 (void) ipmi_set_error(ihp
, EIPMI_BAD_RESPONSE_LENGTH
, NULL
);
156 if ((caps
= ipmi_alloc(ihp
, sizeof (ipmi_channel_auth_caps_t
)))
161 (void) memcpy(caps
, resp
->ic_data
, sizeof (ipmi_channel_auth_caps_t
));
166 ipmi_channel_info_t
*
167 ipmi_get_channel_info(ipmi_handle_t
*ihp
, int number
)
169 ipmi_cmd_t cmd
, *rsp
;
173 (void) ipmi_set_error(ihp
, EIPMI_INVALID_REQUEST
, NULL
);
177 channel
= (uint8_t)number
;
179 cmd
.ic_netfn
= IPMI_NETFN_APP
;
181 cmd
.ic_cmd
= IPMI_CMD_GET_CHANNEL_INFO
;
182 cmd
.ic_data
= &channel
;
183 cmd
.ic_dlen
= sizeof (channel
);
185 if ((rsp
= ipmi_send(ihp
, &cmd
)) == NULL
)
188 if (rsp
->ic_dlen
< sizeof (ipmi_channel_info_t
)) {
189 (void) ipmi_set_error(ihp
, EIPMI_BAD_RESPONSE_LENGTH
, NULL
);
193 return (rsp
->ic_data
);
197 * IPMI Chassis Identify Command
201 ipmi_chassis_identify(ipmi_handle_t
*ihp
, boolean_t enable
)
214 cmd
.ic_netfn
= IPMI_NETFN_CHASSIS
;
215 cmd
.ic_cmd
= IPMI_CMD_CHASSIS_IDENTIFY
;
216 cmd
.ic_data
= msg_data
;
217 cmd
.ic_dlen
= sizeof (msg_data
);
220 if (ipmi_send(ihp
, &cmd
) == NULL
)