oemcommands: move OEM set fan config to new API

Rewrite "OEM set Fan Config" command to
use the newly introduced IPMI provider API.

Tested:
verified using ipmitool OEM set fan config command

Command: ipmitool raw 0x30 0x89 0x20 0x24
Response:
Command: ipmitool raw 0x30 0x89 0x20 0xc0 //Acoustic mode
Response:                                 //Success
Command: ipmitool raw 0x30 0x89 0x20 0xc4 //Performance mode
Response:                                 //Success

Change-Id: I6875e914f636a0048ff456589d303c7b1c709cac
Signed-off-by: anil kumar appana <anil.kumarx.appana@intel.com>
Signed-off-by: jayaprakash Mutyala <mutyalax.jayaprakash@intel.com>
diff --git a/include/oemcommands.hpp b/include/oemcommands.hpp
index 753fdf3..a382716 100644
--- a/include/oemcommands.hpp
+++ b/include/oemcommands.hpp
@@ -313,12 +313,6 @@
     uint8_t policySupport;
 };
 
-struct SetFanConfigReq
-{
-    uint8_t selectedProfile;
-    uint8_t flags;
-    // other parameters from previous generation are not supported
-};
 struct CfgHostSerialReq
 {
     uint8_t command;
@@ -360,15 +354,6 @@
     maxFaultGroup,
 };
 
-enum class setFanProfileFlags : uint8_t
-{
-    setFanProfile = 7,
-    setPerfAcousMode = 6,
-    // reserved [5:3]
-    performAcousSelect = 2
-    // reserved [1:0]
-};
-
 enum class setFscParamFlags : uint8_t
 {
     tcontrol = 0x1,
diff --git a/src/oemcommands.cpp b/src/oemcommands.cpp
index 6cc951e..521c454 100644
--- a/src/oemcommands.cpp
+++ b/src/oemcommands.cpp
@@ -1366,45 +1366,45 @@
     return true;
 }
 
-ipmi_ret_t ipmiOEMSetFanConfig(ipmi_netfn_t netfn, ipmi_cmd_t cmd,
-                               ipmi_request_t request, ipmi_response_t response,
-                               ipmi_data_len_t dataLen, ipmi_context_t context)
+/**@brief implements the OEM set fan config.
+ * @param selectedFanProfile - fan profile to enable
+ * @param reserved1
+ * @param performanceMode - Performance/Acoustic mode
+ * @param reserved2
+ * @param setPerformanceMode - set Performance/Acoustic mode
+ * @param setFanProfile - set fan profile
+ *
+ * @return IPMI completion code.
+ **/
+ipmi::RspType<> ipmiOEMSetFanConfig(uint8_t selectedFanProfile,
+
+                                    uint2_t reserved1, bool performanceMode,
+                                    uint3_t reserved2, bool setPerformanceMode,
+                                    bool setFanProfile)
 {
-
-    if (*dataLen < 2 || *dataLen > 7)
+    if (reserved1 || reserved2)
     {
-        phosphor::logging::log<phosphor::logging::level::ERR>(
-            "ipmiOEMSetFanConfig: invalid input len!");
-        *dataLen = 0;
-        return IPMI_CC_REQ_DATA_LEN_INVALID;
+        return ipmi::responseInvalidFieldRequest();
     }
-
     // todo: tell bios to only send first 2 bytes
-
-    SetFanConfigReq* req = reinterpret_cast<SetFanConfigReq*>(request);
     boost::container::flat_map<
         std::string, std::variant<std::vector<std::string>, std::string>>
         profileData;
     std::shared_ptr<sdbusplus::asio::connection> dbus = getSdBus();
     if (!getFanProfileInterface(*dbus, profileData))
     {
-        return IPMI_CC_UNSPECIFIED_ERROR;
+        return ipmi::responseUnspecifiedError();
     }
 
     std::vector<std::string>* supported =
         std::get_if<std::vector<std::string>>(&profileData["Supported"]);
     if (supported == nullptr)
     {
-        return IPMI_CC_INVALID_FIELD_REQUEST;
+        return ipmi::responseInvalidFieldRequest();
     }
     std::string mode;
-    if (req->flags &
-        (1 << static_cast<uint8_t>(setFanProfileFlags::setPerfAcousMode)))
+    if (setPerformanceMode)
     {
-        bool performanceMode =
-            (req->flags & (1 << static_cast<uint8_t>(
-                               setFanProfileFlags::performAcousSelect))) > 0;
-
         if (performanceMode)
         {
 
@@ -1416,7 +1416,6 @@
         }
         else
         {
-
             if (std::find(supported->begin(), supported->end(), "Acoustic") !=
                 supported->end())
             {
@@ -1425,13 +1424,24 @@
         }
         if (mode.empty())
         {
-            return IPMI_CC_INVALID_FIELD_REQUEST;
+            return ipmi::responseInvalidFieldRequest();
         }
-        setDbusProperty(*dbus, settingsBusName, thermalModePath,
-                        thermalModeInterface, "Current", mode);
+
+        try
+        {
+            setDbusProperty(*dbus, settingsBusName, thermalModePath,
+                            thermalModeInterface, "Current", mode);
+        }
+        catch (sdbusplus::exception_t& e)
+        {
+            phosphor::logging::log<phosphor::logging::level::ERR>(
+                "ipmiOEMSetFanConfig: can't set thermal mode!",
+                phosphor::logging::entry("EXCEPTION=%s", e.what()));
+            return ipmi::responseResponseError();
+        }
     }
 
-    return IPMI_CC_OK;
+    return ipmi::responseSuccess();
 }
 
 ipmi::RspType<uint8_t, // profile support map
@@ -3438,8 +3448,9 @@
                          intel::general::cmdGetShutdownPolicy, NULL,
                          ipmiOEMGetShutdownPolicy, PRIVILEGE_ADMIN);
 
-    ipmiPrintAndRegister(intel::netFnGeneral, intel::general::cmdSetFanConfig,
-                         NULL, ipmiOEMSetFanConfig, PRIVILEGE_USER);
+    registerHandler(prioOemBase, intel::netFnGeneral,
+                    intel::general::cmdSetFanConfig, Privilege::User,
+                    ipmiOEMSetFanConfig);
 
     registerHandler(prioOemBase, intel::netFnGeneral,
                     intel::general::cmdGetFanConfig, Privilege::User,