This patch adds "ipmi-oem dell get-system-info cmc-firmware-version".
From a blade, it grabs the firmware version of the CMC for the
enclosure that the blade is in. It appears to only show the active CMC
firmware and not show anything for the standby CMC (if there is one). I
have no idea what it would show if there is a redundant CMC using
different firmware. This patch has worked for every Dell blade (10G,
11G, 12G) we have in an M1000e enclosure, including M1000e's with one
and two CMC's.
The version can be grabbed with: ipmi-raw 0 6 0x59 0 0xDF 1 0
rcvd: 59 00 11 01 00 00 00 00 33 2E 30 33 00 00 00 00 00 00 00 00
"3.03" in this case. I have tried this with several 3.x and 4.x
versions and the version numbers are all 4 characters long.
As far as I can tell, there is no easy way to grab this through existing
generic functions in ipmi-oem-dell.c. Those functions appear to assume
set selector and block selector 0, though the set selector is different
in this case. I had to decide to either reinvent the wheel somewhat or
modify the other functions to take selectors as parameters instead of
assuming 0. I took the easy route and reinvented the wheel, though I'm
open to changing that if needed. I figured I should at least get some
feedback before submitting a patch that changes a whole lot of code.
This patch may need some reworking, but it has been tested successfully
on: M600, M610, M610x, M910, and a pre-prod 12G system. On a rackmount,
it returns "dell:get-system-info 'cmc-firmware-version' option not
supported on this system".
Let me know if there's anything that needs to be changed and if you
would prefer the slight duplication of code that I did versus adding set
and block selector parameters to several functions.
--
Ryan Cox
Systems Administrator
Fulton Supercomputing Lab
Brigham Young University
--- ipmi-oem-dell.c.orig 2012-05-18 09:19:48.962028000 -0600
+++ ipmi-oem-dell.c 2012-05-18 10:29:16.225538000 -0600
@@ -374,6 +374,7 @@
#define IPMI_OEM_DELL_PORT_MAP_SLOT_MAPPING_1_2_OR_1_4 1
#define IPMI_OEM_DELL_PORT_MAP_SLOT_MAPPING_1_8 2
+#define IPMI_OEM_DELL_CMC_FIRMWARE_VERSION 0xDF
/* Will call ipmi_cmd_get_system_info_parameters only once, b/c field
* requested is defined by OEM to be < 16 bytes in length
@@ -1824,6 +1825,7 @@ ipmi_oem_dell_get_system_info (ipmi_oem_
"Option: idrac-info\n"
"Option: idrac-ipv4-url\n"
"Option: idrac-gui-webserver-control\n"
+ "Option: cmc-firmware-version\n"
"Option: cmc-ipv4-url\n"
"Option: cmc-ipv6-info\n"
"Option: cmc-ipv6-url\n"
@@ -1857,6 +1859,7 @@ ipmi_oem_dell_get_system_info (ipmi_oem_
&& strcasecmp (state_data->prog_data->args->oem_options[0], "idrac-info")
&& strcasecmp (state_data->prog_data->args->oem_options[0], "idrac-ipv4-url")
&& strcasecmp (state_data->prog_data->args->oem_options[0], "idrac-gui-webserver-control")
+ && strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-firmware-version")
&& strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-ipv4-url")
&& strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-ipv6-info")
&& strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-ipv6-url")
@@ -2197,7 +2200,12 @@ ipmi_oem_dell_get_system_info (ipmi_oem_
"%s\n",
idrac_web_gui_server_control_str);
}
- else if (!strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-ipv4-url"))
+ else if (!strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-firmware-version"))
+ {
+ if (ipmi_oem_dell_get_cmc_firmware_version(state_data) < 0)
+ goto cleanup;
+ }
+ else if (!strcasecmp (state_data->prog_data->args->oem_options[0], "cmc-ipv4-url"))
{
if (_get_dell_system_info_long_string (state_data,
IPMI_SYSTEM_INFO_PARAMETER_OEM_DELL_CMC_IPV4_URL,
@@ -7088,3 +7096,86 @@ ipmi_oem_dell_set_port_map (ipmi_oem_sta
cleanup:
return (rv);
}
+
+int
+ipmi_oem_dell_get_cmc_firmware_version (ipmi_oem_state_data_t *state_data)
+{
+ uint8_t bytes_rq[IPMI_OEM_MAX_BYTES];
+ uint8_t bytes_rs[IPMI_OEM_MAX_BYTES];
+ uint8_t bytes_read[4];
+ int rs_len;
+ int rv = -1;
+
+ assert (state_data);
+ assert (!state_data->prog_data->args->oem_options_count);
+
+ /* Dell Poweredge OEM
+ *
+ * From Dell Provided Docs
+ *
+ * Get Active LOM Status
+ *
+ * 0x30 - OEM network function
+ * 0xC1 - OEM cmd
+ * 0x?? - reserved
+ * 0x?? - reserved
+ *
+ * Get NIC Selection Response
+ *
+ * 0xC1 - OEM cmd
+ * 0x?? - Completion Code
+ * 0x?? -
+ * - 0x00 = No Lom Active (i.e. dedicated)
+ * - 0x01 = LOM 1
+ * - 0x02 = LOM 2
+ * - 0x03 = LOM 3
+ * - 0x04 = LOM 4
+ * - 0xff = unknown
+ * 0x?? - reserved
+ * 0x?? - reserved
+ */
+
+ bytes_rq[0] = IPMI_CMD_GET_SYSTEM_INFO_PARAMETERS;
+ bytes_rq[1] = 0x00;
+ bytes_rq[2] = IPMI_OEM_DELL_CMC_FIRMWARE_VERSION;
+ bytes_rq[3] = 0x01;
+ bytes_rq[4] = 0x00;
+
+ if ((rs_len = ipmi_cmd_raw (state_data->ipmi_ctx,
+ 0, /* lun */
+ IPMI_NET_FN_APP_RQ, /* network function */
+ bytes_rq, /* data */
+ 5, /* num bytes */
+ bytes_rs,
+ IPMI_OEM_MAX_BYTES)) < 0)
+ {
+ pstdout_fprintf (state_data->pstate,
+ stderr,
+ "ipmi_cmd_raw: %s\n",
+ ipmi_ctx_errormsg (state_data->ipmi_ctx));
+ goto cleanup;
+ }
+
+ if(rs_len != 20) {
+ pstdout_fprintf (state_data->pstate,
+ stderr,
+ "dell:get-system-info 'cmc-firmware-version' option not supported on this system\n");
+ goto cleanup;
+ }
+
+ if (ipmi_oem_check_response_and_completion_code (state_data,
+ bytes_rs,
+ rs_len,
+ 20,
+ IPMI_OEM_DELL_CMC_FIRMWARE_VERSION,
+ IPMI_NET_FN_APP_RQ,
+ NULL) < 0)
+ goto cleanup;
+
+ memcpy(bytes_read, &bytes_rs[8], 4);
+ pstdout_printf (state_data->pstate, "%s\n", bytes_read);
+
+ rv = 0;
+ cleanup:
+ return (rv);
+}
--- ipmi-oem-dell.h.orig 2012-05-18 09:19:52.367128000 -0600
+++ ipmi-oem-dell.h 2012-05-18 09:21:31.576046000 -0600
@@ -76,4 +76,6 @@ int ipmi_oem_dell_get_port_map (ipmi_oem
int ipmi_oem_dell_set_port_map (ipmi_oem_state_data_t *state_data);
+int ipmi_oem_dell_get_cmc_firmware_version (ipmi_oem_state_data_t *state_data);
+
#endif
_______________________________________________
Freeipmi-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/freeipmi-devel