firmware-update: move fw update mode to new API

Rewrite exit firmware update mode" command to use new api

Tested:
verified using ipmitool raw command
1.command output before code modifications
ipmitool raw 0x08 0x28
Unable to send RAW command (channel=0x0 netfn=0x8 lun=0x0 cmd=0x28
rsp=0xcc):
Invalid data field in request
2.command output after code modifications
ipmitool raw 0x08 0x28
Unable to send RAW command (channel=0x0 netfn=0x8 lun=0x0 cmd=0x28
rsp=0xcc):
Invalid data field in request

Signed-off-by: anil kumar appana <anil.kumarx.appana@intel.com>
Change-Id: I3f33b2d87e9088007f4283985970e7e8ca1afe4e
diff --git a/src/firmware-update.cpp b/src/firmware-update.cpp
index f9cd153..50726e2 100644
--- a/src/firmware-update.cpp
+++ b/src/firmware-update.cpp
@@ -349,20 +349,23 @@
     return ipmi::responseSuccess();
 }
 
-static ipmi_ret_t ipmi_firmware_exit_fw_update_mode(
-    ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t request,
-    ipmi_response_t response, ipmi_data_len_t data_len, ipmi_context_t context)
+/** @brief implements exit firmware update mode command
+ *  @param None
+ *
+ *  @returns IPMI completion code
+ */
+ipmi::RspType<> ipmiFirmwareExitFwUpdateMode()
 {
-    if (DEBUG)
-        std::cerr << "Exit FW update mode\n";
-    *data_len = 0;
 
-    ipmi_ret_t rc = IPMI_CC_OK;
+    if (DEBUG)
+    {
+        std::cerr << "Exit FW update mode \n";
+    }
     switch (fw_update_status.state())
     {
         case fw_update_status_cache::FW_STATE_INIT:
         case fw_update_status_cache::FW_STATE_IDLE:
-            rc = IPMI_CC_INVALID_FIELD_REQUEST;
+            return ipmi::responseInvalidFieldRequest();
             break;
         case fw_update_status_cache::FW_STATE_DOWNLOAD:
         case fw_update_status_cache::FW_STATE_VERIFY:
@@ -373,15 +376,11 @@
         case fw_update_status_cache::FW_STATE_ERROR:
             break;
         case fw_update_status_cache::FW_STATE_AC_CYCLE_REQUIRED:
-            rc = IPMI_CC_INVALID_FIELD_REQUEST;
+            return ipmi::responseInvalidFieldRequest();
             break;
     }
-    if (rc == IPMI_CC_OK)
-    {
-        fw_update_status.firmwareUpdateAbortState();
-    }
-
-    return rc;
+    fw_update_status.firmwareUpdateAbortState();
+    return ipmi::responseSuccess();
 }
 
 static void post_transfer_complete_handler(
@@ -1655,7 +1654,7 @@
 static constexpr ipmi_cmd_t IPMI_CMD_FW_GET_ROOT_CERT_DATA = 0x25;
 static constexpr ipmi_cmd_t IPMI_CMD_FW_GET_FW_UPDATE_RAND_NUM = 0x26;
 static constexpr ipmi_cmd_t IPMI_CMD_FW_SET_FW_UPDATE_MODE = 0x27;
-static constexpr ipmi_cmd_t IPMI_CMD_FW_EXIT_FW_UPDATE_MODE = 0x28;
+static constexpr ipmi_cmd_t cmdFirmwareExitFirmwareUpdateMode = 0x28;
 static constexpr ipmi_cmd_t IPMI_CMD_FW_UPDATE_CONTROL = 0x29;
 static constexpr ipmi_cmd_t IPMI_CMD_FW_GET_STATUS = 0x2a;
 static constexpr ipmi_cmd_t IPMI_CMD_FW_SET_FW_UPDATE_OPTIONS = 0x2b;
@@ -1720,9 +1719,9 @@
                           ipmi::Privilege::Admin, ipmiSetFirmwareUpdateMode);
 
     // exit firmware update mode
-    ipmi_register_callback(NETFUN_FIRMWARE, IPMI_CMD_FW_EXIT_FW_UPDATE_MODE,
-                           NULL, ipmi_firmware_exit_fw_update_mode,
-                           PRIVILEGE_ADMIN);
+    ipmi::registerHandler(ipmi::prioOemBase, ipmi::netFnFirmware,
+                          cmdFirmwareExitFirmwareUpdateMode,
+                          ipmi::Privilege::Admin, ipmiFirmwareExitFwUpdateMode);
 
     // firmware control mechanism (set filename, usb, etc.)
     ipmi_register_callback(NETFUN_FIRMWARE, IPMI_CMD_FW_UPDATE_CONTROL, NULL,