[Feature]Merge MP1_MR1 from MTK

Change-Id: I3fc364555acf14f1c308b6be7b05f21f92757fd0
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/CMakeLists.txt b/src/telephonyware/3.0/hardware/ril/fusion/libril/CMakeLists.txt
old mode 100644
new mode 100755
index 09c4886..01e30d6
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/CMakeLists.txt
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/CMakeLists.txt
@@ -20,6 +20,7 @@
 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/rilmipc/telephony/radio/")
 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/rilmipc/telephony/sim/")
 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/rilmipc/telephony/call/")
+include_directories("${CMAKE_CURRENT_SOURCE_DIR}/rilmipc/telephony/ecall/")
 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/rilmipc/telephony/ss/")
 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/rilmipc/telephony/sms/")
 include_directories("${CMAKE_CURRENT_SOURCE_DIR}/rilmipc/telephony/stk/")
@@ -76,6 +77,7 @@
 	rilmipc/telephony/sim/RpSimController.cpp
 	rilmipc/telephony/call/GsmUtil.cpp
 	rilmipc/telephony/call/RpCallController.cpp
+	rilmipc/telephony/ecall/RpEcallController.cpp
 	rilmipc/telephony/ss/RpSsController.cpp
 	rilmipc/telephony/ss/RpSsUtils.cpp
 	rilmipc/telephony/sms/RpSmsController.cpp
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp
old mode 100644
new mode 100755
index d439436..17802d4
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/ril.cpp
@@ -728,11 +728,6 @@
     return rild;
 }
 
-extern "C"
-void RIL_setRilSocketName(const char * s) {
-    strncpy(rild, s, MAX_SOCKET_NAME_LENGTH);
-}
-
 static char *
 strdupReadString(Parcel &p) {
     size_t stringlen;
@@ -8593,9 +8588,6 @@
     status = p.readInt32(&t);
     eCallReqMsg.ecall_variant = (RIL_ECall_Variant)t;
 
-    status = p.readInt32(&t);
-    eCallReqMsg.ivs_mode = (RIL_ECall_Ivs_Config_Mode)t;
-
     eCallReqMsg.address = strdupReadString(p);
 
     //debug
@@ -8620,8 +8612,8 @@
     }
 
     startRequest;
-    appendPrintBuf("%secall_cat=%d,ecall_variant=%d,ivs_mode=%d,address=%s,length=%d", printBuf,
-        eCallReqMsg.ecall_cat, eCallReqMsg.ecall_variant, eCallReqMsg.ivs_mode, (char*)eCallReqMsg.address,\
+    appendPrintBuf("%secall_cat=%d,ecall_variant=%d,address=%s,length=%d", printBuf,
+        eCallReqMsg.ecall_cat, eCallReqMsg.ecall_variant, (char*)eCallReqMsg.address,\
         eCallReqMsg.length
         );
     closeRequest;
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/framework/core/RfxControllerFactory.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/framework/core/RfxControllerFactory.cpp
old mode 100644
new mode 100755
index 9355c16..22b783d
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/framework/core/RfxControllerFactory.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/framework/core/RfxControllerFactory.cpp
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -56,6 +57,7 @@
 #include "RpStkController.h"
 #include "RpNwController.h"
 #include "RpImsController.h"
+#include "RpEcallController.h"
 
 /*****************************************************************************
  * Define
@@ -80,6 +82,7 @@
     RFX_CONTROLLER_CREATION_ENTRY(RpStkController),
     RFX_CONTROLLER_CREATION_ENTRY(RpNwController),
     RFX_CONTROLLER_CREATION_ENTRY(RpImsController),
+    RFX_CONTROLLER_CREATION_ENTRY(RpEcallController),
 };
 
 const RfxCreateControllerFuncptr RfxControllerFactory::s_non_slot_controllers[] = {
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RmcDataDefs.h b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RmcDataDefs.h
old mode 100644
new mode 100755
index a0e3e6f..c0477b7
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RmcDataDefs.h
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RmcDataDefs.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -141,6 +142,8 @@
 #define ESM_CAUSE_END ESM_CAUSE_BASE + 0xFF
 #define PAM_CAUSE_BASE 0x1200 // PAM cause
 #define PAM_CAUSE_END PAM_CAUSE_BASE + 0xC9
+#define FIVESMGSM_CAUSE_BASE 0x1A00 // 5GSM cause
+#define FIVESMGSM_CAUSE_END FIVESMGSM_CAUSE_BASE + 0xFF
 #define CME_CAUSE_BASE_V14 0x64 // Defined in 3GPP TS 27.007 V14
 #define CME_CAUSE_END_V14 CME_CAUSE_BASE_V14 + 0x64
 
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.cpp
old mode 100644
new mode 100755
index 0fe027c..edc24af
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.cpp
@@ -214,12 +214,75 @@
     }
 }
 
+void mipc_data_get_retry_timer_cb(mipc_sim_ps_id_enum sim_ps_id,
+    mipc_data_get_retry_timer_struct_v *result_ptr, void *cb_priv_ptr) {
+    Get_Retry_timer_call_back_priv* cb_priv = (Get_Retry_timer_call_back_priv*)cb_priv_ptr;
+    Parcel * parcel = NULL;
+    int ret = 0;
+
+    RpDataController * dataController = RpDataController::getInstance(sim_ps_id - 1);
+
+    if (dataController == NULL){
+        RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] NULL dataController", __FUNCTION__, __LINE__ ,sim_ps_id);
+        goto error;
+    }
+    if (cb_priv == NULL || cb_priv->response == NULL) {
+        RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] NULL cb_priv && response", __FUNCTION__, __LINE__ ,sim_ps_id);
+        goto error;
+    }
+
+    parcel = new Parcel();
+    if (parcel == NULL){
+        RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] NULL dataController", __FUNCTION__, __LINE__ ,sim_ps_id);
+        goto error;
+    }
+    if (result_ptr != NULL) {
+        cb_priv->response->suggestedRetryTime = result_ptr->retry_timer;
+    } else {
+        cb_priv->response->suggestedRetryTime = -1;
+    }
+
+    ret = responseDataCallListV11(*parcel, cb_priv->response, sizeof(MTK_RIL_Data_Call_Response_v11));
+    if (ret != 0){
+        RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] NULL dataController", __FUNCTION__, __LINE__ ,sim_ps_id);
+        goto error;
+    }
+
+    goto finish;
+
+error:
+    if (parcel != NULL){
+        delete(parcel);
+        parcel = NULL;
+    }
+    RFX_LOG_E(RFX_LOG_TAG, "%s:%d notify failure", __FUNCTION__ ,  __LINE__);
+finish:
+    RFX_LOG_D(RFX_LOG_TAG, "%s:%d notify response", __FUNCTION__ ,  __LINE__);
+    if (parcel == NULL)
+        rfx_enqueue_response_message(NULL, cb_priv->token, mipc_sim_id_to_slot_id(sim_ps_id), RIL_E_GENERIC_FAILURE);
+    else
+        rfx_enqueue_response_message(parcel, cb_priv->token, mipc_sim_id_to_slot_id(sim_ps_id), RIL_E_SUCCESS);
+
+    if (cb_priv->response != NULL) {
+        dataController->freeDataResponse(cb_priv->response);
+        FREEIF(cb_priv->response);
+        FREEIF(cb_priv);
+    }
+    RFX_LOG_D(RFX_LOG_TAG, "[%s] finish", __FUNCTION__);
+
+}
+
 void mipc_data_call_act_cb(mipc_sim_ps_id_enum sim_ps_id,
     mipc_data_call_act_struct *result_ptr, void *cb_priv_ptr) {
 
     MTK_RIL_Data_Call_Response_v11* response = NULL;
     Parcel * parcel = NULL;
     int ret = 0;
+    mipc_api_result_enum result = MIPC_API_RESULT_SUCCESS;
+    char *apn = NULL;
+    Act_Data_call_back_priv* data_cb_priv = (Act_Data_call_back_priv*)cb_priv_ptr;
+    Get_Retry_timer_call_back_priv* retry_timer_cb_priv = NULL;
+    RIL_DataCallFailCause dataCallFailCause = PDP_FAIL_NONE;
 
     RFX_LOG_D(RFX_LOG_TAG,"%s %d sim_ps_id[%d] result_ptr[%p] cb_priv_ptr[%p]",__FUNCTION__, __LINE__, sim_ps_id, \
         result_ptr, cb_priv_ptr);
@@ -250,15 +313,51 @@
 
    if (result_ptr->result_code != MIPC_API_RESULT_SUCCESS) {
         RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] MIPC_API_RESULT_FAIL", __FUNCTION__, __LINE__ ,sim_ps_id);
-        response->status = result_ptr->result_code;
-        dataController->setGprsFailureCause((int)result_ptr->result_code);
-            goto error;
+        if (result_ptr->apn == NULL || strlen((char*)result_ptr->apn) <= 0) {
+            if (data_cb_priv != NULL) {
+                RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] cb apn %s", __FUNCTION__, __LINE__ , sim_ps_id, data_cb_priv->apn);
+                asprintf(&apn, "%s", data_cb_priv->apn);
+            }
+        } else {
+            apn = (char*)result_ptr->apn;
+        }
+        pPdnManager->clearPdnInfo(result_ptr->id);
+    } else {
+        pPdnManager->fillPdnInfoByMipcDataCallAct(result_ptr);
     }
 
-    pPdnManager->fillPdnInfoByMipcDataCallAct(result_ptr);
     dataController->createDataResponse(dataController->calculateTransIntfId(result_ptr->id, result_ptr->interface_id), IPV4V6, response);
-    RFX_LOG_D(RFX_LOG_TAG, "[%d][%s] %s", sim_ps_id, __FUNCTION__, dataController->responsesToString(response, 1).string());
 
+
+    if (result_ptr->result_code != MIPC_API_RESULT_SUCCESS) {
+        dataCallFailCause = dataController->convertFailCauseToRilStandard((int)result_ptr->result_code);
+        if (dataCallFailCause == PDP_FAIL_NONE) {
+            RFX_LOG_E(RFX_LOG_TAG, "[%d][%s] NO CAUSE(0) but mipc_data_call_act_req failed",
+                    sim_ps_id, __FUNCTION__);
+            dataCallFailCause = PDP_FAIL_ERROR_UNSPECIFIED;
+        } else {
+            RFX_LOG_E(RFX_LOG_TAG, "[%d][%s] FAIL CAUSE: %X",
+                    sim_ps_id, __FUNCTION__, dataCallFailCause);
+        }
+        response->status = dataCallFailCause;
+        dataController->setGprsFailureCause((int)dataCallFailCause);
+        retry_timer_cb_priv = (Get_Retry_timer_call_back_priv*)calloc(1, sizeof(Get_Retry_timer_call_back_priv));
+        if (retry_timer_cb_priv != NULL) {
+            retry_timer_cb_priv->token = data_cb_priv->token;
+            retry_timer_cb_priv->response = response;
+            RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] MIPC_API_RESULT_FAIL [%s]", __FUNCTION__, __LINE__ ,sim_ps_id,(char*)result_ptr->apn);
+            result = mipc_data_get_retry_timer_async(sim_ps_id, mipc_data_get_retry_timer_cb, (void*)retry_timer_cb_priv, apn);
+            if (result != MIPC_API_RESULT_SUCCESS) {
+                RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] mipc_data_get_retry_timer_sync fail", __FUNCTION__, __LINE__ ,sim_ps_id);
+            }
+            FREEIF(apn);
+            FREEIF(data_cb_priv);
+            return;
+        } else {
+            RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] null calloc",__FUNCTION__,__LINE__, sim_ps_id);
+        }
+        FREEIF(apn);
+    }
     parcel = new Parcel();
     if (parcel == NULL){
         RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] NULL dataController", __FUNCTION__, __LINE__ ,sim_ps_id);
@@ -281,14 +380,15 @@
 finish:
     RFX_LOG_D(RFX_LOG_TAG, "%s:%d notify response", __FUNCTION__ ,  __LINE__);
     if (parcel == NULL)
-        rfx_enqueue_response_message(NULL, cb_priv_ptr, mipc_sim_id_to_slot_id(sim_ps_id), RIL_E_GENERIC_FAILURE);
+        rfx_enqueue_response_message(NULL, data_cb_priv->token, mipc_sim_id_to_slot_id(sim_ps_id), RIL_E_GENERIC_FAILURE);
     else
-        rfx_enqueue_response_message(parcel, cb_priv_ptr, mipc_sim_id_to_slot_id(sim_ps_id), RIL_E_SUCCESS);
+        rfx_enqueue_response_message(parcel, data_cb_priv->token, mipc_sim_id_to_slot_id(sim_ps_id), RIL_E_SUCCESS);
 
     if (response != NULL) {
         dataController->freeDataResponse(response);
         FREEIF(response);
     }
+    FREEIF(data_cb_priv);
     RFX_LOG_D(RFX_LOG_TAG, "[%s] finish", __FUNCTION__);
 }
 
@@ -383,6 +483,7 @@
 
 void mipc_data_call_deact_ind_cb(mipc_sim_ps_id_enum sim_ps_id,
     mipc_data_call_deact_struct *result_ptr, void *cb_priv_ptr) {
+    PdnInfo pdn_info;
 
     RFX_LOG_D(RFX_LOG_TAG,"%s %d  sim_ps_id[%d] result_ptr[%p]",__FUNCTION__, __LINE__, sim_ps_id, result_ptr);
 
@@ -397,8 +498,18 @@
         return;
     }
 
-    RFX_LOG_D(RFX_LOG_TAG,"%s %d:sim_ps_id %d result_code %d",__FUNCTION__, __LINE__,
-        sim_ps_id,result_ptr->result_code);
+    RmcDcPdnManager* pPdnManager = dataController->m_pPdnManager;
+
+    if (pPdnManager == NULL){
+        RFX_LOG_E(RFX_LOG_TAG, "[%s][%d] sim_ps_id[%d] NULL m_pPdnManager", __FUNCTION__, __LINE__ ,sim_ps_id);
+        return;
+    }
+
+    pdn_info = pPdnManager->getPdnInfo(result_ptr->id);
+    pdn_info.deactReason = dataController->convertFailCauseToRilStandard(result_ptr->network_error);
+    pPdnManager->setPdnInfo(result_ptr->id, &pdn_info);
+    RFX_LOG_D(RFX_LOG_TAG,"%s %d:sim_ps_id %d result_code %d, deactReason %d",__FUNCTION__, __LINE__,
+        sim_ps_id,result_ptr->result_code, pdn_info.deactReason);
 
     dataController->sendDataCallListResponse(result_ptr->id);
 }
@@ -830,28 +941,39 @@
             s_dataSetting[m_slot_id][DOMESTIC_ROAMING_DATA] == SKIP_DATA_SETTINGS &&
             s_dataSetting[m_slot_id][INTERNATIONAL_ROAMING_DATA] == SKIP_DATA_SETTINGS) {
             result = mipc_data_set_config_sync(mipc_sim_ps_id_enum(request->getSlotId()), &dataConfigResult, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][MOBILE_DATA], \
-                (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][DOMESTIC_ROAMING_DATA], MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
-                MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][INTERNATIONAL_ROAMING_DATA]);
+                MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                (mipc_data_config_type_const_enum)imsTestMode, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE);
         } else if (s_dataSetting[m_slot_id][MOBILE_DATA] == SKIP_DATA_SETTINGS &&
             s_dataSetting[m_slot_id][DOMESTIC_ROAMING_DATA] != SKIP_DATA_SETTINGS &&
             s_dataSetting[m_slot_id][INTERNATIONAL_ROAMING_DATA] == SKIP_DATA_SETTINGS) {
-            result = mipc_data_set_config_sync(mipc_sim_ps_id_enum(request->getSlotId()), &dataConfigResult, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][MOBILE_DATA], \
-                (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][DOMESTIC_ROAMING_DATA], MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
-                MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][INTERNATIONAL_ROAMING_DATA]);
+            result = mipc_data_set_config_sync(mipc_sim_ps_id_enum(request->getSlotId()), &dataConfigResult, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                MIPC_DATA_CONFIG_TYPE_NO_CHANGE, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][DOMESTIC_ROAMING_DATA], MIPC_DATA_CONFIG_TYPE_NO_CHANGE);
         } else if (s_dataSetting[m_slot_id][MOBILE_DATA] == SKIP_DATA_SETTINGS &&
             s_dataSetting[m_slot_id][DOMESTIC_ROAMING_DATA] == SKIP_DATA_SETTINGS &&
             s_dataSetting[m_slot_id][INTERNATIONAL_ROAMING_DATA] != SKIP_DATA_SETTINGS) {
+            result = mipc_data_set_config_sync(mipc_sim_ps_id_enum(request->getSlotId()), &dataConfigResult, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                (mipc_data_config_type_const_enum)imsTestMode, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][INTERNATIONAL_ROAMING_DATA]);
         //    RFX_LOG_I(RFX_LOG_TAG, "Enter ECNCFG, only international on/off");
             //p_response = atSendCommand(String8::format("AT+ECNCFG=,,,%d,,%d",
             //    imsTestMode, s_dataSetting[m_slot_id][INTERNATIONAL_ROAMING_DATA]));
         } else if (s_dataSetting[m_slot_id][MOBILE_DATA] == SKIP_DATA_SETTINGS &&
             s_dataSetting_resend[m_slot_id][DOMESTIC_ROAMING_DATA] != SKIP_DATA_SETTINGS &&
             s_dataSetting_resend[m_slot_id][INTERNATIONAL_ROAMING_DATA] != SKIP_DATA_SETTINGS) {
+            result = mipc_data_set_config_sync(mipc_sim_ps_id_enum(request->getSlotId()), &dataConfigResult, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                (mipc_data_config_type_const_enum)imsTestMode, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][DOMESTIC_ROAMING_DATA], \
+                (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][INTERNATIONAL_ROAMING_DATA]);
         //    RFX_LOG_I(RFX_LOG_TAG, "Enter ECNCFG, domestic and international on/off");
             //p_response = atSendCommand(String8::format("AT+ECNCFG=,,,%d,%d,%d",
             //    imsTestMode, s_dataSetting_resend[m_slot_id][DOMESTIC_ROAMING_DATA],
             //    s_dataSetting_resend[m_slot_id][INTERNATIONAL_ROAMING_DATA]));
         } else {
+            result = mipc_data_set_config_sync(mipc_sim_ps_id_enum(request->getSlotId()), &dataConfigResult, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][MOBILE_DATA], \
+                MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                (mipc_data_config_type_const_enum)imsTestMode, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][DOMESTIC_ROAMING_DATA], \
+                (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][INTERNATIONAL_ROAMING_DATA]);
         //    RFX_LOG_I(RFX_LOG_TAG, "Enter ECNCFG,else ");
             //p_response = atSendCommand(String8::format("AT+ECNCFG=%d,,,%d,%d,%d",
             //    s_dataSetting[m_slot_id][MOBILE_DATA],imsTestMode,
@@ -864,27 +986,39 @@
     // AT+ECNCFG=<mobile_data>,<data_roaming>,[<volte>,<ims_test_mode>]
         if (s_dataSetting[m_slot_id][MOBILE_DATA] != SKIP_DATA_SETTINGS &&
             s_dataSetting[m_slot_id][ROAMING_DATA] == SKIP_DATA_SETTINGS) {
+            result = mipc_data_set_config_sync(mipc_sim_ps_id_enum(request->getSlotId()), &dataConfigResult, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][MOBILE_DATA], \
+                MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                (mipc_data_config_type_const_enum)imsTestMode, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE);
             //p_response = atSendCommand(String8::format("AT+ECNCFG=%d,,,%d,,",
              //   s_dataSetting[m_slot_id][MOBILE_DATA],imsTestMode));
         } else if (s_dataSetting[m_slot_id][MOBILE_DATA] == SKIP_DATA_SETTINGS &&
             s_dataSetting[m_slot_id][ROAMING_DATA] != SKIP_DATA_SETTINGS) {
+            result = mipc_data_set_config_sync(mipc_sim_ps_id_enum(request->getSlotId()), &dataConfigResult, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][ROAMING_DATA], MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                (mipc_data_config_type_const_enum)imsTestMode, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE);
             //p_response = atSendCommand(String8::format("AT+ECNCFG=,%d,,%d,,",
              //       s_dataSetting[m_slot_id][ROAMING_DATA], imsTestMode));
         } else {
+            result = mipc_data_set_config_sync(mipc_sim_ps_id_enum(request->getSlotId()), &dataConfigResult, (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][MOBILE_DATA], \
+                (mipc_data_config_type_const_enum)s_dataSetting[m_slot_id][ROAMING_DATA], MIPC_DATA_CONFIG_TYPE_NO_CHANGE, \
+                (mipc_data_config_type_const_enum)imsTestMode, MIPC_DATA_CONFIG_TYPE_NO_CHANGE, MIPC_DATA_CONFIG_TYPE_NO_CHANGE);
            // p_response = atSendCommand(String8::format("AT+ECNCFG=%d,%d,,%d,,",
             //    s_dataSetting[m_slot_id][MOBILE_DATA], s_dataSetting[m_slot_id][ROAMING_DATA],
            //     imsTestMode));
         }
     }
 
-   RFX_LOG_D(RFX_LOG_TAG, "[%d][%s] End", rid, __FUNCTION__);
+   RFX_LOG_D(RFX_LOG_TAG, "[%d][%s] End result: %d", rid, __FUNCTION__, result);
 
-error:
-    RFX_LOG_E(RFX_LOG_TAG, "%s:%d notify failure", __FUNCTION__ ,  __LINE__);
 finish:
     RFX_LOG_D(RFX_LOG_TAG, "%s:%d notify response", __FUNCTION__ ,  __LINE__);
+    rfx_enqueue_response_message(NULL, request->getRilToken(),(RIL_SOCKET_ID)request->getSlotId(), RIL_E_SUCCESS);
     FREEIF(pReqData);
     return;
+error:
+    RFX_LOG_E(RFX_LOG_TAG, "%s:%d notify failure", __FUNCTION__ ,  __LINE__);
+    rfx_enqueue_response_message(NULL, request->getRilToken(),(RIL_SOCKET_ID)request->getSlotId(), RIL_E_GENERIC_FAILURE);
+    return;
 }
 
 
@@ -1086,7 +1220,7 @@
                 goto error;
             }
             result = mipc_apn_profile_update_sync(slot_id_to_mipc_sim_id(request->getSlotId()), &apnProfiles, i+1, mccmnc, \
-                dataProfiles[i].apn, (uint32_t)dataProfiles[i].profileId, apnPdpType, MIPC_APN_ENUM_PDP_TYPE_IPV4V6, (mipc_apn_auth_type_enum)dataProfiles[i].authType, \
+                dataProfiles[i].apn, (uint32_t)dataProfiles[i].supportedTypesBitmask, apnPdpType, MIPC_APN_ENUM_PDP_TYPE_IPV4V6, (mipc_apn_auth_type_enum)dataProfiles[i].authType, \
                 dataProfiles[i].user, dataProfiles[i].password, 0xffffffff, MIPC_APN_ENUM_COMPRESSION_ENABLE);
             RFX_LOG_D(RFX_LOG_TAG,"%s %d2 apn[%s] result[%d] apnProfiles.result_code[%d], apnProfiles.apn_list_count[%d]", __FUNCTION__, __LINE__, dataProfiles[i].apn, result, apnProfiles.result_code, apnProfiles.apn_list_count);
             if (result != MIPC_API_RESULT_SUCCESS) {
@@ -1449,10 +1583,120 @@
     rfx_enqueue_response_message(NULL, request->getRilToken(),(RIL_SOCKET_ID)request->getSlotId(), RIL_E_GENERIC_FAILURE);
 }
 
+RIL_DataCallFailCause RpDataController::convertFailCauseToRilStandard(int cause) {
+    int rid = m_slot_id;
+
+    if (cause > MIPC_RESULT_PDN_EXT_NETWORK_ERROR_BEGIN /*0x140000*/ &&
+            cause < MIPC_RESULT_PDN_EXT_NETWORK_ERROR_END) {
+        cause -= MIPC_RESULT_PDN_EXT_NETWORK_ERROR_BEGIN;
+        if (cause > SM_CAUSE_BASE && cause < SM_CAUSE_END) {
+            cause -= SM_CAUSE_BASE;
+        } else if (cause > ESM_CAUSE_BASE && cause < ESM_CAUSE_END) {
+            RFX_LOG_E(RFX_LOG_TAG, "[%d][%s] ESM CAUSE: %X",
+                    rid, __FUNCTION__, cause);
+            cause -= ESM_CAUSE_BASE;
+        } else if (cause > PAM_CAUSE_BASE && cause < PAM_CAUSE_END) {
+            RFX_LOG_E(RFX_LOG_TAG, "[%d][%s] PAM CAUSE: %X",
+                    rid, __FUNCTION__, cause);
+            cause -= PAM_CAUSE_BASE;
+        } else if (cause > FIVESMGSM_CAUSE_BASE && cause < FIVESMGSM_CAUSE_END) {
+            RFX_LOG_E(RFX_LOG_TAG, "[%d][%s] 5GSM CAUSE: %X",
+                    rid, __FUNCTION__, cause);
+            cause -= FIVESMGSM_CAUSE_BASE;
+        } else if (cause > CME_CAUSE_BASE_V14 && cause < CME_CAUSE_END_V14) {
+            RFX_LOG_E(RFX_LOG_TAG, "[%d][%s] CME CAUSE: %X",
+                    rid, __FUNCTION__, cause);
+            if (cause == 149) {//CME_PDP_AUTHENTICATION_FAILED = 149
+                return PDP_FAIL_USER_AUTHENTICATION;
+            } else {
+                cause -= CME_CAUSE_BASE_V14;
+            }
+        }
+
+        switch (cause) {
+            case 0: return PDP_FAIL_NONE;
+            case 0x08: return PDP_FAIL_OPERATOR_BARRED;
+            case 0x0E: return PDP_FAIL_NAS_SIGNALLING;
+            case 0x18: return PDP_FAIL_MBMS_CAPABILITIES_INSUFFICIENT;
+            case 0x19: return PDP_FAIL_LLC_SNDCP;
+            case 0x1A: return PDP_FAIL_INSUFFICIENT_RESOURCES;
+            case 0x1B: return PDP_FAIL_MISSING_UKNOWN_APN;
+            case 0x1C: return PDP_FAIL_UNKNOWN_PDP_ADDRESS_TYPE;
+            case 0x1D: return PDP_FAIL_USER_AUTHENTICATION;
+            case 0x1E: return PDP_FAIL_ACTIVATION_REJECT_GGSN;
+            case 0x1F: return PDP_FAIL_ACTIVATION_REJECT_UNSPECIFIED;
+            case 0x20: return PDP_FAIL_SERVICE_OPTION_NOT_SUPPORTED;
+            case 0x21: return PDP_FAIL_SERVICE_OPTION_NOT_SUBSCRIBED;
+            case 0x22: return PDP_FAIL_SERVICE_OPTION_OUT_OF_ORDER;
+            case 0x23: return PDP_FAIL_NSAPI_IN_USE;
+            case 0x24: return PDP_FAIL_REGULAR_DEACTIVATION;
+            case 0x25: return PDP_FAIL_QOS_NOT_ACCEPTED;
+            case 0x26: return PDP_FAIL_NETWORK_FAILURE;
+            case 0x27: return PDP_FAIL_UMTS_REACTIVATION_REQ;
+            case 0x28: return PDP_FAIL_FEATURE_NOT_SUPP;
+            case 0x29: return PDP_FAIL_TFT_SEMANTIC_ERROR;
+            case 0x2A: return PDP_FAIL_TFT_SYTAX_ERROR;
+            case 0x2B: return PDP_FAIL_UNKNOWN_PDP_CONTEXT;
+            case 0x2C: return PDP_FAIL_FILTER_SEMANTIC_ERROR;
+            case 0x2D: return PDP_FAIL_FILTER_SYTAX_ERROR;
+            case 0x2E: return PDP_FAIL_PDP_WITHOUT_ACTIVE_TFT;
+            case 0x2F: return PDP_FAIL_MULTICAST_GROUP_MEMBERSHIP_TIMEOUT;
+            case 0x30: return PDP_FAIL_BCM_VIOLATION;
+            case 0x31: return PDP_FAIL_LAST_PDN_DISC_NOT_ALLOWED;
+            case 0x32: return PDP_FAIL_ONLY_IPV4_ALLOWED;
+            case 0x33: return PDP_FAIL_ONLY_IPV6_ALLOWED;
+            case 0x34: return PDP_FAIL_ONLY_SINGLE_BEARER_ALLOWED;
+            case 0x35: return PDP_FAIL_ESM_INFO_NOT_RECEIVED;
+            case 0x36: return PDP_FAIL_PDN_CONN_DOES_NOT_EXIST;
+            case 0x37: return PDP_FAIL_MULTI_CONN_TO_SAME_PDN_NOT_ALLOWED;
+            case 0x38: return PDP_FAIL_COLLISION_WITH_NW_INITIATED_REQUEST;
+            case 0x3B: return PDP_FAIL_ESM_UNSUPPORTED_QCI_VALUE;
+            case 0x3C: return PDP_FAIL_BEARER_HANDLING_NOT_SUPPORT;
+            case 0x41: return PDP_FAIL_MAX_ACTIVE_PDP_CONTEXT_REACHED;
+            case 0x42: return PDP_FAIL_UNSUPPORTED_APN_IN_CURRENT_PLMN;
+            case 0x51: return PDP_FAIL_INVALID_TRANSACTION_ID;
+            case 0x5F: return PDP_FAIL_MESSAGE_INCORRECT_SEMANTIC;
+            case 0x60: return PDP_FAIL_INVALID_MANDATORY_INFO;
+            case 0x61: return PDP_FAIL_MESSAGE_TYPE_UNSUPPORTED;
+            case 0x62: return PDP_FAIL_MSG_TYPE_NONCOMPATIBLE_STATE;
+            case 0x63: return PDP_FAIL_UNKNOWN_INFO_ELEMENT;
+            case 0x64: return PDP_FAIL_CONDITIONAL_IE_ERROR;
+            case 0x65: return PDP_FAIL_MSG_AND_PROTOCOL_STATE_UNCOMPATIBLE;
+            case 0x6F: return PDP_FAIL_PROTOCOL_ERRORS;
+            case 0x70: return PDP_FAIL_APN_TYPE_CONFLICT;
+            case 0x71: return PDP_FAIL_INVALID_PCSCF_ADDR;
+            case 0x72: return PDP_FAIL_INTERNAL_CALL_PREEMPT_BY_HIGH_PRIO_APN;
+            case 0x73: return PDP_FAIL_EMM_ACCESS_BARRED;
+            case 0x74: return PDP_FAIL_EMERGENCY_IFACE_ONLY;
+            case 0x75: return PDP_FAIL_IFACE_MISMATCH;
+            case 0x76: return PDP_FAIL_COMPANION_IFACE_IN_USE;
+            case 0x77: return PDP_FAIL_IP_ADDRESS_MISMATCH;
+            case 0x78: return PDP_FAIL_IFACE_AND_POL_FAMILY_MISMATCH;
+            case 0x79: return PDP_FAIL_EMM_ACCESS_BARRED_INFINITE_RETRY;
+            case 0x7A: return PDP_FAIL_AUTH_FAILURE_ON_EMERGENCY_CALL;
+            case 0x0E0F: return PDP_FAIL_LOCAL_REJECT_ACT_REQ_DUE_TO_REACH_RETRY_COUNTER;
+            case 0x0F47: return PDP_FAIL_TCM_ESM_TIMER_TIMEOUT;
+            case 0x1402: return PDP_FAIL_PAM_ATT_PDN_ACCESS_REJECT_IMS_PDN_BLOCK_TEMP;
+            case 0x1671: return PDP_FAIL_DATA_NOT_ALLOW;
+            case -1: return PDP_FAIL_VOICE_REGISTRATION_FAIL;
+            case -2: return PDP_FAIL_DATA_REGISTRATION_FAIL;
+            case -3: return PDP_FAIL_SIGNAL_LOST;
+            case -4: return PDP_FAIL_PREF_RADIO_TECH_CHANGED;
+            case -5: return PDP_FAIL_RADIO_POWER_OFF;
+            case -6: return PDP_FAIL_TETHERED_CALL_ACTIVE;
+            default: return PDP_FAIL_ERROR_UNSPECIFIED;
+        }
+    } else {
+        return PDP_FAIL_ERROR_UNSPECIFIED;
+    }
+}
+
 void RpDataController::handleGetLastFailCauseRequest(const sp<RfxMessage>& request) {
 
     Parcel * parcel = NULL;
+    int lastFailCause = 0;
     RFX_LOG_D(RFX_LOG_TAG, "[%d][%s][%d] m_nGprsFailureCause[%d]", m_slot_id, __FUNCTION__, __LINE__, m_nGprsFailureCause);
+
     parcel = new Parcel();
 
     if (parcel == NULL){
@@ -1460,19 +1704,19 @@
                 request->getSlotId(), request->getClientId(), request->getToken());
         goto error;
     }
