[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 {
diff --git a/src/telephonyware/3.0/libvendor-ril/apn/inc/LogUtils.h b/src/telephonyware/3.0/libvendor-ril/apn/inc/LogUtils.h
index 5c0a402..a8d6085 100755
--- a/src/telephonyware/3.0/libvendor-ril/apn/inc/LogUtils.h
+++ b/src/telephonyware/3.0/libvendor-ril/apn/inc/LogUtils.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*
  * LogUtils.h
  *
@@ -12,7 +13,7 @@
 #undef LOG_TAG
 #define LOG_TAG "APN"
 
-namespace logutils {
+namespace apn_logutils {
 class SLOG {
 private:
 	const static char* SEPERATE;
@@ -25,7 +26,7 @@
 };
 }
 
-#define SLOGD(...) logutils::SLOG::D(LOG_TAG, ##__VA_ARGS__)
-#define SLOGFATAL(f, a...) logutils::SLOG::FATAL(LOG_TAG, f "(%s, %d)", __FILE__, __LINE__,## a)
+#define SLOGD(...) apn_logutils::SLOG::D(LOG_TAG, ##__VA_ARGS__)
+#define SLOGFATAL(f, a...) apn_logutils::SLOG::FATAL(LOG_TAG, f "(%s, %d)", ##a,  __FILE__, __LINE__)
 
 #endif /* SRC_LogUtils_H_ */
diff --git a/src/telephonyware/3.0/libvendor-ril/apn/src/LogUtils.cpp b/src/telephonyware/3.0/libvendor-ril/apn/src/LogUtils.cpp
index 0997cfa..2dc7743 100755
--- a/src/telephonyware/3.0/libvendor-ril/apn/src/LogUtils.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/apn/src/LogUtils.cpp
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*
  * LogUtils.cpp
  *
@@ -15,7 +16,7 @@
 #include <stdio.h>
 
 using namespace std;
-using logutils::SLOG;
+using apn_logutils::SLOG;
 
 #define LOG_BUF_SIZE 1024
 
diff --git a/src/telephonyware/3.0/libvendor-ril/apn/src/apn_manager.cpp b/src/telephonyware/3.0/libvendor-ril/apn/src/apn_manager.cpp
index f9654b2..8b2b80a 100755
--- a/src/telephonyware/3.0/libvendor-ril/apn/src/apn_manager.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/apn/src/apn_manager.cpp
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*
  * apn_manager.cpp
  *
@@ -186,8 +187,10 @@
 	sql.append(";");
 	char* errmsg = NULL;
 	if (sqlite3_exec(mDb, sql.c_str(), NULL, NULL, &errmsg) != SQLITE_OK) {
-		SLOGFATAL("update error %s", errmsg);
-		return APN_ERR;
+            if(errmsg != NULL) {
+                SLOGFATAL("update error %s", errmsg);
+            }
+            return APN_ERR;
 	}
 	return APN_OK;
 }
diff --git a/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h b/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
old mode 100644
new mode 100755
index 693672e..dad33d5
--- a/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
+++ b/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
@@ -1,3 +1,4 @@
+//SPDX-License-Identifier: MediaTekProprietary
 /*
  * mtk_ril_ivt.h
  *
@@ -460,9 +461,18 @@
     RIL_UNSOL_ECALL_ALACK_CLEARDOWN_RECEIVED = 5,
     RIL_UNSOL_ECALL_ACTIVE = 11,
     RIL_UNSOL_ECALL_DISCONNECTED = 12,
+    RIL_UNSOL_ECALL_IMS_ACTIVE = 13,
+    RIL_UNSOL_ECALL_IMS_DISCONNECTED = 14,
     RIL_UNSOL_ECALL_ABNORMAL_HANGUP=15,
     RIL_UNSOL_ECALL_IMS_MSD_ACK = 20,
     RIL_UNSOL_ECALL_IMS_UPDATE_MSD = 21,
+    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_PSAP_CALLBACK_START = 40,
+    RIL_UNSOL_ECALL_PSAP_CALLBACK_IMS_UPDATE_MSD = 41,
     RIL_UNSOL_ECALL_UNSPECIFIED = 0xffff,
 }RIL_ECall_Indication;
 
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/base/RfxParcelTransferUtils.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/base/RfxParcelTransferUtils.cpp
old mode 100644
new mode 100755
index f7367c4..bac1102
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/base/RfxParcelTransferUtils.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/base/RfxParcelTransferUtils.cpp
@@ -1,3 +1,4 @@
+//SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -126,6 +127,8 @@
         case PREF_NET_TYPE_NR_ONLY:
         case PREF_NET_TYPE_NR_LTE:
         case PREF_NET_TYPE_NR_LTE_CDMA_EVDO:
+        case PREF_NET_TYPE_NR_LTE_GSM_WCDMA:
+        case PREF_NET_TYPE_NR_LTE_WCDMA:
         case PREF_NET_TYPE_NR_LTE_TDSCDMA_CDMA_EVDO_GSM_WCDMA:
         case PREF_NET_TYPE_NR_LTE_TDSCDMA_GSM_WCDMA:
         case PREF_NET_TYPE_NR_LTE_TDSCDMA_WCDMA:
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/base/RfxTransferUtils.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/base/RfxTransferUtils.cpp
old mode 100644
new mode 100755
index 0a92f93..dd95982
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/base/RfxTransferUtils.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/framework/base/RfxTransferUtils.cpp
@@ -177,7 +177,7 @@
 void RfxTransferUtils::parcelToDataResponse(RIL_Token t, RIL_Errno e, int request,
         Parcel * parcel, int slotId) {
     DataToParcelInfo *parcelInfo;
-    if (request >= 1 && request <= (int32_t)NUM_ELEMS(s_data_to_parcel_request)) {
+    if (request >= 1 && request < (int32_t)NUM_ELEMS(s_data_to_parcel_request)) {
         parcelInfo = &(s_data_to_parcel_request[request]);
     } else if (request >= RIL_REQUEST_VENDOR_BASE && (request< RIL_REQUEST_VENDOR_BASE +
             (int32_t)NUM_ELEMS(s_data_to_parcel_mtk_request))) {
@@ -3526,6 +3526,8 @@
     RequestInfo *requestInfo = (RequestInfo *)t;
     int type = getTypeAndJumpToData(p, id);
 
+    memset(&mem_status, 0, sizeof(mem_status));
+
     if (p->dataAvail() > 0) {
         p->readInt32(&mem_status.used);
         p->readInt32(&mem_status.total);
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
old mode 100644
new mode 100755
index 8b1f596..d5475d4
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.cpp
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -47,6 +48,7 @@
 #include <RfxMainThread.h>
 #include <cutils/properties.h>
 #include <unistd.h>
+#include <string.h>
 
 #define RFX_LOG_TAG "RPApnController"
 extern int rfx_get_data_allowed_slotid(void);
@@ -66,6 +68,11 @@
 #define APNDB_NOTREADY (0)
 bool gApnDoneCond_flag = APNDB_NOTREADY;
 
+using std::string;
+
+special_char_pattern_t APN_PROP_CHAR[CHAR_ID_TOTAL] = {
+    { CHAR_QUOTE, CHAR_REP_QUOTE },
+};
 
 
 /*****************************************************************************
@@ -406,11 +413,31 @@
     return false;
 }
 
+bool RpApnController::handleSpecialChar(std::string& source, const std::string& pattern, const std::string& replace)
+{
+    if(source.find(pattern) == std::string::npos) {
+        return false;
+    }
+    std::size_t result = 0;
+    std::size_t index = 0;
+    while((result = source.find(pattern, index)) != std::string::npos) {
+        source.replace(result, pattern.size(), replace);
+        index = result + replace.size();
+    }
+    logD(RFX_LOG_TAG, "[handleSpecialChar] source : %s",  source.c_str());
+    return true;
+}
+
 char * RpApnController::getPropValue(const char *string) {
     const char *start = NULL;
     const char *end = NULL;
     int length = -1;
     char *return_value = NULL;
+    std::string target;
+    std::size_t found = 0;
+    int i = 0;
+    bool result = false;
+
     logD(RFX_LOG_TAG, "[getPropValue]input string: %s", string);
     while((';' != *string) && ('\0' != *string)) {
         if ('=' == *string) {
@@ -437,6 +464,19 @@
         return NULL;
     return_value = (char *)malloc(length+1);
     snprintf(return_value, length+1, "%s", start);
+
+    target = return_value;
+
+    for (i = 0; i < CHAR_ID_TOTAL; i++) {
+        if (true == handleSpecialChar(target, APN_PROP_CHAR[i].pattern, APN_PROP_CHAR[i].replace_char)) {
+            result = true;
+        }
+    }
+    if (result == true) {
+        free(return_value);
+        return_value = (char *)calloc(1, target.length() + 1);
+        strncpy(return_value, target.c_str(), target.length());
+    }
     logD(RFX_LOG_TAG, "[getPropValue] return_value : %s",  return_value);
     return return_value;
 }
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.h b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.h
old mode 100644
new mode 100755
index 9ff29df..baab352
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.h
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/apn/RpApnController.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -84,6 +85,18 @@
     string mvno_match_data;
 }ApnsettingT;
 
+typedef struct {
+    const char* pattern;
+    const char* replace_char;
+} special_char_pattern_t;
+
+typedef enum {
+    CHAR_ID_QUOTE,
+    CHAR_ID_TOTAL
+} prop_char_id_enum;
+
+#define CHAR_QUOTE "'"
+#define CHAR_REP_QUOTE "''"
 
 extern "C"
 void apncallback(int ret, void* data);
@@ -149,6 +162,8 @@
     bool checkPropEmpty(apn_record_t* record, int index);
     bool checkPropExist(apn_record_t* record, int index);
     string constructQueryResult(const apn_list_t * apn_list);
+    bool handleSpecialChar(std::string& source, const std::string& pattern, const std::string& replce);
+
 public:
     RfxSignal0 apn_ready_singal;
     apn_list_t* g_apnlist;
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
old mode 100644
new mode 100755
index 8b8224d..3d2f26f
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*
  * ApnContext.cpp
  *
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcController.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcController.cpp
old mode 100644
new mode 100755
index 46577d4..a3eb1d2
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcController.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcController.cpp
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*
  * DcController.cpp
  *
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
old mode 100644
new mode 100755
index 64a694a..f92fd54
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*
  * DcTracker.cpp
  *
@@ -809,8 +810,7 @@
     if (isPsRestricted == true) {
         dataAllowFailReason.addDataAllowFailReason(PS_RESTRICTED);
     }
-    RFX_LOG_D(RFX_LOG_TAG, "%s always return true", __FUNCTION__);
-    return true;
+
     return !dataAllowFailReason.isFailed();
 }
 
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.h b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.h
old mode 100644
new mode 100755
index 0477dd0..66c1c46
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.h
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /*
  * DcTracker.h
  *
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataController.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataController.cpp
old mode 100644
new mode 100755
index ae5c6c3..4dc7432
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataController.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataController.cpp
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -450,7 +451,6 @@
     }
 
     logD(RFX_LOG_TAG, "RpDataController::isAllCallingStateIdle, with result: %s", RpDataUtils::b2s(result).c_str());
-    result = true;
     return result;
 }
 
@@ -459,8 +459,8 @@
     RfxNwServiceState ss = getStatusManager()->getServiceStateValue(RFX_STATUS_KEY_SERVICE_STATE);
     result = ss.isConcurrentVoiceAndDataAllowed();
 
-    result = true;
-    logD(RFX_LOG_TAG, "RpDataController::isDataSupportConcurrent, with result: %s", RpDataUtils::b2s(result).c_str());
+    logD(RFX_LOG_TAG, "RpDataController::isDataSupportConcurrent, rilVoiceRadioTech(%d) with result: %s m_slot_id %d",
+            ss.getRilVoiceRadioTech(), RpDataUtils::b2s(result).c_str(), m_slot_id);
     return result;
 }
 
@@ -468,7 +468,6 @@
     bool result = false;
     result = getStatusManager()->getBoolValue(RFX_STATUS_KEY_PS_RESTRICT_STATE, false);
 
-    result = true;
     logD(RFX_LOG_TAG, "RpDataController::isPsRestricted, with result: %s", RpDataUtils::b2s(result).c_str());
 
     return result;
@@ -488,7 +487,6 @@
     RfxNwServiceState ss = getStatusManager()->getServiceStateValue(RFX_STATUS_KEY_SERVICE_STATE);
     result = ss.isInService(ss.getRilDataRegState());
  
-    result = true;
     logD(RFX_LOG_TAG, "RpDataController::isAttached, with result: %s", RpDataUtils::b2s(result).c_str());
 
     return result;
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/power/RpRadioController.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/power/RpRadioController.cpp
old mode 100644
new mode 100755
index 888e944..4661c35
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/power/RpRadioController.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/power/RpRadioController.cpp
@@ -1,3 +1,4 @@
+//SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/suplmessageparser/SuplMsgDispatcher.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/suplmessageparser/SuplMsgDispatcher.cpp
old mode 100644
new mode 100755
index 2c6d63a..f64e668
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/suplmessageparser/SuplMsgDispatcher.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/suplmessageparser/SuplMsgDispatcher.cpp
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/suplmessageparser/SuplMsgDispatcher.h b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/suplmessageparser/SuplMsgDispatcher.h
old mode 100644
new mode 100755
index 709b924..b8f9946
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/suplmessageparser/SuplMsgDispatcher.h
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/suplmessageparser/SuplMsgDispatcher.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: MediaTekProprietary
 /* Copyright Statement:
  *
  * This software/firmware and related documentation ("MediaTek Software") are
@@ -48,8 +49,9 @@
 #define HAL_MNL_BUFF_SIZE           (16 * 1024)
 #define HAL2MNL_NI_MESSAGE          401
 #define HAL_MNL_INTERFACE_VERSION   1
+
 #ifndef MTK_HAS_HAL2MNL_EXT_SERVER
-#define MTK_HAL2MNL                 "mtk_hal2mnl"
+#define MTK_HAL2MNL      "mtk_hal2mnl"
 #else
 #define MTK_HAL2MNL      "mnldinf_ext"
 #endif
diff --git a/src/telephonyware/3.0/mcf_cmd/LICENSE b/src/telephonyware/3.0/mcf_cmd/LICENSE
new file mode 100755
index 0000000..10f9164
--- /dev/null
+++ b/src/telephonyware/3.0/mcf_cmd/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+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. Without
+the prior written permission of 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.
+
+Copyright  (C) 2021 MediaTek Inc. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/src/telephonyware/3.0/mcf_cmd/Makefile b/src/telephonyware/3.0/mcf_cmd/Makefile
new file mode 100755
index 0000000..98b4167
--- /dev/null
+++ b/src/telephonyware/3.0/mcf_cmd/Makefile
@@ -0,0 +1,13 @@
+TARGET := mcf_cmd
+SRCS := ./mcf_cmd.c
+
+.PHONY: all clean
+
+all: mcf_cmd
+
+mcf_cmd:
+	$(CC) $(CFLAGS) -o $@ $(SRCS) $(LDFLAGS) $(LIBS)
+
+clean:
+	$(warning "makefile mcf_cmd clean")
+	rm -f $(TARGET)
\ No newline at end of file
diff --git a/src/telephonyware/3.0/mcf_cmd/mcf_cmd.c b/src/telephonyware/3.0/mcf_cmd/mcf_cmd.c
new file mode 100755
index 0000000..3248e0d
--- /dev/null
+++ b/src/telephonyware/3.0/mcf_cmd/mcf_cmd.c
@@ -0,0 +1,758 @@
+/******************************************************************************
+*  Copyright Statement:
+*  --------------------
+*  This software is protected by Copyright and the information contained
+*  herein is confidential. The software may not be copied and the information
+*  contained herein may not be used or disclosed except with the written
+*  permission of MediaTek Inc. (C) 2020
+*
+*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*******************************************************************************/
+
+/******************************************************************************
+ * Filename:
+ * ---------
+ *   mcf_cmd.c
+ *
+ * Project:
+ * --------
+ *   Colgin
+ *
+ * Description:
+ * ------------
+ *   MD Configuration Framework, opreation command, send by sAP/openWrt
+ *
+*******************************************************************************/
+
+/******************************************************************************
+ *  Includes
+ ******************************************************************************/
+#include <stdbool.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <sys/time.h>
+#include "mipc_msg_host.h"
+
+/******************************************************************************
+ *  Macro
+ ******************************************************************************/
+#define SPECIFIC_MIPC_PORT "/dev/ttyCMIPC9"
+
+/******************************************************************************
+ *  Typedefs
+ ******************************************************************************/
+typedef enum {
+    MCF_CMD_BIN_TYPE_DEFAULT_BIN         = 0,
+    MCF_CMD_BIN_TYPE_CARRIER_BIN         = 1,
+    MCF_CMD_BIN_TYPE_GENERAL_CARRIER_BIN = 2,
+    MCF_CMD_BIN_TYPE_MAX
+} mcf_cmd_bin_type_enum;
+
+typedef enum {
+    MCF_CMD_PATH_TYPE_OTA                = 0,
+    MCF_CMD_PATH_TYPE_RUNTIME            = 1,
+    MCF_CMD_PATH_TYPE_MAX
+} mcf_cmd_path_type_enum;
+
+typedef enum {
+    MCF_CMD_VARIABLE_ACT_READ_OTA        = 0,
+    MCF_CMD_VARIABLE_ACT_READ_OPOTA      = 1,
+    MCF_CMD_VARIABLE_ACT_WRITE_OTA       = 2,
+    MCF_CMD_VARIABLE_ACT_WRITE_OPOTA     = 3,
+    MCF_CMD_VARIABLE_ACT_MAX
+} mcf_cmd_variable_act_enum;
+
+typedef enum {
+    MCF_CMD_QUERY_VARIABLE_FORM_PATH     = 0,
+    MCF_CMD_QUERY_VARIABLE_FORM_GID      = 1,
+}mcf_cmd_query_variable_form_enum;
+
+typedef enum {
+    MCF_CMD_IS_TRIGGER_FALSE             = 0,
+    MCF_CMD_IS_TRIGGER_TRUE              = 1,
+
+    MCF_CMD_IS_APPEND_OTA                = 0,
+    MCF_CMD_IS_RESET_LID                 = 1,
+
+    MCF_CMD_IS_UPDATE_WITH_NO_READ_INI   = 0,
+    MCF_CMD_IS_UPDATE_WITH_READ_INI      = 1,
+
+    MCF_PARA_IS_MAX                      = 2,
+} mcf_para_is_enum;
+
+typedef struct {
+    uint8_t num;
+    char str[7];
+} mapping_table_t;
+
+typedef struct {
+    /* required parameter */
+    uint8_t opnum;
+    uint8_t bin_type;
+    uint8_t path_folder_idx;
+    uint8_t appendOTA_resetLID;
+    /* optional parameter */
+    uint8_t is_trigger;
+    uint8_t is_with;
+    uint8_t record_id;
+    uint8_t data_length;
+    /* internal use variable */
+    uint8_t write_flag;
+    uint8_t real_write_length;
+    /* required parameter */
+    uint32_t gid;
+    char* file_name;
+    char* write_value;
+    /* optional parameter */
+    char* lid_str;
+    char* array_index;
+    /* internal use variable */
+    uint16_t run_cmd_ret;
+    uint16_t sim_ps_id;
+} mcf_cmd_parameter_list_t;
+
+/******************************************************************************
+ *  Global variables
+ ******************************************************************************/
+#define PARA_INT8_ERROE_MAX 0xFF
+#define RESULT_SUCCESS 0
+#define WRITE_FLAG 90
+
+extern char *optarg;
+extern int optind, optopt, opterr;
+static mipc_msg_t* msg_req_ptr = NULL;
+static mipc_msg_t* msg_cnf_ptr = NULL;
+static mcf_cmd_parameter_list_t mc;
+
+/* NOTE: read and write are same opreation code 10 */
+static mapping_table_t cmd_map[9] = {
+    {MIPC_SYS_MCF_OP_GET_APPLIED_FILE_PATH, "get"},
+    {MIPC_SYS_MCF_OP_DUMP_LID_DATA, "dump"},
+    {MIPC_SYS_MCF_OP_SET_FILE_PATH_AND_AUTO_SELECT_BIN, "set"},
+    {MIPC_SYS_MCF_OP_UPDATE_OPOTA_FILE, "update"},
+    {MIPC_SYS_MCF_OP_QUERY_VARIABLE_VALUE, "read"},
+    {MIPC_SYS_MCF_OP_QUERY_VARIABLE_VALUE + WRITE_FLAG, "write"},
+    {MIPC_SYS_MCF_OP_ASSIGN_COMBINED_PATH, "merge"},
+    {99,"reboot"},
+};
+
+static mapping_table_t path_map[2] = {
+    {MCF_CMD_PATH_TYPE_OTA, "mdota2"},
+    {MCF_CMD_PATH_TYPE_RUNTIME, "mdota"}
+};
+
+#define CMD_MAP_LEN (sizeof(cmd_map)/sizeof(cmd_map[0]))
+#define PATH_MAP_LEN (sizeof(path_map)/sizeof(path_map[0]))
+
+//#define USE_DEBUG_LOG
+#ifdef USE_DEBUG_LOG
+#define debug_log(format, ...) printf(format, ##__VA_ARGS__)
+#else
+#define debug_log(format, ...)
+#endif
+
+/******************************************************************************
+ *  Feature: wait ind callback by linux signal
+ ******************************************************************************/
+#define USE_MCF_THREAD_WAIT_IND_CB
+
+#ifdef USE_MCF_THREAD_WAIT_IND_CB
+#define WAIT_IND_CB_TIMEOUT_SEC 5
+static pthread_cond_t g_cond;
+static pthread_mutex_t g_mutex;
+static bool g_ind_cb_done = false;
+
+static void mcf_thread_wait_ind_cb(void)
+{
+    struct timeval now_time;
+    struct timespec out_time;
+
+    if (g_ind_cb_done == false) {
+        pthread_cond_init(&g_cond, NULL);
+        pthread_mutex_init(&g_mutex, NULL);
+
+        gettimeofday(&now_time, NULL);
+        out_time.tv_sec = now_time.tv_sec + WAIT_IND_CB_TIMEOUT_SEC;
+        out_time.tv_nsec = now_time.tv_usec * 1000;
+
+        debug_log("wait mcf ind cb\n");
+        pthread_mutex_lock(&g_mutex);
+        pthread_cond_timedwait(&g_cond, &g_mutex, &out_time);
+        pthread_mutex_unlock(&g_mutex);
+        debug_log("wait done\n");
+
+        pthread_cond_destroy(&g_cond);
+        pthread_mutex_destroy(&g_mutex);
+    }
+}
+
+static void mcf_thread_send_signal(void)
+{
+    if (g_ind_cb_done == false) {
+        pthread_mutex_lock(&g_mutex);
+        pthread_cond_signal(&g_cond);
+        pthread_mutex_unlock(&g_mutex);
+        g_ind_cb_done = true;
+    }
+}
+
+#else
+#define mcf_thread_wait_ind_cb()
+#define mcf_thread_send_signal()
+#endif  /* THREAD_WAIT_MCF_IND_CB */
+
+/******************************************************************************
+ *  Functions
+ ******************************************************************************/
+static void printf_help(void)
+{
+    char help_text[] = {"Usage:\n"
+        "  mcf_cmd <-o get> <-b bin_type>\n"
+        "  mcf_cmd <-o dump> [-d lid1,lid2,...,lid32]\n"
+        "  mcf_cmd <-o set> <-b bin_type> <-p path_folder> <-f file_name> <-r appendOTA_resetLID> [-t trigger_dsbp] [-s sim_id]\n"
+        "  mcf_cmd <-o update> [-w with_ini]\n"
+        "  mcf_cmd <-o read> <-b bin_type> <-g GID> [-i record_id] [-y array_index] [-l length]\n"
+        "  mcf_cmd <-o write> <-b bin_type> <-g GID> [-i record_id] [-y array_index] [-l length] <-v write_value>\n"
+        "  mcf_cmd <-o merge> <-b bin_type> <-p path_folder> <-f file_name>\n"
+        "    <> is required parameter; [] is optional parameter, notice its default value if not set\n"
+        "    -o, operation (str): get/dump/set/update/read/write/merge\n"
+        "    -b, bin type: 0:OTA, 1:OTA by OP, 2:general OTA by OP\n"
+        "    -d, LID list (str): use \",\" to split, max num is 32; default dump all\n"
+        "    -p, path folder (str): \"mdota\"/\"mdota2\"\n"
+        "    -f, OTA file name (str)\n"
+        "    -r, appendOTA_resetLID: Valid after running merge cmd, 0:append OTA file, 1:reset LIDs\n"
+        "    -t, trigger dsbp: 0:not trigger, 1:trigger; default 0\n"
+        "    -w, update with ini file: 0:no read ini, 1:read ini; default 0\n"
+        "    -i, NVRAM item record id: default 1\n"
+        "    -g, GID number\n"
+        "    -y, array index (str): use \",\" to split; default \"\"\n"
+        "    -l, data length\n"
+        "    -v, write value (str): hex string, use \"3412\" for 0x1234\n"
+        "    -s, send cmd by sim id, support all cmd: 0 for sim1, 1 for sim2, optional, defatul 0\n"
+        "  note: if parameter is string, its \"\" can be omitted\n"
+    };
+    printf("%s", help_text);
+}
+
+static void mcf_ind_cb(mipc_msg_t *msg_ptr, void *priv_ptr)
+{
+    uint32_t ret;
+
+    printf("MCF cmd CB type=%u result=%u\n", mipc_msg_get_val_uint8(msg_ptr, MIPC_SYS_MCF_IND_T_TYPE, 0xff),
+            ret = mipc_msg_get_val_uint8(msg_ptr, MIPC_SYS_MCF_IND_T_RESULT, 0xff));
+
+    if ((mc.opnum == MIPC_SYS_MCF_OP_DUMP_LID_DATA) && (ret == RESULT_SUCCESS)) {
+        mc.run_cmd_ret = RESULT_SUCCESS;
+    }
+
+    mcf_thread_send_signal();
+}
+
+static void mcf_mipc_init(void)
+{
+#ifdef SPECIFIC_MIPC_PORT
+    SETCOM(SPECIFIC_MIPC_PORT);
+    printf("MCF cmd SETCOM %s\n", SPECIFIC_MIPC_PORT);
+#endif
+
+    mipc_init("mcf_cmd");
+    mipc_msg_register_ind(mc.sim_ps_id, MIPC_SYS_MCF_IND, mcf_ind_cb, NULL);
+}
+
+static void mcf_mipc_deinit(void)
+{
+    mipc_msg_deinit(msg_req_ptr);
+    mipc_msg_deinit(msg_cnf_ptr);
+    mipc_deinit();
+}
+
+static char* mcf_get_map_str(uint8_t num, mapping_table_t *map, uint32_t map_len)
+{
+    static char* null_str = "";
+    uint32_t i = 0;
+
+    for (i=0;i<map_len;i++) {
+        if (num == (map+i)->num) {
+            return (map+i)->str;
+        }
+    }
+
+    return null_str;
+}
+
+static uint8_t mcf_get_map_num(char* str, mapping_table_t *map, uint32_t map_len)
+{
+    uint32_t i = 0;
+
+    for (i=0;i<map_len;i++) {
+        if (strcmp(str, (map+i)->str) == 0) {
+            if (strcmp(str, "write") == 0) {
+                mc.write_flag = WRITE_FLAG;
+                return (map+i)->num - mc.write_flag;
+            } else {
+                return (map+i)->num;
+            }
+        }
+    }
+
+    return PARA_INT8_ERROE_MAX;
+}
+
+static void log_op_error_parameter(uint8_t num)
+{
+    printf("MCF op=\"%s\" error parameter, CHECK!\nRun mcf_cmd to see the format!", mcf_get_map_str(num, cmd_map, CMD_MAP_LEN));
+}
+
+static void log_mipc_result_fail(uint32_t result)
+{
+    printf("MCF cmd FAIL, mipc result=%u\n", result);
+}
+
+static void mcf_cmd_parameters_init(void)
+{
+    /* required parameter, will check them */
+    mc.opnum = PARA_INT8_ERROE_MAX;
+    mc.bin_type = PARA_INT8_ERROE_MAX;
+    mc.path_folder_idx = PARA_INT8_ERROE_MAX;
+    mc.appendOTA_resetLID = PARA_INT8_ERROE_MAX;
+    mc.gid = 0;
+    mc.file_name = NULL;
+    mc.write_value = NULL;
+    /* optional parameter, set default value */
+    mc.is_trigger = 0;
+    mc.is_with = 0;
+    mc.record_id = 1;
+    mc.data_length = 0;
+    mc.lid_str = "";
+    mc.array_index = "";
+    /* internal use variable */
+    mc.write_flag = 0;
+    mc.real_write_length = 0;
+    mc.run_cmd_ret = PARA_INT8_ERROE_MAX;   // linux shell only get 0~255
+    mc.sim_ps_id = MIPC_MSG_PS0;            // set default as MIPC_MSG_PS0
+}
+
+static void mcf_cmd_hex_string_to_bytes(char *input_string)
+{
+    uint32_t length = strlen(input_string);
+    uint8_t temp[2];
+    uint32_t i,j;
+
+    if (length%2 != 0) {
+        printf("write_value str len need be even\n");
+        return;
+    }
+
+    char* pdata = malloc(length/2);
+    if (pdata == NULL) return;
+
+    for (i=0;i<length/2;i++) {
+        temp[0] = input_string[i*2];
+        temp[1] = input_string[i*2+1];
+
+        for (j=0; j<2; j++) {
+            if (temp[j] >= '0' && temp[j] <= '9') {
+                temp[j] = temp[j] - '0';
+            } else if (temp[j] >= 'a' && temp[j] <= 'f') {
+                temp[j] = temp[j] - 'a' + 10;
+            } else if (temp[j] >= 'A' && temp[j] <= 'F') {
+                temp[j] = temp[j] - 'A' + 10;
+            } else {
+                free(pdata);
+                return;
+            }
+        }
+
+        pdata[i] = (temp[0]<<4) | temp[1];
+    }
+
+    if (mc.write_value != NULL) free(mc.write_value);
+    mc.write_value = pdata;
+    mc.real_write_length = length/2;
+}
+
+static void mcf_cmd_parameters_parser(int argc, char *argv[])
+{
+    uint32_t ch;
+    uint16_t sim_id;
+    char* opstr = "";
+
+    if (argc == 1) {
+        printf_help();
+        mc.run_cmd_ret = RESULT_SUCCESS;
+        return;
+    }
+
+    while ((ch = getopt(argc, argv, "o:b:d:p:f:t:r:w:g:i:y:l:v:s:")) != -1) {
+        switch(ch) {
+            case 'o':
+                mc.opnum = mcf_get_map_num(optarg, cmd_map, CMD_MAP_LEN);
+                opstr = optarg;
+                break;
+            case 'b':
+                mc.bin_type = atoi(optarg);
+                break;
+            case 'd':
+                mc.lid_str = optarg;
+                break;
+            case 'p':
+                mc.path_folder_idx = mcf_get_map_num(optarg, path_map, PATH_MAP_LEN);
+                break;
+            case 'f':
+                mc.file_name = optarg;
+                break;
+            case 't':
+                mc.is_trigger = atoi(optarg);
+                break;
+            case 'r':
+                mc.appendOTA_resetLID = atoi(optarg);
+                break;
+            case 'w':
+                mc.is_with = atoi(optarg);
+                break;
+            case 'g':
+                mc.gid = atoi(optarg);
+                break;
+            case 'i':
+                mc.record_id = atoi(optarg);
+                break;
+            case 'y':
+                mc.array_index = optarg;
+                break;
+            case 'l':
+                mc.data_length = atoi(optarg);
+                break;
+            case 'v':
+                mcf_cmd_hex_string_to_bytes(optarg);
+                break;
+            case 's':
+                sim_id = atoi(optarg);
+                if (sim_id == 0xFF) {
+                    mc.sim_ps_id = MIPC_MSG_ALL;
+                } else if (sim_id <= 7) {
+                    mc.sim_ps_id = (mipc_msg_sim_ps_id_enum)(1 << sim_id);
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    if (mc.opnum == PARA_INT8_ERROE_MAX) {
+        printf("MCF unsupport: -o \"%s\"\n", opstr);
+    }
+}
+
+static void mcf_cmd_parameters_free(void)
+{
+    if(mc.write_value != NULL)
+        free(mc.write_value);
+}
+
+/*******************************************************************************
+ * origin cmd: AT+EMCFC=4,<config_type>
+ * response:   +EMCFC:4,<config_type>,<path_type>,<config1 str>
+ * ind cb:     none
+ * mcf cmd:    mcf_cmd <-o get> <-b bin_type>
+ *******************************************************************************/
+static void mcf_cmd_op_get_applied_file_path(int argc, char *argv[])
+{
+    uint32_t mipc_ret = 0;
+
+    if (mc.bin_type >= MCF_CMD_BIN_TYPE_MAX) {
+        log_op_error_parameter(MIPC_SYS_MCF_OP_GET_APPLIED_FILE_PATH);
+        return;
+    }
+
+    msg_req_ptr = mipc_msg_init(MIPC_SYS_MCF_REQ, mc.sim_ps_id);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_OP, MIPC_SYS_MCF_OP_GET_APPLIED_FILE_PATH);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_CONFIG_TYPE, mc.bin_type);
+    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+
+    mipc_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_T_RESULT, MIPC_RESULT_FAILURE);
+
+    if (mipc_ret == MIPC_RESULT_SUCCESS) {
+        printf("MCF cmd SUCCESS op=\"%s\" bin_type=%u path_folder=\"%s\" config_file=\"%s\"\n",
+                mcf_get_map_str(mipc_msg_get_val_uint8(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_OP, 0xff), cmd_map, CMD_MAP_LEN),
+                mipc_msg_get_val_uint8(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_CONFIG_TYPE, 0xff),
+                mcf_get_map_str(mipc_msg_get_val_uint8(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_PATH_TYPE, 0xff), path_map, PATH_MAP_LEN),
+                (char *)mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_CONFIG1, NULL));
+        mc.run_cmd_ret = RESULT_SUCCESS;
+    } else {
+        log_mipc_result_fail(mipc_ret);
+    }
+}
+
+/*******************************************************************************
+ * origin cmd: AT+EMCFC=5 [lid1,lid2,...,lid32]
+ * response:   +EMCFC:5,<MCF result>
+ * ind cb:     +EMCFRPT:<type>,<MCF result>
+ * mcf cmd:    mcf_cmd <-o dump> [-d lid1,lid2,...,lid32]
+ *******************************************************************************/
+static void mcf_cmd_op_dump_lid_data(int argc, char *argv[])
+{
+    uint32_t mipc_ret = 0, mcf_ret = 0xffffffff;
+
+    msg_req_ptr = mipc_msg_init(MIPC_SYS_MCF_REQ, mc.sim_ps_id);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_OP, MIPC_SYS_MCF_OP_DUMP_LID_DATA);
+    if (strcmp(mc.lid_str, "") != 0) {
+        mipc_msg_add_tlv(msg_req_ptr, MIPC_SYS_MCF_REQ_T_DUMP_LIDS, strlen(mc.lid_str) + 1, mc.lid_str);
+    }
+    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+
+    mipc_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_T_RESULT, MIPC_RESULT_FAILURE);
+    if (mipc_ret == MIPC_RESULT_SUCCESS) {
+        printf("MCF cmd SUCCESS op=\"%s\" mcf_result=%u\n",
+                mcf_get_map_str(mipc_msg_get_val_uint8(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_OP, 0xff), cmd_map, CMD_MAP_LEN),
+                mcf_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_MCF_RESULT, 0xffffffff));
+    } else {
+        log_mipc_result_fail(mipc_ret);
+    }
+
+    if(mcf_ret == RESULT_SUCCESS) {
+        mcf_thread_wait_ind_cb();
+    }
+}
+
+/*******************************************************************************
+ * origin cmd: AT+EMCFC=6,<config_type>,<path_type>,<config1 str>,<trigger_dsbp>,<is_reset>
+ * response:  +EMCFC:6,<MCF result>,<DSBP result>
+ * ind cb:    (if trigger_dsbp == 1) +EMCFRPT:<type>,<DSBP result>
+ * mcf cmd:   mcf_cmd <-o set> <-b bin_type> <-p path_folder> <-f file_name> <-r append_resetLID> [-t trigger_dsbp]
+ *******************************************************************************/
+static void mcf_cmd_op_set_file_path_and_auto_select_bin(int argc, char *argv[])
+{
+    uint32_t mipc_ret = 0, mcf_ret = 0xffffffff, dsbp_ret = 0xffffffff;
+
+    if ((mc.bin_type >= MCF_CMD_BIN_TYPE_MAX) || (mc.path_folder_idx >= MCF_CMD_PATH_TYPE_MAX) || (mc.file_name == NULL ) ||
+            (mc.is_trigger >= MCF_PARA_IS_MAX )|| (mc.appendOTA_resetLID >= MCF_PARA_IS_MAX)) {
+        log_op_error_parameter(MIPC_SYS_MCF_OP_SET_FILE_PATH_AND_AUTO_SELECT_BIN);
+        return;
+    }
+
+    msg_req_ptr = mipc_msg_init(MIPC_SYS_MCF_REQ, mc.sim_ps_id);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_OP, MIPC_SYS_MCF_OP_SET_FILE_PATH_AND_AUTO_SELECT_BIN);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_CONFIG_TYPE, mc.bin_type);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_PATH_TYPE, mc.path_folder_idx);
+    mipc_msg_add_tlv(msg_req_ptr, MIPC_SYS_MCF_REQ_T_CONFIG1, strlen(mc.file_name)+1, mc.file_name);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_TRIGGER_DSBP, mc.is_trigger);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_IS_RESET, mc.appendOTA_resetLID);
+    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+
+    mipc_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_T_RESULT, MIPC_RESULT_FAILURE);
+    if (mipc_ret == MIPC_RESULT_SUCCESS) {
+        printf("MCF cmd SUCCESS op=\"%s\" mcf_result=%u dsbp_result=%u\n",
+                mcf_get_map_str(mipc_msg_get_val_uint8(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_OP, 0xff), cmd_map, CMD_MAP_LEN),
+                mcf_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_MCF_RESULT, 0xffffffff),
+                dsbp_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_DSBP_RESULT, 0xffffffff));
+    } else {
+        log_mipc_result_fail(mipc_ret);
+    }
+
+    if (mcf_ret == RESULT_SUCCESS && dsbp_ret == RESULT_SUCCESS) {
+        mc.run_cmd_ret = RESULT_SUCCESS;
+        if(mc.is_trigger == MCF_CMD_IS_TRIGGER_TRUE) {
+            mcf_thread_wait_ind_cb();
+        }
+    }
+}
+
+/*******************************************************************************
+ * cmd:      AT+EMCFC=7,<action>
+ * response: +EMCFC:7,<MCF result>
+ * ind cb:   +EMCFRPT:<type>,<result>
+ * mcf cmd:  mcf_cmd <-o update> [-w with_ini]
+ *******************************************************************************/
+static void mcf_cmd_op_update_opota_file(int argc, char *argv[])
+{
+    uint32_t mipc_ret = 0, mcf_ret = 0xffffffff;
+
+    if (mc.is_with >= MCF_PARA_IS_MAX) {
+        log_op_error_parameter(MIPC_SYS_MCF_OP_UPDATE_OPOTA_FILE);
+        return;
+    }
+
+    msg_req_ptr = mipc_msg_init(MIPC_SYS_MCF_REQ, mc.sim_ps_id);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_OP, MIPC_SYS_MCF_OP_UPDATE_OPOTA_FILE);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_ACTION, mc.is_with);
+    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+
+    mipc_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_T_RESULT, MIPC_RESULT_FAILURE);
+    if (mipc_ret == MIPC_RESULT_SUCCESS) {
+        printf("MCF cmd SUCCESS op=\"%s\" mcf_result=%u\n",
+            mcf_get_map_str(mipc_msg_get_val_uint8(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_OP, 0xff), cmd_map, CMD_MAP_LEN),
+            mcf_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_MCF_RESULT, 0xffffffff));
+    } else {
+        log_mipc_result_fail(mipc_ret);
+    }
+
+    if (mcf_ret == RESULT_SUCCESS) {
+        mc.run_cmd_ret = RESULT_SUCCESS;
+        mcf_thread_wait_ind_cb();
+    }
+}
+
+/*******************************************************************************
+ * cmd:      AT+EMCFC=10,<format>,<action>,<record ID>,<number>,<config str>[,<length>],[,<value>]]
+ * response: +EMCFC:10,<format>,<action>,<mcf result>,<length>,<value>
+ * ind cb:   none
+ * mcf_cmd <-o read> <-b bin_type> <-g GID> [-i record_id] [-y array_index] [-l length]
+ * mcf_cmd <-o write> <-b bin_type> <-g GID> [-i record_id] [-y array_index] [-l length] <-v write_value>
+ *******************************************************************************/
+static void mcf_cmd_op_query_variable_value(int argc, char *argv[])
+{
+    uint32_t mipc_ret = 0, mcf_ret = 0xffffffff;
+    uint8_t action, ret_len, i;
+    char *ret_str;
+
+    if ((mc.bin_type >= MCF_CMD_BIN_TYPE_MAX) || (mc.gid == 0) || (mc.write_flag == WRITE_FLAG && mc.write_value == NULL)) {
+        log_op_error_parameter(MIPC_SYS_MCF_OP_QUERY_VARIABLE_VALUE);
+        return;
+    }
+
+    if (mc.write_flag != WRITE_FLAG) {
+        action = (mc.bin_type == MCF_CMD_BIN_TYPE_DEFAULT_BIN) ? MCF_CMD_VARIABLE_ACT_READ_OTA : MCF_CMD_VARIABLE_ACT_READ_OPOTA;
+    } else {
+        action = (mc.bin_type == MCF_CMD_BIN_TYPE_DEFAULT_BIN) ? MCF_CMD_VARIABLE_ACT_WRITE_OTA : MCF_CMD_VARIABLE_ACT_WRITE_OPOTA;
+    }
+
+    msg_req_ptr = mipc_msg_init(MIPC_SYS_MCF_REQ, mc.sim_ps_id);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_OP, MIPC_SYS_MCF_OP_QUERY_VARIABLE_VALUE);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_FORMAT, MCF_CMD_QUERY_VARIABLE_FORM_GID);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_ACTION, action);
+    mipc_msg_add_tlv_uint32(msg_req_ptr, MIPC_SYS_MCF_REQ_T_NUM, mc.gid);
+    mipc_msg_add_tlv_uint16(msg_req_ptr, MIPC_SYS_MCF_REQ_T_REC_ID, mc.record_id);
+    mipc_msg_add_tlv(msg_req_ptr, MIPC_SYS_MCF_REQ_T_CONFIG, strlen(mc.array_index)+1, mc.array_index);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_LEN, mc.data_length);
+    if (mc.write_flag == WRITE_FLAG) {
+        mipc_msg_add_tlv(msg_req_ptr, MIPC_SYS_MCF_REQ_T_VALUE, mc.real_write_length, mc.write_value);
+    }
+
+    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+    mipc_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_T_RESULT, MIPC_RESULT_FAILURE);
+    if (mipc_ret == MIPC_RESULT_SUCCESS) {
+        printf("MCF cmd SUCCESS op=\"%s\" mcf_result=%u bin_type=%u",
+                mcf_get_map_str(mipc_msg_get_val_uint8(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_OP, 0xff)+mc.write_flag, cmd_map, CMD_MAP_LEN),
+                mcf_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_MCF_RESULT, 0xffffffff),
+                (mipc_msg_get_val_uint8(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_ACTION, 0xff)%2 == 0) ? MCF_CMD_BIN_TYPE_DEFAULT_BIN : MCF_CMD_BIN_TYPE_CARRIER_BIN);
+        if (mcf_ret == RESULT_SUCCESS) {
+            mc.run_cmd_ret = RESULT_SUCCESS;
+            ret_len = mipc_msg_get_val_uint8(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_LEN, 0xff);
+            printf(" length=%u", ret_len);
+            if (mc.write_flag != WRITE_FLAG) {
+                ret_str = (char*)mipc_msg_get_val_ptr(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_VALUE, NULL);
+                printf(" value=\"");
+                for (i=0;i<ret_len;i++) {
+                    printf("%02X", *(ret_str + i));
+                }
+                printf("\"");
+            }
+        }
+        printf("\n");
+    } else {
+        log_mipc_result_fail(mipc_ret);
+    }
+}
+
+/*******************************************************************************
+ * cmd:      AT+EMCFC=11,<config_type>,<path_type>,<config1 str>
+ * response: +EMCFC:11,<MCF result>
+ * ind cb:   none
+ * mcf cmd:  mcf_cmd <-o merge> <-b bin_type> <-p path_folder> <-f file_name>
+ *******************************************************************************/
+static void mcf_cmd_op_assign_combined_path(int argc, char *argv[])
+{
+    uint32_t mipc_ret = 0, mcf_ret = 0xffffffff;
+
+    if ((mc.bin_type >= MCF_CMD_BIN_TYPE_MAX) || (mc.path_folder_idx >= MCF_CMD_PATH_TYPE_MAX) || (mc.file_name == NULL)) {
+        log_op_error_parameter(MIPC_SYS_MCF_OP_ASSIGN_COMBINED_PATH);
+        return;
+    }
+
+    msg_req_ptr = mipc_msg_init(MIPC_SYS_MCF_REQ, mc.sim_ps_id);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_OP, MIPC_SYS_MCF_OP_ASSIGN_COMBINED_PATH);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_CONFIG_TYPE, mc.bin_type);
+    mipc_msg_add_tlv_uint8(msg_req_ptr, MIPC_SYS_MCF_REQ_T_PATH_TYPE, mc.path_folder_idx);
+    mipc_msg_add_tlv(msg_req_ptr, MIPC_SYS_MCF_REQ_T_CONFIG1, strlen(mc.file_name)+1, mc.file_name);
+    msg_cnf_ptr = mipc_msg_sync(msg_req_ptr);
+
+    mipc_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_T_RESULT, MIPC_RESULT_FAILURE);
+    if (mipc_ret == MIPC_RESULT_SUCCESS) {
+        printf("MCF cmd SUCCESS op=\"%s\" mcf_result=%u\n",
+                mcf_get_map_str(mipc_msg_get_val_uint8(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_OP, 0xff), cmd_map, CMD_MAP_LEN),
+                mcf_ret = mipc_msg_get_val_uint32(msg_cnf_ptr, MIPC_SYS_MCF_CNF_T_MCF_RESULT, 0xffffffff));
+        if (mcf_ret == RESULT_SUCCESS) {
+            mc.run_cmd_ret = RESULT_SUCCESS;
+        }
+    } else {
+        log_mipc_result_fail(mipc_ret);
+    }
+}
+
+static void mcf_system_reboot(void)
+{
+    printf("MCF system reboot\n");
+    system("reboot");
+}
+
+int main(int argc, char *argv[])
+{
+    mcf_cmd_parameters_init();
+    mcf_cmd_parameters_parser(argc, argv);
+    if (mc.opnum != PARA_INT8_ERROE_MAX)
+    {
+        mcf_mipc_init();
+        switch (mc.opnum) {
+            case MIPC_SYS_MCF_OP_GET_APPLIED_FILE_PATH:
+                mcf_cmd_op_get_applied_file_path(argc, argv);
+                break;
+            case MIPC_SYS_MCF_OP_DUMP_LID_DATA:
+                mcf_cmd_op_dump_lid_data(argc, argv);
+                break;
+            case MIPC_SYS_MCF_OP_SET_FILE_PATH_AND_AUTO_SELECT_BIN:
+                mcf_cmd_op_set_file_path_and_auto_select_bin(argc, argv);
+                break;
+            case MIPC_SYS_MCF_OP_UPDATE_OPOTA_FILE:
+                mcf_cmd_op_update_opota_file(argc, argv);
+                break;
+            case MIPC_SYS_MCF_OP_QUERY_VARIABLE_VALUE:
+                mcf_cmd_op_query_variable_value(argc, argv);
+                break;
+            case MIPC_SYS_MCF_OP_ASSIGN_COMBINED_PATH:
+                mcf_cmd_op_assign_combined_path(argc, argv);
+                break;
+            case 99:
+                mcf_system_reboot();
+            default:
+                break;
+        }
+        mcf_mipc_deinit();
+    }
+    mcf_cmd_parameters_free();
+    return mc.run_cmd_ret;
+}
+
diff --git a/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_custom/mipc.release.tar.gz b/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_custom/mipc.release.tar.gz
old mode 100644
new mode 100755
index 128cc21..a20cb06
--- a/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_custom/mipc.release.tar.gz
+++ b/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_custom/mipc.release.tar.gz
Binary files differ
diff --git a/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_wide_temp_custom/mipc.release.tar.gz b/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_wide_temp_custom/mipc.release.tar.gz
old mode 100644
new mode 100755
index 128cc21..268ff16
--- a/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_wide_temp_custom/mipc.release.tar.gz
+++ b/src/telephonyware/3.0/mipc/mt2735_ivt_nlwg_wide_temp_custom/mipc.release.tar.gz
Binary files differ
diff --git a/src/telephonyware/3.0/mipc/mt6890_evb_nlwg_custom/mipc.release.tar.gz b/src/telephonyware/3.0/mipc/mt6890_evb_nlwg_custom/mipc.release.tar.gz
new file mode 100755
index 0000000..0680522
--- /dev/null
+++ b/src/telephonyware/3.0/mipc/mt6890_evb_nlwg_custom/mipc.release.tar.gz
Binary files differ
diff --git a/src/telephonyware/3.0/mtk_nvram/src/libfile_op/libfile_op.c b/src/telephonyware/3.0/mtk_nvram/src/libfile_op/libfile_op.c
old mode 100644
new mode 100755
index 0de1590..815e641
--- a/src/telephonyware/3.0/mtk_nvram/src/libfile_op/libfile_op.c
+++ b/src/telephonyware/3.0/mtk_nvram/src/libfile_op/libfile_op.c
@@ -5599,7 +5599,7 @@
 
 //-----------------------------------------------------------------------------
 bool FileOp_BackupDataToFiles(int * iFileMask, bool bWorkForBinRegion) {
-	DIR *dir;
+	DIR *dir = NULL;
 	struct dirent *entry;
 	struct stat statbuf;
 	const char* lpSrcDirName = NULL;
diff --git a/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.h b/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.h
old mode 100644
new mode 100755
index d0ec5c4..a8a1e3e
--- a/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.h
+++ b/src/telephonyware/3.0/netagent/src/libnetagent/MdEventHandler.h
@@ -60,7 +60,7 @@
 //xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx.xxx

 

 #define INVALID_TRANS_ID -1

-#define UCI_CONFIG_FILE "/etc/config/system"

+#define UCI_CONFIG_FILE "/etc/config/radio_property"

 

 void onEifIndCallback(mipc_msg_t *msg_ptr, void *priv_ptr);

 void onEIpPortCallback(mipc_msg_t *msg_ptr, void *priv_ptr);

diff --git a/src/telephonyware/3.0/netagent/src/libnetagent/nautils/common/sysutils/NetlinkEvent.cpp b/src/telephonyware/3.0/netagent/src/libnetagent/nautils/common/sysutils/NetlinkEvent.cpp
old mode 100644
new mode 100755
index 3d4d3a1..87fd5ce
--- a/src/telephonyware/3.0/netagent/src/libnetagent/nautils/common/sysutils/NetlinkEvent.cpp
+++ b/src/telephonyware/3.0/netagent/src/libnetagent/nautils/common/sysutils/NetlinkEvent.cpp
@@ -69,7 +69,7 @@
 #define SLOGE(fmt, ...) syslog(LOG_ERR, fmt, ##__VA_ARGS__)
 #endif
 
-#define UCI_CONFIG_FILE "/etc/config/system"
+#define UCI_CONFIG_FILE "/etc/config/radio_property"
 
 void clearRaInfoFlag(char *buff);
 // remark due to not support mtk_properties