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

Reply via email to