-
+    lastFailCause = getGprsFailureCause();
+    parcel->writeInt32(1);
+    parcel->writeInt32(lastFailCause);
+    RFX_LOG_D(RFX_LOG_TAG, "[%d][%s][%d] lastFailCause[%d]", m_slot_id, __FUNCTION__, __LINE__, lastFailCause);
+    rfx_enqueue_response_message(parcel, request->getRilToken(),(RIL_SOCKET_ID)request->getSlotId(), RIL_E_SUCCESS);
+    return;
 error:
     if (parcel != NULL){
         delete(parcel);
         parcel = NULL;
     }
     RFX_LOG_E(RFX_LOG_TAG, "%s:%d notify failure", __FUNCTION__ ,  __LINE__);
-
-    if (parcel == NULL)
-        rfx_enqueue_response_message(NULL, request->getRilToken(),(RIL_SOCKET_ID)request->getSlotId(), RIL_E_GENERIC_FAILURE);
-    else
-        rfx_enqueue_response_message(parcel, request->getRilToken(),(RIL_SOCKET_ID)request->getSlotId(), RIL_E_SUCCESS);
-    return;
+    rfx_enqueue_response_message(NULL, request->getRilToken(),(RIL_SOCKET_ID)request->getSlotId(), RIL_E_GENERIC_FAILURE);
 }
 
 
@@ -1737,6 +1981,7 @@
     mipc_api_result_enum result = MIPC_API_RESULT_SUCCESS;
     Parcel * parcel = NULL;
     Parcel *p = NULL;
+    Act_Data_call_back_priv* data_call_cb = NULL;
 
 
     memset(&dataCallAct, 0, sizeof(dataCallAct));
@@ -1834,7 +2079,17 @@
 
     mapPdpTypeFromStringToEnum(pStrings[6], &pdpType);
 
-    result = mipc_data_call_act_async(slot_id_to_mipc_sim_id(request->getSlotId()), mipc_data_call_act_cb, (void *)request->getRilToken(), pStrings[2], \
+    data_call_cb = (Act_Data_call_back_priv*)calloc(1, sizeof(Act_Data_call_back_priv));
+    if (data_call_cb == NULL) {
+        RFX_LOG_E(RFX_LOG_TAG, "%s:%d  slotid[%d] clientid[%d] token[%d] NULL calloc", __FUNCTION__ ,  __LINE__, \
+                request->getSlotId(), request->getClientId(), request->getToken());
+        goto error;
+    }
+    data_call_cb->token = request->getRilToken();
+    memset(data_call_cb->apn, 0, MAX_APN_NAME_LENGTH);
+    strncpy(data_call_cb->apn, pStrings[2], strlen(pStrings[2]));
+
+    result = mipc_data_call_act_async(slot_id_to_mipc_sim_id(request->getSlotId()), mipc_data_call_act_cb, (void *)data_call_cb, pStrings[2], \
         apnType, pdpType, pdpType, authType, pStrings[3], pStrings[4], \
         MIPC_DATA_ENUM_FALLBACK_TYPE_IPV4_FIRST, 0xffffffff);
 error:
@@ -1922,3 +2177,7 @@
     m_nGprsFailureCause = gprsFailureCause;
 }
 
+int RpDataController::getGprsFailureCause(){
+    return m_nGprsFailureCause;
+}
+
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.h b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.h
old mode 100644
new mode 100755
index 4f530c0..790cf9e
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.h
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/data/RpDataController.h
@@ -61,6 +61,15 @@
 
 #define SKIP_DATA_SETTINGS    -2
 
