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 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
30 #include "ipmi_impl.h"
33 ipmi_get_deviceid(ipmi_handle_t
*ihp
)
35 ipmi_cmd_t cmd
, *resp
;
38 if (ihp
->ih_deviceid
!= NULL
)
39 return (ihp
->ih_deviceid
);
41 cmd
.ic_netfn
= IPMI_NETFN_APP
;
43 cmd
.ic_cmd
= IPMI_CMD_GET_DEVICEID
;
47 if ((resp
= ipmi_send(ihp
, &cmd
)) == NULL
)
50 if (resp
->ic_dlen
< sizeof (ipmi_deviceid_t
)) {
51 (void) ipmi_set_error(ihp
, EIPMI_BAD_RESPONSE_LENGTH
, NULL
);
56 * The devid response data may include additional data beyond the end of
57 * the normal structure, so we copy the entire response.
59 if ((ihp
->ih_deviceid
= ipmi_alloc(ihp
, resp
->ic_dlen
)) == NULL
)
62 (void) memcpy(ihp
->ih_deviceid
, resp
->ic_data
, resp
->ic_dlen
);
63 id_prod
= LE_IN16(&ihp
->ih_deviceid
->id_product
);
64 (void) memcpy(&ihp
->ih_deviceid
->id_product
, &id_prod
,
66 ihp
->ih_deviceid_len
= resp
->ic_dlen
;
68 return (ihp
->ih_deviceid
);
72 * Returns the firmware revision as a string. This does the work of converting
73 * the deviceid data into a human readable string (decoding the BCD values).
74 * It also encodes the fact that Sun ILOM includes the additional micro revision
75 * at the end of the deviceid information.
78 ipmi_firmware_version(ipmi_handle_t
*ihp
)
86 if (ihp
->ih_firmware_rev
!= NULL
)
87 return (ihp
->ih_firmware_rev
);
89 if ((dp
= ipmi_get_deviceid(ihp
)) == NULL
)
93 * Start with the major an minor revision numbers
95 (void) snprintf(rev
, sizeof (rev
), "%d.%d", dp
->id_firm_major
,
96 ipmi_convert_bcd(dp
->id_firm_minor
));
98 if (ipmi_is_sun_ilom(dp
) &&
99 ihp
->ih_deviceid_len
>= sizeof (ipmi_deviceid_t
) + 4) {
101 * With Sun ILOM we have the micro revision at the end of the
102 * deviceid. The first two bytes of the aux revision field are
103 * the platform version and release version.
105 auxrev
= (uint8_t *)dp
+ sizeof (ipmi_deviceid_t
);
106 for (i
= 0; i
< 2; i
++) {
111 (void) snprintf(rev
+ len
, sizeof (rev
) - len
, ".%u",
116 if ((ihp
->ih_firmware_rev
= ipmi_strdup(ihp
, rev
)) == NULL
)
119 return (ihp
->ih_firmware_rev
);
122 ipmi_channel_info_t
*
123 ipmi_get_channel_info(ipmi_handle_t
*ihp
, int number
)
125 ipmi_cmd_t cmd
, *rsp
;
129 (void) ipmi_set_error(ihp
, EIPMI_INVALID_REQUEST
, NULL
);
133 channel
= (uint8_t)number
;
135 cmd
.ic_netfn
= IPMI_NETFN_APP
;
137 cmd
.ic_cmd
= IPMI_CMD_GET_CHANNEL_INFO
;
138 cmd
.ic_data
= &channel
;
139 cmd
.ic_dlen
= sizeof (channel
);
141 if ((rsp
= ipmi_send(ihp
, &cmd
)) == NULL
)
144 if (rsp
->ic_dlen
< sizeof (ipmi_channel_info_t
)) {
145 (void) ipmi_set_error(ihp
, EIPMI_BAD_RESPONSE_LENGTH
, NULL
);
149 return (rsp
->ic_data
);