+typedef struct Act_Data_call_back_priv {
+    RIL_Token token;
+    char apn[MAX_APN_NAME_LENGTH];
+} Act_Data_call_back_priv;
+
+typedef struct Get_Retry_timer_call_back_priv {
+    RIL_Token token;
+    MTK_RIL_Data_Call_Response_v11* response;
+} Get_Retry_timer_call_back_priv;
 
 /*****************************************************************************
  * Class RpDataController
@@ -117,6 +126,9 @@
     bool validateAid(int aid);
     String8 responsesToString(MTK_RIL_Data_Call_Response_v11* responses, int num);
     void setGprsFailureCause(int gprsFailureCause);
+    int getGprsFailureCause();
+    RIL_DataCallFailCause convertFailCauseToRilStandard(int cause);
+
 
 protected:
     int m_nGprsFailureCause;
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/ecall/RpEcallController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/ecall/RpEcallController.cpp
new file mode 100755
index 0000000..1bbdc29
--- /dev/null
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/ecall/RpEcallController.cpp
Binary files differ
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/ecall/RpEcallController.h b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/ecall/RpEcallController.h
new file mode 100755
index 0000000..dfd52af
--- /dev/null
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/ecall/RpEcallController.h
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: MediaTekProprietary

+/*****************************************************************************

+*  Copyright Statement:

+*  --------------------

+*  Copyright (c) [2020], MediaTek Inc. All rights reserved.

+*  This software/firmware and related documentation ("MediaTek Software") are

+*  protected under relevant copyright laws.

+*

+*  The information contained herein is confidential and proprietary to

+*  MediaTek Inc. and/or its licensors. Except as otherwise provided in the

+*  applicable licensing terms with MediaTek Inc. and/or its licensors, any

+*  reproduction, modification, use or disclosure of MediaTek Software, and

+*  information contained herein, in whole or in part, shall be strictly

+*  prohibited.

+*****************************************************************************/

+

+#ifndef __RP_ECALL_CONTROLLER_H__

+#define __RP_ECALL_CONTROLLER_H__

+

+#include <string>

+

+#include "RfxController.h"

+#include "RpUtils.h"

+#include "RilParcelUtils.h"

+#include <telephony/mtk_ril_request_info.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+#include "mipc_ecall_api.h"

+#include "mipc_msg_tlv_const.h"

+#ifdef __cplusplus

+}

+#endif

+

+/*****************************************************************************

+ * Class RpEcallController

+ *****************************************************************************/

+class RpEcallController : public RfxController {

+    RFX_DECLARE_CLASS(RpEcallController);  // Required: declare this class

+

+public:

+    RpEcallController();

+

+    virtual ~RpEcallController();

+

+// Override

+protected:

+

+    virtual void onInit();

+    virtual void onDeinit();

+    virtual bool onHandleRequest(const sp<RfxMessage>& message);

+

+private:

+    std::string mLog_tag;

+    String8 mEccListWithCard;

+    String8 mEccListNoCard;

+    bool mIsSimInsert;

+    String8 mGsmEcc;

+

+private:

+    void registerInd(mipc_sim_ps_id_enum sim_ps_id,void *cb_priv_ptr);

+

+    void handleEcallFastMakeEcall(const sp<RfxMessage> &request);

+    void handleEcallUpdateMsd(const sp<RfxMessage>& request);

+    void handleEcallResetIvs(const sp<RfxMessage>& request);

+    void handleEcallSetRegState(const sp<RfxMessage>& request);

+    int handleEcallGetSimInfo();

+    void handleEcallSetTestAddr(const sp<RfxMessage>& request);

+    void handleEcallSetReconfAddr(const sp<RfxMessage> &request);

+    void handleEcallSetAddrPri(const sp<RfxMessage> &request);

+

+    void checkEccNumberAndServiceCategory(char* number, const sp<RfxMessage> &request);

+    bool isEmergencyNumber(String8 number);

+    int getServiceCategory(String8 number);

+    bool isEccMatchInList(String8 number, String8 eccList);

+

+    std::string IdToString(int request);

+};

+

+#endif /* __RP_ECALL_CONTROLLER_H__ */

diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp
old mode 100644
new mode 100755
index cea50da..c643c1c
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/network/RpNwController.cpp
@@ -1,3 +1,4 @@
+//SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -118,6 +119,7 @@
 int prefNwType[RIL_SOCKET_NUM];
 int mCurPreferedNetWorkType[RIL_SOCKET_NUM];
 int mPhoneMode[RIL_SOCKET_NUM];
+bool mHasSetRat[RIL_SOCKET_NUM];
 /*****************************************************************************
  * Class RfxNwController
  * The class is created if the slot is single mode, LWG or C,
@@ -649,7 +651,7 @@
             writeStringToParcel(p,responseStr[i]);
             free(responseStr[i]);
         }
-        rfx_enqueue_urc_message(RIL_UNSOL_RESPONSE_CS_NETWORK_STATE_CHANGED,p,mipc_sim_id_to_slot_id(sim_ps_id),RIL_E_SUCCESS);
+        rfx_enqueue_urc_message(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED,p,mipc_sim_id_to_slot_id(sim_ps_id),RIL_E_SUCCESS);
         isNeedNotifyStateChanged(mipc_sim_id_to_slot_id(sim_ps_id));
     }
 }
@@ -861,6 +863,28 @@
     updatePhoneMode(mipc_sim_id_to_slot_id(sim_ps_id));
 }
 
+void mipc_unsol_nw_etxpwr_ind_cb(mipc_msg_t *msg_ptr, void *cb_priv_ptr) {
+    mipc_sim_ps_id_enum sim_ps_id;
+    uint32_t act = 0;
+    int32_t tx_power = 0;
+
+    sim_ps_id = (mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id;
+    act = mipc_nw_etxpwr_ind_get_act(msg_ptr,0);
+    tx_power = mipc_nw_etxpwr_ind_get_tx_power(msg_ptr,0);
+    RFX_LOG_D(RFX_LOG_TAG,"mipc_unsol_nw_etxpwr_ind_cb act=%d, tx_power=%d\n", act, tx_power);
+
+    Parcel *p = new Parcel();
+    if(p != NULL) {
+        p->writeInt32(2);
+        p->writeUint32(act);
+        p->writeInt32(tx_power);
+        rfx_enqueue_urc_message(RIL_UNSOL_TX_POWER, p, mipc_sim_id_to_slot_id(sim_ps_id), RIL_E_SUCCESS);
+
+    } else {
+        RFX_LOG_E(RFX_LOG_TAG,"mipc_unsol_nw_cs_ind_cb new parcel error!");
+    }
+}
+
 }
 
 void RpNwController::onInit() {
@@ -872,6 +896,7 @@
     mCurPreferedNetWorkType[getSlotId()] = -1;
     prefNwType[getSlotId()] = -1;
     mPhoneMode[getSlotId()] = RADIO_TECH_UNKNOWN;
+    mHasSetRat[getSlotId()] = false;
 
     const int request_id_list[] = {
             RIL_REQUEST_SIGNAL_STRENGTH,  // 19
@@ -906,6 +931,7 @@
     mipc_nw_ciev_ind_register(slot_id_to_mipc_sim_id(getSlotId()),mipc_unsol_nw_ciev_ind_cb,NULL);
     mipc_nw_egmss_ind_register(slot_id_to_mipc_sim_id(getSlotId()),mipc_unsol_nw_egmss_ind_cb,NULL);
     mipc_nw_psbearer_ind_register(slot_id_to_mipc_sim_id(getSlotId()),mipc_unsol_nw_psbearer_ind_cb,NULL);
+    mipc_nw_etxpwr_ind_register(slot_id_to_mipc_sim_id(getSlotId()),mipc_unsol_nw_etxpwr_ind_cb,NULL);
 
     // register request id list
     registerToHandleRequest(request_id_list,
@@ -1450,6 +1476,9 @@
         } else if (nt_type == 6 && prefer_type == 0) {
             //4G/3G/2G(Auto) item
             return_type = PREF_NET_TYPE_LTE_GSM_WCDMA;
+        } else if (nt_type == 6 && prefer_type == 128) {
+            //4G/3G/2G(Auto) item
+            return_type = PREF_NET_TYPE_LTE_GSM_WCDMA;
         } else if (nt_type == 14) {
             // LTE CDMA EVDO GSM/WCDMA mode
             return_type = PREF_NET_TYPE_LTE_CMDA_EVDO_GSM_WCDMA;
@@ -1699,6 +1728,11 @@
             mCurPreferedNetWorkType[slotid] = prefNwType[slotid];
             updatePhoneMode(mipc_sim_id_to_slot_id(sim_ps_id));
         }
+
+        mHasSetRat[mipc_sim_id_to_slot_id(sim_ps_id)] = true;
+        RFX_LOG_D(RFX_LOG_TAG,"mipc_set_prefer_network_cb set mHasSetRat[%d]=%d\n",
+                mipc_sim_id_to_slot_id(sim_ps_id),
+                mHasSetRat[mipc_sim_id_to_slot_id(sim_ps_id)]);
     }
 
     if (cb_priv_ptr == NULL) {
@@ -2042,6 +2076,23 @@
     int ret = 0;
     rfx_property_get(mccMncKey.c_str(), value, "");
     RFX_LOG_D(RFX_LOG_TAG, "handleGetOperator plmnid[%s]",value);
+
+    // Handle for test SIM, always return 00101
+    if (strcmp(value, "00101") == 0) {
+        Parcel * p = new Parcel();
+        if(p == NULL) {
+            rfx_enqueue_response_message(NULL,request->getRilToken(),(RIL_SOCKET_ID)request->getSlotId(),RIL_E_GENERIC_FAILURE);
+            return;
+        }
+        p->writeInt32(3); //number of strings
+        writeStringToParcel(p,value);
+        writeStringToParcel(p,value);
+        writeStringToParcel(p,value);
+        RFX_LOG_D(RFX_LOG_TAG,"%s plmn_id[%s],shortname[%s]", __FUNCTION__, value, value);
+        rfx_enqueue_response_message(p,request->getRilToken(),(RIL_SOCKET_ID)request->getSlotId(),RIL_E_SUCCESS);
+        return;
+    }
+
     //get operator name with plmnid
     mipc_nw_provider_name_get_async(slot_id_to_mipc_sim_id(request->getSlotId()), mipc_get_Operator_cb,
         (void *)request->getRilToken(), value);
@@ -2238,8 +2289,8 @@
         p->readInt32(&pInt[1]);
         p->readInt32(&pInt[2]);
     }
-    int req, err, gsm_band, umts_band;
-    unsigned int lte_band_1_32=0,lte_band_33_64=0;
+    int req, err;
+    unsigned int gsm_band=0, umts_band=0, lte_band_1_32=0, lte_band_33_64=0;
     req = pInt[0];
     switch (req) {
         case BM_AUTO_MODE: //"unspecified" (selected by baseband automatically)
@@ -2312,12 +2363,13 @@
         }
     }
     mipc_nw_band_mode_struct BandMode;
+    memset(&BandMode, 0, sizeof(BandMode));
     BandMode.GSM_band_mode=gsm_band;
-    BandMode.GSM_band_mode=umts_band;
+    BandMode.UMTS_band_mode=umts_band;
     BandMode.LTE_band[0]=lte_band_1_32;
     BandMode.LTE_band[1]=lte_band_33_64;
-    RFX_LOG_D(RFX_LOG_TAG, "gsm_band:%d, umts_band : %d, lte_band_1_32 : %d, lte_band_33_64: %d, req: %d ",
-        gsm_band, umts_band, lte_band_1_32, lte_band_33_64, req);
+    RFX_LOG_D(RFX_LOG_TAG, "GSM_band_mode:%d, UMTS_band_mode: %d, LTE_band[0]: %d, LTE_band[1]: %d, req: %d",
+        BandMode.GSM_band_mode, BandMode.UMTS_band_mode, BandMode.LTE_band[0], BandMode.LTE_band[1], req);
     mipc_nw_band_mode_set_async(slot_id_to_mipc_sim_id(request->getSlotId()), mipc_band_set_network_cb, (void *)request->getRilToken(),&BandMode);
 }
 
@@ -2383,21 +2435,29 @@
     RFX_UNUSED(key);
     RFX_UNUSED(old_value);
 
-    int rat = 6, rat1 = 4; //6: GSM + UMTS + LTE, 4: LTE prefer
-
     if (value.asBool() == true) {
         int newCardType = getStatusManager(slotId)->getIntValue(RFX_STATUS_KEY_CARD_TYPE, CARD_TYPE_NONE);
-        RFX_LOG_D(RFX_LOG_TAG, "[%d]%s get slotId[%d] RFX_STATUS_KEY_CARD_TYPE = %d",
-                getSlotId(), __FUNCTION__, slotId, newCardType);
+        //RFX_LOG_D(RFX_LOG_TAG, "[%d]%s get slotId[%d] RFX_STATUS_KEY_CARD_TYPE = %d",
+        //        getSlotId(), __FUNCTION__, slotId, newCardType);
 
-        /// M: there is no sim card, that mean: card has been plugout.
-        /// M: Send global rat mode
-        if (newCardType == CARD_TYPE_NONE) {
-            RFX_LOG_D(RFX_LOG_TAG, "[%d]%s send RAT mode for slotid=%d: no sim card state = %d, rat=%d, rat1=%d",
-                    getSlotId(), __FUNCTION__, slotId, newCardType, rat, rat1);
+        /// M: Must set rat mode when first time boot (Never set RAT before)
+        if ((newCardType == CARD_TYPE_NONE) && (mHasSetRat[getSlotId()] == false)) {
+            mipc_nw_get_rat_struct cur_rat;
+            mipc_nw_get_rat_sync(slot_id_to_mipc_sim_id(getSlotId()), &cur_rat);
+
+            RFX_LOG_D(RFX_LOG_TAG, "[%d]%s send RAT mode for slotid=%d: no sim card state = %d, rat=%d, prefer_rat=%d",
+                    getSlotId(), __FUNCTION__, slotId, newCardType, cur_rat.rat, cur_rat.prefer_rat);
+
+            if (0 > cur_rat.rat || 30 < cur_rat.rat) {
+                //6: GSM + UMTS + LTE, 4: LTE prefer
+                cur_rat.rat = 6;
+                cur_rat.prefer_rat = 4;
+                RFX_LOG_D(RFX_LOG_TAG, "[%d]%s Update as rat=%d, prefer_rat=%d",
+                        getSlotId(), __FUNCTION__, cur_rat.rat, cur_rat.prefer_rat);
+            }
 
             mipc_nw_set_rat_async(slot_id_to_mipc_sim_id(getSlotId()), mipc_set_prefer_network_cb, NULL,
-                (uint8_t)rat,(uint8_t)rat1);
+                (uint8_t)cur_rat.rat,(uint8_t)cur_rat.prefer_rat);
         }
     }
 }
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/radio/RpRadioController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/radio/RpRadioController.cpp
old mode 100644
new mode 100755
index b83f8bc..6e70ad6
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/radio/RpRadioController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/radio/RpRadioController.cpp
@@ -94,10 +94,11 @@
     RFX_OBJ_GET_INSTANCE(RfxRootController)->getStatusManager(mipc_sim_id_to_slot_id(sim_ps_id))->setIntValue(RFX_STATUS_KEY_RADIO_LOCK, RADIO_LOCK_IDLE);
 
     //retry set radio status
-    if(result_ptr->result_code != MIPC_RESULT_SUCCESS) {
+    if(result_ptr->result_code != MIPC_RESULT_SUCCESS ||
+        result_ptr->sw_radio_state != mPendingRequest[mipc_sim_id_to_slot_id(sim_ps_id)]) {
         RFX_OBJ_GET_INSTANCE(RfxRootController)->getStatusManager(mipc_sim_id_to_slot_id(sim_ps_id))->setIntValue(RFX_STATUS_KEY_RADIO_LOCK, RADIO_LOCK_BY_RADIO);
         int radio_state = mPendingRequest[mipc_sim_id_to_slot_id(sim_ps_id)];
-        RFX_LOG_D(getTag(sim_ps_id).c_str(), "%s, set radio fail, start retry, radio_state", __FUNCTION__, radio_state);
+        RFX_LOG_D(getTag(sim_ps_id).c_str(), "%s, set radio fail or not equal pending, start retry, radio_state", __FUNCTION__, radio_state);
         int ret = mipc_nw_radio_state_set_async(
                 sim_ps_id,
                 mipc_nw_radio_state_booup_set_cb,
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.cpp
old mode 100644
new mode 100755
index 0fa766a..6615766
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sim/RpSimController.cpp
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*****************************************************************************
  *  Copyright Statement:
  *  --------------------
@@ -281,12 +282,32 @@
     }
 }
 
+int transferMipcSimResultCode(mipc_result_enum result_code) {
+    switch(result_code) {
+        case MIPC_RESULT_SIM_NOT_INSERTED:
+            return RIL_E_SIM_ABSENT;
+        case MIPC_RESULT_PIN_REQUIRED:
+        case MIPC_RESULT_PIN_DISABLED:
+            return RIL_E_PASSWORD_INCORRECT;
+        case MIPC_RESULT_BUSY:
+            return RIL_E_SIM_BUSY;
+        case MIPC_RESULT_BAD_SIM:
+            return RIL_E_SIM_ERR;
+        case MIPC_RESULT_FAILURE:
+            return RIL_E_GENERIC_FAILURE;
+        default:
+            return result_code;
+    }
+}
 
 static void mipc_sim_status_get_cb(mipc_sim_ps_id_enum sim_ps_id, mipc_sim_status_struct *result_ptr, void *cb_priv_ptr) {
     RFX_LOG_D(getTag(sim_ps_id).c_str(),"%s, %s", __FUNCTION__, dump_mipc_sim_status(result_ptr,cb_priv_ptr).c_str());
-    if(cb_priv_ptr && (result_ptr->result_code != MIPC_RESULT_SUCCESS)) {
-        //result code to ril error transfer
-        rfx_enqueue_response_message(NULL,cb_priv_ptr,mipc_sim_id_to_slot_id(sim_ps_id),result_ptr->result_code);
+    if(cb_priv_ptr &&
+            !(result_ptr->result_code == MIPC_RESULT_SUCCESS ||
+            result_ptr->result_code == MIPC_RESULT_SIM_NOT_INSERTED ||
+            result_ptr->result_code == MIPC_RESULT_PIN_REQUIRED ||
+            result_ptr->result_code == MIPC_RESULT_PIN_DISABLED)) {
+        rfx_enqueue_response_message(NULL,cb_priv_ptr,mipc_sim_id_to_slot_id(sim_ps_id),transferMipcSimResultCode(result_ptr->result_code));
     } else {
         if(result_ptr->gsm_app_idx >= 0 && result_ptr->gsm_app_idx < result_ptr->app_count){
             handleCardType(result_ptr->app_list[result_ptr->gsm_app_idx].app_type,sim_ps_id);
@@ -478,6 +499,24 @@
     return str;
 }
 
+const char HEX_DIGITS[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+unsigned char* byteArrayToHexString(unsigned char* array,int length)
+{
+    unsigned char* buf = (unsigned char*)calloc(1, length*2+1);
+    assert(buf != NULL);
+    int bufIndex = 0;
+    int i = 0;
+    for (i = 0 ; i < length; i++)
+    {
+        unsigned char b = array[i];
+        buf[bufIndex++] = HEX_DIGITS[(b >> 4) & 0x0F];
+        buf[bufIndex++] = HEX_DIGITS[b & 0x0F];
+    }
+    buf[bufIndex] = '\0';
+    return buf;
+}
+
 static void mipc_sim_channel_restricted_access_cb(mipc_sim_ps_id_enum sim_ps_id, mipc_sim_apdu_access_struct *result_ptr, void *cb_priv_ptr) {
     RFX_LOG_D(getTag(sim_ps_id).c_str(),"%s, %s", __FUNCTION__, dump_sim_channel_restricted_access(result_ptr,cb_priv_ptr).c_str());
     if(result_ptr->result_code != MIPC_RESULT_SUCCESS) {
@@ -493,7 +532,14 @@
         sscanf(out.c_str(), "%02x%02x", &(sw1), &(sw2));
         p->writeInt32(sw1);
         p->writeInt32(sw2);
-        writeStringToParcel(p, string(strlen(result_ptr->resp_apdu) == 0 ? "" : result_ptr->resp_apdu).c_str());
+
+        char* temp = (char*)byteArrayToHexString((unsigned char*)result_ptr->resp_apdu, result_ptr->resp_len);
+        RFX_LOG_D(getTag(sim_ps_id).c_str(),"%s, temp %s", __FUNCTION__, temp);
+        writeStringToParcel(p, string(strlen(temp) == 0 ? "" : temp).c_str());
+        if (temp != NULL) {
+            free(temp);
+        }
+
         rfx_enqueue_response_message(p,cb_priv_ptr,mipc_sim_id_to_slot_id(sim_ps_id),RIL_E_SUCCESS);
     }
 }
@@ -527,7 +573,13 @@
         sscanf(out.c_str(), "%02x%02x", &(sw1), &(sw2));
         p->writeInt32(sw1);
         p->writeInt32(sw2);
-        writeStringToParcel(p, string(strlen(result_ptr->resp_apdu) == 0 ? "" : result_ptr->resp_apdu).c_str());
+
+        char* temp = (char*)byteArrayToHexString((unsigned char*)result_ptr->resp_apdu, result_ptr->resp_len);
+        RFX_LOG_D(getTag(sim_ps_id).c_str(),"%s, temp %s", __FUNCTION__, temp);
+        writeStringToParcel(p, string(strlen(temp) == 0 ? "" : temp).c_str());
+        if (temp != NULL) {
+            free(temp);
+        }
         rfx_enqueue_response_message(p,cb_priv_ptr,mipc_sim_id_to_slot_id(sim_ps_id),RIL_E_SUCCESS);
     }
 }
@@ -583,8 +635,15 @@
             sscanf(out.c_str(), "%02x%02x", &(sw1), &(sw2));
             p->writeInt32(sw1);
             p->writeInt32(sw2);
+            writeStringToParcel(p, string(strlen(result_ptr->resp) == 0 ? "" : result_ptr->resp).c_str());
+        } else { //RIL_REQUEST_ISIM_AUTHENTICATION
+            char* temp = (char*)byteArrayToHexString((unsigned char*)result_ptr->resp, result_ptr->resp_len);
+            RFX_LOG_D(getTag(sim_ps_id).c_str(),"%s, temp %s", __FUNCTION__, temp);
+            writeStringToParcel(p, string(strlen(temp) == 0 ? "" : temp).c_str());
+            if (temp != NULL) {
+                free(temp);
+            }
         }
-        writeStringToParcel(p, string(strlen(result_ptr->resp) == 0 ? "" : result_ptr->resp).c_str());
         rfx_enqueue_response_message(p,cb_priv_ptr,mipc_sim_id_to_slot_id(sim_ps_id),RIL_E_SUCCESS);
     }
 }
@@ -776,7 +835,7 @@
     Parcel *parcel = new Parcel();
     parcel->writeInt32(result_ptr->sim_refresh_result);
     parcel->writeInt32((result_ptr->ef_id == UINT32_MAX) ? -1:result_ptr->ef_id);
-    writeStringToParcel(parcel, ((strlen(result_ptr->aid) == 0) ? "": result_ptr->aid));
+    writeStringToParcel(parcel, ((result_ptr->aid == NULL || (result_ptr->aid != NULL && strlen(result_ptr->aid) == 0)) ? "": result_ptr->aid));
     rfx_enqueue_urc_message(RIL_UNSOL_SIM_REFRESH,parcel,mipc_sim_id_to_slot_id(sim_ps_id),err);
 }
 
@@ -1279,28 +1338,43 @@
         p3 = (int)t;
 
         data_ptr = strdupReadString(p);
-        if(string(data_ptr).empty()) {
-            RFX_LOG_D(mLog_tag.c_str(), "%s data_ptr = NULL", __FUNCTION__);
-            if(data_ptr) {
-                free(data_ptr);
+        if (data_ptr != NULL) {
+            RFX_LOG_E(mLog_tag.c_str(), "data_ptr %d", __FUNCTION__,data_ptr);
+            if(string(data_ptr).empty()) {
+                RFX_LOG_D(mLog_tag.c_str(), "%s data_ptr = NULL", __FUNCTION__);
+                if(data_ptr) {
+                    free(data_ptr);
+                }
+                data_ptr = NULL;
             }
-            data_ptr = NULL;
+        } else {
+            RFX_LOG_E(mLog_tag.c_str(), "data_ptr NULL", __FUNCTION__);
         }
         pin2 = strdupReadString(p);
-        if(string(pin2).empty()) {
-            RFX_LOG_D(mLog_tag.c_str(), "%s pin2 = NULL", __FUNCTION__);
-            if(pin2) {
-                free(pin2);
+        if (pin2 != NULL) {
+            RFX_LOG_E(mLog_tag.c_str(), "pin2 %d", __FUNCTION__,pin2);
+            if(string(pin2).empty()) {
+                RFX_LOG_D(mLog_tag.c_str(), "%s pin2 = NULL", __FUNCTION__);
+                if(pin2) {
+                    free(pin2);
+                }
+                pin2 = NULL;
             }
-            pin2 = NULL;
+        } else {
+            RFX_LOG_E(mLog_tag.c_str(), "pin2 NULL", __FUNCTION__);
         }
         aidPtr = strdupReadString(p);
-        if(string(aidPtr).empty()) {
-            RFX_LOG_D(mLog_tag.c_str(), "%s aidPtr = NULL", __FUNCTION__);
-            if(aidPtr) {
-                free(aidPtr);
+        if (aidPtr != NULL) {
+            RFX_LOG_E(mLog_tag.c_str(), "aidPtr %d", __FUNCTION__,aidPtr);
+            if(string(aidPtr).empty()) {
+                RFX_LOG_D(mLog_tag.c_str(), "%s aidPtr = NULL", __FUNCTION__);
+                if(aidPtr) {
+                    free(aidPtr);
+                }
+                aidPtr = NULL;
             }
-            aidPtr = NULL;
+        } else {
+            RFX_LOG_E(mLog_tag.c_str(), "aidPtr NULL", __FUNCTION__);
         }
         app_id = queryAppTypeId(aidPtr==NULL? "": aidPtr);
         RFX_LOG_D(mLog_tag.c_str(), "cmd:%d, file_id:%d,path:%s,p1=%d,p2=%d,p3=%u,data=%s,pin2=%s,aid=%s, app_id=%d", cmd, file_id,
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/stk/RpStkController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/stk/RpStkController.cpp
old mode 100644
new mode 100755
index 5216fd3..322860b
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/stk/RpStkController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/stk/RpStkController.cpp
@@ -877,7 +877,7 @@
             //Todo: Add the data structure for RIL_SimRefreshResponse_v7
             parcel->writeInt32(simRefreshRspV7.result);
             parcel->writeInt32((simRefreshRspV7.ef_id == UINT32_MAX) ? -1:simRefreshRspV7.ef_id);
-            writeStringToParcel(parcel, ((strlen(simRefreshRspV7.aid) == 0) ? "": simRefreshRspV7.aid));
+            writeStringToParcel(parcel, ((simRefreshRspV7.aid != NULL && strlen(simRefreshRspV7.aid) == 0) ? "": simRefreshRspV7.aid));
             rfx_enqueue_urc_message(RIL_UNSOL_SIM_REFRESH,parcel,mipc_sim_id_to_slot_id(sim_ps_id),err);
             readIdx += 4;  // go to next EFID
         }
@@ -885,7 +885,7 @@
             //Todo: Add the data structure for RIL_SimRefreshResponse_v7
             parcel->writeInt32(simRefreshRspV7.result);
             parcel->writeInt32((simRefreshRspV7.ef_id == UINT32_MAX) ? -1:simRefreshRspV7.ef_id);
-            writeStringToParcel(parcel, ((strlen(simRefreshRspV7.aid) == 0) ? "": simRefreshRspV7.aid));
+            writeStringToParcel(parcel, ((simRefreshRspV7.aid != NULL && strlen(simRefreshRspV7.aid) == 0) ? "": simRefreshRspV7.aid));
             rfx_enqueue_urc_message(RIL_UNSOL_SIM_REFRESH,parcel,mipc_sim_id_to_slot_id(sim_ps_id),err);
     }
 
@@ -914,6 +914,24 @@
     }
 }
 
+static void mipc_stk_pac_set_cb(
+    mipc_sim_ps_id_enum sim_ps_id,
+    mipc_stk_pac_set_struct *result_ptr,
+    void *cb_priv_ptr)
+{
+    int i = 0;
+    if (result_ptr != NULL) {
+        RFX_LOG_D(RFX_LOG_TAG,"mipc_stk_pac_set_cb result_code %d\n", result_ptr->result_code);
+        for (i = 0; i < 32; i++) {
+            RFX_LOG_D(RFX_LOG_TAG,"pac[%d][%d][%d][%d][%d][%d][%d][%d]\n",
+                result_ptr->pac_profile[(8*i)],result_ptr->pac_profile[(8*i)+1],result_ptr->pac_profile[(8*i)+2],result_ptr->pac_profile[(8*i)+3],
+                result_ptr->pac_profile[(8*i)+4],result_ptr->pac_profile[(8*i)+5],result_ptr->pac_profile[(8*i)+6],result_ptr->pac_profile[(8*i)+7]);
+        }
+    } else {
+        RFX_LOG_E(RFX_LOG_TAG,"mipc_stk_pac_set_cb result_code NULL\n");
+    }
+}
+
 static void mipc_stk_send_envelope_cb(
     mipc_sim_ps_id_enum sim_ps_id,
     mipc_stk_envelope_struct *result_ptr,
@@ -1077,7 +1095,7 @@
 
         stkController->handleStkCommand(cmd, CMD_TYPE_NOTIFY, sim_ps_id);
         break;
-        case CMD_YPE_SESSIONEND:
+        case CMD_TYPE_SESSIONEND:
             rfx_enqueue_urc_message(RIL_UNSOL_STK_SESSION_END,NULL,mipc_sim_id_to_slot_id(sim_ps_id),err);
             break;
     }
@@ -1098,6 +1116,9 @@
         RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING,//103
         RIL_REQUEST_STK_SEND_ENVELOPE_WITH_STATUS //107
     };
+    uint8_t value[32];
+    uint8_t len = 32;
+    memset(value, 0xFF, len);
 
     sInstance[getSlotId()] = this;
     // register request id list
@@ -1105,7 +1126,7 @@
             sizeof(request_id_list) / sizeof(int));
     slotid = getSlotId();
     mipc_stk_pac_ind_register(slot_id_to_mipc_sim_id(slotid), mipc_stk_proactive_notification_command_cb, NULL);
-
+    mipc_stk_pac_set_async(slot_id_to_mipc_sim_id(slotid), mipc_stk_pac_set_cb, NULL, value);
     RFX_LOG_D(RFX_LOG_TAG, "RpStkController onInit done");
 }
 
@@ -1360,7 +1381,7 @@
         switch(cmdType) {
             case CMD_REFRESH:
                 //handle sim refresh
-                handleSimRefresh(&(cmd[type_pos - 6]), sim_ps_id);
+                //L5 has handled it and we use mipc_stk_sim_refresh_ind_cb to report the sim refresh command.
                 break;
             case CMD_SETUP_CALL:
                 //handle setup call
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/stk/RpStkController.h b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/stk/RpStkController.h
old mode 100644
new mode 100755
index f1335a0..5441330
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/stk/RpStkController.h
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/stk/RpStkController.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -92,7 +93,7 @@
 typedef enum {
     CMD_TYPE_PROACTIVE = 0x00,
     CMD_TYPE_NOTIFY = 0x01,
-    CMD_YPE_SESSIONEND = 0x02
+    CMD_TYPE_SESSIONEND = 0x02
 } sat_cmd_type_num;
 
 typedef struct {
diff --git a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sys/RpSysController.cpp b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sys/RpSysController.cpp
old mode 100644
new mode 100755
index 2d07983..00d321e
--- a/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sys/RpSysController.cpp
+++ b/src/telephonyware/3.0/hardware/ril/fusion/libril/rilmipc/telephony/sys/RpSysController.cpp
@@ -875,7 +875,7 @@
 
     mipc_sys_mapping_struct sys_mapping;
     uint8_t mapping_list_count = getSimCount();
-    mipc_sys_mapping_struct4 ps_list[4];
+    mipc_sys_mapping_struct4 ps_list[4] = {0};
 
     if (m_new_main_slot == 0) {
         // PS1 on SIM1
diff --git a/src/telephonyware/3.0/hardware/ril/include/telephony/mtk_ril_ivt.h b/src/telephonyware/3.0/hardware/ril/include/telephony/mtk_ril_ivt.h
old mode 100644
new mode 100755
index 7d787f6..a13482f
--- a/src/telephonyware/3.0/hardware/ril/include/telephony/mtk_ril_ivt.h
+++ b/src/telephonyware/3.0/hardware/ril/include/telephony/mtk_ril_ivt.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -54,15 +55,9 @@
     ECALL_RECONFIG = 3,     /*  Reconfiguration eCall */
 }RIL_ECall_Variant;
 
-typedef enum{
-    ECALL_PSAP_PULL_MODE = 1,   /*  PSAP will PULL the data */
-    ECALL_IVS_PUSH_MODE = 2,    /*  IVS should request PSAP to PULL the data */
-}RIL_ECall_Ivs_Config_Mode;
-
 typedef struct{
     RIL_ECall_Category   ecall_cat;
     RIL_ECall_Variant   ecall_variant;
-    RIL_ECall_Ivs_Config_Mode    ivs_mode;
     char* address;
     unsigned int length;
     unsigned char* msd_data;
@@ -89,6 +84,8 @@
     RIL_UNSOL_ECALL_IMS_IN_BAND_TRANSFER = 22,
     RIL_UNSOL_ECALL_IMS_MSD_NACK = 23,
     RIL_UNSOL_ECALL_IMS_SRVCC = 24,
+    RIL_UNSOL_ECALL_ONLY_DEREGISTRATION = 31,
+    RIL_UNSOL_ECALL_MAY_DEREGISTER = 32,
     RIL_UNSOL_ECALL_UNSPECIFIED = 0xffff,
 }RIL_ECall_Indication;
 
diff --git a/src/telephonyware/3.0/hardware/ril/include/telephony/ril.h b/src/telephonyware/3.0/hardware/ril/include/telephony/ril.h
old mode 100644
new mode 100755
index 88bf56f..c769602
--- a/src/telephonyware/3.0/hardware/ril/include/telephony/ril.h
+++ b/src/telephonyware/3.0/hardware/ril/include/telephony/ril.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*
  * Copyright (C) 2006 The Android Open Source Project
  *
@@ -1127,6 +1128,7 @@
     PDP_FAIL_AUTH_FAILURE_ON_EMERGENCY_CALL = 0x7A,
 
     PDP_FAIL_LOCAL_REJECT_ACT_REQ_DUE_TO_REACH_RETRY_COUNTER = 0x0E0F,  /* M */
+    PDP_FAIL_TCM_ESM_DETACH = 0x0F45,  /* M */
     PDP_FAIL_TCM_ESM_TIMER_TIMEOUT = 0x0F46,  /* M */
     PDP_FAIL_TCM_ESM_DEACT_DUE_TO_DRB_RELEASE = 0x0F8E,  /* M */
     PDP_FAIL_PAM_ATT_PDN_ACCESS_REJECT_IMS_PDN_BLOCK_TEMP = 0x1402,  /* M */
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/CMakeLists.txt b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/CMakeLists.txt
old mode 100644
new mode 100755
index 63e5d21..662945a
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/CMakeLists.txt
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/CMakeLists.txt
@@ -27,6 +27,7 @@
 	lib/src/api/mipc_stk_api.c
 	lib/src/api/mipc_sys_api.c
 	lib/src/api/mipc_call_api.c
+	lib/src/api/mipc_ecall_api.c
 	lib/src/api/mipc_radio_api.c)
 
 add_library(mipc_api SHARED ${api_src_files})
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_data_api.h b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_data_api.h
old mode 100644
new mode 100755
index c05afc4..6c3ec31
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_data_api.h
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_data_api.h
@@ -136,7 +136,7 @@
     /** @brief id */
     uint8_t id;
 
-    mipc_data_error_enum network_error;
+    uint32_t network_error;
 } mipc_data_call_deact_struct;
 
 /** @brief pco info. */
@@ -176,6 +176,11 @@
     mipc_result_enum result_code;
 } mipc_data_set_data_config_struct_v;
 
+typedef struct {
+    /** @brief result code*/
+    mipc_result_enum result_code;
+    uint32_t retry_timer;
+} mipc_data_get_retry_timer_struct_v;
 
 
 /** @brief packet filter*/
@@ -695,7 +700,37 @@
     mipc_data_config_type_const_enum data_international_roaming
 );
 
+typedef void (*MIPC_DATA_RETRY_TIMER_CB)(
+    mipc_sim_ps_id_enum sim_ps_id,
+    mipc_data_get_retry_timer_struct_v *result_ptr,
+    void *cb_priv_ptr
+);
 
+/**
+  *@brief function for async. packet filter get operation
+  *@param[in] sim_ps_id indicate which sim or ps received the event (the value is decided by what is used when doing register operation)
+  *@param[in] result_ptr point to the execution result
+  *@param[in] apnName apn name
+*/
+mipc_api_result_enum mipc_data_get_retry_timer_sync(
+    mipc_sim_ps_id_enum sim_ps_id,
+    mipc_data_get_retry_timer_struct_v *result_ptr,
+    char* apnName
+);
+
+/**
+  *@brief function for async. packet filter get operation
+  *@param[in] sim_ps_id indicate which sim or ps received the event (the value is decided by what is used when doing register operation)
+  *@param[in] cb which callback function will be invoked after the operation completion
+  *@param[in] cb_priv_ptr point to the callback private data
+  *@param[in] apnName apn name
+*/
+mipc_api_result_enum mipc_data_get_retry_timer_async(
+    mipc_sim_ps_id_enum sim_ps_id,
+    MIPC_DATA_RETRY_TIMER_CB cb,
+    void *cb_priv_ptr,
+    char* apnName
+);
 
 /*!
     @}
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_ecall_api.h b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_ecall_api.h
new file mode 100755
index 0000000..226c9d2
--- /dev/null
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_ecall_api.h
@@ -0,0 +1,477 @@
+// SPDX-License-Identifier: MediaTekProprietary

+/*****************************************************************************

+*  Copyright Statement:

+*  --------------------

+*  Copyright (c) [2020], MediaTek Inc. All rights reserved.

+*  This software/firmware and related documentation ("MediaTek Software") are

+*  protected under relevant copyright laws.

+*

+*  The information contained herein is confidential and proprietary to

+*  MediaTek Inc. and/or its licensors. Except as otherwise provided in the

+*  applicable licensing terms with MediaTek Inc. and/or its licensors, any

+*  reproduction, modification, use or disclosure of MediaTek Software, and

+*  information contained herein, in whole or in part, shall be strictly

+*  prohibited.

+*****************************************************************************/

+

+#ifndef MIPC_ECALL_INTERFACE_H_

+#define MIPC_ECALL_INTERFACE_H_

+

+#include "mipc_api.h"

+#include "mipc_msg_host.h"

+#include "mipc_msg_tlv_const.h"

+

+/** @brief mipc ecall make an ecall */

+typedef struct {

+    /** @brief result code*/

+    mipc_result_enum result_code;

+} mipc_call_ivs_onekey_ecall_struct;

+

+/**

+  *@brief callback function prototype for async. SIM status get operation

+  *@param[in] sim_ps_id indicate which sim or ps completed the operation (the value is decided by what is used when doing aysnc. operation)

+  *@param[in] result_ptr point to the execution result

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+*/

+typedef void (*MIPC_CALL_IVS_ONEKEY_ECALL_CB)(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_call_ivs_onekey_ecall_struct *result_ptr,

+    void *cb_priv_ptr

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] result_ptr point to the execution result

+  *@param[in] ecall_type

+  *@param[in] ecall_format

+  *@param[in] msd_length

+  *@param[in] msd_data

+*/

+mipc_api_result_enum mipc_call_ivs_onekey_ecall_sync(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_call_ivs_onekey_ecall_struct *result_ptr,

+    mipc_ecall_type_const_enum ecall_type,

+    mipc_ecall_msd_format_const_enum ecall_format,

+    unsigned int msd_length,

+    unsigned char* msd_data

+);

+

+/**

+  *@brief function for async.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] cb

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+  *@param[in] ecall_type

+  *@param[in] ecall_format

+  *@param[in] msd_length

+  *@param[in] msd_data

+*/

+mipc_api_result_enum mipc_call_ivs_onekey_ecall_async(

+    mipc_sim_ps_id_enum sim_ps_id,

+    MIPC_CALL_IVS_ONEKEY_ECALL_CB cb,

+    void *cb_priv_ptr,

+    mipc_ecall_type_const_enum ecall_type,

+    mipc_ecall_msd_format_const_enum ecall_format,

+    unsigned int msd_length,

+    unsigned char* msd_data

+);

+

+/** @brief mipc ecall update msd struct */

+typedef struct {

+    /** @brief result code*/

+    mipc_result_enum result_code;

+} mipc_ecall_ivs_update_msd_struct;

+

+/**

+  *@brief callback function prototype for async. SIM status get operation

+  *@param[in] sim_ps_id indicate which sim or ps completed the operation (the value is decided by what is used when doing aysnc. operation)

+  *@param[in] result_ptr point to the execution result

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+*/

+typedef void (*MIPC_ECALL_IVS_UPDATE_MSD_CB)(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_update_msd_struct *result_ptr,

+    void *cb_priv_ptr

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] result_ptr point to the execution result

+  *@param[in] ecall_type

+  *@param[in] ecall_format

+  *@param[in] msd_length

+  *@param[in] msd_data

+*/

+mipc_api_result_enum mipc_ecall_ivs_update_msd_sync(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_update_msd_struct *result_ptr,

+    mipc_ecall_msd_format_const_enum msd_format,

+    unsigned int msd_length,

+    unsigned char* msd_data

+);

+

+/**

+  *@brief function for async.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] cb

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+  *@param[in] ecall_type

+  *@param[in] ecall_format

+  *@param[in] msd_length

+  *@param[in] msd_data

+*/

+mipc_api_result_enum mipc_ecall_ivs_update_msd_async(

+    mipc_sim_ps_id_enum sim_ps_id,

+    MIPC_ECALL_IVS_UPDATE_MSD_CB cb,

+    void *cb_priv_ptr,

+    mipc_ecall_msd_format_const_enum msd_format,

+    unsigned int msd_length,

+    unsigned char* msd_data

+);

+

+/** @brief mipc ecall reset ivs struct */

+typedef struct {

+    /** @brief result code*/

+    mipc_result_enum result_code;

+} mipc_ecall_ivs_reset_struct;

+

+/**

+  *@brief callback function prototype for async. SIM status get operation

+  *@param[in] sim_ps_id indicate which sim or ps completed the operation (the value is decided by what is used when doing aysnc. operation)

+  *@param[in] result_ptr point to the execution result

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+*/

+typedef void (*MIPC_ECALL_IVS_RESET_CB)(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_reset_struct *result_ptr,

+    void *cb_priv_ptr

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] result_ptr point to the execution result

+*/

+mipc_api_result_enum mipc_ecall_ivs_reset_sync(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_reset_struct *result_ptr

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] result_ptr point to the execution result

+  *@param[in] dail_address dail address

+  *@param[in] dial_addr_type

+  *@param[in] type, isn't mandatory, default voice

+  *@param[in] domain isn't mandatory,default auto

+  *@param[in] ecc_retry_domain isn't mandatory,default auto

+  *@param[in] ecc_category isn't mandatory,default 0

+  *@param[in] clir isn't mandatory,default false

+*/

+mipc_api_result_enum mipc_ecall_ivs_reset_async(

+    mipc_sim_ps_id_enum sim_ps_id,

+    MIPC_ECALL_IVS_RESET_CB cb,

+    void *cb_priv_ptr

+);

+

+

+/** @brief mipc ecall get sim info resp struct*/

+typedef struct {

+    /** @brief result code*/

+    mipc_result_enum result_code;

+    mipc_ecall_sim_type_const_enum sim_type;

+    char* usim_test_ecall_uri;

+    char* usim_test_ecall_num;

+    char* usim_reconf_ecall_uri;

+    char* usim_reconf_ecall_num;

+} mipc_ecall_ivs_get_sim_info_struct;

+

+/**

+  *@brief callback function prototype for async. SIM status get operation

+  *@param[in] sim_ps_id indicate which sim or ps completed the operation (the value is decided by what is used when doing aysnc. operation)

+  *@param[in] result_ptr point to the execution result

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+*/

+typedef void (*MIPC_ECALL_IVS_GET_SIM_INFO_CB)(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_get_sim_info_struct *result_ptr,

+    void *cb_priv_ptr

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] result_ptr point to the execution result

+  *@param[in] test_address test address

+  *@param[in] num

+  *@param[in] type

+*/

+mipc_api_result_enum mipc_ecall_ivs_get_sim_info_sync(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_get_sim_info_struct *result_ptr

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] cb

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+  *@param[in] test_address test address

+  *@param[in] num

+  *@param[in] type

+*/

+mipc_api_result_enum mipc_ecall_ivs_get_sim_info_async(

+    mipc_sim_ps_id_enum sim_ps_id,

+    MIPC_ECALL_IVS_GET_SIM_INFO_CB cb,

+    void *cb_priv_ptr

+);

+

+

+/** @brief mipc ecall set reg state resp struct*/

+typedef struct {

+    /** @brief result code*/

+    mipc_result_enum result_code;

+} mipc_ecall_ivs_set_reg_state_struct;

+

+

+/**

+  *@brief callback function prototype for async. SIM status get operation

+  *@param[in] sim_ps_id indicate which sim or ps completed the operation (the value is decided by what is used when doing aysnc. operation)

+  *@param[in] result_ptr point to the execution result

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+*/

+typedef void (*MIPC_ECALL_IVS_SET_REG_STATE_CB)(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_set_reg_state_struct *result_ptr,

+    void *cb_priv_ptr

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] result_ptr point to the execution result

+  *@param[in] test_address test address

+  *@param[in] num

+  *@param[in] type

+*/

+mipc_api_result_enum mipc_ecall_ivs_set_reg_state_sync(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_set_reg_state_struct *result_ptr,

+    mipc_nw_register_mode_const_enum reg_state

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] cb

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+  *@param[in] test_address test address

+  *@param[in] num

+  *@param[in] type

+*/

+mipc_api_result_enum mipc_ecall_ivs_set_reg_state_async(

+    mipc_sim_ps_id_enum sim_ps_id,

+    MIPC_ECALL_IVS_SET_REG_STATE_CB cb,

+    void *cb_priv_ptr,

+    mipc_nw_register_mode_const_enum reg_state

+);

+

+

+/** @brief mipc ecall set test addr resp struct*/

+typedef struct {

+    /** @brief result code*/

+    mipc_result_enum result_code;

+} mipc_ecall_ivs_set_test_addr_struct;

+

+

+/**

+  *@brief callback function prototype for async. SIM status get operation

+  *@param[in] sim_ps_id indicate which sim or ps completed the operation (the value is decided by what is used when doing aysnc. operation)

+  *@param[in] result_ptr point to the execution result

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+*/

+typedef void (*MIPC_ECALL_IVS_SET_TEST_ADDR_CB)(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_set_test_addr_struct *result_ptr,

+    void *cb_priv_ptr

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] result_ptr point to the execution result

+  *@param[in] test_address test address

+  *@param[in] num

+  *@param[in] type

+*/

+mipc_api_result_enum mipc_ecall_ivs_set_test_addr_sync(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_set_test_addr_struct *result_ptr,

+    char *test_address,

+	mipc_call_dial_address_type_const_enum address_type

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] cb

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+  *@param[in] test_address test address

+  *@param[in] num

+  *@param[in] type

+*/

+mipc_api_result_enum mipc_ecall_ivs_set_test_addr_async(

+    mipc_sim_ps_id_enum sim_ps_id,

+    MIPC_ECALL_IVS_SET_TEST_ADDR_CB cb,

+    void *cb_priv_ptr,

+    char *test_address,

+	mipc_call_dial_address_type_const_enum address_type

+);

+

+/** @brief mipc ecall set reconf addr resp struct*/

+typedef struct {

+    /** @brief result code*/

+    mipc_result_enum result_code;

+} mipc_ecall_ivs_set_reconf_addr_struct;

+

+

+/**

+  *@brief callback function prototype for async. SIM status get operation

+  *@param[in] sim_ps_id indicate which sim or ps completed the operation (the value is decided by what is used when doing aysnc. operation)

+  *@param[in] result_ptr point to the execution result

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+*/

+typedef void (*MIPC_ECALL_IVS_SET_RECONF_ADDR_CB)(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_set_reconf_addr_struct *result_ptr,

+    void *cb_priv_ptr

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] result_ptr point to the execution result

+  *@param[in] test_address test address

+  *@param[in] num

+  *@param[in] type

+*/

+mipc_api_result_enum mipc_ecall_ivs_set_reconf_addr_sync(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_set_reconf_addr_struct *result_ptr,

+    char *reconf_address,

+	mipc_call_dial_address_type_const_enum address_type

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] cb

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+  *@param[in] test_address test address

+  *@param[in] num

+  *@param[in] type

+*/

+mipc_api_result_enum mipc_ecall_ivs_set_reconf_addr_async(

+    mipc_sim_ps_id_enum sim_ps_id,

+    MIPC_ECALL_IVS_SET_RECONF_ADDR_CB cb,

+    void *cb_priv_ptr,

+    char *reconf_address,

+	mipc_call_dial_address_type_const_enum address_type

+);

+

+/** @brief mipc ecall addr pri resp struct*/

+typedef struct {

+    /** @brief result code*/

+    mipc_result_enum result_code;

+} mipc_ecall_ivs_set_addr_pri_struct;

+

+

+/**

+  *@brief callback function prototype for async. SIM status get operation

+  *@param[in] sim_ps_id indicate which sim or ps completed the operation (the value is decided by what is used when doing aysnc. operation)

+  *@param[in] result_ptr point to the execution result

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+*/

+typedef void (*MIPC_ECALL_IVS_SET_ADDR_PRI_CB)(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_set_addr_pri_struct *result_ptr,

+    void *cb_priv_ptr

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] result_ptr point to the execution result

+  *@param[in] test_address test address

+  *@param[in] num

+  *@param[in] type

+*/

+mipc_api_result_enum mipc_ecall_ivs_set_addr_pri_sync(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_ivs_set_addr_pri_struct *result_ptr,

+    mipc_ecall_address_priority_class_const_enum first_pri,

+    mipc_ecall_address_priority_class_const_enum second_pri,

+    mipc_ecall_address_priority_class_const_enum third_pri,

+    mipc_ecall_address_priority_class_const_enum fourth_pri

+);

+

+/**

+  *@brief function for sync.

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in, out] cb

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+  *@param[in] test_address test address

+  *@param[in] num

+  *@param[in] type

+*/

+mipc_api_result_enum mipc_ecall_ivs_set_addr_pri_async(

+    mipc_sim_ps_id_enum sim_ps_id,

+    MIPC_ECALL_IVS_SET_ADDR_PRI_CB cb,

+    void *cb_priv_ptr,

+    mipc_ecall_address_priority_class_const_enum first_pri,

+    mipc_ecall_address_priority_class_const_enum second_pri,

+    mipc_ecall_address_priority_class_const_enum third_pri,

+    mipc_ecall_address_priority_class_const_enum fourth_pri

+);

+

+/////////////////////////////////INDICATIONS////////////////////////////////////////////

+typedef struct {

+    /** @brief result code*/

+    mipc_result_enum result_code;

+    /** @brief ecall state list*/

+    mipc_ecall_status_const_enum state;

+    uint8_t callid;

+} mipc_ecall_status_ind_struct;

+

+

+/**

+  *@brief callback function prototype for  call status changed notification operation

+  * This function will be called when radio state changed.

+  *@param[in] sim_ps_id indicate which sim or ps received the event (the value is decided by what is used when doing register operation)

+  *@param[in] result_ptr point to the execution result

+  *@param[in] cb_priv_ptr point to the private data assigned when doing async. operation

+*/

+typedef void (*MIPC_ECALL_STATUS_IND_CB)(

+    mipc_sim_ps_id_enum sim_ps_id,

+    mipc_ecall_status_ind_struct *result_ptr,

+    void *cb_priv_ptr

+);

+

+/**

+  *@brief function to register callback function for call status changed

+  *@param[in] sim_ps_id indicate which sim or ps is assigned to do the operation

+  *@param[in] cb which callback function will be invoked after the operation completion

+  *@param[in] cb_priv_ptr point to the callback private data

+*/

+mipc_api_result_enum mipc_ecall_status_register(

+    mipc_sim_ps_id_enum sim_ps_id,

+    MIPC_ECALL_STATUS_IND_CB cb,

+    void *cb_priv_ptr

+);

+

+

+#endif /* MIPC_ECALL_INTERFACE_H_ */

+

diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_nw_api.h b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_nw_api.h
old mode 100644
new mode 100755
index ec05943..40e7099
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_nw_api.h
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/include/api/mipc_nw_api.h
@@ -1,3 +1,4 @@
+//SPDX-License-Identifier: MediaTekProprietary
 /*****************************************************************************
 *  Copyright Statement:
 *  --------------------
@@ -866,6 +867,11 @@
     MIPC_MSG_CB cb,
     void *cb_priv_ptr);
 
+mipc_api_result_enum mipc_nw_etxpwr_ind_register(
+    mipc_sim_ps_id_enum sim_ps_id,
+    MIPC_MSG_CB cb,
+    void *cb_priv_ptr);
+
 /**
   *@brief callback function prototype for async. home provider set operation
   *@param[in] sim_ps_id indicate which sim or ps completed the operation (the value is decided by what is used when doing aysnc. operation)
@@ -1423,6 +1429,7 @@
 mipc_api_result_enum mipc_nw_band_mode_set_async(mipc_sim_ps_id_enum sim_ps_id, MIPC_NW_BAND_MODE_SET_CB cb, void *cb_priv_ptr,mipc_nw_band_mode_struct *band_mode);
 mipc_api_result_enum mipc_nw_set_rat_async(mipc_sim_ps_id_enum sim_ps_id, MIPC_NW_SET_RAT_CB cb, void *cb_priv_ptr, uint8_t rat,uint8_t prefer_rat);
 mipc_api_result_enum mipc_nw_get_rat_async(mipc_sim_ps_id_enum sim_ps_id, MIPC_NW_GET_RAT_CB cb, void *cb_priv_ptr);
+mipc_api_result_enum mipc_nw_get_rat_sync(mipc_sim_ps_id_enum sim_ps_id, mipc_nw_get_rat_struct *cb_priv_ptr);
 mipc_api_result_enum mipc_nw_data_get_async(mipc_sim_ps_id_enum sim_ps_id, MIPC_NW_DATA_GET_CB cb, void *cb_priv_ptr);
 mipc_api_result_enum mipc_nw_band_mode_get_async(mipc_sim_ps_id_enum sim_ps_id, MIPC_NW_BAND_MODE_GET_CB cb, void *cb_priv_ptr);
 mipc_api_result_enum mipc_nw_band_mode_get_sync(mipc_sim_ps_id_enum sim_ps_id, mipc_nw_band_mode_struct *cb_priv_ptr);
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_data_api.c b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_data_api.c
old mode 100644
new mode 100755
index 3db527e..7d56c73
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_data_api.c
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_data_api.c
@@ -17,6 +17,10 @@
 #include "mipc_msg.h"
 #include "mipc_msg_host.h"
 #include "mipc_data_api.h"
+#include "mipc_msg_tlv_api.h"
+#include "mtk_log.h"
+
+#define LOG_TAG "MIPC_DATA_API"
 
 #define mipc_msg_address_decode(addr_len, count, type, addrs)\
 do{val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, type, NULL);\
@@ -234,9 +238,9 @@
         val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_DATA_DEACT_CALL_IND_T_ID, NULL);
         if (NULL == val_ptr) break;
         result_ptr->id = *((uint8_t*)val_ptr);
-        val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_DATA_DEACT_CALL_IND_T_RES, NULL);
+        val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_DATA_DEACT_CALL_IND_T_NEW_RES, NULL);
         if (NULL == val_ptr) break;
-        result_ptr->network_error = (mipc_data_error_enum)(*((uint8_t*)val_ptr));
+        result_ptr->network_error = (*((uint32_t*)val_ptr));
         result = MIPC_API_RESULT_SUCCESS;
     } while (0);
 
@@ -1129,7 +1133,7 @@
 
 mipc_api_result_enum mipc_data_set_config_sync(mipc_sim_ps_id_enum sim_ps_id, mipc_data_set_data_config_struct_v *result_ptr, mipc_data_config_type_const_enum mobile_data, mipc_data_config_type_const_enum data_roaming, mipc_data_config_type_const_enum volte, mipc_data_config_type_const_enum ims_test_mode, mipc_data_config_type_const_enum data_domestic_roaming, mipc_data_config_type_const_enum data_international_roaming)
 {
-    return mipc_data_set_config(sim_ps_id, NULL, NULL, NULL, mobile_data, data_roaming, volte, ims_test_mode, data_domestic_roaming, data_international_roaming);
+    return mipc_data_set_config(sim_ps_id, NULL, NULL, result_ptr, mobile_data, data_roaming, volte, ims_test_mode, data_domestic_roaming, data_international_roaming);
 }
 
 
@@ -1141,3 +1145,95 @@
     return mipc_data_set_config(sim_ps_id, cb, cb_priv_ptr, NULL, mobile_data, data_roaming, volte, ims_test_mode, data_domestic_roaming, data_international_roaming);
 }
 
+static mipc_api_result_enum mipc_data_get_retry_timer_decode(mipc_msg_t *msg_cnf_ptr, mipc_data_get_retry_timer_struct_v *result_ptr)
+{
+    void* val_ptr;
+    mipc_api_result_enum result = MIPC_API_RESULT_FAIL;
+    mipc_data_retry_type_const_enum retry_type = mipc_data_retry_type_const_NONE;
+
+    if (result_ptr) {
+        MEMSET(result_ptr, 0, sizeof(mipc_data_get_retry_timer_struct_v));
+    } else {
+        return result;
+    }
+
+    if (msg_cnf_ptr == NULL) {
+        if (result_ptr) {
+            result_ptr->result_code = MIPC_RESULT_TIMEOUT;
+        }
+        return MIPC_API_RESULT_TIMEOUT;
+    }
+    mtkLogD(LOG_TAG, "[%s] result_code=%d", __FUNCTION__, result_ptr->result_code);
+    do {
+        result_ptr->result_code = (mipc_result_enum)mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_T_RESULT, 0xFFFFFFFF);
+        if (MIPC_RESULT_SUCCESS != result_ptr->result_code) {
+            break;
+        }
+        retry_type = mipc_data_retry_timer_cnf_get_retry_type(msg_cnf_ptr, 0);
+
+        if (retry_type == MIPC_DATA_RETRY_TYPE_RETRY_TYPE_NO_SUGGEST) {
+            mtkLogD(LOG_TAG, "[%s] no suggest", __FUNCTION__);
+            result_ptr->retry_timer = -1;
+        } else if (retry_type == MIPC_DATA_RETRY_TYPE_RETRY_TYPE_NO_RETRY) {
+            mtkLogD(LOG_TAG, "[%s] no retry", __FUNCTION__);
+            result_ptr->retry_timer = 0x7fffffff;
+        } else if (retry_type == MIPC_DATA_RETRY_TYPE_RETRY_TYPE_WITH_SUGGEST) {
+            result_ptr->retry_timer = mipc_data_retry_timer_cnf_get_retry_time(msg_cnf_ptr, 0);
+            mtkLogD(LOG_TAG, "[%s] suggest=%d", __FUNCTION__, result_ptr->retry_timer);
+            result_ptr->retry_timer = result_ptr->retry_timer * 1000;
+        }
+
+        result = MIPC_API_RESULT_SUCCESS;
+    } while (0);
+
+    return result;
+}
+
+static void mipc_data_get_retry_timer_cb(mipc_msg_t *msg_ptr, MIPC_API_CB cb, void *cb_priv_ptr)
+{
+    mipc_data_get_retry_timer_struct_v result;
+    mipc_sim_ps_id_enum sim_ps_id = (mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id;
+    MEMSET(&result, 0, sizeof(mipc_data_get_retry_timer_struct_v));
+    mipc_data_get_retry_timer_decode(msg_ptr, &result);
+    cb(sim_ps_id, &result, cb_priv_ptr);
+}
+
+static mipc_api_result_enum mipc_data_get_retry_timer(mipc_sim_ps_id_enum sim_ps_id, MIPC_DATA_RETRY_TIMER_CB cb, void *cb_priv_ptr, mipc_data_get_retry_timer_struct_v *result_ptr, char* apnName)
+{
+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_DATA_RETRY_TIMER_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);
+    mipc_msg_t *msg_cnf_ptr = NULL;
+    mipc_api_result_enum ret = MIPC_API_RESULT_FAIL;
+
+    if (apnName == NULL) {
+        mipc_msg_deinit(msg_req_ptr);
+        return ret;
+    }
+    mipc_data_retry_timer_req_add_mode(msg_req_ptr, MIPC_DATA_RETRY_MODE_QUERY_TIMER);
+    mipc_data_retry_timer_req_add_apn_name(msg_req_ptr, strlen(apnName) + 1, apnName);
+    mtkLogD(LOG_TAG, "[%s] mode=%d, apn=%s", __FUNCTION__, MIPC_DATA_RETRY_MODE_QUERY_TIMER, apnName);
+    if (cb) {
+        mipc_msg_async_api(msg_req_ptr, (void *)mipc_data_get_retry_timer_cb, (MIPC_API_CB)cb, cb_priv_ptr);
+        mipc_msg_deinit(msg_req_ptr);
+        return MIPC_API_RESULT_SUCCESS;
+    } else {
+        msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);
+        mipc_msg_deinit(msg_req_ptr);
+        ret = mipc_data_get_retry_timer_decode(msg_cnf_ptr, result_ptr);
+        mipc_msg_deinit(msg_cnf_ptr);
+        return ret;
+    }
+}
+
+mipc_api_result_enum mipc_data_get_retry_timer_sync(mipc_sim_ps_id_enum sim_ps_id, mipc_data_get_retry_timer_struct_v *result_ptr, char* apnName)
+{
+    return mipc_data_get_retry_timer(sim_ps_id, NULL, NULL, result_ptr, apnName);
+}
+
+mipc_api_result_enum mipc_data_get_retry_timer_async(mipc_sim_ps_id_enum sim_ps_id, MIPC_DATA_RETRY_TIMER_CB cb, void *cb_priv_ptr, char* apnName)
+{
+    if (cb == NULL) {
+        return MIPC_API_RESULT_FAIL;
+    }
+    return mipc_data_get_retry_timer(sim_ps_id, cb, cb_priv_ptr, NULL, apnName);
+}
+
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_ecall_api.c b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_ecall_api.c
new file mode 100755
index 0000000..7c34a20
--- /dev/null
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_ecall_api.c
@@ -0,0 +1,754 @@
+//SPDX-License-Identifier: MediaTekProprietary

+/*****************************************************************************

+*  Copyright Statement:

+*  --------------------

+*  Copyright (c) [2020], MediaTek Inc. All rights reserved.

+*  This software/firmware and related documentation ("MediaTek Software") are

+*  protected under relevant copyright laws.

+*

+*  The information contained herein is confidential and proprietary to

+*  MediaTek Inc. and/or its licensors. Except as otherwise provided in the

+*  applicable licensing terms with MediaTek Inc. and/or its licensors, any

+*  reproduction, modification, use or disclosure of MediaTek Software, and

+*  information contained herein, in whole or in part, shall be strictly

+*  prohibited.

+*****************************************************************************/

+#include "mipc_ecall_api.h"

+#include <stddef.h>

+

+static mipc_api_result_enum mipc_call_ivs_onekey_ecall_cnf_decode(mipc_msg_t *msg_cnf_ptr, mipc_call_ivs_onekey_ecall_struct *result_ptr)

+{

+    mipc_api_result_enum result = MIPC_API_RESULT_FAIL;

+

+    if (msg_cnf_ptr == NULL) { //timeout

+        if (result_ptr) {

+            result_ptr->result_code = MIPC_RESULT_TIMEOUT;

+        }

+        return MIPC_API_RESULT_TIMEOUT;

+    }

+    do {

+        void* val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_T_RESULT, NULL);

+        if (NULL == val_ptr) break;

+        result_ptr->result_code = (mipc_result_enum)(*((uint32_t*)val_ptr));

+        //acording to MBIM spec, non-succ result should have no information buffer(9.4.5)

+        if (MIPC_RESULT_SUCCESS != result_ptr->result_code) {

+            result = MIPC_API_RESULT_SUCCESS;

+            break;

+        }

+

+        result = MIPC_API_RESULT_SUCCESS;

+    } while (0);

+    return result;

+}

+

+static void mipc_call_ivs_onekey_ecall_cb(mipc_msg_t *msg_ptr, MIPC_CALL_IVS_ONEKEY_ECALL_CB cb, void *cb_priv_ptr)

+{

+    mipc_call_ivs_onekey_ecall_struct *result_ptr = (mipc_call_ivs_onekey_ecall_struct *)ALLOC(sizeof(mipc_call_ivs_onekey_ecall_struct));

+

+    if (result_ptr) {

+        MEMSET(result_ptr, 0, sizeof(mipc_call_ivs_onekey_ecall_struct));

+        mipc_call_ivs_onekey_ecall_cnf_decode(msg_ptr, result_ptr);

+    }

+    cb((mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id, result_ptr, cb_priv_ptr);

+    if (result_ptr) {

+        FREE(result_ptr);

+    }

+}

+

+static mipc_api_result_enum mipc_call_ivs_onekey_ecall(MIPC_CALL_IVS_ONEKEY_ECALL_CB cb,

+        void *cb_priv_ptr, mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_type_const_enum ecall_type,

+        mipc_ecall_msd_format_const_enum ecall_format,

+        unsigned int msd_length,

+        unsigned char* msd_data,

+        mipc_call_ivs_onekey_ecall_struct *result_ptr)

+{

+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_CALL_IVS_ONEKEY_ECALL_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);

+    mipc_msg_t *msg_cnf_ptr;

+    mipc_api_result_enum ret;

+

+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_CALL_IVS_ONEKEY_ECALL_REQ_T_TYPE, ecall_type);

+    if (msd_length > 0) {

+        mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_CALL_IVS_ONEKEY_ECALL_REQ_T_MSD_FORMAT, ecall_format);

+        if (msd_data) {

+            mipc_msg_add_tlv(msg_req_ptr, MIPC_CALL_IVS_ONEKEY_ECALL_REQ_T_MSD, (msd_length < MIPC_MAX_ECALL_MSD_DATA_LEN ? msd_length :MIPC_MAX_ECALL_MSD_DATA_LEN), msd_data);

+        } else {

+            return MIPC_API_RESULT_FAIL;

+        }

+    }

+    if (cb) {

+        mipc_msg_async_api(msg_req_ptr, (void *)mipc_call_ivs_onekey_ecall_cb, (MIPC_API_CB)cb, cb_priv_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        return MIPC_API_RESULT_SUCCESS;

+    } else {

+        msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        ret = mipc_call_ivs_onekey_ecall_cnf_decode(msg_cnf_ptr, result_ptr);

+        mipc_msg_deinit(msg_cnf_ptr);

+        return ret;

+    }

+}

+

+mipc_api_result_enum mipc_call_ivs_onekey_ecall_sync(mipc_sim_ps_id_enum sim_ps_id,

+        mipc_call_ivs_onekey_ecall_struct *result_ptr,

+        mipc_ecall_type_const_enum ecall_type,

+        mipc_ecall_msd_format_const_enum ecall_format,

+        unsigned int msd_length,

+        unsigned char* msd_data)

+{

+    if (NULL == result_ptr) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_call_ivs_onekey_ecall(NULL, NULL, sim_ps_id, ecall_type, ecall_format, msd_length, msd_data, result_ptr);

+}

+

+mipc_api_result_enum mipc_call_ivs_onekey_ecall_async(mipc_sim_ps_id_enum sim_ps_id,

+        MIPC_CALL_IVS_ONEKEY_ECALL_CB cb, void *cb_priv_ptr,

+        mipc_ecall_type_const_enum ecall_type,

+        mipc_ecall_msd_format_const_enum ecall_format,

+        unsigned int msd_length,

+        unsigned char* msd_data)

+{

+    if (NULL == cb) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_call_ivs_onekey_ecall(cb, cb_priv_ptr, sim_ps_id, ecall_type, ecall_format, msd_length, msd_data, NULL);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_update_msd_cnf_decode(mipc_msg_t *msg_cnf_ptr, mipc_ecall_ivs_update_msd_struct *result_ptr)

+{

+    mipc_api_result_enum result = MIPC_API_RESULT_FAIL;

+

+    if (msg_cnf_ptr == NULL) { //timeout

+        if (result_ptr) {

+            result_ptr->result_code = MIPC_RESULT_TIMEOUT;

+        }

+        return MIPC_API_RESULT_TIMEOUT;

+    }

+    do {

+        void* val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_T_RESULT, NULL);

+        if (NULL == val_ptr) break;

+        result_ptr->result_code = (mipc_result_enum)(*((uint32_t*)val_ptr));

+        //acording to MBIM spec, non-succ result should have no information buffer(9.4.5)

+        if (MIPC_RESULT_SUCCESS != result_ptr->result_code) {

+            result = MIPC_API_RESULT_SUCCESS;

+            break;

+        }

+

+        result = MIPC_API_RESULT_SUCCESS;

+    } while (0);

+    return result;

+}

+

+static void mipc_ecall_ivs_update_msd_cb(mipc_msg_t *msg_ptr, MIPC_ECALL_IVS_UPDATE_MSD_CB cb, void *cb_priv_ptr)

+{

+    mipc_ecall_ivs_update_msd_struct *result_ptr = (mipc_ecall_ivs_update_msd_struct *)ALLOC(sizeof(mipc_ecall_ivs_update_msd_struct));

+

+    if (result_ptr) {

+        MEMSET(result_ptr, 0, sizeof(mipc_ecall_ivs_update_msd_struct));

+        mipc_ecall_ivs_update_msd_cnf_decode(msg_ptr, result_ptr);

+    }

+    cb((mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id, result_ptr, cb_priv_ptr);

+    if (result_ptr) {

+        FREE(result_ptr);

+    }

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_update_msd(MIPC_ECALL_IVS_UPDATE_MSD_CB cb, void *cb_priv_ptr, mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_msd_format_const_enum msd_format,

+        unsigned int msd_length,

+        unsigned char* msd_data,

+        mipc_ecall_ivs_update_msd_struct *result_ptr)

+{

+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_ECALL_IVS_UPDATE_MSD_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);

+    mipc_msg_t *msg_cnf_ptr;

+    mipc_api_result_enum ret;

+

+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_ECALL_IVS_UPDATE_MSD_REQ_T_MSD_FORMAT, msd_format);

+    if (msd_data) {

+        mipc_msg_add_tlv(msg_req_ptr, MIPC_ECALL_IVS_UPDATE_MSD_REQ_T_MSD_DATA, (msd_length < MIPC_MAX_ECALL_MSD_DATA_LEN ? msd_length :MIPC_MAX_ECALL_MSD_DATA_LEN), msd_data);

+    }

+

+    if (cb) {

+        mipc_msg_async_api(msg_req_ptr, (void *)mipc_ecall_ivs_update_msd_cb, (MIPC_API_CB)cb, cb_priv_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        return MIPC_API_RESULT_SUCCESS;

+    } else {

+        msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        ret = mipc_ecall_ivs_update_msd_cnf_decode(msg_cnf_ptr, result_ptr);

+        mipc_msg_deinit(msg_cnf_ptr);

+        return ret;

+    }

+}

+

+mipc_api_result_enum mipc_ecall_ivs_update_msd_sync(mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_ivs_update_msd_struct *result_ptr,

+        mipc_ecall_msd_format_const_enum msd_format,

+        unsigned int msd_length,

+        unsigned char* msd_data)

+{

+    if (NULL == result_ptr) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_update_msd(NULL, NULL, sim_ps_id, msd_format, msd_length, msd_data, result_ptr);

+}

+

+mipc_api_result_enum mipc_ecall_ivs_update_msd_async(mipc_sim_ps_id_enum sim_ps_id,

+        MIPC_ECALL_IVS_UPDATE_MSD_CB cb, void *cb_priv_ptr,

+        mipc_ecall_msd_format_const_enum msd_format,

+        unsigned int msd_length,

+        unsigned char* msd_data)

+{

+    if (NULL == cb) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_update_msd(cb, cb_priv_ptr, sim_ps_id, msd_format, msd_length, msd_data, NULL);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_reset_cnf_decode(mipc_msg_t *msg_cnf_ptr, mipc_ecall_ivs_reset_struct *result_ptr)

+{

+    mipc_api_result_enum result = MIPC_API_RESULT_FAIL;

+

+    if (msg_cnf_ptr == NULL) { //timeout

+        if (result_ptr) {

+            result_ptr->result_code = MIPC_RESULT_TIMEOUT;

+        }

+        return MIPC_API_RESULT_TIMEOUT;

+    }

+    do {

+        void* val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_T_RESULT, NULL);

+        if (NULL == val_ptr) break;

+        result_ptr->result_code = (mipc_result_enum)(*((uint32_t*)val_ptr));

+        //acording to MBIM spec, non-succ result should have no information buffer(9.4.5)

+        if (MIPC_RESULT_SUCCESS != result_ptr->result_code) {

+            result = MIPC_API_RESULT_SUCCESS;

+            break;

+        }

+

+        result = MIPC_API_RESULT_SUCCESS;

+    } while (0);

+    return result;

+}

+

+static void mipc_ecall_ivs_reset_cb(mipc_msg_t *msg_ptr, MIPC_ECALL_IVS_RESET_CB cb, void *cb_priv_ptr)

+{

+    mipc_ecall_ivs_reset_struct *result_ptr = (mipc_ecall_ivs_reset_struct *)ALLOC(sizeof(mipc_ecall_ivs_reset_struct));

+

+    if (result_ptr) {

+        MEMSET(result_ptr, 0, sizeof(mipc_ecall_ivs_reset_struct));

+        mipc_ecall_ivs_reset_cnf_decode(msg_ptr, result_ptr);

+    }

+    cb((mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id, result_ptr, cb_priv_ptr);

+    if (result_ptr) {

+        FREE(result_ptr);

+    }

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_reset(MIPC_ECALL_IVS_RESET_CB cb, void *cb_priv_ptr, mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_ivs_reset_struct *result_ptr)

+{

+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_ECALL_IVS_RESET_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);

+    mipc_msg_t *msg_cnf_ptr;

+    mipc_api_result_enum ret;

+

+    if (cb) {

+        mipc_msg_async_api(msg_req_ptr, (void *)mipc_ecall_ivs_reset_cb, (MIPC_API_CB)cb, cb_priv_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        return MIPC_API_RESULT_SUCCESS;

+    } else {

+        msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        ret = mipc_ecall_ivs_reset_cnf_decode(msg_cnf_ptr, result_ptr);

+        mipc_msg_deinit(msg_cnf_ptr);

+        return ret;

+    }

+}

+

+mipc_api_result_enum mipc_ecall_ivs_reset_sync(mipc_sim_ps_id_enum sim_ps_id, mipc_ecall_ivs_reset_struct *result_ptr)

+{

+    if (NULL == result_ptr) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_reset(NULL, NULL, sim_ps_id, result_ptr);

+}

+

+mipc_api_result_enum mipc_ecall_ivs_reset_async(mipc_sim_ps_id_enum sim_ps_id, MIPC_ECALL_IVS_RESET_CB cb, void *cb_priv_ptr)

+{

+    if (NULL == cb) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_reset(cb, cb_priv_ptr, sim_ps_id, NULL);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_set_reg_state_cnf_decode(mipc_msg_t *msg_cnf_ptr, mipc_ecall_ivs_set_reg_state_struct *result_ptr)

+{

+    mipc_api_result_enum result = MIPC_API_RESULT_FAIL;

+

+    if (msg_cnf_ptr == NULL) { //timeout

+        if (result_ptr) {

+            result_ptr->result_code = MIPC_RESULT_TIMEOUT;

+        }

+        return MIPC_API_RESULT_TIMEOUT;

+    }

+    do {

+        void* val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_T_RESULT, NULL);

+        if (NULL == val_ptr) break;

+        result_ptr->result_code = (mipc_result_enum)(*((uint32_t*)val_ptr));

+        //acording to MBIM spec, non-succ result should have no information buffer(9.4.5)

+        if (MIPC_RESULT_SUCCESS != result_ptr->result_code) {

+            result = MIPC_API_RESULT_SUCCESS;

+            break;

+        }

+

+        result = MIPC_API_RESULT_SUCCESS;

+    } while (0);

+    return result;

+}

+

+static void mipc_ecall_ivs_set_reg_state_cb(mipc_msg_t *msg_ptr, MIPC_ECALL_IVS_SET_REG_STATE_CB cb, void *cb_priv_ptr)

+{

+    mipc_ecall_ivs_set_reg_state_struct result_ptr;

+

+    MEMSET(&result_ptr, 0, sizeof(mipc_ecall_ivs_set_reg_state_struct));

+    mipc_ecall_ivs_set_reg_state_cnf_decode(msg_ptr, &result_ptr);

+    cb((mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id, &result_ptr, cb_priv_ptr);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_set_reg_state(MIPC_ECALL_IVS_SET_REG_STATE_CB cb,

+        void *cb_priv_ptr,

+        mipc_sim_ps_id_enum sim_ps_id,

+        mipc_nw_register_mode_const_enum reg_state,

+        mipc_ecall_ivs_set_reg_state_struct *result_ptr)

+{

+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_NW_SET_REGISTER_STATE_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);

+    mipc_msg_t *msg_cnf_ptr;

+    mipc_api_result_enum ret;

+

+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_NW_SET_REGISTER_STATE_REQ_T_MODE, reg_state);

+

+    if (cb) {

+        mipc_msg_async_api(msg_req_ptr, (void *)mipc_ecall_ivs_set_reg_state_cb, (MIPC_API_CB)cb, cb_priv_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        return MIPC_API_RESULT_SUCCESS;

+    } else {

+        msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        ret = mipc_ecall_ivs_set_reg_state_cnf_decode(msg_cnf_ptr, result_ptr);

+        mipc_msg_deinit(msg_cnf_ptr);

+        return ret;

+    }

+}

+

+mipc_api_result_enum mipc_ecall_ivs_set_reg_state_sync(mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_ivs_set_reg_state_struct *result_ptr,

+        mipc_nw_register_mode_const_enum reg_state)

+{

+    if (NULL == result_ptr) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_set_reg_state(NULL, NULL, sim_ps_id, reg_state, result_ptr);

+}

+

+mipc_api_result_enum mipc_ecall_ivs_set_reg_state_async(mipc_sim_ps_id_enum sim_ps_id,

+        MIPC_ECALL_IVS_SET_REG_STATE_CB cb, void *cb_priv_ptr,

+        mipc_nw_register_mode_const_enum reg_state)

+{

+    if (NULL == cb) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_set_reg_state(cb, cb_priv_ptr, sim_ps_id, reg_state, NULL);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_get_sim_info_cnf_decode(mipc_msg_t *msg_cnf_ptr, mipc_ecall_ivs_get_sim_info_struct *result_ptr)

+{

+    mipc_api_result_enum result = MIPC_API_RESULT_FAIL;

+    uint16_t val_len = 0;

+

+    if (msg_cnf_ptr == NULL) { //timeout

+        if (result_ptr) {

+            result_ptr->result_code = MIPC_RESULT_TIMEOUT;

+        }

+        return MIPC_API_RESULT_TIMEOUT;

+    }

+    do {

+        void* val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_T_RESULT, NULL);

+        if (NULL == val_ptr) break;

+        result_ptr->result_code = (mipc_result_enum)(*((uint32_t*)val_ptr));

+        //acording to MBIM spec, non-succ result should have no information buffer(9.4.5)

+        if (MIPC_RESULT_SUCCESS != result_ptr->result_code) {

+            result = MIPC_API_RESULT_SUCCESS;

+            break;

+        }

+

+        val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_ECALL_IVS_GET_SIM_INFO_CNF_T_SIM_TYPE, NULL);

+        if (NULL == val_ptr) break;

+        result_ptr->sim_type = (uint32_t)(*((uint32_t*)val_ptr));

+

+        result = MIPC_API_RESULT_SUCCESS;

+    } while (0);

+    return result;

+}

+

+static void mipc_ecall_ivs_get_sim_info_cb(mipc_msg_t *msg_ptr, MIPC_ECALL_IVS_GET_SIM_INFO_CB cb, void *cb_priv_ptr)

+{

+    mipc_ecall_ivs_get_sim_info_struct result_ptr;

+

+    MEMSET(&result_ptr, 0, sizeof(mipc_ecall_ivs_get_sim_info_struct));

+    mipc_ecall_ivs_get_sim_info_cnf_decode(msg_ptr, &result_ptr);

+    cb((mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id, &result_ptr, cb_priv_ptr);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_get_sim_info(MIPC_ECALL_IVS_GET_SIM_INFO_CB cb,

+        void *cb_priv_ptr,

+        mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_ivs_get_sim_info_struct *result_ptr)

+{

+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_ECALL_IVS_GET_SIM_INFO_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);

+    mipc_msg_t *msg_cnf_ptr;

+    mipc_api_result_enum ret;

+

+    if (cb) {

+        mipc_msg_async_api(msg_req_ptr, (void *)mipc_ecall_ivs_get_sim_info_cb, (MIPC_API_CB)cb, cb_priv_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        return MIPC_API_RESULT_SUCCESS;

+    } else {

+        msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        ret = mipc_ecall_ivs_get_sim_info_cnf_decode(msg_cnf_ptr, result_ptr);

+        mipc_msg_deinit(msg_cnf_ptr);

+        return ret;

+    }

+}

+

+mipc_api_result_enum mipc_ecall_ivs_get_sim_info_sync(mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_ivs_get_sim_info_struct *result_ptr)

+{

+    if (NULL == result_ptr) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_get_sim_info(NULL, NULL, sim_ps_id, result_ptr);

+}

+

+mipc_api_result_enum mipc_ecall_ivs_get_sim_info_async(mipc_sim_ps_id_enum sim_ps_id,

+        MIPC_ECALL_IVS_GET_SIM_INFO_CB cb, void *cb_priv_ptr) {

+    if (NULL == cb) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_get_sim_info(cb, cb_priv_ptr, sim_ps_id, NULL);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_set_test_addr_cnf_decode(mipc_msg_t *msg_cnf_ptr, mipc_ecall_ivs_set_test_addr_struct *result_ptr)

+{

+    mipc_api_result_enum result = MIPC_API_RESULT_FAIL;

+

+    if (msg_cnf_ptr == NULL) { //timeout

+        if (result_ptr) {

+            result_ptr->result_code = MIPC_RESULT_TIMEOUT;

+        }

+        return MIPC_API_RESULT_TIMEOUT;

+    }

+    do {

+        void* val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_T_RESULT, NULL);

+        if (NULL == val_ptr) break;

+        result_ptr->result_code = (mipc_result_enum)(*((uint32_t*)val_ptr));

+        //acording to MBIM spec, non-succ result should have no information buffer(9.4.5)

+        if (MIPC_RESULT_SUCCESS != result_ptr->result_code) {

+            result = MIPC_API_RESULT_SUCCESS;

+            break;

+        }

+

+        result = MIPC_API_RESULT_SUCCESS;

+    } while (0);

+    return result;

+}

+

+static void mipc_ecall_ivs_set_test_addr_cb(mipc_msg_t *msg_ptr, MIPC_ECALL_IVS_SET_TEST_ADDR_CB cb, void *cb_priv_ptr)

+{

+    mipc_ecall_ivs_set_test_addr_struct result_ptr;

+

+    MEMSET(&result_ptr, 0, sizeof(mipc_ecall_ivs_set_test_addr_struct));

+    mipc_ecall_ivs_set_test_addr_cnf_decode(msg_ptr, &result_ptr);

+    cb((mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id, &result_ptr, cb_priv_ptr);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_set_test_addr(MIPC_ECALL_IVS_SET_TEST_ADDR_CB cb,

+        void *cb_priv_ptr,

+        mipc_sim_ps_id_enum sim_ps_id,

+        char* test_address,

+	    mipc_call_dial_address_type_const_enum address_type,

+        mipc_ecall_ivs_set_test_addr_struct *result_ptr)

+{

+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_ECALL_IVS_SET_TEST_ADDR_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);

+    mipc_msg_t *msg_cnf_ptr;

+    mipc_api_result_enum ret;

+

+    if (test_address) {

+        mipc_msg_add_tlv(msg_req_ptr, MIPC_ECALL_IVS_SET_TEST_ADDR_REQ_T_ADDRESS,

+			(strlen(test_address) < MIPC_MAX_DIAL_ADDRESS_LEN ? strlen(test_address) :MIPC_MAX_DIAL_ADDRESS_LEN), test_address);

+    }

+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_ECALL_IVS_SET_TEST_ADDR_REQ_T_ADDR_TYPE, address_type);

+

+    if (cb) {

+        mipc_msg_async_api(msg_req_ptr, (void *)mipc_ecall_ivs_set_test_addr_cb, (MIPC_API_CB)cb, cb_priv_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        return MIPC_API_RESULT_SUCCESS;

+    } else {

+        msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        ret = mipc_ecall_ivs_set_test_addr_cnf_decode(msg_cnf_ptr, result_ptr);

+        mipc_msg_deinit(msg_cnf_ptr);

+        return ret;

+    }

+}

+

+mipc_api_result_enum mipc_ecall_ivs_set_test_addr_sync(mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_ivs_set_test_addr_struct *result_ptr,

+        char* test_address,

+        mipc_call_dial_address_type_const_enum address_type)

+{

+    if (NULL == result_ptr || NULL == test_address) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_set_test_addr(NULL, NULL, sim_ps_id, test_address, address_type, result_ptr);

+}

+

+mipc_api_result_enum mipc_ecall_ivs_set_test_addr_async(mipc_sim_ps_id_enum sim_ps_id,

+        MIPC_ECALL_IVS_SET_TEST_ADDR_CB cb, void *cb_priv_ptr,

+        char* test_address,

+        mipc_call_dial_address_type_const_enum address_type)

+{

+    if (NULL == cb) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_set_test_addr(cb, cb_priv_ptr, sim_ps_id, test_address, address_type, NULL);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_set_reconf_addr_cnf_decode(mipc_msg_t *msg_cnf_ptr, mipc_ecall_ivs_set_reconf_addr_struct *result_ptr)

+{

+    mipc_api_result_enum result = MIPC_API_RESULT_FAIL;

+

+    if (msg_cnf_ptr == NULL) { //timeout

+        if (result_ptr) {

+            result_ptr->result_code = MIPC_RESULT_TIMEOUT;

+        }

+        return MIPC_API_RESULT_TIMEOUT;

+    }

+    do {

+        void* val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_T_RESULT, NULL);

+        if (NULL == val_ptr) break;

+        result_ptr->result_code = (mipc_result_enum)(*((uint32_t*)val_ptr));

+        //acording to MBIM spec, non-succ result should have no information buffer(9.4.5)

+        if (MIPC_RESULT_SUCCESS != result_ptr->result_code) {

+            result = MIPC_API_RESULT_SUCCESS;

+            break;

+        }

+

+        result = MIPC_API_RESULT_SUCCESS;

+    } while (0);

+    return result;

+}

+

+static void mipc_ecall_ivs_set_reconf_addr_cb(mipc_msg_t *msg_ptr, MIPC_ECALL_IVS_SET_RECONF_ADDR_CB cb, void *cb_priv_ptr)

+{

+    mipc_ecall_ivs_set_reconf_addr_struct result_ptr;

+

+    MEMSET(&result_ptr, 0, sizeof(mipc_ecall_ivs_set_addr_pri_struct));

+    mipc_ecall_ivs_set_reconf_addr_cnf_decode(msg_ptr, &result_ptr);

+    cb((mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id, &result_ptr, cb_priv_ptr);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_set_reconf_addr(MIPC_ECALL_IVS_SET_RECONF_ADDR_CB cb,

+        void *cb_priv_ptr,

+        mipc_sim_ps_id_enum sim_ps_id,

+        char* reconf_address,

+        mipc_call_dial_address_type_const_enum address_type,

+        mipc_ecall_ivs_set_reconf_addr_struct *result_ptr)

+{

+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_ECALL_IVS_SET_RECONF_ADDR_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);

+    mipc_msg_t *msg_cnf_ptr;

+    mipc_api_result_enum ret;

+

+    if (reconf_address) {

+        mipc_msg_add_tlv(msg_req_ptr, MIPC_ECALL_IVS_SET_RECONF_ADDR_REQ_T_ADDRESS,

+            (strlen(reconf_address) < MIPC_MAX_DIAL_ADDRESS_LEN ? strlen(reconf_address) :MIPC_MAX_DIAL_ADDRESS_LEN), reconf_address);

+    }

+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_ECALL_IVS_SET_RECONF_ADDR_REQ_T_ADDR_TYPE, address_type);

+

+    if (cb) {

+        mipc_msg_async_api(msg_req_ptr, (void *)mipc_ecall_ivs_set_reconf_addr_cb, (MIPC_API_CB)cb, cb_priv_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        return MIPC_API_RESULT_SUCCESS;

+    } else {

+        msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        ret = mipc_ecall_ivs_set_reconf_addr_cnf_decode(msg_cnf_ptr, result_ptr);

+        mipc_msg_deinit(msg_cnf_ptr);

+        return ret;

+    }

+}

+

+mipc_api_result_enum mipc_ecall_ivs_set_reconf_addr_sync(mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_ivs_set_reconf_addr_struct *result_ptr,

+        char* reconf_address,

+        mipc_call_dial_address_type_const_enum address_type)

+{

+    if (NULL == result_ptr) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_set_reconf_addr(NULL, NULL, sim_ps_id, reconf_address, address_type, result_ptr);

+}

+

+mipc_api_result_enum mipc_ecall_ivs_set_reconf_addr_async(mipc_sim_ps_id_enum sim_ps_id,

+        MIPC_ECALL_IVS_SET_RECONF_ADDR_CB cb, void *cb_priv_ptr,

+        char* reconf_address,

+        mipc_call_dial_address_type_const_enum address_type)

+{

+    if (NULL == cb) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_set_test_addr(cb, cb_priv_ptr, sim_ps_id, reconf_address, address_type, NULL);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_set_addr_pri_cnf_decode(mipc_msg_t *msg_cnf_ptr, mipc_ecall_ivs_set_addr_pri_struct *result_ptr)

+{

+    mipc_api_result_enum result = MIPC_API_RESULT_FAIL;

+

+    if (msg_cnf_ptr == NULL) { //timeout

+        if (result_ptr) {

+            result_ptr->result_code = MIPC_RESULT_TIMEOUT;

+        }

+        return MIPC_API_RESULT_TIMEOUT;

+    }

+    do {

+        void* val_ptr = mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_T_RESULT, NULL);

+        if (NULL == val_ptr) break;

+        result_ptr->result_code = (mipc_result_enum)(*((uint32_t*)val_ptr));

+        //acording to MBIM spec, non-succ result should have no information buffer(9.4.5)

+        if (MIPC_RESULT_SUCCESS != result_ptr->result_code) {

+            result = MIPC_API_RESULT_SUCCESS;

+            break;

+        }

+

+        result = MIPC_API_RESULT_SUCCESS;

+    } while (0);

+    return result;

+}

+

+static void mipc_ecall_ivs_set_addr_pri_cb(mipc_msg_t *msg_ptr, MIPC_ECALL_IVS_SET_ADDR_PRI_CB cb, void *cb_priv_ptr)

+{

+    mipc_ecall_ivs_set_addr_pri_struct result_ptr;

+

+    MEMSET(&result_ptr, 0, sizeof(mipc_ecall_ivs_set_addr_pri_struct));

+    mipc_ecall_ivs_set_addr_pri_cnf_decode(msg_ptr, &result_ptr);

+    cb((mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id, &result_ptr, cb_priv_ptr);

+}

+

+static mipc_api_result_enum mipc_ecall_ivs_set_addr_pri(MIPC_ECALL_IVS_SET_ADDR_PRI_CB cb,

+        void *cb_priv_ptr,

+        mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_address_priority_class_const_enum first_pri,

+        mipc_ecall_address_priority_class_const_enum second_pri,

+        mipc_ecall_address_priority_class_const_enum third_pri,

+        mipc_ecall_address_priority_class_const_enum fourth_pri,

+        mipc_ecall_ivs_set_addr_pri_struct *result_ptr)

+{

+    mipc_msg_t *msg_req_ptr = mipc_msg_init(MIPC_ECALL_IVS_SET_ADDR_PRI_REQ, (mipc_msg_sim_ps_id_enum)sim_ps_id);

+    mipc_msg_t *msg_cnf_ptr;

+    mipc_api_result_enum ret;

+

+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_ECALL_IVS_SET_ADDR_PRI_REQ_T_FIRST_PRI, first_pri);

+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_ECALL_IVS_SET_ADDR_PRI_REQ_T_SECOND_PRI, second_pri);

+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_ECALL_IVS_SET_ADDR_PRI_REQ_T_THIRD_PRI, third_pri);

+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_ECALL_IVS_SET_ADDR_PRI_REQ_T_FOURTH_PRI, fourth_pri);

+

+    if (cb) {

+        mipc_msg_async_api(msg_req_ptr, (void *)mipc_ecall_ivs_set_addr_pri_cb, (MIPC_API_CB)cb, cb_priv_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        return MIPC_API_RESULT_SUCCESS;

+    } else {

+        msg_cnf_ptr = mipc_msg_sync_timeout(msg_req_ptr);

+        mipc_msg_deinit(msg_req_ptr);

+        ret = mipc_ecall_ivs_set_addr_pri_cnf_decode(msg_cnf_ptr, result_ptr);

+        mipc_msg_deinit(msg_cnf_ptr);

+        return ret;

+    }

+}

+

+mipc_api_result_enum mipc_ecall_ivs_set_addr_pri_sync(mipc_sim_ps_id_enum sim_ps_id,

+        mipc_ecall_ivs_set_addr_pri_struct *result_ptr,

+        mipc_ecall_address_priority_class_const_enum first_pri,

+        mipc_ecall_address_priority_class_const_enum second_pri,

+        mipc_ecall_address_priority_class_const_enum third_pri,

+        mipc_ecall_address_priority_class_const_enum fourth_pri)

+{

+    if (NULL == result_ptr) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_set_addr_pri(NULL, NULL, sim_ps_id, first_pri, second_pri, third_pri, fourth_pri, result_ptr);

+}

+

+mipc_api_result_enum mipc_ecall_ivs_set_addr_pri_async(mipc_sim_ps_id_enum sim_ps_id,

+        MIPC_ECALL_IVS_SET_ADDR_PRI_CB cb, void *cb_priv_ptr,

+        mipc_ecall_address_priority_class_const_enum first_pri,

+        mipc_ecall_address_priority_class_const_enum second_pri,

+        mipc_ecall_address_priority_class_const_enum third_pri,

+        mipc_ecall_address_priority_class_const_enum fourth_pri)

+{

+    if (NULL == cb) {

+        return MIPC_API_RESULT_FAIL;

+    }

+    return mipc_ecall_ivs_set_addr_pri(cb, cb_priv_ptr, sim_ps_id, first_pri, second_pri, third_pri, fourth_pri, NULL);

+}

+

+//////////////////////////////////////////INDICATIONS////////////////////////////////////////////

+static mipc_api_result_enum mipc_ecall_status_ind(mipc_msg_t *msg_ptr, mipc_ecall_status_ind_struct *result_ptr)

+{

+    void *val_ptr;

+    uint8_t api_error = 1;

+

+    do {

+        result_ptr->result_code = MIPC_RESULT_SUCCESS;

+

+        if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_ECALL_STATUS_IND_T_STATE, NULL)) == NULL) break;

+        result_ptr->state = (mipc_ecall_status_const_enum) * ((uint8_t *)val_ptr);

+        if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_ECALL_STATUS_IND_T_CALL_ID, NULL)) == NULL) break;

+        result_ptr->callid = (uint8_t) * ((uint8_t *)val_ptr);

+

+        api_error = 0;

+    } while (0);

+

+    if (api_error) {

+        result_ptr->result_code = MIPC_RESULT_FAILURE;

+        return MIPC_API_RESULT_FAIL;

+    } else {

+        return MIPC_API_RESULT_SUCCESS;

+    }

+}

+

+static void mipc_ecall_status_ind_cb(mipc_msg_t *msg_ptr, MIPC_ECALL_STATUS_IND_CB cb, void *cb_priv_ptr)

+{

+    mipc_ecall_status_ind_struct result_ptr;

+

+    MEMSET(&result_ptr, 0, sizeof(mipc_ecall_status_ind_struct));

+    if (mipc_ecall_status_ind(msg_ptr, &result_ptr) == MIPC_API_RESULT_SUCCESS) {

+        cb((mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id, &result_ptr, cb_priv_ptr);

+    }

+}

+

+mipc_api_result_enum mipc_ecall_status_register(mipc_sim_ps_id_enum sim_ps_id, MIPC_ECALL_STATUS_IND_CB cb, void *cb_priv_ptr)

+{

+    void *callback;

+    if (cb) {

+        callback = (void *)mipc_ecall_status_ind_cb;

+    } else {

+        callback = NULL;

+    }

+

+    if (mipc_msg_register_ind_api((mipc_msg_sim_ps_id_enum)sim_ps_id, MIPC_ECALL_STATUS_IND, callback, (MIPC_API_CB)cb, cb_priv_ptr) == 0) {

+        return MIPC_API_RESULT_SUCCESS;

+    } else {

+        return MIPC_API_RESULT_FAIL;

+    }

+}

+

diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_nw_api.c b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_nw_api.c
old mode 100644
new mode 100755
index e14ccfc..f68e16b
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_nw_api.c
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_nw_api.c
@@ -1,3 +1,4 @@
+//SPDX-License-Identifier: MediaTekProprietary
 /*****************************************************************************
 *  Copyright Statement:
 *  --------------------
@@ -1042,6 +1043,14 @@
     }
 }
 
+mipc_api_result_enum mipc_nw_etxpwr_ind_register(mipc_sim_ps_id_enum sim_ps_id, MIPC_MSG_CB cb, void *cb_priv_ptr)
+{
+    if (mipc_msg_register_ind_api((mipc_msg_sim_ps_id_enum)sim_ps_id, MIPC_NW_ETXPWR_IND, cb, NULL, cb_priv_ptr) == 0) {
+        return MIPC_API_RESULT_SUCCESS;
+    } else {
+        return MIPC_API_RESULT_FAIL;
+    }
+}
 
 /////////////////////////////////////////////////////////////////////////////////////////////////////
 //fill result_ptr according to msg_ptr
@@ -2680,11 +2689,19 @@
 
     //STEP5: fill the result
     do {
-        if ((t_result_ptr = (uint32_t *)mipc_msg_get_val_ptr(msg_ptr, MIPC_T_RESULT, NULL)) == NULL) break;
+        if ((t_result_ptr = (uint32_t *)mipc_msg_get_val_ptr(msg_ptr, MIPC_T_RESULT, NULL)) == NULL) {
+            mtkLogE(LOG_TAG, "%s result=NULL", __FUNCTION__);
+            break;
+        }
+
         if (*t_result_ptr == 0) { // SUCCESS
             result_ptr->result_code = MIPC_RESULT_SUCCESS;
 
-            if ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_CS_CNF_T_REG_INFO, &t_nwtmp_len)) == NULL) break;
+            if ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_CS_CNF_T_REG_INFO, &t_nwtmp_len)) == NULL) {
+                mtkLogE(LOG_TAG, "%s REG_INFO=NULL", __FUNCTION__);
+                break;
+            }
+
             result_ptr->cs_reg.stat = ((mipc_nw_cs_reg_info_struct4 *)t_nwtmp_ptr)->stat;
             result_ptr->cs_reg.rat = ((mipc_nw_cs_reg_info_struct4 *)t_nwtmp_ptr)->rat;
             result_ptr->cs_reg.css = ((mipc_nw_cs_reg_info_struct4 *)t_nwtmp_ptr)->css;
@@ -2692,10 +2709,19 @@
             result_ptr->cs_reg.is_in_prl = ((mipc_nw_cs_reg_info_struct4 *)t_nwtmp_ptr)->is_in_prl;
             result_ptr->cs_reg.def_roaming_ind = ((mipc_nw_cs_reg_info_struct4 *)t_nwtmp_ptr)->def_roaming_ind;
             result_ptr->cs_reg.reason_for_denial = ((mipc_nw_cs_reg_info_struct4 *)t_nwtmp_ptr)->reason_for_denial;
-            if ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_CS_CNF_T_CELL_TYPE, &t_nwtmp_len)) == NULL) break;
+            if ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_CS_CNF_T_CELL_TYPE, &t_nwtmp_len)) == NULL) {
+                mtkLogE(LOG_TAG, "%s CELL_TYPE=NULL", __FUNCTION__);
+                break;
+            }
+
             signal_type = (mipc_nw_cell_type_const_enum )(*(uint8_t *)t_nwtmp_ptr);
             result_ptr->cell_list.cell_type = signal_type;
-            if ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_CS_CNF_T_CELL_INFO, &t_nwtmp_len)) == NULL) break;
+            if ((signal_type != mipc_nw_cell_type_const_NONE) &&
+                ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_CS_CNF_T_CELL_INFO, &t_nwtmp_len)) == NULL)) {
+                mtkLogE(LOG_TAG, "%s cell_type!=NONE && CELL_INFO=NULL", __FUNCTION__);
+                break;
+            }
+
             switch(signal_type)
             {
                 case MIPC_NW_CELL_TYPE_GSM:
@@ -2816,11 +2842,19 @@
 
     //STEP5: fill the result
     do {
-        if ((t_result_ptr = (uint32_t *)mipc_msg_get_val_ptr(msg_ptr, MIPC_T_RESULT, NULL)) == NULL) break;
+        if ((t_result_ptr = (uint32_t *)mipc_msg_get_val_ptr(msg_ptr, MIPC_T_RESULT, NULL)) == NULL) {
+            mtkLogE(LOG_TAG, "%s result=NULL", __FUNCTION__);
+            break;
+        }
+
         if (*t_result_ptr == 0) { // SUCCESS
             result_ptr->result_code = MIPC_RESULT_SUCCESS;
 
-            if ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_PS_CNF_T_REG_INFO, &t_nwtmp_len)) == NULL) break;
+            if ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_PS_CNF_T_REG_INFO, &t_nwtmp_len)) == NULL) {
+                mtkLogE(LOG_TAG, "%s REG_INFO=NULL", __FUNCTION__);
+                break;
+            }
+
             result_ptr->ps_reg.stat = ((mipc_nw_ps_reg_info_struct4 *)t_nwtmp_ptr)->stat;
             result_ptr->ps_reg.rat = ((mipc_nw_ps_reg_info_struct4 *)t_nwtmp_ptr)->rat;
             result_ptr->ps_reg.reason_for_denial = ((mipc_nw_ps_reg_info_struct4 *)t_nwtmp_ptr)->reason_for_denial;
@@ -2828,10 +2862,19 @@
             result_ptr->ps_reg.is_in_prl = ((mipc_nw_ps_reg_info_struct4 *)t_nwtmp_ptr)->is_in_prl;
             result_ptr->ps_reg.def_roaming_ind = ((mipc_nw_ps_reg_info_struct4 *)t_nwtmp_ptr)->def_roaming_ind;
             result_ptr->ps_reg.reason_for_denial = ((mipc_nw_ps_reg_info_struct4 *)t_nwtmp_ptr)->reason_for_denial;
-            if ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_PS_CNF_T_CELL_TYPE, &t_nwtmp_len)) == NULL) break;
+            if ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_PS_CNF_T_CELL_TYPE, &t_nwtmp_len)) == NULL) {
+                mtkLogE(LOG_TAG, "%s CELL_TYPE=NULL", __FUNCTION__);
+                break;
+            }
+
             signal_type = (mipc_nw_cell_type_const_enum )(*(uint8_t *)t_nwtmp_ptr);
             result_ptr->cell_list.cell_type = signal_type;
-            if ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_PS_CNF_T_CELL_INFO, &t_nwtmp_len)) == NULL) break;
+            if ((signal_type != mipc_nw_cell_type_const_NONE) &&
+                ((t_nwtmp_ptr = (char *)mipc_msg_get_val_ptr(msg_ptr, MIPC_NW_GET_PS_CNF_T_CELL_INFO, &t_nwtmp_len)) == NULL)) {
+                mtkLogE(LOG_TAG, "%s cell_type!=NONE && CELL_INFO=NULL", __FUNCTION__);
+                break;
+            }
+
             switch(signal_type)
             {
                 case MIPC_NW_CELL_TYPE_GSM:
@@ -3387,3 +3430,11 @@
     return mipc_nw_get_rat_req(cb, cb_priv_ptr, sim_ps_id, NULL);
 }
 
+mipc_api_result_enum mipc_nw_get_rat_sync(mipc_sim_ps_id_enum sim_ps_id, mipc_nw_get_rat_struct *cb_priv_ptr)
+{
+    //SETP0: check input
+    if (cb_priv_ptr == NULL) {
+        return MIPC_API_RESULT_FAIL;
+    }
+    return mipc_nw_get_rat_req(NULL, cb_priv_ptr, sim_ps_id, cb_priv_ptr);
+}
diff --git a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sim_api.c b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sim_api.c
old mode 100644
new mode 100755
index b6cb1c5..b07312d
--- a/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sim_api.c
+++ b/src/telephonyware/3.0/hardware/ril/platformlib/libmipc/lib/src/api/mipc_sim_api.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*****************************************************************************
 *  Copyright Statement:
 *  --------------------
@@ -1896,6 +1897,7 @@
     mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SIM_CHANNEL_RESTRICTED_ACCESS_REQ_T_P2, p2);
     mipc_msg_add_tlv_uint16(msg_req_ptr, MIPC_SIM_CHANNEL_RESTRICTED_ACCESS_REQ_T_P3, p3);
     mipc_msg_add_tlv_uint16(msg_req_ptr, MIPC_SIM_CHANNEL_RESTRICTED_ACCESS_REQ_T_DATA_LEN, data_len);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SIM_CHANNEL_RESTRICTED_ACCESS_REQ_T_FCP_CONVERT, MIPC_SIM_FCP_CONVERT_ENABLE);
     if (data_ptr) {
         mipc_msg_add_tlv(msg_req_ptr, MIPC_SIM_CHANNEL_RESTRICTED_ACCESS_REQ_T_DATA, data_len, data_ptr);
     }
@@ -4316,9 +4318,9 @@
     do {
         result_ptr->result_code = MIPC_RESULT_SUCCESS;
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_STK_SIM_REFRESH_IND_T_SIM_REFRESH_RESULT, NULL)) == NULL) break;
-        result_ptr->sim_refresh_result = (mipc_sim_refresh_result_type_const_enum) * ((uint8_t *)val_ptr);
+        result_ptr->sim_refresh_result = mipc_stk_sim_refresh_ind_get_sim_refresh_result(msg_ptr, mipc_sim_refresh_result_type_const_NONE);
         if ((val_ptr = mipc_msg_get_val_ptr(msg_ptr, MIPC_STK_SIM_REFRESH_IND_T_EF_ID, NULL)) != NULL) {
-            result_ptr->ef_id = (uint32_t) * ((uint32_t *)val_ptr);
+            result_ptr->ef_id = mipc_stk_sim_refresh_ind_get_ef_id(msg_ptr, 0);
         } else {
             result_ptr->ef_id = UINT32_MAX;
         }
@@ -4341,7 +4343,7 @@
 static void mipc_stk_sim_refresh_ind_cb(mipc_msg_t *msg_ptr, MIPC_STK_SIM_REFRESH_IND_CB cb, void *cb_priv_ptr)
 {
     mipc_stk_sim_refresh_ind_struct result_ptr;
-    MEMSET(&result_ptr, 0, sizeof(mipc_sim_physical_slots_mapping_done_ind_struct));
+    MEMSET(&result_ptr, 0, sizeof(mipc_stk_sim_refresh_ind_struct));
     if (mipc_stk_sim_refresh_ind(msg_ptr, &result_ptr) == MIPC_API_RESULT_SUCCESS) {
         cb((mipc_sim_ps_id_enum)msg_ptr->hdr.msg_sim_ps_id, &result_ptr, cb_priv_ptr);
     } else {