[Feature]Upload Modem source code

Change-Id: Id4294f30faced84d3e6fd6d5e61e1111bf287a37
diff --git a/mcu/service/mcf/src/mcf_if.c b/mcu/service/mcf/src/mcf_if.c
new file mode 100644
index 0000000..068c57a
--- /dev/null
+++ b/mcu/service/mcf/src/mcf_if.c
@@ -0,0 +1,11901 @@
+/*****************************************************************************
+*  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) 2018
+*
+*  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_if.c
+ *
+ * Project:
+ * --------
+ *   UMOLYA
+ *
+ * Description:
+ * ------------
+ *   MD Configuration Framework public interface implementation.
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *==============================================================================
+ *                 HISTORY
+ * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *------------------------------------------------------------------------------
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ *
+ * removed!
+ *
+ * removed!
+ *
+ * removed!
+ *
+ * removed!
+ *
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *------------------------------------------------------------------------------
+ * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
+ *==============================================================================
+ *******************************************************************************/
+
+#include "kal_public_api.h"
+#include "fs_general_api.h"
+#include <math.h>
+
+#include "md_sap.h"
+#include "md_svc_sap.h"
+#include "em_msgid.h"
+#include "em_l4_common_public_struct.h"
+#include "em_mcf_public_struct.h"
+#include "nvram_interface.h"
+
+#include "mcf_nvram_editor.h"
+#include "mcf_msgid.h"
+#include "mcf_custom.h"
+#include "mcf_defs.h"
+#include "mcf_if.h"
+#include "mcf_debug.h"
+#include "mcf_util.h"
+#include "mcf_object.h"
+#include "mcf_utfwk.h"
+
+/*------------------------------------------------------------------------------
+ * Global variables.
+ *----------------------------------------------------------------------------*/
+extern MCF_DB_LID_MAPPING mcf_db_lid_mapping_tbl[];
+extern mcf_dump_param_struct mcf_dump_param_tbl[];
+extern kal_uint32 mcf_dump_param_tbl_num;
+
+kal_uint8 mcf_dump_buffer[MCF_MAX_DUMP_SIZE + MCF_MAX_RECORD_CNT * MCF_DUMP_LID_HEADER_SIZE];
+nvram_mcf_lid_info_struct   mcf_last_mod_lid_g = {0};
+nvram_mcf_lid_info_struct   mcf_curr_mod_lid_g = {0};
+nvram_mcf_lid_info_struct   mcf_tlvota_last_mod_lid_g[MAX_SIM_NUM] = {0};
+nvram_mcf_lid_info_struct   mcf_tlvota_curr_mod_lid_g[MAX_SIM_NUM] = {0};
+nvram_mcf_lid_info_struct   mcf_general_tlvota_last_mod_lid_g[MAX_SIM_NUM] = {0};
+nvram_mcf_lid_info_struct   mcf_general_tlvota_curr_mod_lid_g[MAX_SIM_NUM] = {0};
+kal_char    txt_buff[64];
+kal_bool    is_read_tlvota[MAX_SIM_NUM] = {0};
+kal_bool    is_read_general_tlvota[MAX_SIM_NUM] = {0};
+kal_bool    is_update_tlvota[MAX_SIM_NUM];
+nvram_ef_mcf_internal_info_struct nv_int_info;
+kal_char   mcf_gid_buff[256];
+mcf_ota_result_e set_op_read_ret[MAX_SIM_NUM];
+
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+kal_uint8 mcf_merge_buffer[MCF_MAX_FILE_SIZE];
+kal_uint8 mcf_file_buffer[MCF_MAX_FILE_SIZE];
+kal_wchar merge_ota_name[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+#endif
+
+kal_uint8 dsbp_ret = 0;
+
+/*------------------------------------------------------------------------------
+ * Helper macro.
+ *----------------------------------------------------------------------------*/
+ 
+ 
+/*------------------------------------------------------------------------------
+ * Private data structure.
+ *----------------------------------------------------------------------------*/
+typedef struct tm MCF_TIME_STRUCT;
+
+/*------------------------------------------------------------------------------
+ * Private variables.
+  *----------------------------------------------------------------------------*/
+
+/*------------------------------------------------------------------------------
+ * Extern fucntions.
+ *----------------------------------------------------------------------------*/
+extern kal_char* release_verno(void);
+extern kal_char* build_date_time(void);
+extern sim_interface_enum l4c_gemini_get_actual_sim_id(sim_interface_enum simId);
+extern sim_interface_enum l4c_gemini_get_switched_sim_id(sim_interface_enum simId);
+extern void mcf_merge_make_ota_file_header(mcf_tool_file_info_t *output_header, mcf_tool_file_info_t *copy_header);
+
+/*------------------------------------------------------------------------------
+ * Private fucntions.
+ *----------------------------------------------------------------------------*/
+_STATIC kal_bool mcf_check_tag_match(
+    mcf_tool_tlvota_file_item_t *pItem,
+    mcf_tlvota_tag_t *tag_entry,
+    kal_uint32 tag_num,
+    kal_uint32 *match_idx)
+{
+    kal_uint32  tag_cnt = 0;
+
+    ASSERT(pItem);
+    ASSERT(tag_entry);
+    ASSERT(tag_num >= 0);
+
+    while(tag_cnt < tag_num) {
+        if ( (pItem->tag_type == tag_entry[tag_cnt].tag_type) && (strncmp(&(pItem->buff_start), tag_entry[tag_cnt].tag, pItem->tag_len) == 0) ) {
+            *match_idx = tag_cnt;
+
+            return KAL_TRUE;
+        }
+
+        tag_cnt++;
+    }
+
+    return KAL_FALSE;
+}
+
+_STATIC kal_bool mcf_v2_check_tag_match(
+    mcf_tool_gid_tlvota_file_item_t *pItem,
+    mcf_tlvota_tag_t *tag_entry,
+    kal_uint32 tag_num,
+    kal_uint32 *match_idx)
+{
+    kal_uint32  tag_cnt = 0;
+
+    ASSERT(pItem);
+    ASSERT(tag_entry);
+    ASSERT(tag_num >= 0);
+
+    while(tag_cnt < tag_num) {
+        if ( (pItem->tag_type == tag_entry[tag_cnt].tag_type) && (strncmp(&(pItem->buff_start), tag_entry[tag_cnt].tag, pItem->tag_len) == 0) ) {
+            *match_idx = tag_cnt;
+
+            return KAL_TRUE;
+        }
+
+        tag_cnt++;
+    }
+
+    return KAL_FALSE;
+}
+
+_STATIC mcf_ota_result_e mcf_fill_tag_entry(mcf_tlvota_sbp_tag_t sbp_tag, kal_bool is_general, mcf_tlvota_tag_t *tag_entry, kal_uint32 *tag_num)
+{
+    mcf_ota_result_e                    ret = MCF_OTA_R_SUCCESS;
+    static kal_char                     tag[4][MCF_MAX_TAG_LEN];
+	kal_int32                           ret_snprintf;
+
+    kal_mem_set(tag, 0, sizeof(kal_char) * 4 * MCF_MAX_TAG_LEN);
+    *tag_num = 0;
+    /* Fill tag entry */
+    if (sbp_tag.sbp_id != SBP_ID_INVALID) {
+        if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
+            if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // sbpid_mcc_mnc case
+                /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
+                if (is_general == KAL_TRUE){
+                    /* NA_mcc_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+
+                    /* NA_mcc_mnc */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+                }else{
+                    /* Reuse tag_entry */
+                    *tag_num = 0;
+                    /* NA_NA_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+
+                    /* sbpid_NA_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+
+                    /* sbpid_mcc_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+
+                    /* sbpid_mcc_mnc */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_%s_%s", sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "SBP_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+                }
+            } else { // sbpid_mcc_NA case
+                /* NA_mcc_NA case should be updated first */
+                if (is_general == KAL_TRUE){
+                    /* NA_mcc_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+                }else{
+                    /* Reuse tag_entry */
+                    *tag_num = 0;
+                    /* NA_NA_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+
+                    /* sbpid_NA_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+
+                    /* sbpid_mcc_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+                }
+            }
+        } else {
+            if (strcmp((kal_char *)sbp_tag.mnc, "") == 0) { // sbpid_NA_NA case
+                if (is_general == KAL_FALSE){
+                    /* NA_NA_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+
+                    /* sbpid_NA_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+                }
+            } else { // sbpid_NA_mnc case is not allowed!!
+                MD_TRC_MCF_TR_FILL_TAG_ENTRY_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                ret = MCF_OTA_R_INVALID_SBP_TAG;
+
+                return ret;
+            }
+        }
+    } else {
+        if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
+            if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // NA_mcc_mnc case
+                /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
+                if (is_general == KAL_TRUE){
+                    /* NA_mcc_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+
+                    /* NA_mcc_mnc */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+                }else{
+                    /* Reuse tag_entry */
+                    *tag_num = 0;
+                    /* NA_NA_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+                }
+            } else { // NA_mcc_NA case
+                /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
+                if (is_general == KAL_TRUE){
+                    /* NA_mcc_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+
+                }else{
+                    /* Reuse tag_entry */
+                    *tag_num = 0;
+                    /* NA_NA_NA */
+                    tag_entry[*tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                    ret_snprintf = kal_snprintf(tag[*tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+					if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+						strncpy(tag[*tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+						MD_TRC_MCF_TR_FILL_TAG_ENTRY_SNPRINTF_FAIL(tag[*tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+					}
+                    tag_entry[*tag_num].tag_len = strlen(tag[*tag_num]);
+                    tag_entry[*tag_num].tag = tag[*tag_num];
+                    *tag_num = *tag_num +1;
+                }
+            }
+        } else { // NA_NA_mnc cases is not allowed!!
+            MD_TRC_MCF_TR_FILL_TAG_ENTRY_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+            ret = MCF_OTA_R_INVALID_SBP_TAG;
+
+            return ret;
+        }
+    }
+    return ret;
+}
+_STATIC void mcf_v1_read_tlvota_buffer_tag_update_flow(mcf_tlvota_file_t *tlvota_file, mcf_tlvota_tag_t *tag_entry, kal_uint32 tag_num, nvram_lid_enum lid, kal_uint8 *buffer)
+{
+    mcf_tool_file_info_t           *pFile;
+    mcf_tool_tlvota_file_item_t    *pItem;
+    kal_uint16                      item_cnt = 0;
+    kal_uint16                      item_byte_offset;
+    kal_uint16                      item_bit_offset;
+    kal_uint32                      item_size;
+    kal_uint32                      match_idx;
+    kal_char                        item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
+    mcf_tag_info_struct             unuse = {0};
+    MCF_DB_STRUCT_VARIABLE          const *unuse_db_ptr = NULL;
+    
+    pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+    pItem = (mcf_tool_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+    /* Read changed items from TLV-OTA file */
+    while (item_cnt < pFile->item_num) {
+        /* Check if LID and tag match */       
+        if ( (pItem->lid != lid) || (mcf_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
+            goto next;
+        }
+
+        /* Check if item_tag_len is valid */
+        if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+            mcf_utfwk_printf("Invalid item_tag_len(%d)!! max item_tag_len(%d) \r\n", pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+            goto next;
+        }
+
+        /* Update LID item */
+        if (pItem->is_bit_op == 0) {
+            strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
+            item_tag[pItem->item_tag_len] = '\0';
+            if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+                goto next;
+            }
+
+            if (pItem->op.byte.value_len > item_size) {
+                MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
+                mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->op.byte.value_len, item_size);
+
+                goto next;
+            }
+
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BYTE_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, pItem->op.byte.value_len);
+            mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
+
+            kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
+        } else {
+            kal_uint32 bit_value = 0;
+            kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
+
+            kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.bit.value_len);
+
+            strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
+            item_tag[pItem->item_tag_len] = '\0';
+            if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+                goto next;
+            }
+
+            if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
+                MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+
+                goto next;
+            }
+
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BIT_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, item_bit_offset, pItem->op.bit.len, pItem->op.bit.value_len, bit_value);
+
+            if (pItem->op.bit.value_len == 1) {
+                kal_uint8 *val_tmp = (kal_uint8 *)(buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            } else if (pItem->op.bit.value_len == 2) {
+                kal_uint16 *val_tmp = (kal_uint16 *)(buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            } else if (pItem->op.bit.value_len == 4) {
+                kal_uint32 *val_tmp = (kal_uint32 *)(buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            }
+        }
+
+next:
+        pItem = (mcf_tool_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+        item_cnt++;
+    }
+    MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+}
+
+_STATIC mcf_ota_result_e mcf_read_tlvota_buffer_multi_tag(
+    kal_uint8 ps_id,
+    mcf_tlvota_tag_t *tag_entry,
+    kal_uint32 tag_num,
+    nvram_lid_enum lid,
+    kal_uint8 *buffer,
+    kal_uint32 size)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t               *pFile;
+    mcf_tool_gid_tlvota_file_item_t    *pItem;
+    sim_interface_enum                  sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+    mcf_tlvota_file_t                  *tlvota_file = &(pMcf->general_tlvota_file);
+    nvram_ltable_entry_struct           lid_info;
+    kal_uint16                          item_cnt = 0;
+    kal_uint32                          match_idx;
+    nvram_errno_enum                    nvram_api_ret;
+    mcf_ota_result_e                    ret = MCF_OTA_R_SUCCESS;
+    kal_uint16                          item_byte_offset;
+    kal_uint16                          item_bit_offset;
+    kal_uint32                          item_size;
+    kal_char                            array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+    kal_bool                            item_is_bit = KAL_FALSE;
+    kal_uint16                          item_lid;
+
+    ASSERT(buffer);
+    ASSERT(size > 0);
+    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_START(ps_id, sim_id, tag_num);
+
+    MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+        /* Check if file type is TLV-OTA file */
+        if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+            kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+
+            mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_FILE(str_tmp);
+            ret = MCF_OTA_R_INVALID_FILE;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+        if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+            mcf_utfwk_printf("Fail to get LID information!! LID(%d), nvram_api_ret(%d) \r\n", lid, nvram_api_ret);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        if (size != lid_info.size) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_SIZE(size, lid, lid_info.size);
+            mcf_utfwk_printf("Invalid buffer_size(%d)!! LID(%d), record_size(%d) \r\n", size, lid, lid_info.size);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) == 0 ) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_ATTR_NOT_SET(lid, lid_info.attr);
+            mcf_utfwk_printf("ERROR!! OTA by op attribute is not set! LID(%d), attribute(%x) \r\n", lid, lid_info.attr);
+            ret = MCF_OTA_R_INVALID_ATTR;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+        if (pFile->file_version == 2){
+            mcf_v1_read_tlvota_buffer_tag_update_flow(tlvota_file, tag_entry, tag_num, lid, buffer);
+        }else if (pFile->file_version == 3){
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+            /* Read changed items from TLV-OTA file */
+            while (item_cnt < pFile->item_num) {
+                /* Check if array_index_len is valid */
+                if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+                    mcf_utfwk_printf("Invalid array_index_len(%d)!! max array_index_len(%d) \r\n", pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+                    goto next;
+                }
+                strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
+                array_tag[pItem->array_index_len] = '\0';
+
+                /* Find GID corresponding LID */
+                item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+                if (item_lid == 65535){
+                    //-1(65535) means not found
+                    goto next;
+                }
+                
+                /* Check if LID and tag match */
+                if ( (item_lid != lid) || (mcf_v2_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
+                    goto next;
+                }
+
+
+                if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+                    goto next;
+                }
+
+                /* Update LID item */
+                if (item_is_bit == 0) {
+                    if (pItem->value_len > item_size) {
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_LARGE_VAL_LEN(pItem->value_len, item_size);
+                        mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->value_len, item_size);
+
+                        goto next;
+                    }
+
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BYTE_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, pItem->value_len);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BYTE_UPDATE, lid, tag_entry[match_idx].tag, item_byte_offset, pItem->value_len);
+                    mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+                    kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+					nv_int_info.update_general_tlvota_result = KAL_TRUE;
+                } else {
+                    kal_uint32 bit_value = 0;
+                    kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+					kal_uint32 offset = 0;
+					kal_uint32 var_size = 1;
+					kal_uint32 val_tmp = 0;
+
+                    kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+                    if (pItem->value_len > 4) {
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BIT_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, item_bit_offset, item_size, pItem->value_len, bit_value);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_READ_TLVOTA_BUFFER_MULTI_TAG_BIT_UPDATE, lid, tag_entry[match_idx].tag, item_byte_offset, item_bit_offset, item_size, pItem->value_len, bit_value);
+                    
+                    if (item_size > 8 && item_size <= 16) {
+                        var_size = 2;
+                    }else if (item_size > 16 && item_size <= 24) {
+                        var_size = 3;
+                    }else if (item_size > 24 && item_size <= 32) {
+                        var_size = 4;
+                    }
+
+                    if (item_bit_offset > 0 && item_bit_offset < 8) {
+                        offset = 0;
+                    }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        offset = 1;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        offset = 2;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        offset = 3;
+                    }else if (item_bit_offset >= 32){
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    if (item_bit_offset > 0) {
+                        if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+                            var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+                        }
+                    }
+                    if(var_size > 4){
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        item_bit_offset -= 8;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        item_bit_offset -= 16;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        item_bit_offset -= 24;
+                    }
+
+
+                    kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
+                    val_tmp &= ~(bit_mask << item_bit_offset);
+                    val_tmp |= (bit_value << item_bit_offset);
+
+                    kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
+					nv_int_info.update_general_tlvota_result = KAL_TRUE;
+                }
+
+        next:
+                pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+                item_cnt++;
+            }
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        }
+    } else {
+        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_MULTI_TAG_TAKE_READ_LOCK_FAIL();
+        mcf_utfwk_printf("Fail to take read lock!! \r\n");
+        ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+    }
+
+    return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_read_tlvota_buffer_sbp_multi_tag(
+    kal_uint8 ps_id,
+    mcf_tlvota_tag_t *tag_entry,
+    kal_uint32 tag_num,
+    nvram_lid_enum lid,
+    kal_uint8 *buffer,
+    kal_uint32 size)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t               *pFile;
+    mcf_tool_gid_tlvota_file_item_t    *pItem;
+    sim_interface_enum                  sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+    mcf_tlvota_file_t                  *tlvota_file;
+    nvram_ltable_entry_struct           lid_info;
+    kal_uint16                          item_cnt = 0;
+    kal_uint32                          match_idx;
+    nvram_errno_enum                    nvram_api_ret;
+    mcf_ota_result_e                    ret = MCF_OTA_R_SUCCESS;
+    kal_uint16                          item_byte_offset;
+    kal_uint16                          item_bit_offset;
+    kal_uint32                          item_size;
+    kal_char                            array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+    kal_bool                            item_is_bit = KAL_FALSE;
+    kal_uint16                          item_lid;
+
+    ASSERT(buffer);
+    ASSERT(size > 0);
+    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_START(ps_id, sim_id, tag_num);
+    
+    if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+		MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_SIM_ID(ps_id, sim_id);
+		ret = MCF_OTA_R_INVALID_PARAMETER;
+
+		return ret;
+	}
+    tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+    MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+        /* Check if file type is TLV-OTA file */
+        if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+            kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+
+            mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_FILE(str_tmp);
+            ret = MCF_OTA_R_INVALID_FILE;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+        if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+            mcf_utfwk_printf("Fail to get LID information!! LID(%d), nvram_api_ret(%d) \r\n", lid, nvram_api_ret);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        if (size != lid_info.size) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_SIZE(size, lid, lid_info.size);
+            mcf_utfwk_printf("Invalid buffer_size(%d)!! LID(%d), record_size(%d) \r\n", size, lid, lid_info.size);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) == 0 ) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_ATTR_NOT_SET(lid, lid_info.attr);
+            mcf_utfwk_printf("ERROR!! OTA by op attribute is not set! LID(%d), attribute(%x) \r\n", lid, lid_info.attr);
+            ret = MCF_OTA_R_INVALID_ATTR;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+        if (pFile->file_version == 2){
+            mcf_v1_read_tlvota_buffer_tag_update_flow(tlvota_file, tag_entry, tag_num, lid, buffer);
+        }else if (pFile->file_version == 3){
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+            /* Read changed items from TLV-OTA file */
+            while (item_cnt < pFile->item_num) {
+                /* Check if array_index_len is valid */
+                if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+                    goto next;
+                }
+                strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
+                array_tag[pItem->array_index_len] = '\0';
+                
+                /* Find GID corresponding LID */
+                item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+                if (item_lid == 65535){
+                    //-1(65535) means not found
+                    goto next;
+                }
+
+                /* Check if LID and tag match */
+                if ( (item_lid != lid) || (mcf_v2_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
+                    goto next;
+                }
+                
+                if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+                    goto next;
+                }
+
+                /* Update LID item */
+                if (item_is_bit == 0) {
+                    if (pItem->value_len > item_size) {
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_LARGE_VAL_LEN(pItem->value_len, item_size);
+                        mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n", pItem->value_len, item_size);
+
+                        goto next;
+                    }
+
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_BYTE_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, pItem->value_len);
+                    mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+                    kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+					nv_int_info.update_tlvota_result[sim_id] = KAL_TRUE;
+                } else {
+                    kal_uint32 bit_value = 0;
+                    kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+					kal_uint32 offset = 0;
+					kal_uint32 var_size = 1;
+					kal_uint32 val_tmp = 0;
+
+                    kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+                    if (pItem->value_len > 4) {
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_BIT_UPDATE(lid, tag_entry[match_idx].tag, item_byte_offset, item_bit_offset, item_size, pItem->value_len, bit_value);
+
+                    if (item_size > 8 && item_size <= 16) {
+                        var_size = 2;
+                    }else if (item_size > 16 && item_size <= 24) {
+                        var_size = 3;
+                    }else if (item_size > 24 && item_size <= 32) {
+                        var_size = 4;
+                    }
+
+                    if (item_bit_offset > 0 && item_bit_offset < 8) {
+                        offset = 0;
+                    }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        offset = 1;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        offset = 2;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        offset = 3;
+                    }else if (item_bit_offset >= 32){
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    if (item_bit_offset > 0) {
+                        if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+                            var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+                        }
+                    }
+                    if(var_size > 4){
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        item_bit_offset -= 8;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        item_bit_offset -= 16;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        item_bit_offset -= 24;
+                    }
+
+
+                    kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
+                    val_tmp &= ~(bit_mask << item_bit_offset);
+                    val_tmp |= (bit_value << item_bit_offset);
+
+                    kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
+					nv_int_info.update_tlvota_result[sim_id] = KAL_TRUE;
+                }
+
+        next:
+                pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+                item_cnt++;
+            }
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        }
+    } else {
+        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_MULTI_TAG_TAKE_READ_LOCK_FAIL();
+        mcf_utfwk_printf("Fail to take read lock!! \r\n");
+        ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+    }
+
+    return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_set_dsbp_mode(kal_bool is_ignore_dsbp, kal_bool is_general, sim_interface_enum sim_id)
+{
+    mcf_ota_result_e            ret = MCF_OTA_R_SUCCESS;
+	
+	MD_TRC_MCF_TR_SET_DSBP_MODE_START(is_ignore_dsbp, is_general, sim_id);
+    
+    if(sim_id < 0 || sim_id >= MAX_SIM_NUM){
+        MD_TRC_MCF_TR_SET_DSBP_MODE_INVALID_SIM_ID(sim_id);
+    }
+    
+    kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+    /* Read MCF SW information in NVRAM */
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+        MD_TRC_MCF_TR_SET_DSBP_MODE_READ_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+        ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+        return ret;
+    }
+    
+    if (is_general == KAL_FALSE){
+        if(sim_id >= 0 && sim_id < MAX_SIM_NUM){
+            nv_int_info.tlvota_is_ignore_dsbp[sim_id] = is_ignore_dsbp;
+        }
+    }else{
+        nv_int_info.general_is_ignore_dsbp = is_ignore_dsbp;
+    }
+
+    /* Write MCF SW information in NVRAM */
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+        MD_TRC_MCF_TR_SET_DSBP_MODE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+        ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+        return ret;
+    }
+
+    return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_set_not_reset(kal_bool not_reset, l4c_mcf_config_type_enum config_type, sim_interface_enum sim_id)
+{
+    mcf_ota_result_e            ret = MCF_OTA_R_SUCCESS;
+	
+	if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+        MD_TRC_MCF_TR_SET_NOT_RESET_INVALID_SIM_ID(sim_id);
+        ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return ret;
+    }
+    
+    kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+    /* Read MCF SW information in NVRAM */
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+        MD_TRC_MCF_TR_SET_NOT_RESET_READ_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+        ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+        return ret;
+    }
+
+    switch (config_type)
+    {
+        case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+            nv_int_info.not_reset_ota = not_reset;
+            break;
+        case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+            nv_int_info.not_reset_tlvota[sim_id] = not_reset;
+            break;
+        case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
+            nv_int_info.not_reset_general_tlvota = not_reset;
+            break;
+        default:
+            MD_TRC_MCF_TR_SET_NOT_RESET_INVALID_CONFIG_TYPE(config_type);
+            ret = KAL_FALSE;
+            break;
+    }
+
+    /* Write MCF SW information in NVRAM */
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+        MD_TRC_MCF_TR_SET_NOT_RESET_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+        ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+        return ret;
+    }
+
+    return ret;
+}
+
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+_STATIC mcf_ota_result_e mcf_store_tlvota_modified_lid(sim_interface_enum sim_id, mcf_tlvota_sbp_tag_t sbp_tag, kal_bool is_general)
+#else
+_STATIC mcf_ota_result_e mcf_store_tlvota_modified_lid(sim_interface_enum sim_id, mcf_tlvota_sbp_tag_t sbp_tag, kal_bool is_general, kal_bool not_reset, kal_bool set_combined)
+#endif
+{
+    mcf_t                                  *pMcf = mcf_get_instance();
+    mcf_ota_result_e                        ret = MCF_OTA_R_SUCCESS;
+    mcf_tlvota_tag_t                        tag_entry[4];
+    kal_uint32                              tag_num = 0;
+    kal_uint16                              pre_LID = 0;
+    kal_int16                               pos = -1;
+    kal_uint16                              in_pos = 0;
+    mcf_tool_file_info_t                   *pFile;
+    mcf_tool_gid_tlvota_file_item_t        *pItem;
+    nvram_ltable_entry_struct               lid_info;
+    kal_uint16                              item_cnt = 0;
+    kal_uint32                              match_idx;
+    nvram_errno_enum                        nvram_api_ret;
+    kal_uint16                              dummy_byte_offset;
+    kal_uint16                              dummy_bit_offset;
+    kal_uint32                              dummy_size;
+    kal_bool                                dummy_is_bit;
+    kal_char                                array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+    kal_uint16                              item_lid = 65535;
+    mcf_tlvota_file_t                      *tlvota_file;
+	mcf_tlvota_tag_t                        iccid_tag;
+	kal_char                                iccid[21];
+
+    MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_START(sim_id, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc, is_general);
+
+    #if defined(__MCF_COMBINE_FILE_SUPPORT__)
+    MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_NOT_RESET(not_reset);
+#endif
+
+	if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+		MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_SIM_ID(sim_id);
+		ret = MCF_OTA_R_INVALID_PARAMETER;
+
+		return ret;
+	}
+    
+    kal_mem_set(tag_entry, 0, sizeof(mcf_tlvota_tag_t) * 4);
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    kal_mem_set(&mcf_general_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_ef_mcf_tlvota_file_info_struct));
+    kal_mem_set(&iccid_tag, 0, sizeof(mcf_tlvota_tag_t));
+    
+    ret = mcf_fill_tag_entry(sbp_tag, is_general, tag_entry, &tag_num);
+    if (ret != MCF_OTA_R_SUCCESS){
+        return ret;
+    }
+	tlvota_file = &(pMcf->tlvota_file[sim_id]);
+    if (is_general == KAL_TRUE){
+		if (com_Mcf.is_iccid == KAL_TRUE){
+			kal_mem_set(&iccid_tag, 0, sizeof(mcf_tlvota_tag_t));
+			iccid_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+			
+			MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			if (tlvota_file){
+				kal_mem_cpy(&iccid, tlvota_file->iccid, 21);
+				iccid_tag.tag = iccid;
+				iccid_tag.tag_len = strlen((kal_char *)tlvota_file->iccid);
+				
+				MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			}else {
+				MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_TAKE_READ_LOCK_FAIL();
+				ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+				return ret;
+			}
+		}
+		
+		tlvota_file = &(pMcf->general_tlvota_file);
+    }
+    
+    MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+        /* Check if file type is TLV-OTA file */
+        if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+            kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+
+            mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+            MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_FILE(str_tmp);
+            ret = MCF_OTA_R_INVALID_FILE;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        }else{
+			if (pFile->file_version == 3){
+				pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+				/* Read changed LID from TLV-OTA file */
+				while (item_cnt < pFile->item_num) {
+					/* Check if array_index_len is valid */
+					if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+						MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+						goto next;
+					}
+					strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
+					array_tag[pItem->array_index_len] = '\0';
+					
+					/* Find GID corresponding LID */
+					item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+					if (item_lid == 65535){
+						//-1(65535) means not found
+						goto next;
+					}
+					
+					if ( (item_lid == pre_LID)){
+						goto next;
+					}
+
+					/* Check if LID and tag match */
+					if ((mcf_v2_check_tag_match(pItem, tag_entry, tag_num, &match_idx) == KAL_FALSE) ) {
+						if (com_Mcf.is_iccid == KAL_TRUE){
+							if ((pItem->tag_type != iccid_tag.tag_type) || (strncmp(&(pItem->buff_start), iccid_tag.tag, pItem->tag_len) != 0) ) {
+								goto next;
+							}
+						}else{
+							goto next;
+						}
+					}
+
+					if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &dummy_byte_offset, &dummy_bit_offset, &dummy_size, &dummy_is_bit) == KAL_FALSE){
+						goto next;
+					}
+					
+					/* Store last time modified LID */
+					nvram_api_ret = nvram_external_get_lid_info(item_lid, &lid_info);
+					if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+						MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_GET_LID_INFO_FAIL(item_lid, nvram_api_ret);
+						ret = KAL_FALSE;
+						goto next;
+					}
+					if ( ((lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) != 0)) {
+						if (((lid_info.attr & NVRAM_ATTR_OTA_RESET) == 0)){
+							MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_RESET_ATTR_NOT_SET(item_lid, lid_info.attr);
+						}
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+						if (is_general == KAL_FALSE){
+							if (mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+								pos = mcf_binary_search_lid(item_lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &in_pos);
+								MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
+								if (pos == -1) {
+									if(mcf_insert_lid(item_lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, in_pos) != KAL_TRUE){
+										MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
+									}else{
+										MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
+									}
+									mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
+								}
+							}
+						}else{
+							if (mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+								pos = mcf_binary_search_lid(item_lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &in_pos);
+								MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
+								if (pos == -1) {
+									if(mcf_insert_lid(item_lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, in_pos) != KAL_TRUE){
+										MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
+									}else{
+										MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
+									}
+									mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
+								}
+							}
+						}
+#else
+						if (is_general == KAL_FALSE){
+							if (mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+								pos = mcf_binary_search_lid_struct(item_lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &in_pos);
+								MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
+								if (pos == -1) {
+									if(mcf_insert_lid_struct(item_lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, in_pos, not_reset, set_combined) != KAL_TRUE){
+										MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
+									}else{
+										MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
+									}
+									mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
+								}
+							}
+						}else{
+							if (mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+								pos = mcf_binary_search_lid_struct(item_lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &in_pos);
+								MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID(item_lid, pos);
+								if (pos == -1) {
+									if(mcf_insert_lid_struct(item_lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, in_pos, not_reset, set_combined) != KAL_TRUE){
+										MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_SEARCH_STORE_LID_FAIL(item_lid);
+									}else{
+										MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_STORE_LID(item_lid, in_pos, sim_id);
+									}
+									mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt++;
+								}
+							}
+						}
+#endif
+						
+					}
+
+			next:
+					pre_LID = item_lid;
+					pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+					item_cnt++;
+				}
+				
+			}else{
+				//File version is not 3
+				MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_INVALID_FILE_VERSION(pFile->file_version);
+			}
+			MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		}
+    } else {
+        MD_TRC_MCF_TR_STORE_TLVOTA_MODIFIED_LID_TAKE_READ_LOCK_FAIL();
+        ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+		MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    }
+
+
+    return ret;
+}
+
+_STATIC void mcf_em_send_ota_file_info(em_mcf_read_ota_file_info_struct *read_file_info)
+{
+    ilm_struct                          ilm;
+    em_mcf_ota_file_info_ind_struct    *em_para_ptr = NULL;
+
+    if (com_Mcf.is_em_on == KAL_TRUE) {
+        em_para_ptr = (em_mcf_ota_file_info_ind_struct *)construct_local_para(sizeof(em_mcf_ota_file_info_ind_struct), TD_RESET);
+
+        em_para_ptr->em_info = MCF_EM_OTA_FILE_INFO;
+        kal_mem_cpy(&(em_para_ptr->read_file_info), read_file_info, sizeof(em_mcf_read_ota_file_info_struct));
+
+        ilm.src_mod_id      = MOD_MCF;
+        ilm.dest_mod_id     = MOD_DHL;
+        ilm.msg_id          = MSG_ID_EM_MCF_OTA_FILE_INFO_IND;
+        ilm.sap_id          = EM_PS_SAP;
+        ilm.local_para_ptr  = (local_para_struct *)em_para_ptr;
+        ilm.peer_buff_ptr   = NULL;
+
+        dhl_EM_logger(&ilm);
+        destroy_ilm(&ilm);
+    } else {
+#ifdef __MT_FRAMEWORK_SUPPORT__
+        if (kal_query_systemInit() == KAL_TRUE) {
+            /* EM switch may not be ON in init stage */
+            em_para_ptr = (em_mcf_ota_file_info_ind_struct *)construct_local_para(sizeof(em_mcf_ota_file_info_ind_struct), TD_RESET);
+
+            em_para_ptr->em_info = MCF_EM_OTA_FILE_INFO;
+            kal_mem_cpy(&(em_para_ptr->read_file_info), read_file_info, sizeof(em_mcf_read_ota_file_info_struct));
+
+            msg_send6(MOD_MCF, /* src_mod_id */
+                    MOD_MT, /* dest_mod_id */
+                    MCF_SAP, /* sap_id */
+                    MSG_ID_EM_MCF_OTA_FILE_INFO_IND, /* msg_id */
+                    (local_para_struct*)em_para_ptr, /* local_para_ptr */
+                    NULL); /* peer_buff_ptr */
+        }
+#endif
+    }
+}
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+_STATIC mcf_ota_result_e mcf_combined_ota_file(l4c_mcf_set_config_req_struct *req)
+{
+	mcf_t                                         *pMcf = mcf_get_instance();
+	mcf_ota_result_e                               ret = MCF_OTA_R_SUCCESS;
+	kal_uint32                                     i;
+	sim_interface_enum                             sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+	mcf_tool_file_info_t                          *pFile;
+	kal_int32                                      fs_ret = FS_NO_ERROR;
+    static nvram_ef_mcf_ota_file_info_struct       nv_ota_file;
+    static nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+	static kal_char                                fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+	static kal_char                                curr_filename[MCF_FILE_MAX_NAME_LEN];
+	static kal_wchar                               filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+    kal_int32                                      fs_api_ret;
+    static kal_char                                apply_filename[MCF_FILE_MAX_NAME_LEN];
+	l4c_mcf_path_type_enum                         apply_path_type;
+    em_mcf_read_ota_file_info_struct               read_file_info;
+    kal_bool                                       read_file_fail = KAL_FALSE;
+	
+	kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+	kal_mem_set(mcf_merge_buffer, 0, MCF_MAX_FILE_SIZE);
+    kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
+    kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+
+	switch (req->config_type)
+	{
+		case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+		{
+			mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+			kal_uint16                          pre_LID = 0;
+			kal_int16                           pos = -1;
+			kal_uint16                          in_pos = 0;
+			mcf_tool_gid_ota_file_item_t       *pItem;
+			nvram_ltable_entry_struct           lid_info;
+			kal_uint16                          item_cnt = 0;
+			nvram_errno_enum                    nvram_api_ret;
+			kal_uint16                          dummy_byte_offset;
+			kal_uint16                          dummy_bit_offset;
+			kal_uint32                          dummy_size;
+			kal_bool                            dummy_is_bit;
+			kal_char                            array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+			kal_uint16                          item_lid;
+			
+			if (strcmp((kal_char *)req->config1, "") != 0) {
+				if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+					strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				} else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+					strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				} else {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_TYPE(req->path_type);
+					ret = MCF_OTA_R_INVALID_PARAMETER;
+
+					return ret;
+				}
+				strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				
+				/* Check if file is existed */
+				kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
+
+				fs_api_ret = FS_GetAttributes(filename);
+				if (fs_api_ret < FS_NO_ERROR) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_FILE_NOT_EXIST(fs_root_path, curr_filename);
+					ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+					return ret;
+				}
+				
+				/* Read MCF Internal information in NVRAM */
+				if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+					ret = MCF_OTA_R_READ_NVRAM_FAIL;
+				}
+				
+				/* Write MCF OTA file information to NVRAM */
+				if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+					ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+					return ret;
+				}
+				
+				if(req->reset == KAL_TRUE){
+					//Need to reset LID
+                    nv_int_info.not_reset_ota = KAL_FALSE;
+                    
+                    //Clear LIDs which is add due to combine
+					if(mcf_clear_last_modified_lid(nv_int_info.last_mod_lid.lid_conf, &nv_int_info.last_mod_lid.lid_cnt) != KAL_TRUE){
+						ret = MCF_OTA_R_INVALID_PARAMETER;
+						return ret;
+					}
+                    
+                    /* Combine OTA file - Only apply one OTA file */	
+					ret = mcf_read_ota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+						return ret;
+					}
+					
+					/*Store LID which need to reset into last modified buffer*/
+					MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+					if (ota_file) {
+						pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+						/* Check if file type is OTA file */
+						if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+							kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+
+							mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+							MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
+							ret = MCF_OTA_R_INVALID_FILE;
+							MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+							return ret;
+						}
+
+						if (pFile->file_version == 3){
+							pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+							pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+							/* Read changed items from OTA file */
+							while (item_cnt < pFile->item_num) {
+								if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+									MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+									goto next;
+								}
+								strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
+								array_tag[pItem->array_index_len] = '\0';
+								
+								/* Find GID corresponding LID */
+								item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+								if (item_lid == 65535){
+									//-1(65535) means not found
+									goto next;
+								}
+								
+								if ( (item_lid == pre_LID)){
+									goto next;
+								}
+								
+								if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &dummy_byte_offset, &dummy_bit_offset, &dummy_size, &dummy_is_bit) == KAL_FALSE){
+									goto next;
+								}
+								
+								/* Store last time modified LID */
+								nvram_api_ret = nvram_external_get_lid_info(item_lid, &lid_info);
+								if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+									MD_TRC_MCF_TR_COMBINED_OTA_FILE_GET_LID_INFO_FAIL(item_lid, nvram_api_ret);
+									ret = MCF_OTA_R_INVALID_PARAMETER;
+									goto next;
+								}
+								/* Store reset LIDs into last time modified LID */
+								if ( ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
+										&& (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
+									if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+										pos = mcf_binary_search_lid_struct(item_lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
+                                        MD_TRC_MCF_TR_COMBINED_OTA_FILE_SEARCH_STORE_LID(item_lid, pos);
+										if (pos == -1) {
+											if(mcf_insert_lid_struct(item_lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, in_pos, KAL_FALSE, KAL_TRUE) != KAL_TRUE){
+												MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LID_FAIL(item_lid);
+											}else{
+												MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LID(item_lid, in_pos);
+											}
+											nv_int_info.last_mod_lid.lid_cnt++;
+										}
+									}
+								}
+
+						next:
+								pre_LID = item_lid;
+								pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+								item_cnt++;
+								
+							}
+						}
+						MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+						
+						if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+							MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+							ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+							return ret;
+						}
+					}
+
+				}else{
+					//Do not Need to reset LID
+                    nv_int_info.not_reset_ota = KAL_TRUE;
+                    
+                    /* Combine OTA file - Append OTA file*/
+					for(i = 0; i < nv_int_info.last_mod_lid.lid_cnt; i++){
+						if(nv_int_info.last_mod_lid.lid_conf[i].not_reset == KAL_FALSE && nv_int_info.last_mod_lid.lid_conf[i].set_combined == KAL_FALSE){
+							nv_int_info.last_mod_lid.lid_conf[i].not_reset = KAL_TRUE;
+						}
+					}
+                    ret = mcf_read_ota_file(KAL_FALSE, nv_ota_file.path, nv_ota_file.name, &apply_path_type, apply_filename, pMcf);
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(nv_ota_file.path, nv_ota_file.name);
+                        read_file_fail = KAL_TRUE;
+					}
+					MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+					if (ota_file) {
+						pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+						/* Check if file type is OTA file */ //If not OTA file, Construct empty file header
+						if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+							mcf_tool_file_info_t copy_header = {0};
+                            mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)mcf_file_buffer;
+                            
+							MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE();
+                            
+                            kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+                            copy_header.file_version = 3;
+                            copy_header.operation_mask = 0;
+                            mcf_merge_make_ota_file_header(output_header, &copy_header); // copy first header to output header
+                            kal_mem_set(output_header->file_type, 0, 8);
+                            strncpy(output_header->file_type, MCF_FILE_TYPE_OTA, 7);
+                            output_header->item_num = 0;
+                            output_header->file_size = (kal_uint32)((kal_uint8 *)mcf_file_buffer + output_header->total_len - (kal_uint8 *)output_header);
+                            
+						}else{
+							kal_mem_cpy(mcf_file_buffer, ota_file->buff, MCF_MAX_OTA_FILE_SIZE);
+						}
+						MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+					}
+					ret = mcf_read_ota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+						return ret;
+					}
+					MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+					if (ota_file) {
+						pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+						/* Check if file type is OTA file */
+						if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+							kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+							mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+							MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
+							ret = MCF_OTA_R_INVALID_FILE;
+							MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+							return ret;
+						}
+						
+                        if(mcf_merge_ota_buffer(mcf_file_buffer, ota_file->buff, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE) != KAL_TRUE){
+                            MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE_FAIL();
+                            ret = MCF_OTA_R_INVALID_PARAMETER;
+                            MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+                            return ret;
+                        }
+						
+						MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+					}
+					strncpy(fs_root_path, nv_ota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+					strncpy(curr_filename, nv_ota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
+					
+					/* Before create merged OTA file, need to delete last time merged OTA file */
+					kal_wsprintf(merge_ota_name, "%s\\%s\0", fs_root_path, curr_filename);
+					fs_ret = FS_Delete(merge_ota_name);
+					
+					if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_DELETE_FILE_FAIL(fs_ret);
+						ret = MCF_OTA_R_WRITE_DISK_FAIL;
+						return ret;
+					}
+					pFile = (mcf_tool_file_info_t *)(mcf_merge_buffer);
+					if(pFile->file_size > MCF_MAX_OTA_FILE_SIZE){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_OTA_FILE_SIZE);
+						ret = MCF_OTA_R_INVALID_PARAMETER;
+						return ret;
+					}
+					ret = mcf_write_buffer(fs_root_path, curr_filename, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
+					if (ret != MCF_OTA_R_SUCCESS) {
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_FAIL(fs_root_path, curr_filename);
+						return ret;
+					}
+                    
+                    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+                        MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+                        ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                        return ret;
+                    }
+					
+				}
+				strncpy(nv_ota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				strncpy(nv_ota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+			}else{
+				/*Deactivate Combine OTA setting */
+
+				kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+				kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
+				kal_mem_set(nv_ota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+				kal_mem_set(nv_ota_file.name, 0, MCF_FILE_MAX_NAME_LEN);
+				
+				kal_mem_set(nv_ota_file.merged_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+				kal_mem_set(nv_ota_file.merged_name, 0, MCF_FILE_MAX_NAME_LEN);
+				
+				nv_int_info.is_combined_ota = KAL_FALSE;
+                
+                //Need to reset LID
+                nv_int_info.not_reset_ota = KAL_FALSE;
+				
+				for(i = 0; i < nv_int_info.last_mod_lid.lid_cnt; i++){
+                    if(nv_int_info.last_mod_lid.lid_conf[i].not_reset == KAL_TRUE){
+						nv_int_info.last_mod_lid.lid_conf[i].not_reset = KAL_FALSE;
+                    }
+                }
+				
+				if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+					ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+					return ret;
+				}
+
+			}
+
+
+			if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+				MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+				ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+				return ret;
+			}
+		
+			break;
+		}
+
+		case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+		{
+			mcf_tlvota_file_t                      *tlvota_file;
+			mcf_tlvota_sbp_tag_t                    sbp_tag;
+			
+			MD_TRC_MCF_TR_COMBINED_OTA_FILE_TLVOTA_START(sim_id);
+            
+            if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+                MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_SIM_ID(req->ps_id, sim_id);
+                ret = MCF_OTA_R_INVALID_PARAMETER;
+                return ret;
+            }
+            
+            tlvota_file = &(pMcf->tlvota_file[sim_id]);
+			
+			if (strcmp((kal_char *)req->config1, "") != 0) {
+				if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
+					/* If MCF is in DSBP passive mode, change to DSBP active mode */
+					ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
+					if (ret != MCF_OTA_R_SUCCESS) {
+						return ret;
+					}
+					pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
+				}
+				if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+					strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				} else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+					strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				} else {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(req->path_type);
+					ret = MCF_OTA_R_INVALID_PARAMETER;
+
+					return ret;
+				}
+				strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				
+				/* Check if file is existed */
+				kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
+
+				fs_api_ret = FS_GetAttributes(filename);
+				if (fs_api_ret < FS_NO_ERROR) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_FILE_NOT_EXIST(fs_root_path, curr_filename);
+					ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+					return ret;
+				}
+				
+				/* Read MCF Internal information in NVRAM */
+				if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+					ret = MCF_OTA_R_READ_NVRAM_FAIL;
+				}
+				
+				/* Read MCF TLV-OTA file information in NVRAM */
+				if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+					ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+					return ret;
+				}
+				
+				if(req->reset == KAL_TRUE){
+					//Need to reset LID
+                    nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
+                    
+                    //Clear LIDs which is add due to combine
+                    if(mcf_clear_last_modified_lid(nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf, &nv_int_info.tlvota_last_mod_lid[sim_id].lid_cnt) != KAL_TRUE){
+						ret = MCF_OTA_R_INVALID_PARAMETER;
+						return ret;
+					}
+                    
+                    /* Combine OTA file - Only apply one OTA file */
+					ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+						return ret;
+					}
+					
+					MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					if (tlvota_file){
+						sbp_tag.sbp_id = tlvota_file->sbp_id;
+						kal_mem_cpy(sbp_tag.mcc, tlvota_file->mcc, MAX_MCC_STR_LEN);
+						kal_mem_cpy(sbp_tag.mnc, tlvota_file->mnc, MAX_MNC_STR_LEN);
+						
+						MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+					}else {
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_TAKE_READ_LOCK_FAIL();
+						MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					}
+					
+					ret = mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE, KAL_FALSE, KAL_TRUE);
+					
+					kal_mem_cpy(&mcf_tlvota_last_mod_lid_g[sim_id], &nv_int_info.tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+					
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LAST_LID_FAIL();
+						return ret;
+					}
+					
+					if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+						ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+						return ret;
+					}
+
+				}else{
+					//Do not need to reset LID
+                    nv_int_info.not_reset_tlvota[sim_id] = KAL_TRUE;
+                    
+                    /* Combine OTA file - Append OTA file*/
+					for(i = 0; i < nv_int_info.tlvota_last_mod_lid[sim_id].lid_cnt; i++){
+						if(nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset == KAL_FALSE && nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].set_combined == KAL_FALSE){
+							nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_TRUE;
+						}
+					}
+                    ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name);
+                        read_file_fail = KAL_TRUE;
+					}
+					MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					if (tlvota_file) {
+						pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+						/* Check if file type is TLV-OTA file */ //If not TLVOTA file, Construct empty file header
+						if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+							mcf_tool_file_info_t copy_header = {0};
+                            mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)mcf_file_buffer;
+                            
+							MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE();
+                            
+                            kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+                            copy_header.file_version = 3;
+                            copy_header.operation_mask = 0;
+                            mcf_merge_make_ota_file_header(output_header, &copy_header); // copy first header to output header
+                            kal_mem_set(output_header->file_type, 0, 8);
+                            strncpy(output_header->file_type, MCF_FILE_TYPE_TLVOTA, 7);
+                            output_header->item_num = 0;
+                            output_header->file_size = (kal_uint32)((kal_uint8 *)mcf_file_buffer + output_header->total_len - (kal_uint8 *)output_header);
+
+						}else{
+							kal_mem_cpy(mcf_file_buffer, tlvota_file->buff, MCF_MAX_TLVOTA_FILE_SIZE);
+						}
+						MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					}
+					ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+						return ret;
+					}
+					MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					if (tlvota_file) {
+						pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+						/* Check if file type is TLV-OTA file */ 
+						if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+							kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+                            mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+							MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
+							ret = MCF_OTA_R_INVALID_FILE;
+							MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+							return ret;
+						}
+						
+                        if(mcf_merge_ota_buffer(mcf_file_buffer, tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
+                            MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE_FAIL();
+                            ret = MCF_OTA_R_INVALID_PARAMETER;
+                            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                            return ret;
+                        }
+						
+						MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					}
+					strncpy(fs_root_path, nv_tlvota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+					strncpy(curr_filename, nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
+
+					/* Before create merged OTA file, need to delete last time merged OTA file */
+					kal_wsprintf(merge_ota_name, "%s\\%s\0", fs_root_path, curr_filename);
+					fs_ret = FS_Delete(merge_ota_name);
+					
+					if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_DELETE_FILE_FAIL(fs_ret);
+						ret = MCF_OTA_R_WRITE_DISK_FAIL;
+						return ret;
+					}
+					
+					pFile = (mcf_tool_file_info_t *)(mcf_merge_buffer);
+					if(pFile->file_size > MCF_MAX_TLVOTA_FILE_SIZE){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_TLVOTA_FILE_SIZE);
+						ret = MCF_OTA_R_INVALID_PARAMETER;
+						return ret;
+					}
+					
+					ret = mcf_write_buffer(fs_root_path, curr_filename, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
+					if (ret != MCF_OTA_R_SUCCESS) {
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_FAIL(fs_root_path, curr_filename);
+						return ret;
+					}
+                    
+                    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+                        MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+                        ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                        return ret;
+                    }
+					
+				}
+				
+				if (req->trigger_dsbp == 1) {
+					/* Read TLV-OTA file */
+					kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+					read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
+					read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+					read_file_info.ps_id = req->ps_id;
+					read_file_info.start_time = kal_get_systicks();
+
+					ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+                    // Store Read TLV-OTA file result for dsbp urc use
+                    set_op_read_ret[sim_id] = ret;
+					if (ret == MCF_OTA_R_SUCCESS) {
+						MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        if (tlvota_file) {
+                            read_file_info.path_type = tlvota_file->path_type;
+                            strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
+                            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        }
+                        is_read_tlvota[sim_id] = KAL_TRUE;
+					} else {
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+					}
+
+					read_file_info.result = ret;
+					read_file_info.end_time = kal_get_systicks();
+
+					mcf_em_send_ota_file_info(&read_file_info);
+				}
+				
+				strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				strncpy(nv_tlvota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+				
+			}else{
+				/*Deactivate Combine OTA setting */
+				if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+					/* If MCF is in DSBP passive mode, change to DSBP active mode */
+					ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
+					if (ret != MCF_OTA_R_SUCCESS) {
+						return ret;
+					}
+					pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
+				}
+				
+				kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+				kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
+				kal_mem_set(nv_tlvota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+				kal_mem_set(nv_tlvota_file.name, 0, MCF_FILE_MAX_NAME_LEN);
+
+				/* Deactivate TLV-OTA setting, reset combined setting */
+				nv_int_info.is_combined_tlvota[sim_id] = KAL_FALSE;
+				kal_mem_set(nv_tlvota_file.merged_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+				kal_mem_set(nv_tlvota_file.merged_name, 0, MCF_FILE_MAX_NAME_LEN);
+                
+                //Need to reset LID
+                nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
+				
+				for(i = 0; i < nv_int_info.tlvota_last_mod_lid[sim_id].lid_cnt; i++){
+                    if(nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset == KAL_TRUE){
+						nv_int_info.tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_FALSE;
+                    }
+                }
+				
+				if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+					ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+					return ret;
+				}
+				
+				if (req->trigger_dsbp == 1) {
+					/* Deactivate TLV-OTA setting, reset TLV-OTA buffer */
+					MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					if (tlvota_file) {
+						kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
+						tlvota_file->path_type = req->path_type;
+						strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
+						kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
+						MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					} else {
+						MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
+					}
+					is_read_tlvota[sim_id] = KAL_TRUE;
+				}
+
+			}
+
+
+			/* Write MCF TLV-OTA file information in NVRAM */
+			if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+				MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+				ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+				return ret;
+			}
+			
+			break;
+		}
+		case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
+		{
+			mcf_tlvota_file_t                      *tlvota_file = &(pMcf->general_tlvota_file);
+			mcf_tlvota_sbp_tag_t                    sbp_tag;
+			
+			if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+                MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_SIM_ID(req->ps_id, sim_id);
+                ret = MCF_OTA_R_INVALID_PARAMETER;
+                return ret;
+            }
+            
+            if (strcmp((kal_char *)req->config1, "") != 0) {
+				if (pMcf->general_is_ignore_dsbp == KAL_FALSE) {
+					/* If MCF is in DSBP passive mode, change to DSBP active mode */
+					ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_TRUE, sim_id);
+					if (ret != MCF_OTA_R_SUCCESS) {
+						return ret;
+					}
+					pMcf->general_is_ignore_dsbp = KAL_TRUE;
+				}
+				if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+					strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				} else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+					strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				} else {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_TYPE(req->path_type);
+					ret = MCF_OTA_R_INVALID_PARAMETER;
+
+					return ret;
+				}
+				strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				
+				/* Check if file is existed */
+				kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
+
+				fs_api_ret = FS_GetAttributes(filename);
+				if (fs_api_ret < FS_NO_ERROR) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_FILE_NOT_EXIST(fs_root_path, curr_filename);
+					ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+					return ret;
+				}
+				
+				/* Read MCF Internal information in NVRAM */
+				if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+					ret = MCF_OTA_R_READ_NVRAM_FAIL;
+				}
+				
+				/* Read MCF TLV-OTA file information in NVRAM */
+				if ( !nvram_external_read_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+					ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+					return ret;
+				}
+				
+				if(req->reset == KAL_TRUE){
+                    //Need to reset LID
+                    nv_int_info.not_reset_general_tlvota = KAL_FALSE;
+                    
+					//Clear LIDs which is add due to combine
+					if(mcf_clear_last_modified_lid(nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf, &nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_cnt) != KAL_TRUE){
+						ret = MCF_OTA_R_INVALID_PARAMETER;
+						return ret;
+					}
+                    
+                    /* Combine OTA file - Only apply one OTA file */
+					ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+						return ret;
+					}
+					tlvota_file = &(pMcf->tlvota_file[sim_id]);
+					MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					if (tlvota_file){
+						sbp_tag.sbp_id = tlvota_file->sbp_id;
+						kal_mem_cpy(sbp_tag.mcc, tlvota_file->mcc, MAX_MCC_STR_LEN);
+						kal_mem_cpy(sbp_tag.mnc, tlvota_file->mnc, MAX_MNC_STR_LEN);
+						
+						MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+					}else {
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_TAKE_READ_LOCK_FAIL();
+						MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					}
+					tlvota_file = &(pMcf->general_tlvota_file);
+					ret = mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE, KAL_FALSE, KAL_TRUE);
+					
+					kal_mem_cpy(&mcf_general_tlvota_last_mod_lid_g[sim_id], &nv_int_info.general_tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+					
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_STORE_LAST_LID_FAIL();
+						return ret;
+					}
+					
+					if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+						ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+						return ret;
+					}
+					
+
+				}else{
+					//Do not need to reset LID
+                    nv_int_info.not_reset_general_tlvota = KAL_TRUE;
+                    
+                    /* Combine OTA file - Append OTA file*/
+					for(i = 0; i < nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_cnt; i++){
+						if(nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset == KAL_FALSE && nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].set_combined == KAL_FALSE){
+							nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_TRUE;
+						}
+					}
+                    ret = mcf_read_general_tlvota_file(KAL_FALSE, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name);
+                        read_file_fail = KAL_TRUE;
+					}
+					MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					if (tlvota_file) {
+						pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+						/* Check if file type is TLV-OTA file */ //If not TLVOTA file, Construct empty file header
+						if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+							mcf_tool_file_info_t copy_header = {0};
+                            mcf_tool_file_info_t *output_header = (mcf_tool_file_info_t *)mcf_file_buffer;
+                           
+                            MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE();
+                            
+                            kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+                            copy_header.file_version = 3;
+                            copy_header.operation_mask = 0;
+                            mcf_merge_make_ota_file_header(output_header, &copy_header); // copy first header to output header
+                            kal_mem_set(output_header->file_type, 0, 8);
+                            strncpy(output_header->file_type, MCF_FILE_TYPE_TLVOTA, 7);
+                            output_header->item_num = 0;
+                            output_header->file_size = (kal_uint32)((kal_uint8 *)mcf_file_buffer + output_header->total_len - (kal_uint8 *)output_header);
+
+						}else{
+							kal_mem_cpy(mcf_file_buffer, tlvota_file->buff, MCF_MAX_TLVOTA_FILE_SIZE);
+						}
+						
+						MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					}
+					ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+					if(ret != MCF_OTA_R_SUCCESS){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+						return ret;
+					}
+					MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					if (tlvota_file) {
+						pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+						/* Check if file type is TLV-OTA file */
+						if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+							kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+							mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+							MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE(str_tmp);
+							ret = MCF_OTA_R_INVALID_FILE;
+							MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+							return ret;
+						}
+						
+                        if(mcf_merge_ota_buffer(mcf_file_buffer, tlvota_file->buff, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
+                            MD_TRC_MCF_TR_COMBINED_OTA_FILE_MERGE_OTA_FILE_FAIL();
+                            ret = MCF_OTA_R_INVALID_PARAMETER;
+                            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                            return ret;
+                        }
+						
+						MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					}
+					strncpy(fs_root_path, nv_tlvota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+					strncpy(curr_filename, nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
+					
+					/* Before create merged OTA file, need to delete last time merged OTA file */
+					kal_wsprintf(merge_ota_name, "%s\\%s\0", fs_root_path, curr_filename);
+					fs_ret = FS_Delete(merge_ota_name);
+					
+					if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_DELETE_FILE_FAIL(fs_ret);
+						ret = MCF_OTA_R_WRITE_DISK_FAIL;
+						return ret;
+					}
+					
+					pFile = (mcf_tool_file_info_t *)(mcf_merge_buffer);
+					if(pFile->file_size > MCF_MAX_TLVOTA_FILE_SIZE){
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_TLVOTA_FILE_SIZE);
+						ret = MCF_OTA_R_INVALID_PARAMETER;
+						return ret;
+					}
+
+					ret = mcf_write_buffer(fs_root_path, curr_filename, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
+					if (ret != MCF_OTA_R_SUCCESS) {
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_FAIL(fs_root_path, curr_filename);
+						return ret;
+					}
+                    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+                        MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+                        ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                        return ret;
+                    }
+					
+				}
+				
+				if (req->trigger_dsbp == 1) {
+					/* Read general TLV-OTA file */
+					kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+					read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
+					read_file_info.config_type = L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN;
+					read_file_info.ps_id = req->ps_id;
+					read_file_info.start_time = kal_get_systicks();
+
+					ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, curr_filename, &apply_path_type, apply_filename, pMcf);
+					if (ret == MCF_OTA_R_SUCCESS) {
+						MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        if (tlvota_file) {
+                            read_file_info.path_type = tlvota_file->path_type;
+                            strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
+                            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        }
+						for(i = 0; i < MAX_SIM_NUM; i++){
+							is_read_general_tlvota[i] = KAL_TRUE;
+						}
+					} else {
+						MD_TRC_MCF_TR_COMBINED_OTA_FILE_READ_FILE_FAIL(fs_root_path, curr_filename);
+					}
+
+					read_file_info.result = ret;
+					read_file_info.end_time = kal_get_systicks();
+
+					mcf_em_send_ota_file_info(&read_file_info);
+				}
+				
+				strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				strncpy(nv_tlvota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+				
+			}else{
+				/*Deactivate Combine OTA setting */
+				if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
+					/* If MCF is in DSBP active mode, change to DSBP passive mode */
+					ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_TRUE, sim_id);
+					if (ret != MCF_OTA_R_SUCCESS) {
+						return ret;
+					}
+					pMcf->general_is_ignore_dsbp = KAL_FALSE;
+				}
+				
+				kal_mem_set(fs_root_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+				kal_mem_set(curr_filename, 0, MCF_FILE_MAX_NAME_LEN);
+				kal_mem_set(nv_tlvota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+				kal_mem_set(nv_tlvota_file.name, 0, MCF_FILE_MAX_NAME_LEN);
+
+				/* Deactivate TLV-OTA setting, reset combined setting */
+				nv_int_info.is_combined_general_tlvota = KAL_FALSE;
+				kal_mem_set(nv_tlvota_file.merged_path, 0, MCF_FILE_MAX_MD_PATH_LEN);
+				kal_mem_set(nv_tlvota_file.merged_name, 0, MCF_FILE_MAX_NAME_LEN);
+                
+                //Need to reset LID
+                nv_int_info.not_reset_general_tlvota = KAL_FALSE;
+				
+				for(i = 0; i < nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_cnt; i++){
+                    if(nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset == KAL_TRUE){
+						nv_int_info.general_tlvota_last_mod_lid[sim_id].lid_conf[i].not_reset = KAL_FALSE;
+                    }
+                }
+				
+				if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+					MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+					ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+					return ret;
+				}
+				
+				if (req->trigger_dsbp == 1) {
+					/* Deactivate general TLV-OTA setting, reset general TLV-OTA buffer */
+					MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					if (tlvota_file) {
+						kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
+						tlvota_file->path_type = req->path_type;
+						strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
+                        tlvota_file->last_mod_time = 0;
+						kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
+						MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+					} else {
+						MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
+					}
+					for(i = 0; i < MAX_SIM_NUM; i++){
+						is_read_general_tlvota[i] = KAL_TRUE;
+					}
+				}
+
+			}
+			
+			/* Write MCF TLV-OTA file information in NVRAM */
+			if ( !nvram_external_write_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+				MD_TRC_MCF_TR_COMBINED_OTA_FILE_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+				ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+				return ret;
+			}
+			break;
+		}
+		
+		default:
+		{
+			MD_TRC_MCF_TR_COMBINED_OTA_FILE_INVALID_CONFIG_TYPE(req->config_type);
+			ret = MCF_OTA_R_INVALID_PARAMETER;
+			break;
+        }
+
+	}
+	
+	
+	return ret;
+}
+#endif
+_STATIC mcf_ota_result_e mcf_set_file_path(l4c_mcf_set_config_req_struct *req)
+{
+    mcf_t                                  *pMcf = mcf_get_instance();
+    sim_interface_enum                      sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+    mcf_ota_result_e                        ret = MCF_OTA_R_SUCCESS;
+	mcf_tool_file_info_t                   *pFile;
+	kal_uint32                              i = 0;
+    
+    if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+        MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SIM_ID(req->ps_id, sim_id);
+        ret = MCF_OTA_R_INVALID_PARAMETER;
+        return ret;
+    }
+
+    switch (req->op)
+    {
+        case L4C_MCF_CONFIG_SET_OTA_AND_OPOTA_FILE_PATH:
+        {
+            nvram_ef_mcf_ota_file_info_struct       nv_ota_file;
+            nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+
+            if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+                /* If MCF is in DSBP active mode, change to DSBP passive mode */
+                ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
+                if (ret != MCF_OTA_R_SUCCESS) {
+                    return ret;
+                }
+                pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
+            }
+
+            /* Read MCF OTA file information in NVRAM */
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+                MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+                return ret;
+            }
+
+            MD_TRC_MCF_TR_SET_OTA_FILE_PATH_AP((kal_char *)req->config1, (kal_char *)req->config2);
+            if (strcmp((kal_char *)req->config1, "") != 0) {
+                strncpy(nv_ota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                strncpy(nv_ota_file.name, (kal_char *)req->config2, MCF_FILE_MAX_NAME_LEN - 1);
+            } else {
+                strncpy(nv_ota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                strncpy(nv_ota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+            }
+            MD_TRC_MCF_TR_SET_OTA_FILE_PATH_MD((kal_char *)nv_ota_file.path, (kal_char *)nv_ota_file.name);
+
+            /* Write MCF OTA file information in NVRAM */
+            if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+                MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                return ret;
+            }
+
+            /* Read MCF TLV-OTA file information in NVRAM */
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+                MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                ret = KAL_FALSE;
+
+                return MCF_OTA_R_READ_NVRAM_FAIL;
+            }
+
+            MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_AP((kal_char *)req->config3, (kal_char *)req->config4, req->ps_id);
+            if (strcmp((kal_char *)req->config3, "") != 0) {
+                strncpy(nv_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                strncpy(nv_tlvota_file.name, (kal_char *)req->config4, MCF_FILE_MAX_NAME_LEN - 1);
+            } else {
+                strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+            }
+            MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_MD((kal_char *)nv_tlvota_file.path, (kal_char *)nv_tlvota_file.name, sim_id);
+
+            /* Write MCF TLV-OTA file information in NVRAM */
+            if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+                MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                return ret;
+            }
+
+            break;
+        }
+
+        case L4C_MCF_CONFIG_SET_OTA_FILE_PATH:
+        {
+            nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+
+            if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+                /* If MCF is in DSBP active mode, change to DSBP passive mode */
+                ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
+                if (ret != MCF_OTA_R_SUCCESS) {
+                    return ret;
+                }
+                pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
+            }
+
+            /* Read MCF OTA file information in NVRAM */
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+                MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+                return ret;
+            }
+
+            MD_TRC_MCF_TR_SET_OTA_FILE_PATH_AP((kal_char *)req->config1, (kal_char *)req->config2);
+            if (strcmp((kal_char *)req->config1, "") != 0) {
+                strncpy(nv_ota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                strncpy(nv_ota_file.name, (kal_char *)req->config2, MCF_FILE_MAX_NAME_LEN - 1);
+            } else {
+                strncpy(nv_ota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                strncpy(nv_ota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+            }
+            MD_TRC_MCF_TR_SET_OTA_FILE_PATH_MD((kal_char *)nv_ota_file.path, (kal_char *)nv_ota_file.name);
+
+            /* Write MCF OTA file information in NVRAM */
+            if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+                MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                return ret;
+            }
+
+            break;
+        }
+
+        case L4C_MCF_CONFIG_SET_OPOTA_FILE_PATH:
+        {
+            nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+
+            if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+                /* If MCF is in DSBP active mode, change to DSBP passive mode */
+                ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
+                if (ret != MCF_OTA_R_SUCCESS) {
+                    return ret;
+                }
+                pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
+            }
+
+            /* Read MCF TLV-OTA file information in NVRAM */
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+                MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+                return ret;
+            }
+
+            MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_AP((kal_char *)req->config1, (kal_char *)req->config2, req->ps_id);
+            if (strcmp((kal_char *)req->config1, "") != 0) {
+                strncpy(nv_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                strncpy(nv_tlvota_file.name, (kal_char *)req->config2, MCF_FILE_MAX_NAME_LEN - 1);
+            } else {
+                strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+            }
+            MD_TRC_MCF_TR_SET_TLVOTA_FILE_PATH_MD((kal_char *)nv_tlvota_file.path, (kal_char *)nv_tlvota_file.name, sim_id);
+
+            /* Write MCF TLV-OTA file information in NVRAM */
+            if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+                MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                return ret;
+            }
+
+            break;
+        }
+
+        case L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE:
+        {
+            if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
+                /* If MCF is in DSBP passive mode, change to DSBP active mode */
+                ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
+                if (ret != MCF_OTA_R_SUCCESS) {
+                    return ret;
+                }
+                pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
+            }
+            pMcf->dsbp_cnf_ret = KAL_TRUE;
+            pMcf->dsbp_ind_ret = KAL_TRUE;
+
+            switch (req->config_type)
+            {
+                case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+                {
+                    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+                    kal_char                            fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+                    kal_char                            curr_filename[MCF_FILE_MAX_NAME_LEN];
+                    kal_wchar                           filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+                    kal_bool                            is_get_custom_filename = KAL_FALSE;
+                    kal_int32                           fs_api_ret;
+                    kal_uint8                           path_type;
+
+                    if (nv_int_info.not_reset_ota == KAL_TRUE) {
+                        /* If MCF is in not reset mode, change to reset mode */
+                        ret = mcf_set_not_reset(KAL_FALSE, req->config_type, 0);
+                        if (ret != MCF_OTA_R_SUCCESS) {
+                            return ret;
+                        }
+                        nv_int_info.not_reset_ota = KAL_FALSE;
+                    }
+                    
+                    if (strcmp((kal_char *)req->config1, "") != 0) {
+                        if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+                            strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                        } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+                            strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                        } else {
+                            MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+                            ret = MCF_OTA_R_INVALID_PARAMETER;
+
+                            return ret;
+                        }
+                        strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                    } else {
+                        is_get_custom_filename = mcf_get_custom_file_path_name(&path_type, curr_filename);
+                        if (is_get_custom_filename == KAL_TRUE) {
+                            if (path_type >= L4C_MCF_PATH_TYPE_MAX) {
+                                MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+                                ret = MCF_OTA_R_INVALID_PARAMETER;
+
+                                return ret;
+                            }
+
+                            if (path_type == L4C_MCF_PATH_TYPE_OTA) {
+                                strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                            } else if (path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+                                strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                            }
+                        } else {
+                            strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                            strncpy(curr_filename, MCF_FS_DEFAULT_OTA_FILE_NAME, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                        }
+                    }
+
+                    /* Check if file is existed */
+                    kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
+
+                    fs_api_ret = FS_GetAttributes(filename);
+                    if (fs_api_ret < FS_NO_ERROR) {
+                        MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, curr_filename);
+                        ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+                        return ret;
+                    }
+
+                    /* Write MCF OTA file information to NVRAM */
+                    if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+                        MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                        ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+                        return ret;
+                    }
+
+                    strncpy(nv_ota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                    strncpy(nv_ota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+
+                    if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+                        MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                        ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                        return ret;
+                    }
+
+                    break;
+                }
+
+                case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+                {
+                    mcf_tlvota_file_t                      *tlvota_file;
+                    mcf_tool_file_info_t                   *pFile;
+                    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+                    em_mcf_read_ota_file_info_struct        read_file_info;
+                    kal_char                                fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+                    kal_wchar                               filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+                    kal_char                                apply_filename[MCF_FILE_MAX_NAME_LEN];
+                    l4c_mcf_path_type_enum                  apply_path_type;
+                    kal_int32                               fs_api_ret;
+                    
+                    if (nv_int_info.not_reset_tlvota[sim_id] == KAL_TRUE) {
+                        /* If MCF is in DSBP active mode, change to DSBP passive mode */
+                        ret = mcf_set_not_reset(KAL_FALSE, req->config_type, sim_id);
+                        if (ret != MCF_OTA_R_SUCCESS) {
+                            return ret;
+                        }
+                        nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
+                    }
+
+					tlvota_file = &(pMcf->tlvota_file[sim_id]);
+					
+					if (strcmp((kal_char *)req->config1, "") != 0) {
+                        /* Check if file is existed */
+                        if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+                            kal_wsprintf(filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, req->config1);
+                            strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                        } else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+                            kal_wsprintf(filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, req->config1);
+                            strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                        } else {
+                            MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+                            ret = MCF_OTA_R_INVALID_PARAMETER;
+
+                            return ret;
+                        }
+
+                        fs_api_ret = FS_GetAttributes(filename);
+                        if (fs_api_ret < FS_NO_ERROR) {
+                            MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, req->config1);
+                            ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+                            return ret;
+                        }
+
+                        /* Read MCF TLV-OTA file information in NVRAM */
+                        if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+                            MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                            ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+                            return ret;
+                        }
+
+                        strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                        strncpy(nv_tlvota_file.name, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+
+                        /* Write MCF TLV-OTA file information in NVRAM */
+                        if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+                            MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                            ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                            return ret;
+                        }
+
+                        kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+                        read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
+                        read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+                        read_file_info.ps_id = req->ps_id;
+                        read_file_info.start_time = kal_get_systicks();
+
+                        /* Read TLV-OTA file */
+                        ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, (kal_char *)req->config1, &apply_path_type, apply_filename, pMcf);
+                        // Store Read TLV-OTA file result for dsbp urc use
+                        set_op_read_ret[sim_id] = ret;
+                        if (ret == MCF_OTA_R_SUCCESS) {
+                            MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                            if (tlvota_file) {
+                                pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+                                /* Do not trigger DSBP if the same file as last one */
+                                if ( (tlvota_file->last_file.path_type == apply_path_type) &&
+                                     (strncmp(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) == 0) &&
+                                     (strncmp(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len) == 0) &&
+                                     (strncmp(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len) == 0) ) {
+                                    MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_CHANGE(0, tlvota_file->last_file.path_type);
+									dhl_print_string(TRACE_INFO, DHL_USER_FLAG_NONE, MOD_MCF, tlvota_file->last_file.name);
+                                    dhl_print_string(TRACE_INFO, DHL_USER_FLAG_NONE, MOD_MCF, tlvota_file->last_file.sw_version);
+                                    dhl_print_string(TRACE_INFO, DHL_USER_FLAG_NONE, MOD_MCF, tlvota_file->last_file.gen_time);
+                                    ret = MCF_OTA_R_FILE_NOT_CHANGE;
+                                } else {
+                                    /* Store temp updated file informantion */
+									kal_mem_set(&(tlvota_file->temp_file), 0, sizeof(mcf_file_info_t));
+									tlvota_file->temp_file.path_type = apply_path_type;
+									strncpy(tlvota_file->temp_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+                                    if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+                                        strncpy(tlvota_file->temp_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+										tlvota_file->temp_file.sw_version[pFile->sw_version_len] = '\0';
+                                    } else {
+                                        MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_VERSION(pFile->sw_version_len);
+                                    }
+                                    if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+                                        strncpy(tlvota_file->temp_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+										tlvota_file->temp_file.gen_time[pFile->gen_time_len] = '\0';
+                                    } else {
+                                        MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_GEN_TIME(pFile->gen_time_len);
+                                    }
+
+                                    read_file_info.path_type = tlvota_file->path_type;
+                                    strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
+                                }
+                                /* Check if file type is TLV-OTA file */
+                                if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+                                    kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+                                    mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+                                    MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_FILE(str_tmp);
+                                    com_Mcf.tlvota_result[sim_id] = MCF_OTA_R_INVALID_FILE;
+                                }
+                                MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                            }else{
+                                MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
+                                ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                                return ret;
+                            }
+                            is_read_tlvota[sim_id] = KAL_TRUE;
+                        } else {
+                            MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_FAIL(req->config_type);
+                        }
+
+                        read_file_info.result = ret;
+                        read_file_info.end_time = kal_get_systicks();
+
+                        mcf_em_send_ota_file_info(&read_file_info);
+                    } else {
+                        /* Read MCF TLV-OTA file information in NVRAM */
+                        if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+                            MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                            ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+                            return ret;
+                        }
+
+                        strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                        strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+
+                        /* Write MCF TLV-OTA file information in NVRAM */
+                        if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+                            MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                            ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                            return ret;
+                        }
+
+                        /* Deactivate TLV-OTA setting, reset TLV-OTA buffer */
+                        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        if (tlvota_file) {
+                            kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
+                            tlvota_file->path_type = req->path_type;
+                            strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
+                            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        } else {
+                            MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
+                        }
+                        
+                         /* Do not trigger DSBP if no last file */
+                        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        if (tlvota_file) {
+                            if (strncmp(tlvota_file->last_file.name, "", MCF_FILE_MAX_NAME_LEN) == 0) {
+                                MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_CHANGE(1, tlvota_file->last_file.path_type);
+                                ret = MCF_OTA_R_FILE_NOT_CHANGE;
+                            } else {
+                                /* Clear last updated file informantion */
+                                kal_mem_set(&(tlvota_file->temp_file), 0, sizeof(mcf_file_info_t));
+                            }
+                            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        } else {
+                            MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
+                        }
+                        is_read_tlvota[sim_id] = KAL_TRUE;
+                    }
+
+                    break;
+                }
+
+                default:
+                    MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_CONFIG_TYPE(req->config_type);
+                    ret = MCF_OTA_R_INVALID_PARAMETER;
+                    break;
+            }
+
+            break;
+        }
+
+        case L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN:
+        {
+            kal_bool is_combine = KAL_FALSE;
+			
+			/* Read MCF Internal information in NVRAM */
+			if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+				MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+				ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+				return ret;
+			}
+            pMcf->dsbp_cnf_ret = KAL_TRUE;
+            pMcf->dsbp_ind_ret = KAL_TRUE;
+            
+            switch (req->config_type)
+            {
+                case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+                {
+                    nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+                    kal_char                            fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+                    kal_char                            curr_filename[MCF_FILE_MAX_NAME_LEN];
+                    kal_wchar                           filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+                    kal_int32                           fs_api_ret;
+
+                    is_combine = nv_int_info.is_combined_ota;
+					
+					if(is_combine == KAL_FALSE){
+                        if (nv_int_info.not_reset_ota == KAL_TRUE) {
+                            /* If MCF is in DSBP active mode, change to DSBP passive mode */
+                            ret = mcf_set_not_reset(KAL_FALSE, req->config_type, 0);
+                            if (ret != MCF_OTA_R_SUCCESS) {
+                                return ret;
+                            }
+                            nv_int_info.not_reset_ota = KAL_FALSE;
+                        }
+						if (strcmp((kal_char *)req->config1, "") != 0) {
+							if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+								strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+							} else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+								strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+							} else {
+								MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+								ret = MCF_OTA_R_INVALID_PARAMETER;
+
+								return ret;
+							}
+							strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                            /* Check if file is existed */
+                            kal_wsprintf(filename, "%s\\%s\0", fs_root_path, curr_filename);
+
+                            fs_api_ret = FS_GetAttributes(filename);
+                            if (fs_api_ret < FS_NO_ERROR) {
+                                MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, curr_filename);
+                                ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+                                return ret;
+                            }
+
+                            /* Write MCF OTA file information to NVRAM */
+                            if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+                                MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                                ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+                                return ret;
+                            }
+
+                            strncpy(nv_ota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                            strncpy(nv_ota_file.name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+
+                            if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+                                MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                                ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                                return ret;
+                            }
+                        } else {
+                            /* Write MCF OTA file information to NVRAM */
+                            if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+                                MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                                ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+                                return ret;
+                            }
+
+                            kal_mem_set(nv_ota_file.path, 0, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                            kal_mem_set(nv_ota_file.name, 0, MCF_FILE_MAX_NAME_LEN - 1);
+
+                            if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+                                MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                                ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                                return ret;
+                            }
+                        }
+					}else{
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+						ret = mcf_combined_ota_file(req);
+						if(ret != MCF_OTA_R_SUCCESS){
+							return ret;
+						}
+#else
+                        ret = MCF_OTA_R_MCF_NOT_SUPPORT;
+                        return ret;
+#endif
+					}
+
+                    break;
+                }
+
+                case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+                {
+                    mcf_tlvota_file_t                      *tlvota_file;
+                    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+                    em_mcf_read_ota_file_info_struct        read_file_info;
+                    kal_char                                fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+                    kal_wchar                               filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+                    kal_char                                apply_filename[MCF_FILE_MAX_NAME_LEN];
+                    l4c_mcf_path_type_enum                  apply_path_type;
+                    kal_int32                               fs_api_ret;
+					
+					if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+						MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SIM_ID(req->ps_id, sim_id);
+						ret = MCF_OTA_R_INVALID_PARAMETER;
+
+						return ret;
+					}
+					
+					tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+                    is_combine = nv_int_info.is_combined_tlvota[sim_id];
+					if(is_combine == KAL_FALSE){
+						if (nv_int_info.not_reset_tlvota[sim_id] == KAL_TRUE) {
+                            /* If MCF is in DSBP active mode, change to DSBP passive mode */
+                            ret = mcf_set_not_reset(KAL_FALSE, req->config_type, sim_id);
+                            if (ret != MCF_OTA_R_SUCCESS) {
+                                return ret;
+                            }
+                            nv_int_info.not_reset_tlvota[sim_id] = KAL_FALSE;
+                        }
+                        if (strcmp((kal_char *)req->config1, "") != 0) {
+							if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
+								/* If MCF is in DSBP passive mode, change to DSBP active mode */
+								ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
+								if (ret != MCF_OTA_R_SUCCESS) {
+									return ret;
+								}
+								pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
+							}
+
+							/* Check if file is existed */
+							if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+								kal_wsprintf(filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, req->config1);
+								strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+							} else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+								kal_wsprintf(filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, req->config1);
+								strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+							} else {
+								MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+								ret = MCF_OTA_R_INVALID_PARAMETER;
+
+								return ret;
+							}
+
+							fs_api_ret = FS_GetAttributes(filename);
+							if (fs_api_ret < FS_NO_ERROR) {
+								MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, req->config1);
+								ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+								return ret;
+							}
+
+							/* Read MCF TLV-OTA file information in NVRAM */
+							if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+								MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+								ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+								return ret;
+							}
+
+							strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+							strncpy(nv_tlvota_file.name, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+
+							/* Write MCF TLV-OTA file information in NVRAM */
+							if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+								MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+								ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+								return ret;
+							}
+
+							if (req->trigger_dsbp == 1) {
+								/* Read TLV-OTA file */
+								kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+								read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
+								read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+								read_file_info.ps_id = req->ps_id;
+								read_file_info.start_time = kal_get_systicks();
+
+								ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, (kal_char *)req->config1, &apply_path_type, apply_filename, pMcf);
+                                // Store Read TLV-OTA file result for dsbp urc use
+                                set_op_read_ret[sim_id] = ret;
+								if (ret == MCF_OTA_R_SUCCESS) {
+									MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+									if (tlvota_file) {
+										pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+										/* Store last updated file informantion */
+										tlvota_file->last_file.path_type = apply_path_type;
+										strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+										if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+											strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+											tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+										} else {
+											MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_VERSION(pFile->sw_version_len);
+										}
+										if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+											strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+											tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+										} else {
+											MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_SW_GEN_TIME(pFile->gen_time_len);
+										}
+                                        /* Check if file type is TLV-OTA file */
+                                        if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+                                            kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+                                            mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+                                            MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_FILE(str_tmp);
+                                            com_Mcf.tlvota_result[sim_id] = MCF_OTA_R_INVALID_FILE;
+                                        }
+										MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+									}else{
+										MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
+										ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+										return ret;
+									}
+									read_file_info.path_type = tlvota_file->path_type;
+									strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
+									is_read_tlvota[sim_id] = KAL_TRUE;
+								} else {
+									MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_FAIL(req->config_type);
+								}
+
+								read_file_info.result = ret;
+								read_file_info.end_time = kal_get_systicks();
+
+								mcf_em_send_ota_file_info(&read_file_info);
+								
+							}
+						} else {
+							if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+								/* If MCF is in DSBP active mode, change to DSBP passive mode */
+								ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_FALSE, sim_id);
+								if (ret != MCF_OTA_R_SUCCESS) {
+									return ret;
+								}
+								pMcf->is_ignore_dsbp[sim_id] = KAL_FALSE;
+							}
+
+							/* Read MCF TLV-OTA file information in NVRAM */
+							if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+								MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+								ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+								return ret;
+							}
+
+							strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+							strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+
+							/* Write MCF TLV-OTA file information in NVRAM */
+							if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+								MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+								ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+								return ret;
+							}
+
+							if (req->trigger_dsbp == 1) {
+								/* Deactivate TLV-OTA setting, reset TLV-OTA buffer */
+								MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+								if (tlvota_file) {
+									kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
+									tlvota_file->path_type = req->path_type;
+									strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
+                                    tlvota_file->last_mod_time = 0;
+									/* Clear last updated file informantion */
+									kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
+									MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+								} else {
+									MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
+								}
+								is_read_tlvota[sim_id] = KAL_TRUE;
+							}
+						}
+					}else{
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+						ret = mcf_combined_ota_file(req);
+						if(ret != MCF_OTA_R_SUCCESS){
+							return ret;
+                        }
+#else
+                        ret = MCF_OTA_R_MCF_NOT_SUPPORT;
+                        return ret;
+#endif
+					}
+
+                    break;
+                }
+
+                case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
+                {
+                    mcf_tlvota_file_t                      *tlvota_file = &(pMcf->general_tlvota_file);
+                    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+                    em_mcf_read_ota_file_info_struct        read_file_info;
+                    kal_char                                fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+                    kal_wchar                               filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+                    kal_char                                apply_filename[MCF_FILE_MAX_NAME_LEN];
+                    l4c_mcf_path_type_enum                  apply_path_type;
+                    kal_int32                               fs_api_ret;
+
+                    is_combine = nv_int_info.is_combined_general_tlvota;
+					if(is_combine == KAL_FALSE){
+						if (nv_int_info.not_reset_general_tlvota == KAL_TRUE) {
+                            /* If MCF is in DSBP active mode, change to DSBP passive mode */
+                            ret = mcf_set_not_reset(KAL_FALSE, req->config_type, 0);
+                            if (ret != MCF_OTA_R_SUCCESS) {
+                                return ret;
+                            }
+                            nv_int_info.not_reset_general_tlvota = KAL_FALSE;
+                        }
+                        if (strcmp((kal_char *)req->config1, "") != 0) {
+							if (pMcf->general_is_ignore_dsbp == KAL_FALSE) {
+								/* If MCF is in DSBP passive mode, change to DSBP active mode */
+								ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_TRUE, sim_id);
+								if (ret != MCF_OTA_R_SUCCESS) {
+									return ret;
+								}
+								pMcf->general_is_ignore_dsbp = KAL_TRUE;
+							}
+                            /* Check if file is existed */
+							if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+								kal_wsprintf(filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, req->config1);
+								strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+							} else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+								kal_wsprintf(filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, req->config1);
+								strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+							} else {
+								MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+								ret = MCF_OTA_R_INVALID_PARAMETER;
+
+								return ret;
+							}
+
+							fs_api_ret = FS_GetAttributes(filename);
+							if (fs_api_ret < FS_NO_ERROR) {
+								MD_TRC_MCF_TR_SET_FILE_PATH_FILE_NOT_EXIST(fs_root_path, req->config1);
+								ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+								return ret;
+							}
+
+							/* Read MCF general TLV-OTA file information in NVRAM */
+							if ( !nvram_external_read_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+								MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+								ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+								return ret;
+							}
+
+							strncpy(nv_tlvota_file.path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+							strncpy(nv_tlvota_file.name, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+
+							/* Write MCF general TLV-OTA file information in NVRAM */
+							if ( !nvram_external_write_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+								MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+								ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+								return ret;
+							}
+
+							if (req->trigger_dsbp == 1) {
+								/* Read general TLV-OTA file */
+								kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+								read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_AP;
+								read_file_info.config_type = L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN;
+								read_file_info.ps_id = req->ps_id;
+								read_file_info.start_time = kal_get_systicks();
+
+								ret = mcf_read_general_tlvota_file(KAL_FALSE, fs_root_path, (kal_char *)req->config1, &apply_path_type, apply_filename, pMcf);
+								if (ret == MCF_OTA_R_SUCCESS) {
+									MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+									if (tlvota_file) {
+										pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+										/* Store last updated file informantion */
+										tlvota_file->last_file.path_type = apply_path_type;
+										strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+										if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+											strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+											tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+										} else {
+											MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+										}
+										if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+											strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+											tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+										} else {
+											MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+										}
+                                        /* Check if file type is TLV-OTA file */
+                                        if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+                                            kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+                                            mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+                                            MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_FILE(str_tmp);
+                                        }
+										MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+									}else{
+										MD_TRC_MCF_TR_SET_FILE_PATH_TAKE_WRITE_LOCK_FAIL();
+										ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+										return ret;
+									}
+									read_file_info.path_type = tlvota_file->path_type;
+									strncpy(read_file_info.file_name, (kal_char *)&(tlvota_file->relative_path_name), MCF_FILE_MAX_NAME_LEN - 1);
+									for(i = 0; i < MAX_SIM_NUM; i++){
+										is_read_general_tlvota[i] = KAL_TRUE;
+									}
+								} else {
+									MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_FAIL(req->config_type);
+								}
+
+								read_file_info.result = ret;
+								read_file_info.end_time = kal_get_systicks();
+
+								mcf_em_send_ota_file_info(&read_file_info);
+							}
+						} else {
+                            if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
+								/* If MCF is in DSBP passive mode, change to DSBP active mode */
+								ret = mcf_set_dsbp_mode(KAL_FALSE, KAL_TRUE, sim_id);
+								if (ret != MCF_OTA_R_SUCCESS) {
+									return ret;
+								}
+								pMcf->general_is_ignore_dsbp = KAL_FALSE;
+							}
+							/* Read MCF general TLV-OTA file information in NVRAM */
+							if ( !nvram_external_read_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+								MD_TRC_MCF_TR_SET_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+								ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+								return ret;
+							}
+
+							strncpy(nv_tlvota_file.path, "", MCF_FILE_MAX_MD_PATH_LEN - 1);
+							strncpy(nv_tlvota_file.name, "", MCF_FILE_MAX_NAME_LEN - 1);
+
+							/* Write MCF general TLV-OTA file information in NVRAM */
+							if ( !nvram_external_write_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+								MD_TRC_MCF_TR_SET_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+								ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+								return ret;
+							}
+
+							if (req->trigger_dsbp == 1) {
+								/* Deactivate general TLV-OTA setting, reset general TLV-OTA buffer */
+								MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+								if (tlvota_file) {
+									kal_mem_set(tlvota_file->buff, 0, sizeof(kal_uint8) * MCF_MAX_TLVOTA_FILE_SIZE);
+									tlvota_file->path_type = req->path_type;
+									strncpy(tlvota_file->relative_path_name, "", MCF_FILE_MAX_NAME_LEN - 1);
+                                    tlvota_file->last_mod_time = 0;
+									/* Clear last updated file informantion */
+									kal_mem_set(&(tlvota_file->last_file), 0, sizeof(mcf_file_info_t));
+									MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+								} else {
+									MD_TRC_MCF_TR_SET_FILE_PATH_RESET_BUFFER_FAIL();
+								}
+								for(i = 0; i < MAX_SIM_NUM; i++){
+									is_read_general_tlvota[i] = KAL_TRUE;
+								}
+							}
+						}
+					}else{
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+						ret = mcf_combined_ota_file(req);
+						if(ret != MCF_OTA_R_SUCCESS){
+							return ret;
+                        }
+#else
+                        ret = MCF_OTA_R_MCF_NOT_SUPPORT;
+                        return ret;
+#endif
+					}
+
+                    break;
+                }
+
+                default:
+                    MD_TRC_MCF_TR_SET_FILE_PATH_INVALID_CONFIG_TYPE(req->config_type);
+                    ret = MCF_OTA_R_INVALID_PARAMETER;
+                    break;
+            }
+
+            break;
+        }
+
+        default:
+            ASSERT(0);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+    }
+
+    return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_get_applied_file_path(
+    l4c_mcf_get_config_req_struct *req,
+    l4c_mcf_get_config_cnf_struct *resp)
+{
+    mcf_t              *pMcf = mcf_get_instance();
+    sim_interface_enum  sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+    mcf_ota_result_e    ret = MCF_OTA_R_SUCCESS;
+
+    switch (req->op)
+    {
+        case L4C_MCF_CONFIG_GET_APPLIED_FILE_PATH:
+            switch (req->config_type)
+            {
+                case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+                {
+                    mcf_ota_file_t *ota_file = &(pMcf->ota_file);
+
+                    resp->config_type = req->config_type;
+
+                    MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+                    if (ota_file) {
+                        resp->path_type = ota_file->path_type;
+                        strncpy((kal_char *)resp->config1, ota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
+                        MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+                    } else {
+                        MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_TAKE_READ_LOCK_FAIL();
+                        ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                    }
+                    break;
+                }
+
+                case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+                {
+                    mcf_tlvota_file_t  *tlvota_file = &(pMcf->tlvota_file[sim_id]);
+
+                    resp->config_type = req->config_type;
+
+                    MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                    if (tlvota_file) {
+                        resp->path_type = tlvota_file->path_type;
+                        strncpy((kal_char *)resp->config1, tlvota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
+                        MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                    } else {
+                        MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_TAKE_READ_LOCK_FAIL();
+                        ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                    }
+                    break;
+                }
+
+                case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
+                {
+                    mcf_tlvota_file_t  *tlvota_file = &(pMcf->general_tlvota_file);
+
+                    resp->config_type = req->config_type;
+
+                    MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                    if (tlvota_file) {
+                        resp->path_type = tlvota_file->path_type;
+                        strncpy((kal_char *)resp->config1, tlvota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
+                        MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                    } else {
+                        MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_TAKE_READ_LOCK_FAIL();
+                        ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                    }
+                    break;
+                }
+
+                default:
+                    MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH_UNSUPPORTED_CONFIG_TYPE(req->config_type);
+                    ret = MCF_OTA_R_INVALID_PARAMETER;
+                    break;
+            }
+            MD_TRC_MCF_TR_GET_APPLIED_FILE_PATH(ret, req->ps_id, sim_id, req->config_type, resp->path_type, resp->config1);
+            break;
+
+        default:
+            ASSERT(0);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+    }
+
+    return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_dump_all_lid_data(l4c_mcf_dump_data_req_struct *req_ptr)
+{
+    mcf_t                          *pMcf = mcf_get_instance();
+    mcf_custom_dump_param_struct    dump_para[MAX_SIM_NUM];
+    mcf_dump_lid_header_struct      dump_lid_header;
+    mcf_dump_lid_header_struct     *dump_header_ptr = NULL;
+    nvram_ltable_entry_struct       lid_info = {0};
+    time_t                          time_sec;
+    MCF_TIME_STRUCT                 curr_time;
+    kal_wchar                       foldername[MCF_FILE_MAX_MD_PATH_LEN];
+    kal_char                        folder_path[MCF_FILE_MAX_MD_PATH_LEN];
+    kal_char                        file_name[MCF_FILE_MAX_MD_PATH_LEN];
+    kal_uint32                      total_size;
+    kal_uint32                      lid_size;
+    kal_uint32                      padding;
+    kal_uint32                      i, j, k;
+    kal_bool                        is_found = KAL_FALSE;
+    kal_bool                        ret;
+    nvram_errno_enum                nvram_api_ret;
+    mcf_ota_result_e                mcf_ret = MCF_OTA_R_SUCCESS;
+    kal_uint32                      dump_lid_cnt = 0;
+    kal_uint32                      m;
+    kal_char                        last_dump_folder_name[MCF_FILE_MAX_MD_PATH_LEN];
+    kal_int32                       fs_ret = FS_NO_ERROR;
+    kal_wchar                       pathname[MCF_FILE_MAX_MD_PATH_LEN];
+    kal_int32                       ret_snprintf;
+    kal_int32                       ret_sprintf;
+    time_t                          time_ret;
+
+    /* Create dump folder */
+    time_ret = time(&time_sec);
+    if (time_ret == (time_t)(-1)){
+        time_sec = 0;
+    }
+#if __MTK_TARGET__
+    localtime_r(&time_sec, &curr_time);
+#else
+    curr_time.tm_year = 12;
+    curr_time.tm_mon = 3;
+    curr_time.tm_mday = 4;
+    curr_time.tm_hour = 5;
+    curr_time.tm_min = 6;
+    curr_time.tm_sec = 7;
+#endif
+    mcf_snprintf(folder_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s\\%s_%.4d%.2d%.2d_%.2d%.2d%.2d%c", MCF_FS_CUSTOM_FOLDER_PATH, MCF_DUMP_FOLDER_PREFIX, curr_time.tm_year + 1900, curr_time.tm_mon + 1, curr_time.tm_mday, curr_time.tm_hour, curr_time.tm_min, curr_time.tm_sec, '\0');
+
+    kal_wsprintf(foldername, "%s\0", folder_path);
+    FS_CreateDir(foldername);
+    
+    /* Support MCF Tool Read/Write - Delete txt */
+
+    kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_DUMP_FOLDER_NAME);
+    fs_ret = FS_Delete(pathname);
+    
+    if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+        MD_TRC_MCF_TR_DUMP_ALL_LID_DELETE_FILE_FAIL(fs_ret);
+        mcf_ret = MCF_OTA_R_WRITE_DISK_FAIL;
+        return mcf_ret;
+    }
+
+    MD_TRC_MCF_TR_DUMP_ALL_LID_START(folder_path);
+
+    kal_mem_set(dump_para, 0, sizeof(mcf_custom_dump_param_struct) * MAX_SIM_NUM);
+    for (k = 0; k < MAX_SIM_NUM; k++) {
+        dump_para[k].ps_id = l4c_gemini_get_switched_sim_id(k);
+        dump_para[k].sbp_id = pMcf->tlvota_file[k].sbp_id;
+        kal_mem_cpy(&(dump_para[k].mcc), &(pMcf->tlvota_file[k].mcc), MAX_MCC_STR_LEN);
+        kal_mem_cpy(&(dump_para[k].mnc), &(pMcf->tlvota_file[k].mnc), MAX_MNC_STR_LEN);
+        kal_mem_cpy(&(dump_para[k].iccid), &(pMcf->tlvota_file[k].iccid), 21);
+        dump_para[k].size = &lid_size;
+    }
+    
+    dump_lid_cnt = req_ptr->lid_cnt;
+    MD_TRC_MCF_TR_DUMP_ALL_LID_NUMBER(dump_lid_cnt);
+
+    /* Dump all LIDs */
+    if(dump_lid_cnt == 0){
+        for (i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++) {
+            is_found = KAL_FALSE;
+
+            nvram_api_ret = nvram_external_get_lid_info(mcf_db_lid_mapping_tbl[i].lid_num, &lid_info);
+            if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+                MD_TRC_MCF_TR_DUMP_ALL_LID_GET_LID_INFO_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, nvram_api_ret);
+                continue;
+            }
+
+            if ((lid_info.size % 4) == 0) {
+                padding = 0;
+            } else {
+                padding = 4 - (lid_info.size % 4);
+                MD_TRC_MCF_TR_DUMP_ALL_LID_SIZE_NOT_ALIGNMENT(lid_info.LID, lid_info.size, padding);
+            }
+
+            for (j = 0; j < mcf_dump_param_tbl_num; j++) {
+                if ( (mcf_dump_param_tbl[j].lid == mcf_db_lid_mapping_tbl[i].lid_num) ) {
+                    is_found = KAL_TRUE;
+
+                    if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
+                        total_size = 0;
+
+                        if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
+                            for (k = 0; k < lid_info.total_records; k++) {
+                                dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+                                kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                                dump_para[0].lid = mcf_dump_param_tbl[j].lid;
+                                dump_para[0].type = MCF_TYPE_OTA;
+                                dump_para[0].record_idx = k + 1;
+                                dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+                                *(dump_para[0].size) = 0;
+
+                                MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_CALLBACK(dump_para[0].lid, dump_para[0].type, dump_para[0].record_idx, dump_para[0].buffer);
+
+                                ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[0]);
+                                if ( (ret == KAL_FALSE) || (*(dump_para[0].size) != lid_info.size) ) {
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_DUMP_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, ret, lid_info.size, *(dump_para[0].size));
+                                    break;
+                                }
+
+                                /* Add header */
+                                kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                                strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                                dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                                dump_lid_header.content_type = MCF_TYPE_OTA;
+                                dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                                dump_lid_header.content_len = lid_info.size;
+                                dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                                dump_lid_header.record_idx = k + 1;
+                                strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                                dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                                dump_lid_header.checksum = 0; /* unused */
+                                kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                                total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+                            }
+                        } else {
+                            /* If not register callback */
+                            for (k = 0; k < lid_info.total_records; k++) {
+                                dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+                                kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                                dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+                                if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size);
+                                    break;
+                                }
+
+                                /* Add header */
+                                kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                                strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                                dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                                dump_lid_header.content_type = MCF_TYPE_OTA;
+                                dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                                dump_lid_header.content_len = lid_info.size;
+                                dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                                dump_lid_header.record_idx = k + 1;
+                                strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                                dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                                dump_lid_header.checksum = 0; /* unused */
+                                kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                                total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+                            }
+                        }
+
+                        ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_default%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, MCF_DUMP_FILE_POSTFIX, '\0');
+                        if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                            strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                            MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
+                        }
+                        mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+                        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                            return mcf_ret;
+                        }
+                    }
+
+                    if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
+                        if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
+                            for (k = 0; k < MAX_SIM_NUM; k++) {
+                                if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+                                    continue;
+                                }
+
+                                total_size = 0;
+
+                                dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+                                kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                                dump_para[k].lid = mcf_dump_param_tbl[j].lid;
+                                dump_para[k].type = MCF_TYPE_OTA_BY_OP;
+                                dump_para[k].record_idx = 1;
+                                dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+                                *(dump_para[k].size) = 0;
+
+                                MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_CALLBACK_1_USIR(dump_para[k].ps_id, dump_para[k].sbp_id, dump_para[k].mcc, dump_para[k].mnc, dump_para[k].iccid);
+                                MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_CALLBACK_2(dump_para[k].lid, dump_para[k].type, dump_para[k].record_idx, dump_para[k].buffer);
+
+                                ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[k]);
+                                if ( (ret == KAL_FALSE) || (*(dump_para[k].size) != lid_info.size) ) {
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_DUMP_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, ret, lid_info.size, *(dump_para[k].size));
+                                    break;
+                                }
+
+                                /* Add header */
+                                kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                                strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                                dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                                dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+                                dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                                dump_lid_header.content_len = lid_info.size;
+                                dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                                dump_lid_header.record_idx = 1;
+                                strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                                dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                                dump_lid_header.checksum = 0; /* unused */
+                                kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                                total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+                                ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+                                if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                                    strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+                                }
+                                mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+                                if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                                    return mcf_ret;
+                                }
+                            }
+                        } else {
+                            /* If not register callback */
+                            for (k = 0; k < MAX_SIM_NUM; k++) {
+                                if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+                                    continue;
+                                }
+
+                                total_size = 0;
+
+                                dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+                                kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                                dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+                                if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size) ) {
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size);
+                                    break;
+                                }
+
+                                /* Add header */
+                                kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                                strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                                dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                                dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+                                dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                                dump_lid_header.content_len = lid_info.size;
+                                dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                                dump_lid_header.record_idx = 1;
+                                strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                                dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                                dump_lid_header.checksum = 0; /* unused */
+                                kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                                total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+                                ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+                                if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                                    strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+                                }
+                                mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+                                if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                                    return mcf_ret;
+                                }
+                            }
+                        }
+                    }
+
+                    break;
+                }
+            }
+
+            /* If not register callback */
+            if (is_found == KAL_FALSE) {
+                if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
+                    total_size = 0;
+
+                    for (k = 0; k < lid_info.total_records; k++) {
+                        dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+                        kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                        dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+                        if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
+                            MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size);
+                            break;
+                        }
+
+                        /* Add header */
+                        kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                        strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                        dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                        dump_lid_header.content_type = MCF_TYPE_OTA;
+                        dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                        dump_lid_header.content_len = lid_info.size;
+                        dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                        dump_lid_header.record_idx = k + 1;
+                        strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                        dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                        dump_lid_header.checksum = 0; /* unused */
+                        kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                        total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+                    }
+
+                    ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_default%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, MCF_DUMP_FILE_POSTFIX, '\0');
+                    if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                        strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                        MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
+                    }
+                    mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+                    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                        return mcf_ret;
+                    }
+                }
+
+                if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
+                    for (k = 0; k < MAX_SIM_NUM; k++) {
+                        if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+                            MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+                            continue;
+                        }
+
+                        total_size = 0;
+
+                        dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+                        kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                        dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+                        if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size) ) {
+                            MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size);
+                            break;
+                        }
+
+                        /* Add header */
+                        kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                        strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                        dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                        dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+                        dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                        dump_lid_header.content_len = lid_info.size;
+                        dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                        dump_lid_header.record_idx = 1;
+                        strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                        dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                        dump_lid_header.checksum = 0; /* unused */
+                        kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                        total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+                        ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+                        if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                            strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                            MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+                        }
+                        mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+                        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                            return mcf_ret;
+                        }
+                    }
+                }
+            }
+        }
+    }else if (dump_lid_cnt > 0)
+    {
+        /* Only dump dump_lid_cnt LIDs */
+        for(m = 0; m < dump_lid_cnt; m++){
+            is_found = KAL_FALSE;
+            for (i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++) {
+                if (req_ptr->lid[m] == mcf_db_lid_mapping_tbl[i].lid_num){
+                    is_found = KAL_TRUE;
+                }
+                    
+            }
+            if (is_found == KAL_FALSE)
+            {
+                MD_TRC_MCF_TR_DUMP_ALL_LID_CANNOT_FIND_LID(req_ptr->lid[m]);
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                return mcf_ret;
+            }
+        }
+
+        for(m = 0; m < dump_lid_cnt; m++){
+            is_found = KAL_FALSE;
+            for (i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++) {
+                if (req_ptr->lid[m] == mcf_db_lid_mapping_tbl[i].lid_num){
+                    is_found = KAL_FALSE;
+
+                    nvram_api_ret = nvram_external_get_lid_info(mcf_db_lid_mapping_tbl[i].lid_num, &lid_info);
+                    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+                        MD_TRC_MCF_TR_DUMP_ALL_LID_GET_LID_INFO_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, nvram_api_ret);
+                        continue;
+                    }
+
+                    if ((lid_info.size % 4) == 0) {
+                        padding = 0;
+                    } else {
+                        padding = 4 - (lid_info.size % 4);
+                        MD_TRC_MCF_TR_DUMP_ALL_LID_SIZE_NOT_ALIGNMENT(lid_info.LID, lid_info.size, padding);
+                    }
+
+                    for (j = 0; j < mcf_dump_param_tbl_num; j++) {
+                        if ( (mcf_dump_param_tbl[j].lid == mcf_db_lid_mapping_tbl[i].lid_num) ) {
+                            is_found = KAL_TRUE;
+
+                            if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
+                                total_size = 0;
+
+                                if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
+                                    for (k = 0; k < lid_info.total_records; k++) {
+                                        dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+                                        kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                                        dump_para[0].lid = mcf_dump_param_tbl[j].lid;
+                                        dump_para[0].type = MCF_TYPE_OTA;
+                                        dump_para[0].record_idx = k + 1;
+                                        dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+                                        *(dump_para[0].size) = 0;
+
+                                        MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_CALLBACK(dump_para[0].lid, dump_para[0].type, dump_para[0].record_idx, dump_para[0].buffer);
+
+                                        ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[0]);
+                                        if ( (ret == KAL_FALSE) || (*(dump_para[0].size) != lid_info.size) ) {
+                                            MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_DUMP_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, ret, lid_info.size, *(dump_para[0].size));
+                                            break;
+                                        }
+
+                                        /* Add header */
+                                        kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                                        strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                                        dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                                        dump_lid_header.content_type = MCF_TYPE_OTA;
+                                        dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                                        dump_lid_header.content_len = lid_info.size;
+                                        dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                                        dump_lid_header.record_idx = k + 1;
+                                        strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                                        dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                                        dump_lid_header.checksum = 0; /* unused */
+                                        kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                                        total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+                                    }
+                                } else {
+                                    /* If not register callback */
+                                    for (k = 0; k < lid_info.total_records; k++) {
+                                        dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+                                        kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                                        dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+                                        if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
+                                            MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size);
+                                            break;
+                                        }
+
+                                        /* Add header */
+                                        kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                                        strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                                        dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                                        dump_lid_header.content_type = MCF_TYPE_OTA;
+                                        dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                                        dump_lid_header.content_len = lid_info.size;
+                                        dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                                        dump_lid_header.record_idx = k + 1;
+                                        strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                                        dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                                        dump_lid_header.checksum = 0; /* unused */
+                                        kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                                        total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+                                    }
+                                }
+
+                                ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_default%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, MCF_DUMP_FILE_POSTFIX, '\0');
+                                if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                                    strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
+                                }
+                                mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+                                if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                                    return mcf_ret;
+                                }
+                            }
+
+                            if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
+                                if ((mcf_dump_param_tbl[j].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
+                                    for (k = 0; k < MAX_SIM_NUM; k++) {
+                                        if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+                                            MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+                                            continue;
+                                        }
+
+                                        total_size = 0;
+
+                                        dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+                                        kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                                        dump_para[k].lid = mcf_dump_param_tbl[j].lid;
+                                        dump_para[k].type = MCF_TYPE_OTA_BY_OP;
+                                        dump_para[k].record_idx = 1;
+                                        dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+                                        *(dump_para[k].size) = 0;
+
+                                        MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_CALLBACK_1_USIR(dump_para[k].ps_id, dump_para[k].sbp_id, dump_para[k].mcc, dump_para[k].mnc, dump_para[k].iccid);
+                                        MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_CALLBACK_2(dump_para[k].lid, dump_para[k].type, dump_para[k].record_idx, dump_para[k].buffer);
+
+                                        ret = mcf_dump_param_tbl[j].dump_func_ptr(&dump_para[k]);
+                                        if ( (ret == KAL_FALSE) || (*(dump_para[k].size) != lid_info.size) ) {
+                                            MD_TRC_MCF_TR_DUMP_ALL_LID_OTA_BY_OP_DUMP_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, ret, lid_info.size, *(dump_para[k].size));
+                                            break;
+                                        }
+
+                                        /* Add header */
+                                        kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                                        strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                                        dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                                        dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+                                        dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                                        dump_lid_header.content_len = lid_info.size;
+                                        dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                                        dump_lid_header.record_idx = 1;
+                                        strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                                        dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                                        dump_lid_header.checksum = 0; /* unused */
+                                        kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                                        total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+                                        ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+                                        if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                                            strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                                            MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+                                        }
+                                        mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+                                        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                                            return mcf_ret;
+                                        }
+                                    }
+                                } else {
+                                    /* If not register callback */
+                                    for (k = 0; k < MAX_SIM_NUM; k++) {
+                                        if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+                                            MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+                                            continue;
+                                        }
+
+                                        total_size = 0;
+
+                                        dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+                                        kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                                        dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+                                        if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size) ) {
+                                            MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size);
+                                            break;
+                                        }
+
+                                        /* Add header */
+                                        kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                                        strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                                        dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                                        dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+                                        dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                                        dump_lid_header.content_len = lid_info.size;
+                                        dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                                        dump_lid_header.record_idx = 1;
+                                        strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                                        dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                                        dump_lid_header.checksum = 0; /* unused */
+                                        kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                                        total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+                                        ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+                                        if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                                            strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                                            MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+                                        }
+                                        mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+                                        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                                            return mcf_ret;
+                                        }
+                                    }
+                                }
+                            }
+
+                            break;
+                        }
+                    }
+
+                    /* If not register callback */
+                    if (is_found == KAL_FALSE) {
+                        if (mcf_db_lid_mapping_tbl[i].is_ota == KAL_TRUE) {
+                            total_size = 0;
+
+                            for (k = 0; k < lid_info.total_records; k++) {
+                                dump_header_ptr = (mcf_dump_lid_header_struct *)(mcf_dump_buffer + (sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding) * k);
+                                kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                                dump_para[0].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+                                if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size) ) {
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, dump_para[0].buffer, lid_info.size);
+                                    break;
+                                }
+
+                                /* Add header */
+                                kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                                strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                                dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                                dump_lid_header.content_type = MCF_TYPE_OTA;
+                                dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                                dump_lid_header.content_len = lid_info.size;
+                                dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                                dump_lid_header.record_idx = k + 1;
+                                strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                                dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                                dump_lid_header.checksum = 0; /* unused */
+                                kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                                total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+                            }
+
+                            ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_default%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, MCF_DUMP_FILE_POSTFIX, '\0');
+                            if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                                strncpy(file_name, "default_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                                MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_DEFAULT_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, ret_snprintf);
+                            }
+                            mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+                            if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                                return mcf_ret;
+                            }
+                        }
+
+                        if (mcf_db_lid_mapping_tbl[i].is_ota_by_op == KAL_TRUE) {
+                            for (k = 0; k < MAX_SIM_NUM; k++) {
+                                if ( (strncmp((kal_char *)(dump_para[k].mcc), "", MAX_MCC_STR_LEN) == 0) || (strncmp((kal_char *)(dump_para[k].mnc), "", MAX_MNC_STR_LEN) == 0) ) {
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_NULL_MCC_MNC((kal_char *)(dump_para[k].mcc), (kal_char *)(dump_para[k].mnc));
+                                    continue;
+                                }
+
+                                total_size = 0;
+
+                                dump_header_ptr = (mcf_dump_lid_header_struct *)mcf_dump_buffer;
+                                kal_mem_set(dump_header_ptr, 0, sizeof(mcf_dump_lid_header_struct) + lid_info.size + padding);
+
+                                dump_para[k].buffer = (kal_uint8 *)dump_header_ptr + sizeof(mcf_dump_lid_header_struct);
+
+                                if ( !nvram_external_read_data(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size) ) {
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_READ_NVRAM_FAIL(mcf_db_lid_mapping_tbl[i].lid_num, dump_para[k].ps_id + 1, dump_para[k].buffer, lid_info.size);
+                                    break;
+                                }
+
+                                /* Add header */
+                                kal_mem_set(&dump_lid_header, 0, sizeof(mcf_dump_lid_header_struct));
+                                strncpy(dump_lid_header.sync_token, MCF_DUMP_LID_SYNC_TOKEN, 7);
+                                dump_lid_header.header_version = MCF_DUMP_LID_HEADER_VERSION;
+                                dump_lid_header.content_type = MCF_TYPE_OTA_BY_OP;
+                                dump_lid_header.operation_mask = MCF_FILE_OP_NONE;
+                                dump_lid_header.content_len = lid_info.size;
+                                dump_lid_header.lid = mcf_db_lid_mapping_tbl[i].lid_num;
+                                dump_lid_header.record_idx = 1;
+                                strncpy(dump_lid_header.lid_version, lid_info.fileverno, FILE_VERNO_LEN);
+                                dump_lid_header.lid_version[FILE_VERNO_LEN] = '\0';
+                                dump_lid_header.checksum = 0; /* unused */
+                                kal_mem_cpy(dump_header_ptr, &dump_lid_header, sizeof(mcf_dump_lid_header_struct));
+
+                                total_size += sizeof(mcf_dump_lid_header_struct) + dump_lid_header.content_len + padding;
+
+                                ret_snprintf = kal_snprintf(file_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%d_SIM%d%s%c", MCF_DUMP_FILE_PREFIX, mcf_db_lid_mapping_tbl[i].lid_num, k + 1, MCF_DUMP_FILE_POSTFIX, '\0');
+                                if (ret_snprintf < 0 || ret_snprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                                    strncpy(file_name, "SIM_error.dump", MCF_FILE_MAX_MD_PATH_LEN - 1);
+                                    MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_SIM_FILENAME_ERROR(mcf_db_lid_mapping_tbl[i].lid_num, k + 1, ret_snprintf);
+                                }
+                                mcf_ret = mcf_write_buffer(folder_path, file_name, mcf_dump_buffer, total_size);
+                                if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                                    return mcf_ret;
+                                }
+                            }
+                        }
+                    }
+                
+                }
+            }
+        }
+    }
+    
+    /* Support MCF Tool Read/Write - Write dump folder name into txt */
+    kal_mem_set(last_dump_folder_name, 0, MCF_FILE_MAX_MD_PATH_LEN);
+    ret_sprintf = kal_snprintf(last_dump_folder_name, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s_%.4d%.2d%.2d_%.2d%.2d%.2d%c", MCF_DUMP_FOLDER_PREFIX, curr_time.tm_year + 1900, curr_time.tm_mon + 1, curr_time.tm_mday, curr_time.tm_hour, curr_time.tm_min, curr_time.tm_sec, '\0');
+    if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
+        strncpy(last_dump_folder_name, "unknown_error", MCF_FILE_MAX_MD_PATH_LEN - 1);
+    }
+    MD_TRC_MCF_TR_DUMP_ALL_LID_DUMP_FOLDER_NAME(last_dump_folder_name);
+    if(mcf_ret == MCF_OTA_R_SUCCESS){
+        mcf_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_DUMP_FOLDER_NAME, (kal_uint8 *)last_dump_folder_name, sizeof(kal_char) * strlen(last_dump_folder_name));
+        if (mcf_ret != MCF_OTA_R_SUCCESS) {
+            return mcf_ret;
+        }
+    }
+
+    return mcf_ret;
+}
+
+_STATIC mcf_ota_result_e mcf_config_ini_info(
+    l4c_mcf_config_req_struct *req,
+    l4c_mcf_config_cnf_struct *resp)
+{
+    mcf_t                                   *pMcf = mcf_get_instance();
+    kal_char                                apply_filename[MCF_FILE_MAX_NAME_LEN];
+    l4c_mcf_path_type_enum                  apply_path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+    mcf_ota_result_e                        mcf_ret = MCF_OTA_R_SUCCESS;
+    mcf_ini_file_t                          *ini_file = &(pMcf->ini_file);
+    kal_char                                *buffer = (kal_char *)ini_file->tmp_buff;
+    kal_char                                orign_value[MCF_MAX_INI_ITEM_VALUE_LEN];
+    kal_uint64                              ini_path_ota_file_last_mod_time = 0;
+    kal_uint64                              ini_path_runtime_file_last_mod_time = 0;
+    kal_uint64                              ini_last_read_mod_time = 0;
+    kal_char                                ini_root_path[20];
+    
+    if(strcmp((kal_char *)req->item,"") == 0){
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+        return mcf_ret;
+    }
+    if(strlen((kal_char *)req->item) > 63){
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+        return mcf_ret;
+    }
+    
+    kal_mem_set((kal_char *)resp->item,0,MCF_MAX_INI_ITEM_LEN);
+    kal_mem_set((kal_char *)resp->value,0,MCF_MAX_INI_ITEM_VALUE_LEN);
+    strncpy((kal_char *)resp->item, (kal_char *)req->item, MCF_MAX_INI_ITEM_LEN-1);
+    
+    switch (req->mode)
+    {
+        case L4C_MCF_CONFIG_MODE_READ:
+            
+            ini_last_read_mod_time = ini_file->last_mod_time;
+            
+            if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                ini_path_ota_file_last_mod_time = 0;
+                MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                
+                if (mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                    ini_path_runtime_file_last_mod_time = 0;
+                    MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                    mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+                    return mcf_ret;
+                }    
+            }
+            
+            
+            if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                ini_path_runtime_file_last_mod_time = 0;
+                MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                
+                if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                    ini_path_ota_file_last_mod_time = 0;
+                    MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                    mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+                    return mcf_ret;
+                }
+            }
+            
+            MD_TRC_MCF_TR_CONFIG_INI_LAST_MOD_TIME(ini_path_ota_file_last_mod_time, ini_path_runtime_file_last_mod_time, ini_last_read_mod_time);
+            kal_mem_set(ini_root_path,0,20);
+            if (ini_path_ota_file_last_mod_time > ini_path_runtime_file_last_mod_time){
+                strncpy(ini_root_path,MCF_FS_DEFAULT_FOLDER_PATH, 19);
+            }else{
+               strncpy(ini_root_path,MCF_FS_CUSTOM_FOLDER_PATH, 19);
+            }
+            
+            MD_TRC_MCF_TR_CONFIG_INI_READ(ini_root_path);
+            if (mcf_read_ini_file(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, &apply_path_type, apply_filename, pMcf) == MCF_OTA_R_SUCCESS) {
+                
+            } else {
+               /* Cannot do OTA if fail to read ini file */
+                mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+                return mcf_ret;
+            }
+            
+            if (mcf_find_ini_item((kal_char *)ini_file->buff, (kal_char *)resp->item, (kal_char *)resp->value, pMcf) == KAL_TRUE) {
+                
+                
+                
+            } else {
+                /* Cannot do OTA if fail to read ini file */
+                mcf_ret = MCF_OTA_R_INVALID_INI_ITEM;
+                return mcf_ret;
+            }
+                
+            
+            break;
+        
+        case L4C_MCF_CONFIG_MODE_WRITE:
+        
+            strncpy((kal_char *)resp->value, (kal_char *)req->value, MCF_MAX_INI_ITEM_VALUE_LEN-1);
+            
+
+            ini_last_read_mod_time = ini_file->last_mod_time;
+            
+            
+            if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                ini_path_ota_file_last_mod_time = 0;
+                MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                
+                if (mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                    ini_path_runtime_file_last_mod_time = 0;
+                    MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                    mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+                    return mcf_ret;
+                }    
+            }
+            
+            
+            if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                ini_path_runtime_file_last_mod_time = 0;
+                MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                
+                if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                    ini_path_ota_file_last_mod_time = 0;
+                    MD_TRC_MCF_TR_CONFIG_INI_READ_INI_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                    mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+                    return mcf_ret;
+                }
+            }
+            
+            MD_TRC_MCF_TR_CONFIG_INI_LAST_MOD_TIME(ini_path_ota_file_last_mod_time, ini_path_runtime_file_last_mod_time, ini_last_read_mod_time);
+            kal_mem_set(ini_root_path,0,20);
+            if (ini_path_ota_file_last_mod_time > ini_path_runtime_file_last_mod_time){
+                strncpy(ini_root_path,MCF_FS_DEFAULT_FOLDER_PATH, 19);
+            }else{
+               strncpy(ini_root_path,MCF_FS_CUSTOM_FOLDER_PATH, 19);
+            }
+            
+            
+            MD_TRC_MCF_TR_CONFIG_INI_READ(ini_root_path);
+            if (mcf_read_ini_file(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, &apply_path_type, apply_filename, pMcf) == MCF_OTA_R_SUCCESS) {
+                
+            } else {
+               /* Cannot do OTA if fail to read ini file */                
+                mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+                return mcf_ret;
+            }
+            kal_mem_set(orign_value, 0, MCF_MAX_INI_ITEM_VALUE_LEN);
+            kal_mem_set((kal_char *)resp->value, 0, MCF_MAX_INI_ITEM_VALUE_LEN);
+            mcf_find_ini_item((kal_char *)ini_file->buff, (kal_char *)resp->item, orign_value, pMcf);
+            
+            kal_mem_set(buffer,0,MCF_MAX_INI_FILE_SIZE);        
+            if (mcf_compose_ini_item((kal_char *)ini_file->buff, buffer, (kal_char *)resp->item, orign_value, (kal_char *)resp->value) == KAL_TRUE) {
+                mcf_ret = mcf_write_buffer(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, (kal_uint8 *)buffer, strlen(buffer));
+                if (mcf_ret != MCF_OTA_R_SUCCESS){
+                    return mcf_ret;
+                }
+                
+            } else {
+               /* Cannot do OTA if fail to read ini file */    
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                return mcf_ret;
+            }
+            
+            break;
+        
+        default:
+             ASSERT(0);
+             mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                    
+    }
+    
+
+    return mcf_ret;
+}
+
+_STATIC mcf_ota_result_e mcf_update_ota_file(
+    l4c_mcf_update_ota_file_req_struct *req,
+    l4c_mcf_update_ota_file_cnf_struct *resp,
+    module_type src_mod_id,
+    kal_bool *reset_MD)
+{
+    mcf_t                                   *pMcf = mcf_get_instance();
+    //sim_interface_enum                      sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+    //nvram_ef_mcf_ini_file_info_struct       ini_file;
+    kal_char                                apply_filename[MCF_FILE_MAX_NAME_LEN];
+    l4c_mcf_path_type_enum                  apply_path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+    mcf_ota_result_e                        mcf_ret = MCF_OTA_R_SUCCESS;
+    mcf_ini_file_t                          *ini_file = &(pMcf->ini_file);
+    kal_uint32                              sbp_id_arr[MCF_MAX_TAG_NUM];
+    kal_char                                tag_str[MCF_MAX_INI_ITEM_VALUE_LEN];
+    kal_uint16                              sbp_id_num = 0;
+    mcf_ota_file_t                          *ota_file = &(pMcf->ota_file);
+    mcf_tlvota_file_t                       *tlvota_file;
+    kal_int32                               i = 0;
+    kal_int32                               j = 0;
+    kal_char                                ota_path_name[MCF_FILE_MAX_NAME_LEN];
+    kal_uint64                              ota_last_read_mod_time = 0;
+    kal_uint64                              ota_path_ota_file_last_mod_time = 0;
+    kal_uint64                              ota_path_runtime_file_last_mod_time = 0;
+    kal_uint32                              sbp_id = SBP_ID_INVALID;
+    protocol_id_enum                        ps_id = 0;
+    kal_char                                tlvota_path_name[MCF_FILE_MAX_NAME_LEN];
+    kal_uint64                              tlvota_last_read_mod_time = 0;
+    kal_uint64                              tlvota_path_ota_file_last_mod_time = 0;
+    kal_uint64                              tlvota_path_runtime_file_last_mod_time = 0;
+    mcf_l4bsbp_trigger_dsbp_ind_struct      *ind_ptr = NULL;
+    kal_bool                                apply_general_tlv;
+    kal_char                                tag_name[10];
+    kal_bool                                trigger_ps_id[MAX_SIM_NUM];
+    kal_uint64                              ini_last_read_mod_time = 0;
+    kal_uint64                              ini_path_ota_file_last_mod_time = 0;
+    kal_uint64                              ini_path_runtime_file_last_mod_time = 0;
+    kal_char                                ini_root_path[20];
+    kal_uint32                              ret_sprintf;
+    
+    
+    MD_TRC_MCF_TR_UPDATE_OTA_START();
+    
+    
+    pMcf->dsbp_cnf_ret = KAL_TRUE;
+    pMcf->dsbp_ind_ret = KAL_TRUE;
+    apply_general_tlv = KAL_FALSE;
+    kal_mem_set(trigger_ps_id,0,MAX_SIM_NUM);
+    /* Compare modified time of OTA file to know whether update OTA file */
+            
+    MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        kal_mem_set(ota_path_name,0,MCF_FILE_MAX_NAME_LEN);
+        strncpy(ota_path_name, ota_file->relative_path_name, MCF_FILE_MAX_NAME_LEN - 1);
+        ota_last_read_mod_time = ota_file->last_mod_time;
+        MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_TAKE_READ_LOCK_FAIL();
+        mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+        return mcf_ret;
+    }
+    
+    
+    
+    if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_OTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+        ota_path_ota_file_last_mod_time = 0;
+        MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+        
+        if (mcf_get_file_last_mod_time (MCF_FS_DEFAULT_OTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+            ota_path_runtime_file_last_mod_time = 0;
+            MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+            mcf_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+            //return mcf_ret;
+        }    
+    }
+    
+    
+    if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_OTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+        ota_path_runtime_file_last_mod_time = 0;
+        MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+        
+        if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_OTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+            ota_path_ota_file_last_mod_time = 0;
+            MD_TRC_MCF_TR_UPDATE_OTA_READ_OTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+            mcf_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+            //return mcf_ret;
+        }
+    }
+    
+    MD_TRC_MCF_TR_UPDATE_OTA_OTA_LAST_MOD_TIME(ota_path_ota_file_last_mod_time, ota_path_runtime_file_last_mod_time, ota_last_read_mod_time);
+    
+    if (ota_path_ota_file_last_mod_time > ota_path_runtime_file_last_mod_time){
+        if(ota_path_ota_file_last_mod_time > ota_last_read_mod_time){
+            /* If OTA file is updated, need to reset MD to apply OTA */
+            MD_TRC_MCF_TR_UPDATE_OTA_RESET_MD(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((ota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(ota_path_ota_file_last_mod_time & 0xFFFFFFFF), 
+                                               (kal_uint32)((ota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(ota_last_read_mod_time & 0xFFFFFFFF));
+            mcf_ret = MCF_OTA_R_SUCCESS;
+            *reset_MD = KAL_TRUE;
+            
+            return mcf_ret;
+        }
+    }else{
+        if(ota_path_runtime_file_last_mod_time > ota_last_read_mod_time){
+            /* If OTA file is updated, need to reset MD to apply OTA */
+            MD_TRC_MCF_TR_UPDATE_OTA_RESET_MD(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((ota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(ota_path_runtime_file_last_mod_time & 0xFFFFFFFF), 
+                                               (kal_uint32)((ota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(ota_last_read_mod_time & 0xFFFFFFFF));
+            mcf_ret = MCF_OTA_R_SUCCESS;
+            *reset_MD = KAL_TRUE;
+            return mcf_ret;
+        }
+    }
+    
+    MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_OTA();
+    
+    switch (req->action)
+    {
+        case L4C_MCF_CONFIG_ACT_NO_READ_INI:
+        /* Update OTA file without reading ini file */    
+            MD_TRC_MCF_TR_UPDATE_OTA_NO_READ_INI();
+            
+            /* If general_tlvota_file update, every sim card should apply */
+            tlvota_file = &(pMcf->general_tlvota_file);
+            MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+            if (tlvota_file){
+                tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+                MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+            }else {
+                MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
+                mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                return mcf_ret;
+            }
+            
+            if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                tlvota_path_ota_file_last_mod_time = 0;
+                MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                
+                if (mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                    tlvota_path_runtime_file_last_mod_time = 0;
+                    MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                    //return mcf_ret;
+                }
+                    
+            }
+            
+            
+            if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                tlvota_path_runtime_file_last_mod_time = 0;
+                MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                
+                if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                    tlvota_path_ota_file_last_mod_time = 0;
+                    MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                    //return mcf_ret;
+                }
+            }
+                
+            MD_TRC_MCF_TR_UPDATE_OTA_GTLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+            if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+                
+                /* If TLV OTA file is updated, trigger DSBP with retry */
+                if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+                    MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF), 
+                                                                     (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                }else{
+                    MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF), 
+                                                                     (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                }
+                
+                
+                /* 
+                 *  Trigger DSBP and do not respond to AP immediately.
+                 *  Wait DSBP response, and then respond to AP.
+                 */
+                
+                for (i = 0; i < MAX_SIM_NUM; i++){
+                    ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                    if (!ind_ptr) {
+                        ASSERT(0);
+                        mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                        return mcf_ret;
+                    }
+                    
+                    ind_ptr->src_id = req->src_id;
+                    ind_ptr->src_mod_id = src_mod_id;
+                    ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+                    ind_ptr->is_dsbp_retry = 1;
+
+                    msg_send6(MOD_MCF, /* src_mod_id */
+                            MOD_L4BSBP + i, /* dest_mod_id */
+                            MCF_SAP, /* sap_id */
+                            MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                            (local_para_struct*)ind_ptr, /* local_para_ptr */
+                            NULL); /* peer_buff_ptr */
+                    pMcf->dsbp_cnf_cnt ++;
+                    pMcf->dsbp_ind_cnt ++;
+                    mcf_ret = MCF_OTA_R_SUCCESS;
+                }
+                
+                MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
+                apply_general_tlv = KAL_TRUE;
+                return mcf_ret;    
+                
+            }
+            
+            MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
+    
+            tlvota_path_ota_file_last_mod_time = 0;
+            tlvota_path_runtime_file_last_mod_time = 0;
+            tlvota_last_read_mod_time = 0;
+            
+            /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
+            
+            for (i = 0; i < MAX_SIM_NUM; i++){
+                tlvota_file = &(pMcf->tlvota_file[i]);
+                MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                if (tlvota_file){
+                    sbp_id = tlvota_file->sbp_id;
+                    ps_id = tlvota_file->ps_id;
+                    tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+                    MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                }else {
+                    MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
+                    mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                    return mcf_ret;
+                }
+                tlvota_path_ota_file_last_mod_time = 0;
+                tlvota_path_runtime_file_last_mod_time = 0;
+                
+                if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
+                    MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
+                    mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                    return mcf_ret;
+                }
+                
+                MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PS_ID(ps_id);
+                MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_SBP_ID(sbp_id);
+
+                /* If have not read tlv ota file, trigger DSBP */
+                if(sbp_id == SBP_ID_INVALID){
+                    mcf_ret = MCF_OTA_R_SUCCESS;
+                }else{
+                    kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
+                    ret_sprintf = kal_snprintf(tlvota_path_name, MCF_FILE_MAX_NAME_LEN - 1, "%s_%d.mcfopota%c", MCF_FS_TLVOTA_FILE_PREFIX, sbp_id, '\0');
+                    if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+                        MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        return mcf_ret;
+                    }
+                    
+                    MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
+                
+                    if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                        tlvota_path_runtime_file_last_mod_time = 0;
+                        MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                        
+                        if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                            tlvota_path_ota_file_last_mod_time = 0;
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                            //return mcf_ret;
+                        }
+                    }
+                    
+                    if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                        tlvota_path_ota_file_last_mod_time = 0;
+                        MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                        
+                        if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                            tlvota_path_runtime_file_last_mod_time = 0;
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                            //return mcf_ret;
+                        }
+                    }
+                    
+                                    
+                    MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+                    
+                    if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+                        
+                        /* If TLV OTA file is updated, trigger DSBP with retry */
+                        if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+                            MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+                                                                         (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                        }else{
+                            MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+                                                                         (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                        }
+                        
+                        /* 
+                         *  Trigger DSBP and do not respond to AP immediately.
+                         *  Wait DSBP response, and then respond to AP.
+                         */
+                        ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                        if (!ind_ptr) {
+                            ASSERT(0);
+                            mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                            return mcf_ret;
+                        }
+
+                        ind_ptr->src_id = req->src_id;
+                        ind_ptr->src_mod_id = src_mod_id;
+                        ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+                        ind_ptr->is_dsbp_retry = 1;
+
+                        msg_send6(MOD_MCF, /* src_mod_id */
+                                MOD_L4BSBP + ps_id, /* dest_mod_id */
+                                MCF_SAP, /* sap_id */
+                                MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                                (local_para_struct*)ind_ptr, /* local_para_ptr */
+                                NULL); /* peer_buff_ptr */
+                        pMcf->dsbp_cnf_cnt ++;
+                        pMcf->dsbp_ind_cnt ++;
+                        mcf_ret = MCF_OTA_R_SUCCESS;
+                        
+                            
+                        
+                    }
+                
+                }
+            }
+            
+            
+            break;
+        
+        case L4C_MCF_CONFIG_ACT_READ_INI:
+            MD_TRC_MCF_TR_UPDATE_OTA_READ_INI();
+            /* Update OTA file with reading ini file */        
+            ini_last_read_mod_time = ini_file->last_mod_time;
+            if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                ini_path_ota_file_last_mod_time = 0;
+                MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                
+                if (mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                    ini_path_runtime_file_last_mod_time = 0;
+                    MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                    mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+                    return mcf_ret;
+                }    
+            }
+            
+            
+            if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &ini_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                ini_path_runtime_file_last_mod_time = 0;
+                MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                
+                if(mcf_get_file_last_mod_time (MCF_FS_DEFAULT_INI_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &ini_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                    ini_path_ota_file_last_mod_time = 0;
+                    MD_TRC_MCF_TR_UPDATE_OTA_READ_INI_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                    mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+                    return mcf_ret;
+                }
+            }
+            
+            MD_TRC_MCF_TR_UPDATE_OTA_INI_LAST_MOD_TIME(ini_path_ota_file_last_mod_time, ini_path_runtime_file_last_mod_time, ini_last_read_mod_time);
+            kal_mem_set(ini_root_path,0,20);
+            if (ini_path_ota_file_last_mod_time > ini_path_runtime_file_last_mod_time){
+                strncpy(ini_root_path,MCF_FS_DEFAULT_FOLDER_PATH, 19);
+            }else{
+               strncpy(ini_root_path,MCF_FS_CUSTOM_FOLDER_PATH, 19);
+            }
+            
+            
+            MD_TRC_MCF_TR_UPDATE_OTA_INI_READ(ini_root_path);
+            if (mcf_read_ini_file(ini_root_path, MCF_FS_DEFAULT_INI_FILE_NAME, &apply_path_type, apply_filename, pMcf) != MCF_OTA_R_SUCCESS) {
+                mcf_ret = MCF_OTA_R_READ_INI_FILE_FAIL;
+                return mcf_ret;
+            }
+            
+            kal_mem_set(tag_name,0,10);
+            strncpy(tag_name,"TagName", 9);
+            mcf_find_ini_item((kal_char *)ini_file->buff, tag_name, tag_str, pMcf);
+            if(strcmp(tag_str,"") == 0){
+                /* Normal TLV OTA apply */
+                /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
+                MD_TRC_MCF_TR_UPDATE_OTA_FIND_INI_TAGNAME_NULL();
+                /* If general_tlvota_file update, every sim card should apply */
+                
+                tlvota_file = &(pMcf->general_tlvota_file);
+                MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                if (tlvota_file){
+                    tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+                    MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                }else {
+                        MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
+                        mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                        return mcf_ret;
+                }
+                
+                if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                    tlvota_path_ota_file_last_mod_time = 0;
+                    MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                    
+                    if (mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                        tlvota_path_runtime_file_last_mod_time = 0;
+                        MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                        //return mcf_ret;
+                    }
+                        
+                }
+                
+                
+                if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                    tlvota_path_runtime_file_last_mod_time = 0;
+                    MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                    
+                    if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                        tlvota_path_ota_file_last_mod_time = 0;
+                        MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                        //return mcf_ret;
+                    }
+                }
+                    
+                MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+                if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+                    
+                    /* If TLV OTA file is updated, trigger DSBP with retry */
+                    if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+                        MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF), 
+                                                                     (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                    }else{
+                        MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF), 
+                                                                     (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                    }
+                    
+                    /* 
+                     *  Trigger DSBP and do not respond to AP immediately.
+                     *  Wait DSBP response, and then respond to AP.
+                     */
+                    
+                    for (i = 0; i < MAX_SIM_NUM; i++){
+                        ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                        if (!ind_ptr) {
+                            ASSERT(0);
+                            mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                            return mcf_ret;
+                        }
+                        
+                        ind_ptr->src_id = req->src_id;
+                        ind_ptr->src_mod_id = src_mod_id;
+                        ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+                        ind_ptr->is_dsbp_retry = 1;
+
+                        msg_send6(MOD_MCF, /* src_mod_id */
+                                MOD_L4BSBP + i, /* dest_mod_id */
+                                MCF_SAP, /* sap_id */
+                                MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                                (local_para_struct*)ind_ptr, /* local_para_ptr */
+                                NULL); /* peer_buff_ptr */
+                        pMcf->dsbp_cnf_cnt ++;
+                        pMcf->dsbp_ind_cnt ++;
+                        mcf_ret = MCF_OTA_R_SUCCESS;
+                    }
+                    MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
+                    apply_general_tlv = KAL_TRUE;
+                    return mcf_ret;
+                        
+                    
+                }
+        
+                tlvota_path_ota_file_last_mod_time = 0;
+                tlvota_path_runtime_file_last_mod_time = 0;
+                tlvota_last_read_mod_time = 0;
+                
+                /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
+                MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
+                for (i = 0; i < MAX_SIM_NUM; i++){
+                    tlvota_file = &(pMcf->tlvota_file[i]);
+                    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                    if (tlvota_file){
+                        sbp_id = tlvota_file->sbp_id;
+                        ps_id = tlvota_file->ps_id;
+                        tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+                        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                    }else {
+                        MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
+                        mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                        return mcf_ret;
+                    }
+                    if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
+                        MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        return mcf_ret;
+                    }
+                    
+                    tlvota_path_ota_file_last_mod_time = 0;
+                    tlvota_path_runtime_file_last_mod_time = 0;
+                    
+                    MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
+                    MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PS_ID(ps_id);
+                    MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_SBP_ID(sbp_id);
+                    /* If have not read tlv ota file, trigger DSBP */
+                    if(sbp_id == SBP_ID_INVALID){
+                        mcf_ret = MCF_OTA_R_SUCCESS;
+                    }else{
+                        kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
+                        ret_sprintf = kal_snprintf(tlvota_path_name, MCF_FILE_MAX_NAME_LEN - 1, "%s_%d.mcfopota%c", MCF_FS_TLVOTA_FILE_PREFIX, sbp_id, '\0');
+                        if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
+                            mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                            return mcf_ret;
+                        }
+                    
+                        if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                            tlvota_path_runtime_file_last_mod_time = 0;
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                            
+                            if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                tlvota_path_ota_file_last_mod_time = 0;
+                                MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                //return mcf_ret;
+                            }
+                        }
+                        
+                        if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                            tlvota_path_ota_file_last_mod_time = 0;
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                            
+                            if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                tlvota_path_runtime_file_last_mod_time = 0;
+                                MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                //return mcf_ret;
+                            }
+                        }
+                        
+                        MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+                        if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+                            
+                            /* If TLV OTA file is updated, trigger DSBP with retry */
+                            if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+                                MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+                                                                         (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                            }else{
+                                MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+                                                                         (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                            }
+                            
+                            /* 
+                             *  Trigger DSBP and do not respond to AP immediately.
+                             *  Wait DSBP response, and then respond to AP.
+                             */
+                            ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                            if (!ind_ptr) {
+                                ASSERT(0);
+                                mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                                return mcf_ret;
+                            }
+
+                            ind_ptr->src_id = req->src_id;
+                            ind_ptr->src_mod_id = src_mod_id;
+                            ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+                            ind_ptr->is_dsbp_retry = 1;
+
+                            msg_send6(MOD_MCF, /* src_mod_id */
+                                    MOD_L4BSBP + ps_id, /* dest_mod_id */
+                                    MCF_SAP, /* sap_id */
+                                    MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                                    (local_para_struct*)ind_ptr, /* local_para_ptr */
+                                    NULL); /* peer_buff_ptr */
+                            pMcf->dsbp_cnf_cnt ++;
+                            pMcf->dsbp_ind_cnt ++;
+                            mcf_ret = MCF_OTA_R_SUCCESS;
+                            
+                                
+                            
+                        }
+                    
+                    }
+                }
+            }else{
+                /* If critical tag is not null */
+                MD_TRC_MCF_TR_UPDATE_OTA_FIND_INI_TAGNAME(tag_str);
+                if(mcf_find_ini_sbp_id (tag_str,sbp_id_arr,&sbp_id_num,&apply_general_tlv) == KAL_TRUE){
+                    /*If general tlvota case is critical, every sim card need to apply general tlv ota */
+                    if (apply_general_tlv == KAL_TRUE){
+                        
+                        tlvota_file = &(pMcf->general_tlvota_file);
+                        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        if (tlvota_file){
+                            tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+                            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        }else {
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
+                            mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                            return mcf_ret;
+                        }
+                        
+                        if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                            tlvota_path_ota_file_last_mod_time = 0;
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                            
+                            if (mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                tlvota_path_runtime_file_last_mod_time = 0;
+                                MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                //return mcf_ret;
+                            }
+                                
+                        }
+                        
+                        
+                        if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                            tlvota_path_runtime_file_last_mod_time = 0;
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                            
+                            if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                tlvota_path_ota_file_last_mod_time = 0;
+                                MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                //return mcf_ret;
+                            }
+                        }
+                            
+                        MD_TRC_MCF_TR_UPDATE_OTA_CGTLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+                        if(tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+                            
+                            /* If TLV OTA file is updated, trigger DSBP with retry */
+                            if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+                                MD_TRC_MCF_TR_UPDATE_CRITICAL_GTLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+                                                                                   (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                            }else{
+                                MD_TRC_MCF_TR_UPDATE_CRITICAL_GTLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF), 
+                                                                                    (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                            }
+ 
+                            /* 
+                             *  Trigger DSBP and do not respond to AP immediately.
+                             *  Wait DSBP response, and then respond to AP.
+                             */
+                            
+                            for (i = 0; i < MAX_SIM_NUM; i++){
+                                
+                                ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                                if (!ind_ptr) {
+                                    ASSERT(0);
+                                    mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                                    return mcf_ret;
+                                }
+                                
+                                ind_ptr->src_id = req->src_id;
+                                ind_ptr->src_mod_id = src_mod_id;
+                                ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+                                ind_ptr->is_dsbp_retry = 0;
+
+                                msg_send6(MOD_MCF, /* src_mod_id */
+                                        MOD_L4BSBP + i, /* dest_mod_id */
+                                        MCF_SAP, /* sap_id */
+                                        MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                                        (local_para_struct*)ind_ptr, /* local_para_ptr */
+                                        NULL); /* peer_buff_ptr */
+                                pMcf->dsbp_cnf_cnt ++;
+                                pMcf->dsbp_ind_cnt ++;
+                                mcf_ret = MCF_OTA_R_SUCCESS;
+                            }
+                            MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
+                            return mcf_ret;
+                                
+                            
+                        }
+                
+                        tlvota_path_ota_file_last_mod_time = 0;
+                        tlvota_path_runtime_file_last_mod_time = 0;
+                        tlvota_last_read_mod_time = 0;
+                    }
+                
+                    MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
+                
+                    for (i = 0; i < MAX_SIM_NUM; i++){
+                        tlvota_file = &(pMcf->tlvota_file[i]);
+                        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        if (tlvota_file){
+                            sbp_id = tlvota_file->sbp_id;
+                            ps_id = tlvota_file->ps_id;
+                            tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+                            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        }else {
+                                MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
+                                mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                                return mcf_ret;
+                        }
+                        if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
+                            mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                            return mcf_ret;
+                        }
+                        tlvota_path_ota_file_last_mod_time = 0;
+                        tlvota_path_runtime_file_last_mod_time = 0;
+                        kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
+                        ret_sprintf = kal_snprintf(tlvota_path_name, MCF_FILE_MAX_NAME_LEN - 1, "%s_%d.mcfopota%c", MCF_FS_TLVOTA_FILE_PREFIX, sbp_id, '\0');
+                        if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
+                            mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                            return mcf_ret;
+                        }
+                        MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
+                        for (j = 0; j < sbp_id_num; j++){
+                             if (sbp_id == sbp_id_arr[j]){
+                                
+                                if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                    tlvota_path_runtime_file_last_mod_time = 0;
+                                    MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                    
+                                    if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                        tlvota_path_ota_file_last_mod_time = 0;
+                                        MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                        //return mcf_ret;
+                                    }
+                                }
+                                
+                                if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                    tlvota_path_ota_file_last_mod_time = 0;
+                                    MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                    
+                                    if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                        tlvota_path_runtime_file_last_mod_time = 0;
+                                        MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                        //return mcf_ret;
+                                    }
+                                }
+                                
+                                MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+                                if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+                                    
+                                        /* If TLV OTA file is updated, trigger DSBP without retry */
+                                        if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+                                            MD_TRC_MCF_TR_UPDATE_CRITICAL_TLVOTA_TRIGGER_DSBP(tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF), 
+                                                                                               (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                                        }else{
+                                            MD_TRC_MCF_TR_UPDATE_CRITICAL_TLVOTA_TRIGGER_DSBP(tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF), 
+                                                                                               (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                                        }
+                                        
+                                        /* 
+                                         *  Trigger DSBP and do not respond to AP immediately.
+                                         *  Wait DSBP response, and then respond to AP.
+                                         */
+                                        ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                                        if (!ind_ptr) {
+                                            ASSERT(0);
+                                            mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+                                            
+
+                                            return mcf_ret;
+                                        }
+
+                                        ind_ptr->src_id = req->src_id;
+                                        ind_ptr->src_mod_id = src_mod_id;
+                                        ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+                                        ind_ptr->is_dsbp_retry = 0;
+                                        msg_send6(MOD_MCF, /* src_mod_id */
+                                                MOD_L4BSBP + ps_id, /* dest_mod_id */
+                                                MCF_SAP, /* sap_id */
+                                                MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                                                (local_para_struct*)ind_ptr, /* local_para_ptr */
+                                                NULL); /* peer_buff_ptr */
+                                        pMcf->dsbp_cnf_cnt ++;
+                                        pMcf->dsbp_ind_cnt ++;
+                                        mcf_ret = MCF_OTA_R_SUCCESS;
+                                        trigger_ps_id[ps_id] = KAL_TRUE;
+                                        
+                                    
+                                    
+                                }
+                            }
+                        }
+                        
+                    }
+                    
+                    /* If no critical OP OTA trigger DSBP, check if general OTA whether updated */
+                        
+                    if(pMcf->dsbp_cnf_cnt < MAX_SIM_NUM){
+                        
+                        MD_TRC_MCF_TR_UPDATE_OTA_NO_CRITICAL_CASE();
+                        
+                        /* If general_tlvota_file update, every sim card should apply */
+                        tlvota_file = &(pMcf->general_tlvota_file);
+                        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        if (tlvota_file){
+                            tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+                            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                        }else {
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_TAKE_READ_LOCK_FAIL();
+                            mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                            return mcf_ret;
+                        }
+                        
+                        if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                            tlvota_path_ota_file_last_mod_time = 0;
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                            
+                            if (mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                tlvota_path_runtime_file_last_mod_time = 0;
+                                MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                //return mcf_ret;
+                            }
+                                
+                        }
+                        
+                        
+                        if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                            tlvota_path_runtime_file_last_mod_time = 0;
+                            MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                            
+                            if(mcf_get_file_last_mod_time (MCF_FS_GENERAL_TLVOTA_FILE_NAME, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                tlvota_path_ota_file_last_mod_time = 0;
+                                MD_TRC_MCF_TR_UPDATE_OTA_READ_GENERAL_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                //return mcf_ret;
+                            }
+                        }
+                            
+                        MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+                        if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+                            
+                            /* If TLV OTA file is updated, trigger DSBP with retry */
+                            if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+                                MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF), 
+                                                                     (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                            }else{
+                                MD_TRC_MCF_TR_UPDATE_GENERAL_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF), 
+                                                                     (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                            }
+                            
+                            /* 
+                             *  Trigger DSBP and do not respond to AP immediately.
+                             *  Wait DSBP response, and then respond to AP.
+                             */
+                            
+                          
+                            
+                            for (i = 0; i < MAX_SIM_NUM; i++){
+                                
+                                if (trigger_ps_id[i] != KAL_TRUE){
+                                    ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                                    if (!ind_ptr) {
+                                        ASSERT(0);
+                                        mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                                        return mcf_ret;
+                                    }
+                                    
+                                    ind_ptr->src_id = req->src_id;
+                                    ind_ptr->src_mod_id = src_mod_id;
+                                    ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+                                    ind_ptr->is_dsbp_retry = 1;
+
+                                    msg_send6(MOD_MCF, /* src_mod_id */
+                                            MOD_L4BSBP + i, /* dest_mod_id */
+                                            MCF_SAP, /* sap_id */
+                                            MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                                            (local_para_struct*)ind_ptr, /* local_para_ptr */
+                                            NULL); /* peer_buff_ptr */
+                                    pMcf->dsbp_cnf_cnt ++;
+                                    pMcf->dsbp_ind_cnt ++;
+                                    mcf_ret = MCF_OTA_R_SUCCESS;
+                                }
+                                
+                            }
+                            apply_general_tlv = KAL_TRUE;
+                            MD_TRC_MCF_TR_UPDATE_OTA_UPDATE_GENERAL_TLVOTA();
+                            return mcf_ret;
+                                
+                            
+                        }
+                
+                        tlvota_path_ota_file_last_mod_time = 0;
+                        tlvota_path_runtime_file_last_mod_time = 0;
+                        tlvota_last_read_mod_time = 0;
+                        
+                        /* Compare modified time of TLV OTA file to know whether update TLV OTA file */
+                        MD_TRC_MCF_TR_UPDATE_OTA_NO_UPDATE_GENERAL_TLVOTA();
+                        for (i = 0; i < MAX_SIM_NUM; i++){
+                            tlvota_file = &(pMcf->tlvota_file[i]);
+                            MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                            if (tlvota_file){
+                                sbp_id = tlvota_file->sbp_id;
+                                ps_id = tlvota_file->ps_id;
+                                tlvota_last_read_mod_time = tlvota_file->last_mod_time;
+                                MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+                            }else {
+                                MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_TAKE_READ_LOCK_FAIL();
+                                mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+                                return mcf_ret;
+                            }
+                            
+                            if (ps_id < 0 || ps_id >= MAX_SIM_NUM){
+                                MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_INVALID_SIM_ID(ps_id, i);
+                                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                                return mcf_ret;
+                            }
+                            
+                            tlvota_path_ota_file_last_mod_time = 0;
+                            tlvota_path_runtime_file_last_mod_time = 0;
+                            
+                            MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PATH_NAME(tlvota_path_name);
+                            MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_PS_ID(ps_id);
+                            /* If have not read tlv ota file, trigger DSBP */
+                            if(sbp_id == SBP_ID_INVALID){
+                                mcf_ret = MCF_OTA_R_SUCCESS;
+                            }else{
+                                kal_mem_set(tlvota_path_name,0,MCF_FILE_MAX_NAME_LEN);
+                                ret_sprintf = kal_snprintf(tlvota_path_name, MCF_FILE_MAX_NAME_LEN - 1, "%s_%d.mcfopota%c", MCF_FS_TLVOTA_FILE_PREFIX, sbp_id, '\0');
+                                if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+                                    MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FILENAME_ERROR(sbp_id, ret_sprintf);
+                                    mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                                    return mcf_ret;
+                                }
+                            
+                                if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                    tlvota_path_runtime_file_last_mod_time = 0;
+                                    MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                    
+                                    if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                        tlvota_path_ota_file_last_mod_time = 0;
+                                        MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                        //return mcf_ret;
+                                    }
+                                }
+                                
+                                if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_OTA, &tlvota_path_ota_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                    tlvota_path_ota_file_last_mod_time = 0;
+                                    MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_OTA, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                    
+                                    if(mcf_get_file_last_mod_time (tlvota_path_name, L4C_MCF_PATH_TYPE_RUNTIME, &tlvota_path_runtime_file_last_mod_time) == MCF_OTA_R_READ_OTA_FILE_FAIL){
+                                        tlvota_path_runtime_file_last_mod_time = 0;
+                                        MD_TRC_MCF_TR_UPDATE_OTA_READ_TLVOTA_FILE_FAIL(L4C_MCF_PATH_TYPE_RUNTIME, MCF_OTA_R_READ_OTA_FILE_FAIL);
+                                        //return mcf_ret;
+                                    }
+                                }
+                                
+                                MD_TRC_MCF_TR_UPDATE_OTA_TLVOTA_LAST_MOD_TIME(tlvota_path_ota_file_last_mod_time, tlvota_path_runtime_file_last_mod_time, tlvota_last_read_mod_time);
+                                if (tlvota_path_ota_file_last_mod_time > tlvota_last_read_mod_time || tlvota_path_runtime_file_last_mod_time > tlvota_last_read_mod_time){
+                                    
+                                    /* If TLV OTA file is updated, trigger DSBP with retry */
+                                    if (tlvota_path_ota_file_last_mod_time > tlvota_path_runtime_file_last_mod_time){
+                                        MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_OTA, (kal_uint32)((tlvota_path_ota_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_ota_file_last_mod_time & 0xFFFFFFFF),
+                                                                         (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                                    }else{
+                                        MD_TRC_MCF_TR_UPDATE_TLVOTA_TRIGGER_DSBP(L4C_MCF_PATH_TYPE_RUNTIME, (kal_uint32)((tlvota_path_runtime_file_last_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_path_runtime_file_last_mod_time & 0xFFFFFFFF),
+                                                                         (kal_uint32)((tlvota_last_read_mod_time >> 32) & 0xFFFFFFFF), (kal_uint32)(tlvota_last_read_mod_time & 0xFFFFFFFF));
+                                    }
+                                    
+                                    /* 
+                                     *  Trigger DSBP and do not respond to AP immediately.
+                                     *  Wait DSBP response, and then respond to AP.
+                                     */
+                                    if(trigger_ps_id[ps_id] != KAL_TRUE){
+                                     
+                                        ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                                        if (!ind_ptr) {
+                                            ASSERT(0);
+                                            mcf_ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                                            return mcf_ret;
+                                        }
+
+                                        ind_ptr->src_id = req->src_id;
+                                        ind_ptr->src_mod_id = src_mod_id;
+                                        ind_ptr->config_op = L4C_MCF_CONFIG_UPDATE_OPOTA_FILE;
+                                        ind_ptr->is_dsbp_retry = 1;
+
+                                        msg_send6(MOD_MCF, /* src_mod_id */
+                                                MOD_L4BSBP + ps_id, /* dest_mod_id */
+                                                MCF_SAP, /* sap_id */
+                                                MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                                                (local_para_struct*)ind_ptr, /* local_para_ptr */
+                                                NULL); /* peer_buff_ptr */
+                                        pMcf->dsbp_cnf_cnt ++;
+                                        pMcf->dsbp_ind_cnt ++;
+                                        mcf_ret = MCF_OTA_R_SUCCESS;
+                                    
+                                    }   
+                                    
+                                }
+                            
+                            }
+                        }
+                    }
+                }
+            }
+            
+            
+                
+            
+            break;
+        
+        default:
+             ASSERT(0);
+             mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                    
+    }
+    
+    MD_TRC_MCF_TR_UPDATE_OTA_RETURN_VALUE(pMcf->dsbp_cnf_cnt);
+    return mcf_ret;
+}
+
+_STATIC mcf_ota_result_e mcf_config_LID_variable(
+    l4c_mcf_config_lid_variable_operation_req_struct *req,
+    l4c_mcf_config_lid_variable_operation_cnf_struct *resp)
+{
+    mcf_ota_result_e                mcf_ret = MCF_OTA_R_SUCCESS;
+#ifdef __MCF_FIND_TAG_SUPPORT__  
+    mcf_t                          *pMcf = mcf_get_instance();
+    sim_interface_enum              sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+    kal_bool                        ret = KAL_TRUE;
+    nvram_ltable_entry_struct       lid_info = {0};
+    nvram_errno_enum                nvram_api_ret;
+    kal_uint16                      item_byte_offset;
+    kal_uint16                      item_bit_offset;
+    kal_uint32                      item_size;
+    mcf_custom_dump_param_struct    dump_para;
+    kal_uint32                      lid_size;
+    kal_uint32                      i;
+    mcf_tag_info_struct             query_tag = {0};
+    kal_uint8                       lid_value[512];
+    kal_uint32                      j = 0;
+    kal_uint32                      n = 1;
+    MCF_DB_STRUCT_VARIABLE          const *db_ptr = NULL;
+    kal_uint32                      read_len = 0;
+    kal_bool                        invalid_arr_size = KAL_FALSE;
+    kal_bool                        next_level_array = KAL_FALSE;
+    kal_bool                        is_found = KAL_FALSE;
+    kal_uint8                       hex_value[512];
+  
+    MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_START(req->lid_num, req->rec_id, req->tag_name);
+    kal_mem_set(&dump_para, 0, sizeof(mcf_custom_dump_param_struct));
+    kal_mem_set(hex_value, 0, 512);
+
+    resp->len = req->len;
+    
+    if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+        MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_INVALID_SIM_ID(req->ps_id, sim_id);
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return mcf_ret;
+    }
+    
+    nvram_api_ret = nvram_external_get_lid_info(req->lid_num, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_GET_LID_INFO_FAIL(req->lid_num, nvram_api_ret);
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return mcf_ret;
+    }
+    
+    
+    kal_mem_set(mcf_dump_buffer, 0, lid_info.size);
+    
+    if(req->rec_id > lid_info.total_records){
+        MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_INVALID_REC_ID(req->rec_id, lid_info.total_records);
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return mcf_ret;
+    }else if (req->rec_id == 0){
+        req->rec_id = 1;
+    }
+
+    dump_para.ps_id = req->ps_id;
+    dump_para.sbp_id = pMcf->tlvota_file[sim_id].sbp_id;
+    kal_mem_cpy(&(dump_para.mcc), &(pMcf->tlvota_file[sim_id].mcc), MAX_MCC_STR_LEN);
+    kal_mem_cpy(&(dump_para.mnc), &(pMcf->tlvota_file[sim_id].mnc), MAX_MNC_STR_LEN);
+    kal_mem_cpy(&(dump_para.iccid), &(pMcf->tlvota_file[sim_id].iccid), 21);
+    dump_para.size = &lid_size;
+
+
+    
+    
+    for (i = 0; i < mcf_dump_param_tbl_num; i++) {
+        if ( (mcf_dump_param_tbl[i].lid == req->lid_num) ) {
+            is_found = KAL_TRUE;
+            if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
+
+                dump_para.type = MCF_TYPE_OTA;
+                dump_para.record_idx = req->rec_id;
+                
+                if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
+
+                    dump_para.lid = mcf_dump_param_tbl[i].lid; 
+                    dump_para.buffer = mcf_dump_buffer;
+                    *(dump_para.size) = 0;
+
+                    MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_CALLBACK(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
+
+                    ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
+                    if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
+                        MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_DUMP_ERROR(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        break;
+                    }   
+                } else {
+                    /* If not register callback */
+                    MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM(lid_info.LID, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
+                    dump_para.buffer = mcf_dump_buffer;
+                    if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+                        MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        break;
+                    } 
+                }
+            }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
+                dump_para.type = MCF_TYPE_OTA_BY_OP;
+                dump_para.record_idx = 1;
+                
+                MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_USIR(dump_para.lid, dump_para.record_idx, dump_para.ps_id, dump_para.sbp_id, dump_para.mnc, dump_para.mcc, dump_para.iccid);
+
+                if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
+                    dump_para.lid = mcf_dump_param_tbl[i].lid;
+                    dump_para.buffer = mcf_dump_buffer;
+                    *(dump_para.size) = 0;
+
+                    MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_CALLBACK_USIR(dump_para.lid, dump_para.type, dump_para.record_idx, dump_para.sbp_id, dump_para.mnc, dump_para.mcc, dump_para.iccid);
+
+                    ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
+                    if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
+                        MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_DUMP_FAIL(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        break;
+                    }   
+                } else {
+                    /* If not register callback */
+                    MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_NVRAM(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type);
+                    dump_para.buffer = mcf_dump_buffer;
+                    if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+                        MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        break;
+                    } 
+                }
+            }
+            break;
+        }
+    }
+
+     if (is_found == KAL_FALSE){
+        /* If not register callback */
+        if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
+
+            dump_para.type = MCF_TYPE_OTA;
+            dump_para.record_idx = req->rec_id;
+
+            MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM_NOT_CALLBACK(req->lid_num, req->rec_id);
+            dump_para.buffer = mcf_dump_buffer;
+            if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+                MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OTA_NVRAM_FAIL_NOT_CALLBACK(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                return mcf_ret;
+            } 
+            
+        }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
+            dump_para.type = MCF_TYPE_OTA_BY_OP;
+            dump_para.record_idx = 1;
+            
+            MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_NVRAM_NOT_CALLBACK_USIR(req->lid_num, dump_para.ps_id, dump_para.sbp_id, dump_para.mcc, dump_para.mnc, dump_para.iccid);
+            dump_para.buffer = mcf_dump_buffer;
+            if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+                MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_OPOTA_NVRAM_FAIL_NOT_CALLBACK(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                return mcf_ret;
+            } 
+   
+        }
+            
+    }
+    
+    if (mcf_ret == MCF_OTA_R_INVALID_PARAMETER){
+        return mcf_ret;
+    }
+    
+    mcf_toupper((char *)req->tag_name);
+    if (mcf_find_tag_offset(req->lid_num, (char *)req->tag_name, &item_byte_offset, &item_bit_offset, &item_size, &db_ptr, &query_tag) == KAL_FALSE) {
+        //Cannot find the tag
+        MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_FIND_TAG_FAIL(req->lid_num, req->tag_name);
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+        
+        return mcf_ret;
+        
+    }
+    
+    for(i = 0; i < query_tag.arr_cnt; i++){
+        if (db_ptr->array_size[i]-1 < query_tag.array_size[i])
+        {
+            invalid_arr_size = KAL_TRUE;
+            MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_INVALID_ARR_SIZE(db_ptr->array_size[i]-1, query_tag.array_size[i]);
+            break;
+        }
+    }
+    
+    if (invalid_arr_size == KAL_TRUE){
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+        return mcf_ret;
+    }
+    resp->len = req->len;
+    
+    read_len = req->len * db_ptr->variable_size;
+    
+    if (read_len == 0)
+    {
+        read_len = 1 * db_ptr->variable_size;
+    }
+
+    if (read_len > db_ptr->total_size){
+        read_len = db_ptr->total_size;
+    }
+    if (read_len > 255){
+        read_len = 255;
+    }
+    
+    MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_LENGTH(read_len, db_ptr->variable_size, db_ptr->total_size);
+    kal_mem_set(lid_value, 0, 512);
+    
+    if (query_tag.is_bit == KAL_FALSE){
+
+        j = query_tag.arr_cnt;
+        
+        while(db_ptr->array_size[j] != 0){
+            n *= (db_ptr->array_size[j]);
+            
+
+            j++;
+            next_level_array = KAL_TRUE;
+        }
+
+        if(req->len == 0)
+        {
+            read_len *= n;
+            MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_TOTAL_ARRAY_SIZE(n, db_ptr->variable_size);
+        }
+        
+        if(next_level_array == KAL_FALSE && read_len > item_size){
+            read_len = item_size;
+        }
+        if(next_level_array == KAL_TRUE && read_len > n*db_ptr->variable_size){
+            read_len = n*db_ptr->variable_size;
+        }
+        
+        
+        if (read_len > 255){
+            read_len = 255;
+        }
+
+        kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), read_len);
+        MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BYTE(lid_value, read_len);
+        mcf_bytes_to_hex(lid_value, read_len, KAL_TRUE, hex_value);
+		strncpy((kal_char *)(resp->value), hex_value, 512);
+        if (db_ptr->variable_size <= read_len){
+            resp->len = read_len / db_ptr->variable_size;
+        }else{
+            resp->len = read_len;
+        }
+    }else{
+
+        if (query_tag.upper_vsize == 1){
+            resp->len = 1;
+        }else if(query_tag.upper_vsize == 2){
+            resp->len = 2;
+        }else if(query_tag.upper_vsize == 4){
+            resp->len = 4;
+        }else{
+            MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT_INVALID_BIT_LEN(query_tag.upper_vsize);
+            mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+            
+            return mcf_ret;
+        }
+        MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT_SIZE(query_tag.upper_vsize, resp->len);
+
+        if (db_ptr->is_bit == KAL_TRUE){
+
+            kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), resp->len);
+            MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT_WHOLE(lid_value, resp->len);
+            
+            mcf_bytes_to_hex(lid_value, resp->len, KAL_TRUE, hex_value);
+			strncpy((kal_char *)(resp->value), hex_value, 512);
+        }else{
+
+            if (query_tag.upper_vsize == 1){
+                kal_uint8 bit_value = *(mcf_dump_buffer + item_byte_offset);
+                kal_uint8 bit_mask = (kal_uint8)MCF_GEN_BIT_MASK(item_size);
+                bit_value &= (bit_mask << item_bit_offset);
+                bit_value = ((kal_uint8)bit_value >> item_bit_offset);
+
+                resp->len = item_size/8+1;
+
+                mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+				strncpy((kal_char *)(resp->value), hex_value, 512);
+                MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT(bit_value, resp->len);
+            }else if(query_tag.upper_vsize == 2){
+                kal_uint16 bit_value = 0;
+                kal_uint16 bit_mask = (kal_uint16)MCF_GEN_BIT_MASK(item_size);
+                
+                kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),2);
+                
+                bit_value &= (bit_mask << item_bit_offset);
+                bit_value = ((kal_uint16)bit_value >> item_bit_offset);
+
+                resp->len = item_size/8+1;
+
+                mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+				strncpy((kal_char *)(resp->value), hex_value, 512);
+                MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT(bit_value, resp->len);
+            }else if(query_tag.upper_vsize == 4){
+                kal_uint32 bit_value = 0;
+                kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+                
+                kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),4);
+                
+                bit_value &= (bit_mask << item_bit_offset);
+                bit_value = ((kal_uint32)bit_value >> item_bit_offset);
+
+                resp->len = item_size/8+1;
+
+                mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+				strncpy((kal_char *)(resp->value), hex_value, 512);
+                MD_TRC_MCF_TR_CONFIG_LID_VARIABLE_READ_VARIABLE_BIT(bit_value, resp->len);
+            }
+
+        }
+    }
+    
+#else
+    resp->len = req->len;
+    mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+#endif
+         
+    return mcf_ret;
+
+}
+_STATIC mcf_ota_result_e mcf_query_variable_value(
+    l4c_mcf_variable_value_operation_req_struct *req,
+    l4c_mcf_variable_value_operation_cnf_struct *resp)
+{
+    mcf_t                          *pMcf = mcf_get_instance();
+    sim_interface_enum              sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+    mcf_ota_result_e                mcf_ret = MCF_OTA_R_SUCCESS;
+    kal_bool                        ret = KAL_TRUE;
+    nvram_ltable_entry_struct       lid_info = {0};
+    nvram_errno_enum                nvram_api_ret;
+    kal_uint16                      item_byte_offset;
+    kal_uint16                      item_bit_offset;
+    kal_uint32                      item_size;
+    mcf_custom_dump_param_struct    dump_para;
+    kal_uint32                      lid_size;
+    kal_uint32                      i;
+    kal_uint8                       lid_value[512];    
+    kal_uint32                      read_len = 0; 
+    kal_bool                        is_found = KAL_FALSE;
+    kal_uint16                      lid = 0;
+    kal_bool                        is_bit;
+    kal_char                        array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+    kal_char                        hex_value[512];
+#if defined(__MCF_FIND_TAG_SUPPORT__)    
+    kal_bool                        invalid_arr_size = KAL_FALSE;
+    kal_bool                        next_level_array = KAL_FALSE;
+    kal_uint32                      j = 0;
+    kal_uint32                      n = 1;
+    MCF_DB_STRUCT_VARIABLE          const *db_ptr = NULL;
+    mcf_tag_info_struct             query_tag = {0};
+#endif
+    
+    MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_START(req->format, req->action, req->num, req->rec_id);
+    kal_mem_set(&dump_para, 0, sizeof(mcf_custom_dump_param_struct));
+    
+    
+    resp->len = req->len;
+    
+    if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+        MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_SIM_ID(req->ps_id, sim_id);
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return mcf_ret;
+    }
+    
+    if (req->format == L4C_MCF_QUERY_VARIABLE_FORM_PATH){
+        lid = req->num;
+    }else if(req->format == L4C_MCF_QUERY_VARIABLE_FORM_GID){
+        lid = mcf_find_gid_return_lid_num(req->num);
+        if (lid == 65535){
+            MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_GET_LID_NUM_FAIL(req->num);
+            mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+            return mcf_ret;
+        }
+    }
+    nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+        MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return mcf_ret;
+    }
+    
+    
+    kal_mem_set(mcf_dump_buffer, 0, lid_info.size);
+    
+    if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
+		if(req->rec_id > lid_info.total_records || req->rec_id == 0){
+			MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_REC_ID(req->rec_id, lid_info.total_records);
+			mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+			return mcf_ret;
+		}
+	}
+
+    dump_para.ps_id = req->ps_id;
+    dump_para.sbp_id = pMcf->tlvota_file[sim_id].sbp_id;
+    kal_mem_cpy(&(dump_para.mcc), &(pMcf->tlvota_file[sim_id].mcc), MAX_MCC_STR_LEN);
+    kal_mem_cpy(&(dump_para.mnc), &(pMcf->tlvota_file[sim_id].mnc), MAX_MNC_STR_LEN);
+    kal_mem_cpy(&(dump_para.iccid), &(pMcf->tlvota_file[sim_id].iccid), 21);
+    dump_para.size = &lid_size;
+    
+    for (i = 0; i < mcf_dump_param_tbl_num; i++) {
+        if ( (mcf_dump_param_tbl[i].lid == lid) ) {
+            is_found = KAL_TRUE;
+            if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
+
+                dump_para.type = MCF_TYPE_OTA;
+                dump_para.record_idx = req->rec_id;
+                
+                if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA) != 0) {
+
+                    dump_para.lid = mcf_dump_param_tbl[i].lid; 
+                    dump_para.buffer = mcf_dump_buffer;
+                    *(dump_para.size) = 0;
+
+                    MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_CALLBACK(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
+
+                    ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
+                    if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
+                        MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_DUMP_ERROR(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        break;
+                    }   
+                } else {
+                    /* If not register callback */
+                    MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM(lid_info.LID, mcf_dump_param_tbl[i].ntfy_type, dump_para.record_idx);
+                    dump_para.buffer = mcf_dump_buffer;
+                    if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+                        MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        break;
+                    } 
+                }
+            }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
+                dump_para.type = MCF_TYPE_OTA_BY_OP;
+                dump_para.record_idx = 1;
+                
+                MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_USIR(dump_para.lid, dump_para.record_idx, dump_para.ps_id, dump_para.sbp_id, dump_para.mnc, dump_para.mcc, dump_para.iccid);
+
+                if ((mcf_dump_param_tbl[i].ntfy_type & MCF_DUMP_NTFY_TYPE_OTA_BY_OP) != 0) {
+                    dump_para.lid = mcf_dump_param_tbl[i].lid;
+                    dump_para.buffer = mcf_dump_buffer;
+                    *(dump_para.size) = 0;
+
+                    MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_CALLBACK_USIR(dump_para.lid, dump_para.type, dump_para.record_idx, dump_para.sbp_id, dump_para.mnc, dump_para.mcc, dump_para.iccid);
+
+                    ret = mcf_dump_param_tbl[i].dump_func_ptr(&dump_para);
+                    if ( (ret == KAL_FALSE) || (*(dump_para.size) != lid_info.size) ) {
+                        MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_DUMP_FAIL(mcf_dump_param_tbl[i].lid, ret, lid_info.size, *(dump_para.size));
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        break;
+                    }   
+                } else {
+                    /* If not register callback */
+                    MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_NVRAM(dump_para.lid, mcf_dump_param_tbl[i].ntfy_type);
+                    dump_para.buffer = mcf_dump_buffer;
+                    if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+                        MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_NVRAM_FAIL(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        break;
+                    } 
+                }
+            }
+            break;
+        }
+    }
+
+     if (is_found == KAL_FALSE){
+        /* If not register callback */
+        if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA){
+
+            dump_para.type = MCF_TYPE_OTA;
+            dump_para.record_idx = req->rec_id;
+
+            MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM_NOT_CALLBACK(lid, req->rec_id);
+            dump_para.buffer = mcf_dump_buffer;
+            if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+                MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OTA_NVRAM_FAIL_NOT_CALLBACK(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                return mcf_ret;
+            } 
+            
+        }else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA){
+            dump_para.type = MCF_TYPE_OTA_BY_OP;
+            dump_para.record_idx = 1;
+            
+            MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_NVRAM_NOT_CALLBACK_USIR(lid, dump_para.ps_id, dump_para.sbp_id, dump_para.mcc, dump_para.mnc, dump_para.iccid);
+            dump_para.buffer = mcf_dump_buffer;
+            if ( !nvram_external_read_data(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size) ) {
+                MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_OPOTA_NVRAM_FAIL_NOT_CALLBACK(lid_info.LID, dump_para.record_idx, dump_para.buffer, lid_info.size);
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                return mcf_ret;
+            } 
+   
+        }
+            
+    }
+    
+    if (mcf_ret == MCF_OTA_R_INVALID_PARAMETER){
+        return mcf_ret;
+    }
+    
+    if (req->format == L4C_MCF_QUERY_VARIABLE_FORM_PATH){
+#if defined(__MCF_FIND_TAG_SUPPORT__)
+        MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_TAG(req->config);
+        mcf_toupper((char *)req->config);
+        if (mcf_find_tag_offset(lid, (char *)req->config, &item_byte_offset, &item_bit_offset, &item_size, &db_ptr, &query_tag) == KAL_FALSE) {
+            //Cannot find the tag
+            MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_FIND_TAG_FAIL(lid, req->config);
+            mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+            
+            return mcf_ret;
+            
+        }
+        
+        for(i = 0; i < query_tag.arr_cnt; i++){
+            if (db_ptr->array_size[i]-1 < query_tag.array_size[i])
+            {
+                invalid_arr_size = KAL_TRUE;
+                MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_ARR_SIZE(db_ptr->array_size[i]-1, query_tag.array_size[i]);
+                break;
+            }
+        }
+        
+        if (invalid_arr_size == KAL_TRUE){
+            mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+            return mcf_ret;
+        }
+        resp->len = req->len;
+        
+        read_len = req->len * db_ptr->variable_size;
+        
+        if (read_len == 0)
+        {
+            read_len = 1 * db_ptr->variable_size;
+        }
+
+        if (read_len > db_ptr->total_size){
+            read_len = db_ptr->total_size;
+        }
+        if (read_len > 255){
+            read_len = 255;
+        }
+        
+        MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_LENGTH(read_len, db_ptr->variable_size, db_ptr->total_size);
+        kal_mem_set(lid_value, 0, 512);
+        
+        if (query_tag.is_bit == KAL_FALSE){
+
+            j = query_tag.arr_cnt;
+            
+            while(db_ptr->array_size[j] != 0){
+                n *= (db_ptr->array_size[j]);
+                j++;
+                next_level_array = KAL_TRUE;
+            }
+
+            if(req->len == 0)
+            {
+                read_len *= n;
+                MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_TOTAL_ARRAY_SIZE(n, db_ptr->variable_size);
+            }
+            
+            if(next_level_array == KAL_FALSE && read_len > item_size){
+                read_len = item_size;
+            }
+            if(next_level_array == KAL_TRUE && read_len > n*db_ptr->variable_size){
+                read_len = n*db_ptr->variable_size;
+            }
+            
+            
+            if (read_len > 255){
+                read_len = 255;
+            }
+
+            kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), read_len);
+            MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BYTE(lid_value, read_len);
+            mcf_bytes_to_hex(lid_value, read_len, KAL_TRUE, hex_value);
+			strncpy((kal_char *)(resp->value), hex_value, 511);
+            if (db_ptr->variable_size <= read_len){
+                resp->len = read_len / db_ptr->variable_size;
+            }else{
+                resp->len = read_len;
+            }
+        }else{
+
+            if (query_tag.upper_vsize == 1){
+                resp->len = 1;
+            }else if(query_tag.upper_vsize == 2){
+                resp->len = 2;
+            }else if(query_tag.upper_vsize == 4){
+                resp->len = 4;
+            }else{
+                MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_INVALID_BIT_LEN(query_tag.upper_vsize);
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                
+                return mcf_ret;
+            }
+            MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_SIZE(query_tag.upper_vsize, resp->len);
+
+            if (db_ptr->is_bit == KAL_TRUE){
+
+                kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), resp->len);
+                MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_WHOLE(lid_value, resp->len);
+                
+                mcf_bytes_to_hex(lid_value, resp->len, KAL_TRUE, hex_value);
+				strncpy((kal_char *)(resp->value), hex_value, 511);
+            }else{
+
+                if (query_tag.upper_vsize == 1){
+                    kal_uint8 bit_value = *(mcf_dump_buffer + item_byte_offset);
+                    kal_uint8 bit_mask = (kal_uint8)MCF_GEN_BIT_MASK(item_size);
+                    bit_value &= (bit_mask << item_bit_offset);
+                    bit_value = ((kal_uint8)bit_value >> item_bit_offset);
+
+                    resp->len = item_size/8+1;
+
+                    mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+					strncpy((kal_char *)(resp->value), hex_value, 511);
+                    MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
+                }else if(query_tag.upper_vsize == 2){
+                    kal_uint16 bit_value = 0;
+                    kal_uint16 bit_mask = (kal_uint16)MCF_GEN_BIT_MASK(item_size);
+                    
+                    kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),2);
+                    
+                    bit_value &= (bit_mask << item_bit_offset);
+                    bit_value = ((kal_uint16)bit_value >> item_bit_offset);
+
+                    resp->len = item_size/8+1;
+
+                    mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+					strncpy((kal_char *)(resp->value), hex_value, 511);
+                    MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
+                }else if(query_tag.upper_vsize == 4){
+                    kal_uint32 bit_value = 0;
+                    kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+                    
+                    kal_mem_cpy(&bit_value,(mcf_dump_buffer + item_byte_offset),4);
+                    
+                    bit_value &= (bit_mask << item_bit_offset);
+                    bit_value = ((kal_uint32)bit_value >> item_bit_offset);
+
+                    resp->len = item_size/8+1;
+
+                    mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+					strncpy((kal_char *)(kal_char *)(resp->value), hex_value, 511);
+                    MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
+                }
+
+            }
+        }
+#else
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+        return mcf_ret;
+#endif
+    }else if(req->format == L4C_MCF_QUERY_VARIABLE_FORM_GID){
+        
+        kal_mem_set(array_tag, 0, MCF_FILE_MAX_ARRAY_TAG_LEN);
+        if(strcmp((kal_char *)req->config, "") != 0){
+            strncpy(array_tag, (kal_char *)req->config, MCF_FILE_MAX_ARRAY_TAG_LEN-1);
+            array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN-1] = '\0';
+            if (strlen((kal_char *)req->config) >= MCF_FILE_MAX_ARRAY_TAG_LEN){
+                MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, strlen((kal_char *)req->config));
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                return mcf_ret;
+            }
+            mcf_replace_char(array_tag, ',', '$');
+            if (strlen(array_tag) != 0 && array_tag[strlen(array_tag)] != '$'){
+                array_tag[strlen(array_tag)] = '$';
+            }
+        }
+        MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_ARRAY_INDEX(req->num, array_tag);
+        if (mcf_find_gid_offset(req->num, array_tag, &lid, &item_byte_offset, &item_bit_offset, &item_size, &is_bit) == KAL_FALSE) {
+            //Cannot find the gid
+            MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_FIND_GID_FAIL(lid, req->config);
+            mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+            
+            return mcf_ret;
+            
+        }
+        if(req->len == 0){
+            read_len = item_size;
+        }else{
+            read_len = req->len;
+        }
+        if(read_len > (lid_info.size-item_byte_offset)){
+            read_len = lid_info.size-item_byte_offset;
+        }
+        if(read_len > 255){
+            read_len = 255;
+        }
+        
+        if (is_bit == KAL_FALSE){
+            kal_mem_cpy(lid_value, (mcf_dump_buffer + item_byte_offset), read_len);
+            MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BYTE(lid_value, read_len);
+            mcf_bytes_to_hex(lid_value, read_len, KAL_TRUE, hex_value);
+			strncpy((kal_char *)(resp->value), hex_value, 511);
+            resp->len = read_len;
+        }else{
+            kal_uint32 align_addr;
+            kal_uint32 bit_value;
+            kal_uint32 *ptr = 0;
+            kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+            MCF_READ_ADDR_GET_ALIGN((kal_uint32)(mcf_dump_buffer + item_byte_offset),align_addr);
+            ptr = (kal_uint32 *)align_addr;
+            bit_value = *(ptr);
+            bit_value = bit_value >> ((((kal_uint32)(mcf_dump_buffer + item_byte_offset))-align_addr)*8);
+            bit_value = (bit_value >> item_bit_offset);
+            bit_value &= bit_mask;                         
+            if (item_size <= 8){
+                resp->len = 1;    
+            }else if(item_size > 8 && item_size <= 16){
+                resp->len = 2;           
+            }else if(item_size > 16 && item_size <= 32){
+                if (item_size % 8 == 0){
+                    resp->len = item_size/8;
+                }else{
+                    resp->len = item_size/8+1;
+                }
+            }else if (item_size > 32){
+                MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT_INVALID_BIT_LEN(item_size);
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                return mcf_ret;
+            }
+            MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_READ_VARIABLE_BIT(bit_value, resp->len);
+            mcf_bytes_to_hex(&bit_value, resp->len, KAL_TRUE, hex_value);
+			strncpy((kal_char *)(resp->value), hex_value, 511);
+        }
+        
+    }
+         
+    return mcf_ret;
+
+}
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+_STATIC mcf_ota_result_e mcf_set_variable_value(
+    l4c_mcf_variable_value_operation_req_struct *req,
+    l4c_mcf_variable_value_operation_cnf_struct *resp)
+{
+    mcf_t                                 *pMcf = mcf_get_instance();
+    sim_interface_enum                     sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+    mcf_ota_result_e                       mcf_ret = MCF_OTA_R_SUCCESS;
+    kal_uint16                             item_byte_offset;
+    kal_uint16                             item_bit_offset;
+    kal_uint32                             item_size;
+	kal_uint16                             lid = 0;
+    static kal_char                        lid_value[512];
+    kal_bool                               is_bit;
+    kal_char                               array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+	kal_int32                              value_len;
+	kal_uint32                             operation_mask = 0;
+	mcf_tool_file_info_t                  *pFile;
+	kal_uint32                             align_len = 0;
+	kal_int32                              fs_ret = FS_NO_ERROR;
+	static kal_char                        hex_value[512];
+	nvram_ltable_entry_struct              lid_info = {0};
+    nvram_errno_enum                       nvram_api_ret;
+	static kal_char                        apply_filename[MCF_FILE_MAX_NAME_LEN];
+	l4c_mcf_path_type_enum                 apply_path_type;
+    kal_bool                               read_file_fail = KAL_FALSE;
+    kal_int32                              ret_snprintf;
+
+    MD_TRC_MCF_TR_SET_VARIABLE_VALUE_START(req->format, req->action, req->num, req->rec_id);
+
+    resp->len = req->len;
+    
+	if(req->format == L4C_MCF_QUERY_VARIABLE_FORM_GID){
+        
+        kal_mem_set(array_tag, 0, MCF_FILE_MAX_ARRAY_TAG_LEN);
+        if(strcmp((kal_char *)req->config, "") != 0){
+            strncpy(array_tag, (kal_char *)req->config, MCF_FILE_MAX_ARRAY_TAG_LEN-1);
+            array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN-1] = '\0';
+            if (strlen((kal_char *)req->config) >= MCF_FILE_MAX_ARRAY_TAG_LEN){
+                MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, strlen((kal_char *)req->config));
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                return mcf_ret;
+            }
+            mcf_replace_char(array_tag, ',', '$');
+            if (strlen(array_tag) != 0 && array_tag[strlen(array_tag)] != '$'){
+                array_tag[strlen(array_tag)] = '$';
+            }
+        }
+        MD_TRC_MCF_TR_SET_VARIABLE_VALUE_ARRAY_INDEX(req->num, array_tag);
+        
+		
+		kal_mem_set(lid_value, 0, 512);
+		kal_mem_set(hex_value, 0, 512);
+		kal_mem_cpy(hex_value, req->value, 511);
+
+		/* If value length is odd, need to add '0'*/
+		kal_mem_cpy(hex_value, req->value, 511);
+		value_len = strlen(hex_value);
+		
+		if(strlen(hex_value) % 2 != 0){
+			MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_VALUE_LEN(strlen(hex_value));
+			mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+            return mcf_ret;
+		}
+		
+		mcf_hex_to_bytes(hex_value, &value_len, lid_value);
+
+		
+		if(req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA){
+			mcf_tool_gid_ota_file_item_t        pItem;
+			mcf_ota_file_t                     *ota_file = &(pMcf->ota_file);
+			nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+			
+			kal_mem_set(&pItem, 0, sizeof(mcf_tool_gid_ota_file_item_t));
+			
+			/*Compose a file content*/
+			pItem.global_id = req->num;
+			pItem.record_idx = req->rec_id;
+			pItem.array_index_len = strlen(array_tag);
+			
+			if (mcf_find_gid_offset(req->num, array_tag, &lid, &item_byte_offset, &item_bit_offset, &item_size, &is_bit) == KAL_FALSE) {
+				//Cannot find the gid
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_FIND_GID_FAIL(lid, req->config);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+				
+				return mcf_ret;
+				
+			}
+			
+			nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+			if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+				return mcf_ret;
+			}
+
+			if(req->rec_id > lid_info.total_records || req->rec_id == 0){
+				MD_TRC_MCF_TR_QUERY_VARIABLE_VALUE_INVALID_REC_ID(req->rec_id, lid_info.total_records);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+				return mcf_ret;
+			}
+			
+			if (pItem.array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, pItem.array_index_len);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+				return mcf_ret;
+			}
+			if(value_len > item_size){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_VAL_LEN(value_len, item_size);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+				return mcf_ret;
+			}
+
+			pItem.total_len = 16;
+			
+			if(is_bit == KAL_TRUE){
+				pItem.value_len = item_size/8+1;
+                item_size = item_size/8+1;
+			}else{
+				pItem.value_len = item_size;
+			}
+			pItem.total_len += item_size;
+			pItem.total_len += pItem.array_index_len;
+			
+			if (pItem.total_len % 4 != 0){
+				align_len = (4-(pItem.total_len % 4));
+				pItem.total_len += align_len;
+			}
+			
+			resp->len = pItem.value_len;
+
+			if (pItem.array_index_len > 0){
+				strncpy(&(pItem.buff_start), array_tag, 1);
+			}else{
+				strncpy(&(pItem.buff_start), lid_value, 1);
+			}
+			
+			kal_mem_set(mcf_gid_buff, 0, 128);
+			kal_mem_cpy(mcf_gid_buff, &pItem, pItem.total_len);
+			strncpy(mcf_gid_buff+16, array_tag, strlen(array_tag));
+			kal_mem_cpy(mcf_gid_buff+16+strlen(array_tag), lid_value, value_len);
+			kal_mem_set(mcf_gid_buff+16+strlen(array_tag)+value_len, 0, item_size-value_len);
+			kal_mem_set(mcf_gid_buff+16+strlen(array_tag)+item_size, 0, align_len);
+			operation_mask |= MCF_FILE_OP_CHECKSUM;
+			
+			kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+			
+			/* Read MCF OTA file information to NVRAM */
+			if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+				mcf_ret = MCF_OTA_R_READ_NVRAM_FAIL;
+				return mcf_ret;
+			}
+			
+			if (strcmp(nv_ota_file.merged_path,"") == 0){
+				strncpy(nv_ota_file.merged_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			}
+			
+			if (strcmp(nv_ota_file.merged_name,"") == 0){
+				strncpy(nv_ota_file.merged_name, MCF_FS_DEFAULT_OTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
+			}
+			
+			if(mcf_merge_one_gid(mcf_gid_buff, MCF_TYPE_OTA, mcf_file_buffer, MCF_MAX_OTA_FILE_SIZE, operation_mask) != KAL_TRUE){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_GID_TO_FILE_FAIL(MCF_TYPE_OTA);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+				return mcf_ret;
+			}
+			
+			mcf_ret = mcf_read_ota_file(KAL_FALSE, nv_ota_file.path, nv_ota_file.name, &apply_path_type, apply_filename, pMcf);
+			//Read fail return fail
+            if(mcf_ret != MCF_OTA_R_SUCCESS){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_FILE_FAIL(nv_ota_file.path, nv_ota_file.name, mcf_ret);
+                read_file_fail = KAL_TRUE;
+			}
+			MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+			if (ota_file) {
+				pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+				/* Check if file type is OTA file */
+				if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+
+                    MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_FILE();
+                    kal_mem_cpy(mcf_merge_buffer, mcf_file_buffer, MCF_MAX_OTA_FILE_SIZE);
+				}else{
+                    if (mcf_merge_ota_buffer(ota_file->buff, mcf_file_buffer, mcf_merge_buffer, MCF_MAX_OTA_FILE_SIZE) != KAL_TRUE){
+                        MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_OTA_FILE_FAIL();
+                        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+                        return mcf_ret;
+                    }
+                }
+				
+				
+				MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+			}else{
+				mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAKE_READ_LOCK_FAIL();
+				MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+				return mcf_ret;
+			}
+			
+			/* Before create merged OTA file, need to delete last time merged OTA file */
+			kal_wsprintf(merge_ota_name, "%s\\%s\0", nv_ota_file.merged_path, nv_ota_file.merged_name);
+			fs_ret = FS_Delete(merge_ota_name);
+			
+			if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_DELETE_FILE_FAIL(fs_ret);
+				mcf_ret = MCF_OTA_R_WRITE_DISK_FAIL;
+				return mcf_ret;
+			}
+			
+			pFile = (mcf_tool_file_info_t *)mcf_merge_buffer;
+			
+			if(pFile->file_size > MCF_MAX_OTA_FILE_SIZE){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_OTA_FILE_SIZE);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+				return mcf_ret;
+			}
+			/*Write Merged OTA file*/
+			mcf_ret = mcf_write_buffer(nv_ota_file.merged_path, nv_ota_file.merged_name, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
+			if (mcf_ret != MCF_OTA_R_SUCCESS) {
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_FILE_FAIL(nv_ota_file.merged_path, nv_ota_file.merged_name);
+				return mcf_ret;
+			}
+
+			strncpy(nv_ota_file.path, nv_ota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			strncpy(nv_ota_file.name, nv_ota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
+
+			if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+				mcf_ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+				return mcf_ret;
+			}
+
+		}else if (req->action == L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA){
+			mcf_tool_gid_tlvota_file_item_t         pItem_op;
+			mcf_tlvota_file_t                      *tlvota_file;
+			kal_char                                tag[MCF_MAX_TAG_LEN];
+			kal_bool                                is_general = KAL_FALSE;
+			nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+			
+			if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+                MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_SIM_ID(req->ps_id, sim_id);
+
+                return KAL_FALSE;
+            }
+            
+            tlvota_file = &(pMcf->tlvota_file[sim_id]);
+            /*Compose a file content*/
+			pItem_op.global_id = req->num;
+			pItem_op.array_index_len = strlen(array_tag);
+			
+			if (mcf_find_gid_offset(req->num, array_tag, &lid, &item_byte_offset, &item_bit_offset, &item_size, &is_bit) == KAL_FALSE) {
+				//Cannot find the gid
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_FIND_GID_FAIL(lid, req->config);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+				
+				return mcf_ret;
+				
+			}
+			if (pItem_op.array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_ARRAY_INDEX_LEN(MCF_FILE_MAX_ARRAY_TAG_LEN, pItem_op.array_index_len);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+				return mcf_ret;
+			}
+			if(value_len > item_size){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_VAL_LEN(value_len, item_size);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+				return mcf_ret;
+			}
+			
+			pItem_op.tag_type = MCF_TLVOTA_TAG_SBPID;
+			MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			if (tlvota_file) {
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TLVOTA_SBPID(tlvota_file->sbp_id, tlvota_file->mcc, tlvota_file->mnc);
+				if (tlvota_file->sbp_id != SBP_ID_INVALID) {
+					is_general = KAL_FALSE;
+					if (strcmp((kal_char *)tlvota_file->mcc, "") != 0) {
+						if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
+							ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_%s_%s%c", tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc, '\0');
+                            if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                                strncpy(tag, "SBP_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+                                MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+                            }
+						}else{
+							ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_%s_NA%c", tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, '\0');
+                            if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                                strncpy(tag, "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
+                                MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+                            }
+						}
+					}else{
+						if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
+							ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_NA_%s%c", tlvota_file->sbp_id, (kal_char *)tlvota_file->mnc, '\0');
+                            if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                                strncpy(tag, "SBP_NA_mnc", MCF_MAX_TAG_LEN - 1);
+                                MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+                            }
+						}else{
+							ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "%d_NA_NA%c", tlvota_file->sbp_id, '\0');
+                            if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                                strncpy(tag, "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+                                MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+                            }
+						}
+					}
+				}else{
+					is_general = KAL_TRUE;
+					if (strcmp((kal_char *)tlvota_file->mcc, "") != 0) {
+						if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
+							ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_%s_%s%c", (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc, '\0');
+                            if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                                strncpy(tag, "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+                                MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+                            }
+						}else{
+							ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_%s_NA%c", (kal_char *)tlvota_file->mcc, '\0');
+                            if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                                strncpy(tag, "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+                                MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+                            }
+						}
+					}else{
+						if (strcmp((kal_char *)tlvota_file->mnc, "") != 0){
+							ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_NA_%s%c", (kal_char *)tlvota_file->mnc, '\0');
+                            if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                                strncpy(tag, "NA_NA_mnc", MCF_MAX_TAG_LEN - 1);
+                                MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+                            }
+						}else{
+							is_general = KAL_FALSE;
+							ret_snprintf = kal_snprintf(tag, MCF_MAX_TAG_LEN, "NA_NA_NA%c", '\0');
+                            if (ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                                strncpy(tag, "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+                                MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAG_SNPRINTF_FAIL(tag, tlvota_file->sbp_id, (kal_char *)tlvota_file->mcc, (kal_char *)tlvota_file->mnc);
+                            }
+						}
+					}
+				}
+				MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			}else{
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAKE_READ_LOCK_FAIL();
+				mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+				MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+				return mcf_ret;
+			}
+			
+			if(is_general == KAL_TRUE){
+				tlvota_file = &(pMcf->general_tlvota_file);
+			}
+			
+			pItem_op.tag_len = strlen(tag);
+
+			pItem_op.total_len = 16;
+			
+			if(is_bit == KAL_TRUE){
+				pItem_op.value_len = item_size/8+1;
+                item_size = item_size/8+1;
+			}else{
+				pItem_op.value_len = item_size;
+			}
+			pItem_op.total_len += pItem_op.value_len;
+			pItem_op.total_len += pItem_op.array_index_len;
+			pItem_op.total_len += pItem_op.tag_len;
+			if (pItem_op.total_len % 4 != 0){
+				align_len = (4-(pItem_op.total_len % 4));
+				pItem_op.total_len += align_len;
+			}
+			resp->len = pItem_op.value_len;
+                
+            strncpy(&(pItem_op.buff_start), tag, 1);
+
+			kal_mem_set(mcf_gid_buff, 0, 128);
+			kal_mem_cpy(mcf_gid_buff, &pItem_op, pItem_op.total_len);
+            strncpy(mcf_gid_buff+16, tag, strlen(tag));
+            strncpy(mcf_gid_buff+16+strlen(tag), array_tag, strlen(array_tag));
+            kal_mem_cpy(mcf_gid_buff+16+strlen(tag)+strlen(array_tag), lid_value, value_len);
+			kal_mem_set(mcf_gid_buff+16+strlen(tag)+strlen(array_tag)+value_len, 0, item_size-value_len);
+			kal_mem_set(mcf_gid_buff+16+strlen(tag)+strlen(array_tag)+item_size, 0, align_len);
+			
+			operation_mask |= MCF_FILE_OP_CHECKSUM;
+			
+			kal_mem_set(mcf_file_buffer, 0, MCF_MAX_FILE_SIZE);
+			
+			if(is_general == KAL_FALSE){
+			/* Read MCF TLV-OTA file information in NVRAM */
+				if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+					MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+					mcf_ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+					return mcf_ret;
+				}
+				mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+				if(mcf_ret != MCF_OTA_R_SUCCESS){
+					MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name, mcf_ret);
+                    read_file_fail = KAL_TRUE;
+				}
+			}else{
+				/* Read MCF general TLV-OTA file into cache buffer */
+				if ( !nvram_external_read_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+					MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+					mcf_ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+					return mcf_ret;
+				}
+				mcf_ret = mcf_read_general_tlvota_file(KAL_FALSE, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+				if(mcf_ret != MCF_OTA_R_SUCCESS){
+					MD_TRC_MCF_TR_SET_VARIABLE_VALUE_READ_FILE_FAIL(nv_tlvota_file.path, nv_tlvota_file.name, mcf_ret);
+                    read_file_fail = KAL_TRUE;
+				}
+			}
+			
+			if (strcmp(nv_tlvota_file.merged_path,"") == 0){
+				strncpy(nv_tlvota_file.merged_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			}
+			
+			if (strcmp(nv_tlvota_file.merged_name,"") == 0){
+				if(is_general == KAL_FALSE){
+                    mcf_snprintf(nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN, "%s_%d.mcfopota%c", MCF_FS_DEFAULT_TLVOTA_MERGED_FILE_PREFIX, sim_id, '\0');
+				}else{
+					strncpy(nv_tlvota_file.merged_name, MCF_FS_GENERAL_TLVOTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
+				}
+			}
+			
+			if(mcf_merge_one_gid(mcf_gid_buff, MCF_TYPE_OTA_BY_OP, mcf_file_buffer, MCF_MAX_TLVOTA_FILE_SIZE, operation_mask) != KAL_TRUE){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_GID_TO_FILE_FAIL(MCF_TYPE_OTA_BY_OP);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+				return mcf_ret;
+			}
+			
+			MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			if (tlvota_file) {
+				pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+				/* Check if file type is OTA file */
+				if (read_file_fail == KAL_TRUE || strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+					MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_FILE();
+					kal_mem_cpy(mcf_merge_buffer, mcf_file_buffer, MCF_MAX_TLVOTA_FILE_SIZE);
+				}else{
+					if(mcf_merge_ota_buffer(tlvota_file->buff, mcf_file_buffer, mcf_merge_buffer, MCF_MAX_TLVOTA_FILE_SIZE) != KAL_TRUE){
+						MD_TRC_MCF_TR_SET_VARIABLE_VALUE_MERGE_OTA_FILE_FAIL();
+						mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+						return mcf_ret;
+					}
+				}
+				
+
+				MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			}else{
+				mcf_ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_TAKE_READ_LOCK_FAIL();
+				MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+				return mcf_ret;
+			}
+			
+			/* Before create merged OTA file, need to delete last time merged OTA file */
+			kal_wsprintf(merge_ota_name, "%s\\%s\0", nv_tlvota_file.merged_path, nv_tlvota_file.merged_name);
+			fs_ret = FS_Delete(merge_ota_name);
+			
+			if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_DELETE_FILE_FAIL(fs_ret);
+				mcf_ret = MCF_OTA_R_WRITE_DISK_FAIL;
+				return mcf_ret;
+			}
+			
+			pFile = (mcf_tool_file_info_t *)mcf_merge_buffer;
+			
+			if(pFile->file_size > MCF_MAX_TLVOTA_FILE_SIZE){
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_INVALID_FILE_SIZE(pFile->file_size, MCF_MAX_TLVOTA_FILE_SIZE);
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+				return mcf_ret;
+			}
+			
+            /*Write Merged OTA file*/
+            mcf_ret = mcf_write_buffer(nv_tlvota_file.merged_path, nv_tlvota_file.merged_name, (kal_uint8 *)mcf_merge_buffer, pFile->file_size);
+			if (mcf_ret != MCF_OTA_R_SUCCESS) {
+				MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_FILE_FAIL(nv_tlvota_file.merged_path, nv_tlvota_file.merged_name);
+				return mcf_ret;
+			}
+
+			strncpy(nv_tlvota_file.path, nv_tlvota_file.merged_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			strncpy(nv_tlvota_file.name, nv_tlvota_file.merged_name, MCF_FILE_MAX_NAME_LEN - 1);
+			
+			if(is_general == KAL_FALSE){
+				/* Write MCF TLV-OTA file information in NVRAM */
+				if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+					MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+					mcf_ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+					return mcf_ret;
+				}
+			}else{
+				/* Write MCF TLV-OTA file information in NVRAM */
+				if ( !nvram_external_write_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+					MD_TRC_MCF_TR_SET_VARIABLE_VALUE_WRITE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+					mcf_ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+					return mcf_ret;
+				}
+			}
+			
+			if (pMcf->is_ignore_dsbp[sim_id] == KAL_FALSE) {
+				/* If MCF is in DSBP passive mode, change to DSBP active mode */
+				mcf_ret = mcf_set_dsbp_mode(KAL_TRUE, KAL_FALSE, sim_id);
+				if (mcf_ret != MCF_OTA_R_SUCCESS) {
+					return mcf_ret;
+				}
+				pMcf->is_ignore_dsbp[sim_id] = KAL_TRUE;
+			}
+		}
+
+    }
+         
+    return mcf_ret;
+
+}
+#endif
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+_STATIC mcf_ota_result_e mcf_assign_combined_file_path(l4c_mcf_set_config_req_struct *req)
+{
+	mcf_ota_result_e                ret = MCF_OTA_R_SUCCESS;
+
+	switch (req->config_type)
+	{
+		case L4C_MCF_CONFIG_TYPE_DEFAULT_BIN:
+		{
+			kal_char                            fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+			kal_char                            curr_filename[MCF_FILE_MAX_NAME_LEN];
+			kal_char                           *file_extension1 = NULL;
+			kal_char                           *file_extension2 = NULL;
+			nvram_ef_mcf_ota_file_info_struct   nv_ota_file;
+			
+			if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+				strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			} else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+				strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			} else {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+				ret = MCF_OTA_R_INVALID_PARAMETER;
+
+				return ret;
+			}
+			
+			if (strcmp((kal_char *)req->config1, "") != 0) {
+				file_extension1 = strstr((kal_char *)req->config1, ".mcfota");
+                if (file_extension1 == NULL){
+                    file_extension2 = strstr((kal_char *)req->config1, ".bin");
+                    if (file_extension2 == NULL) {
+                        MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_FILE_TYPE((kal_char *)req->config1);
+                        ret = MCF_OTA_R_INVALID_PARAMETER;
+                        return ret;
+                    }
+                }
+				strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+			} else {
+				strncpy(curr_filename, MCF_FS_DEFAULT_OTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
+			}
+			
+			/* Read MCF OTA file information in NVRAM */
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+                MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+                return ret;
+            }
+			
+			/* Read MCF Internal information in NVRAM */
+			if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+				ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+				return ret;
+			}
+			
+			strncpy(nv_ota_file.merged_path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			strncpy(nv_ota_file.merged_name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+			nv_int_info.is_combined_ota = KAL_TRUE;
+
+			/* Write MCF OTA file information in NVRAM */
+            if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+                MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_OTA_FILE_LID);
+                ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                return ret;
+            }
+			
+			if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+				ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+				return ret;
+			}
+			
+			break;
+		}
+
+		case L4C_MCF_CONFIG_TYPE_CARRIER_BIN:
+		{
+			kal_char                                fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+			kal_char                                curr_filename[MCF_FILE_MAX_NAME_LEN];
+			kal_char                               *file_extension1 = NULL;
+			kal_char                               *file_extension2 = NULL;
+			nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+			sim_interface_enum                      sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+            
+            if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+                MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_SIM_ID(req->ps_id, sim_id);
+                ret = MCF_OTA_R_INVALID_PARAMETER;
+
+                return ret;
+            }
+			
+			if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+				strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			} else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+				strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			} else {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+				ret = MCF_OTA_R_INVALID_PARAMETER;
+
+				return ret;
+			}
+
+			if (strcmp((kal_char *)req->config1, "") != 0) {
+				file_extension1 = strstr((kal_char *)req->config1, ".mcfopota");
+                if (file_extension1 == NULL){
+                    file_extension2 = strstr((kal_char *)req->config1, ".bin");
+                    if (file_extension2 == NULL) {
+                        MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_FILE_TYPE((kal_char *)req->config1);
+                        ret = MCF_OTA_R_INVALID_PARAMETER;
+                        return ret;
+                    }
+                }
+				strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+			} else {
+				strncpy(curr_filename, MCF_FS_DEFAULT_TLVOTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
+			}
+			
+			/* Read MCF Internal information in NVRAM */
+			if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+				ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+				return ret;
+			}
+			
+			/* Read MCF TLV-OTA file information in NVRAM */
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+                MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                ret = KAL_FALSE;
+
+                return MCF_OTA_R_READ_NVRAM_FAIL;
+            }
+			
+			strncpy(nv_tlvota_file.merged_path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			strncpy(nv_tlvota_file.merged_name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+			nv_int_info.is_combined_tlvota[sim_id] = KAL_TRUE;
+
+			if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+				ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+				return ret;
+			}
+			
+			/* Write MCF TLV-OTA file information in NVRAM */
+            if ( !nvram_external_write_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, sim_id + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct)) ) {
+                MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_TLVOTA_FILE_LID);
+                ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+                return ret;
+            }
+			
+			break;
+		}
+		case L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN:
+		{
+			kal_char                                fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+			kal_char                                curr_filename[MCF_FILE_MAX_NAME_LEN];
+			kal_char                               *file_extension1 = NULL;
+			kal_char                               *file_extension2 = NULL;
+			nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+			
+			if (req->path_type == L4C_MCF_PATH_TYPE_OTA) {
+				strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			} else if (req->path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+				strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			} else {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_PATH_TYPE(req->path_type);
+				ret = MCF_OTA_R_INVALID_PARAMETER;
+
+				return ret;
+			}
+
+			if (strcmp((kal_char *)req->config1, "") != 0) {
+				file_extension1 = strstr((kal_char *)req->config1, ".mcfopota");
+				if (file_extension1 == NULL){
+                    file_extension2 = strstr((kal_char *)req->config1, ".bin");
+                    if (file_extension2 == NULL) {
+                        MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_FILE_TYPE((kal_char *)req->config1);
+                        ret = MCF_OTA_R_INVALID_PARAMETER;
+                        return ret;
+                    }
+                }
+				strncpy(curr_filename, (kal_char *)req->config1, MCF_FILE_MAX_NAME_LEN - 1);
+			} else {
+				strncpy(curr_filename, MCF_FS_GENERAL_TLVOTA_MERGED_FILE_NAME, MCF_FILE_MAX_NAME_LEN - 1);
+			}
+			
+			/* Read MCF Internal information in NVRAM */
+			if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+				ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+				return ret;
+			}
+			
+			/* Read MCF general TLV-OTA file into cache buffer */
+			if ( !nvram_external_read_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_READ_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+				ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+				return ret;
+			}
+			
+			strncpy(nv_tlvota_file.merged_path, fs_root_path, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			strncpy(nv_tlvota_file.merged_name, curr_filename, MCF_FILE_MAX_NAME_LEN - 1);
+			nv_int_info.is_combined_general_tlvota = KAL_TRUE;
+
+			if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+				ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+				return ret;
+			}
+			if ( !nvram_external_write_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+				MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_WRITE_FILE_NVRAM_FAIL(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID);
+				ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+				return ret;
+			}
+			
+			break;
+		}
+		
+		default:
+		{
+			MD_TRC_MCF_TR_ASSIGN_COMBINED_FILE_PATH_INVALID_CONFIG_TYPE(req->config_type);
+			ret = MCF_OTA_R_INVALID_PARAMETER;
+			break;
+        }
+
+	}
+	
+	
+	return ret;
+}
+#endif
+_STATIC mcf_ota_result_e mcf_l4_set_config(ilm_struct *ilm)
+{
+    l4c_mcf_set_config_req_struct  *req = (l4c_mcf_set_config_req_struct *)ilm->local_para_ptr;
+    l4c_mcf_set_config_cnf_struct  *local_para_ptr = NULL;
+    mcf_ota_result_e                ret = MCF_OTA_R_SUCCESS;
+    mcf_ota_result_e                write_ret;
+    kal_int32                       fs_ret = FS_NO_ERROR;
+    kal_wchar                       pathname[MCF_FILE_MAX_MD_PATH_LEN];
+    kal_uint32                      ret_sprintf;
+
+    switch (req->op)
+    {
+        case L4C_MCF_CONFIG_SET_OTA_AND_OPOTA_FILE_PATH:
+        case L4C_MCF_CONFIG_SET_OTA_FILE_PATH:
+        case L4C_MCF_CONFIG_SET_OPOTA_FILE_PATH:
+            ret = mcf_set_file_path(req);
+            break;
+
+        case L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE:
+        {
+            mcf_t                              *pMcf = mcf_get_instance();
+            sim_interface_enum                  sim_id = l4c_gemini_get_actual_sim_id(req->ps_id);
+			mcf_l4bsbp_trigger_dsbp_ind_struct *ind_ptr = NULL;
+            
+            if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+                MD_TRC_MCF_TR_L4_SET_CONFIG_INVALID_SIM_ID(req->ps_id, sim_id);
+                ret = MCF_OTA_R_INVALID_PARAMETER;
+
+                return ret;
+            }
+
+            if (pMcf->is_dsbp_ongoing[sim_id] == KAL_TRUE) {
+                MD_TRC_MCF_TR_L4_SET_CONFIG_DSBP_ONGOING(req->ps_id, sim_id);
+
+                /* Send process result to ATCI */
+                local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+                if (!local_para_ptr) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                    return ret;
+                }
+                local_para_ptr->src_id = req->src_id;
+                local_para_ptr->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+                local_para_ptr->dsbp_result = MCF_TRIGGER_DSBP_R_FAIL_MCF_DSBP_ONGOING;
+
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        ilm->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
+                        (local_para_struct*)local_para_ptr, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+
+                goto out;
+            }
+
+            ret = mcf_set_file_path(req);
+            if (ret == MCF_OTA_R_SUCCESS) {
+                /* 
+                 *  Trigger DSBP and do not respond to AP immediately.
+                 *  Wait DSBP response, and then respond to AP.
+                 */
+                ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                if (!ind_ptr) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                    return ret;
+                }
+
+                ind_ptr->src_id = req->src_id;
+                ind_ptr->config_op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+                ind_ptr->src_mod_id = ilm->src_mod_id;
+
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        MOD_L4BSBP + req->ps_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                        (local_para_struct*)ind_ptr, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+
+                pMcf->is_dsbp_ongoing[sim_id] = KAL_TRUE;
+				
+				/* Support MCF Tool Send AT cmd - delete txt */
+                kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
+                fs_ret = FS_Delete(pathname);
+                
+                if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+                    MD_TRC_MCF_TR_L4_SET_CONFIG_DELETE_FILE_FAIL(fs_ret);
+                    ret = MCF_OTA_R_WRITE_DISK_FAIL;
+                    return ret;
+                }
+                
+                /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
+                kal_mem_set(txt_buff, 0, 64);
+                ret_sprintf = kal_sprintf(txt_buff, "EMCFC=%d,%d,%d%c", L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE, 0, MCF_TRIGGER_DSBP_R_FAIL_MCF_DSBP_ONGOING, '\0');
+                if (ret_sprintf < 0 || ret_sprintf > 64){
+                    strncpy(txt_buff, "EMCFC unknown error", 63);
+                }
+                MD_TRC_MCF_TR_L4_SET_CONFIG_CMD_RESULT(txt_buff);
+                write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
+                if (write_ret != MCF_OTA_R_SUCCESS) {
+                    return write_ret;
+                }
+				
+				
+                goto out;
+            }else {
+                /* Send process result to ATCI */
+                local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+                if (!local_para_ptr) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                    return ret;
+                }
+                local_para_ptr->src_id = req->src_id;
+                local_para_ptr->op = L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE;
+                local_para_ptr->mcf_result = ret;
+
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        ilm->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
+                        (local_para_struct*)local_para_ptr, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+
+                goto out;
+            }
+            break;
+        }
+
+        case L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN:
+        {
+            mcf_l4bsbp_trigger_dsbp_ind_struct *ind_ptr = NULL;
+            kal_uint32                          i = 0;
+            mcf_t                              *pMcf = mcf_get_instance();
+
+            ret = mcf_set_file_path(req);
+            if ( (req->trigger_dsbp == 1) && (ret == MCF_OTA_R_SUCCESS) ) {
+                /* 
+                 *  Trigger DSBP and do not respond to AP immediately.
+                 *  Wait DSBP response, and then respond to AP.
+                 */
+                 if (req->config_type == L4C_MCF_CONFIG_TYPE_GENERAL_CARRIER_BIN){
+                    //General OP-OTA need to trigger dsbp all sims
+                    dsbp_ret = 0;
+                    
+                    for (i = 0; i < MAX_SIM_NUM; i++){
+                        ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                        if (!ind_ptr) {
+                            ASSERT(0);
+                            ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                            return ret;
+                        }
+                        
+                        ind_ptr->src_id = req->src_id;
+                        ind_ptr->config_op = req->op;
+                        ind_ptr->src_mod_id = ilm->src_mod_id;
+
+                        msg_send6(MOD_MCF, /* src_mod_id */
+                                MOD_L4BSBP + i, /* dest_mod_id */
+                                MCF_SAP, /* sap_id */
+                                MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                                (local_para_struct*)ind_ptr, /* local_para_ptr */
+                                NULL); /* peer_buff_ptr */
+                        pMcf->dsbp_cnf_cnt ++;
+                        pMcf->dsbp_ind_cnt ++;
+                        pMcf->dsbp_cnf_ret = KAL_TRUE;
+                        ret = MCF_OTA_R_SUCCESS;
+                    }
+                    
+                }else{
+                    //OTA and OP-OTA only need to by sim trigger dsbp
+                    
+                    ind_ptr = (mcf_l4bsbp_trigger_dsbp_ind_struct *)construct_local_para(sizeof(mcf_l4bsbp_trigger_dsbp_ind_struct), TD_RESET);
+                    if (!ind_ptr) {
+                        ASSERT(0);
+                        ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                        return ret;
+                    }
+
+                    ind_ptr->src_id = req->src_id;
+                    ind_ptr->config_op = req->op;
+                    ind_ptr->src_mod_id = ilm->src_mod_id;
+
+                    msg_send6(MOD_MCF, /* src_mod_id */
+                            MOD_L4BSBP + req->ps_id, /* dest_mod_id */
+                            MCF_SAP, /* sap_id */
+                            MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_IND, /* msg_id */
+                            (local_para_struct*)ind_ptr, /* local_para_ptr */
+                            NULL); /* peer_buff_ptr */
+                        
+                }
+                        
+                /* Support MCF Tool Send AT cmd - delete txt */
+                kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
+                fs_ret = FS_Delete(pathname);
+                
+                if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+                    MD_TRC_MCF_TR_L4_SET_CONFIG_DELETE_FILE_FAIL(fs_ret);
+                    ret = MCF_OTA_R_WRITE_DISK_FAIL;
+                    return ret;
+                }
+                
+                /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
+                kal_mem_set(txt_buff, 0, 64);
+                ret_sprintf = kal_sprintf(txt_buff, "EMCFC=%d,%d,%d%c", L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN, 0, MCF_TRIGGER_DSBP_R_FAIL_MCF_DSBP_ONGOING, '\0');
+                if (ret_sprintf < 0 || ret_sprintf > 64){
+                    strncpy(txt_buff, "EMCFC unknown error", 63);
+                }
+                MD_TRC_MCF_TR_L4_SET_CONFIG_CMD_RESULT(txt_buff);
+                write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
+                if (write_ret != MCF_OTA_R_SUCCESS) {
+                    return write_ret;
+                }
+
+                goto out;
+            } else {
+                /* Send process result to ATCI */
+                local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+                if (!local_para_ptr) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                    return ret;
+                }
+                local_para_ptr->src_id = req->src_id;
+                local_para_ptr->op = req->op;
+                local_para_ptr->mcf_result = ret;
+                local_para_ptr->dsbp_result = 0;
+
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        ilm->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
+                        (local_para_struct*)local_para_ptr, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                        
+                /* Support MCF Tool Send AT cmd - delete txt */
+                kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
+                fs_ret = FS_Delete(pathname);
+                
+                if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+                    MD_TRC_MCF_TR_L4_SET_CONFIG_DELETE_FILE_FAIL(fs_ret);
+                    ret = MCF_OTA_R_WRITE_DISK_FAIL;
+                    return ret;
+                }
+                
+                /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
+                kal_mem_set(txt_buff, 0, 64);
+                ret_sprintf = kal_sprintf(txt_buff, "EMCFC=%d,%d,%d%c", L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN, ret, 0, '\0');
+                if (ret_sprintf < 0 || ret_sprintf > 64){
+                    strncpy(txt_buff, "EMCFC unknown error", 63);
+                }
+                MD_TRC_MCF_TR_L4_SET_CONFIG_CMD_RESULT(txt_buff);
+                write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
+                if (write_ret != MCF_OTA_R_SUCCESS) {
+                    return write_ret;
+                }
+                
+                goto out;
+            }
+            break;
+        }
+
+        default:
+            MD_TRC_MCF_TR_L4_SET_CONFIG_UNKNOWN_OP(req->op);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            break;
+    }
+
+    /* Send process result to ATCI */
+    local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+    if (!local_para_ptr) {
+        ASSERT(0);
+        ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+        return ret;
+    }
+    local_para_ptr->src_id = req->src_id;
+    if (ret == MCF_OTA_R_SUCCESS) {
+        local_para_ptr->result = KAL_TRUE;
+    } else {
+        local_para_ptr->result = KAL_FALSE;
+    }
+
+    msg_send6(MOD_MCF, /* src_mod_id */
+            ilm->src_mod_id, /* dest_mod_id */
+            MCF_SAP, /* sap_id */
+            MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
+            (local_para_struct*)local_para_ptr, /* local_para_ptr */
+            NULL); /* peer_buff_ptr */
+
+out:
+    return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_l4_get_config(ilm_struct *ilm)
+{
+    l4c_mcf_get_config_req_struct  *req = (l4c_mcf_get_config_req_struct *)ilm->local_para_ptr;
+    l4c_mcf_get_config_cnf_struct  *local_para_ptr = NULL;
+    mcf_ota_result_e                ret;
+
+    local_para_ptr = (l4c_mcf_get_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_get_config_cnf_struct), TD_RESET);
+    if (!local_para_ptr) {
+        ASSERT(0);
+        ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+        return ret;
+    }
+
+    switch (req->op)
+    {
+        case L4C_MCF_CONFIG_GET_APPLIED_FILE_PATH:
+            ret = mcf_get_applied_file_path(req, local_para_ptr);
+            break;
+
+        default:
+            MD_TRC_MCF_TR_L4_GET_CONFIG_UNKNOWN_OP(req->op);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            break;
+    }
+    local_para_ptr->src_id = req->src_id;
+    if (ret == MCF_OTA_R_SUCCESS) {
+        local_para_ptr->result = KAL_TRUE;
+    } else {
+        local_para_ptr->result = KAL_FALSE;
+    }
+
+    /* Send process result to ATCI */
+    msg_send6(MOD_MCF, /* src_mod_id */
+            ilm->src_mod_id, /* dest_mod_id */
+            MCF_SAP, /* sap_id */
+            MSG_ID_L4C_MCF_GET_CONFIG_CNF, /* msg_id */
+            (local_para_struct*)local_para_ptr, /* local_para_ptr */
+            NULL); /* peer_buff_ptr */
+
+    return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_l4_dump_data(ilm_struct *ilm)
+{
+    l4c_mcf_dump_data_req_struct       *req_ptr = (l4c_mcf_dump_data_req_struct *)ilm->local_para_ptr;
+    l4c_mcf_dump_data_cnf_struct       *cnf_ptr = NULL;
+    mcf_l4c_report_state_ind_struct    *ind_ptr = NULL;
+    mcf_ota_result_e                    ret = MCF_OTA_R_SUCCESS;
+    mcf_ota_result_e                    write_ret = MCF_OTA_R_SUCCESS;
+    kal_char                            urc_result[16];
+    kal_uint32                          at_len;
+    kal_int32                           fs_ret = FS_NO_ERROR;
+    kal_wchar                           pathname[MCF_FILE_MAX_MD_PATH_LEN];
+    kal_uint32                          ret_sprintf;
+
+    switch (req_ptr->op)
+    {
+        case L4C_MCF_CONFIG_DUMP_LID_DATA:
+            cnf_ptr = (l4c_mcf_dump_data_cnf_struct *)construct_local_para(sizeof(l4c_mcf_dump_data_cnf_struct), TD_RESET);
+            if (!cnf_ptr) {
+                ASSERT(0);
+                ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                return ret;
+            }
+
+            cnf_ptr->src_id = req_ptr->src_id;
+            cnf_ptr->op = req_ptr->op;
+            cnf_ptr->result = ret;
+
+            msg_send6(MOD_MCF, /* src_mod_id */
+                    ilm->src_mod_id, /* dest_mod_id */
+                    MCF_SAP, /* sap_id */
+                    MSG_ID_L4C_MCF_DUMP_DATA_CNF, /* msg_id */
+                    (local_para_struct*)cnf_ptr, /* local_para_ptr */
+                    NULL); /* peer_buff_ptr */
+            
+            /* Support MCF Tool Open Dump File - delete txt */
+            kal_wsprintf(pathname, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT);
+            fs_ret = FS_Delete(pathname);
+            
+            if(fs_ret != FS_NO_ERROR && fs_ret != FS_FILE_NOT_FOUND){
+                MD_TRC_MCF_TR_L4_DUMP_DATA_DELETE_FILE_FAIL(fs_ret);
+                ret = MCF_OTA_R_WRITE_DISK_FAIL;
+                return ret;
+            }
+            
+            
+            /* Support MCF Tool Open Dump File - Write AT cmd result in txt */
+            kal_mem_set(txt_buff, 0, 64);
+            ret_sprintf = kal_snprintf(txt_buff, 63, "EMCFC=%d,%d%c", req_ptr->op, ret, '\0');
+            if (ret_sprintf < 0 || ret_sprintf > 64){
+                strncpy(txt_buff, "EMCFC unknown error", 63);
+            }
+            MD_TRC_MCF_TR_L4_DUMP_DATA_CMD_RESULT(txt_buff);
+            write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
+            if (write_ret != MCF_OTA_R_SUCCESS) {
+                return write_ret;
+            }
+
+            ret = mcf_dump_all_lid_data(req_ptr);
+            break;
+
+        default:
+            MD_TRC_MCF_TR_L4_DUMP_DATA_UNKNOWN_OP(req_ptr->op);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            return ret;
+    }
+
+    ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+    if (!ind_ptr) {
+        ASSERT(0);
+        ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+        return ret;
+    }
+
+    ind_ptr->type = MCF_L4C_REPORT_MCF_DUMP_RESULT;
+    ind_ptr->result = ret;
+
+    msg_send6(MOD_MCF, /* src_mod_id */
+            ilm->src_mod_id, /* dest_mod_id */
+            MCF_SAP, /* sap_id */
+            MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+            (local_para_struct*)ind_ptr, /* local_para_ptr */
+            NULL); /* peer_buff_ptr */
+            
+    /* Support MCF Tool Open Dump File - Write Urc result in txt */
+    kal_mem_set(urc_result,0,16);
+    ret_sprintf = kal_snprintf(urc_result, 15, "%cEMCFRPT=%d,%d%c", '\n', ind_ptr->type, ret, '\0');
+    if (ret_sprintf < 0 || ret_sprintf > 16){
+        strncpy(urc_result, "EMCFRPT error", 15);
+    }
+    at_len = strlen(txt_buff);
+    strncat(txt_buff, urc_result, 15);
+    MD_TRC_MCF_TR_L4_DUMP_DATA_CMD_RESULT(txt_buff);
+    write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, at_len+strlen(urc_result));
+    if (write_ret != MCF_OTA_R_SUCCESS) {
+        return write_ret;
+    }
+
+    return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_l4_update_ota(ilm_struct *ilm)
+{
+    l4c_mcf_update_ota_file_req_struct  *req = (l4c_mcf_update_ota_file_req_struct *)ilm->local_para_ptr;
+    l4c_mcf_update_ota_file_cnf_struct  *local_para_ptr1 = NULL;
+    mcf_ota_result_e                    ret = MCF_OTA_R_SUCCESS;
+    mcf_l4c_report_state_ind_struct     *ind_ptr = NULL;
+    mcf_t                               *pMcf = mcf_get_instance();
+    module_type                         src_mod_id = ilm->src_mod_id;
+    kal_bool                            reset_MD = KAL_FALSE;
+    
+    
+    
+    
+    
+    switch (req->op)
+    {
+        case L4C_MCF_CONFIG_UPDATE_OPOTA_FILE:
+            
+            /* If DSBP is busy when receive AT cmd, send AT cmd to ask AP retry */
+            if (pMcf->dsbp_cnf_cnt != 0 || pMcf->dsbp_ind_cnt != 0){
+                MD_TRC_MCF_TR_L4_UPDATE_OTA_DSBP_IS_ONGOING(pMcf->dsbp_cnf_cnt);
+                MD_TRC_MCF_TR_L4_UPDATE_OTA_DSBP_IS_ONGOING(pMcf->dsbp_ind_cnt);
+                
+                local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+                if (!local_para_ptr1) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                    return ret;
+                }
+                
+                
+                /* Send AT cmd back & send URC to ask AP retry */
+                local_para_ptr1->src_id = req->src_id;
+                local_para_ptr1->op = req->op;
+                local_para_ptr1->mcf_result = MCF_OTA_R_FAIL_MCF_DSBP_ONGOING;
+                
+                
+
+                /* Send process result to ATCI */
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        ilm->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+                        (local_para_struct*)local_para_ptr1, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                
+                ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+                if (!ind_ptr) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+                    return ret;
+                }
+
+                ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+                ind_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
+
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        ilm->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+                        (local_para_struct*)ind_ptr, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                return ret;
+            }
+            
+            
+            MD_TRC_MCF_TR_L4_UPDATE_OPOTA_FILE_UPDATE_OTA();
+            ret = mcf_update_ota_file(req, local_para_ptr1, src_mod_id, &reset_MD);
+            
+            if (ret == MCF_OTA_R_ALLOCATE_BUFFER_FAIL){
+                return ret;
+            }else if(ret == MCF_OTA_R_READ_OTA_FILE_FAIL || ret == MCF_OTA_R_READ_INI_FILE_FAIL){
+                local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+                if (!local_para_ptr1) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                    return ret;
+                }
+                
+                
+                local_para_ptr1->src_id = req->src_id;
+                local_para_ptr1->op = req->op;
+                local_para_ptr1->mcf_result = ret;
+                
+                
+
+                /* Send process result to ATCI */
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        ilm->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+                        (local_para_struct*)local_para_ptr1, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                
+                ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+                if (!ind_ptr) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+                    return ret;
+                }
+
+                ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+                ind_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
+
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        ilm->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+                        (local_para_struct*)ind_ptr, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                        
+                return ret;
+            }
+            if(reset_MD == KAL_TRUE){
+                //ret = MCF_OTA_R_SUCCESS;
+
+                local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+                if (!local_para_ptr1) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                    return ret;
+                }
+                
+                
+                local_para_ptr1->src_id = req->src_id;
+                local_para_ptr1->op = req->op;
+                local_para_ptr1->mcf_result = ret;
+                
+                
+
+                /* Send process result to ATCI */
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        ilm->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+                        (local_para_struct*)local_para_ptr1, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                
+                ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+                if (!ind_ptr) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+                    return ret;
+                }
+
+                ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+                ind_ptr->result = MCF_L4C_REPORT_R_RESET_MD;
+
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        ilm->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+                        (local_para_struct*)ind_ptr, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                        
+                return ret;
+                        
+            }
+            
+            if (pMcf->dsbp_cnf_cnt == 0){
+                local_para_ptr1 = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+                if (!local_para_ptr1) {
+                    ASSERT(0);
+                    ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                    return ret;
+                }
+                
+                
+                
+                local_para_ptr1->src_id = req->src_id;
+                local_para_ptr1->op = req->op;
+                local_para_ptr1->mcf_result = ret;
+                
+                
+
+                /* Send process result to ATCI */
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        ilm->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+                        (local_para_struct*)local_para_ptr1, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                        
+                if (ret == MCF_OTA_R_SUCCESS){
+                
+                    ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+                    if (!ind_ptr) {
+                        ASSERT(0);
+                        ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+                        return ret;
+                    }
+
+                    ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+                    ind_ptr->result = MCF_L4C_REPORT_R_SUCCESS;
+
+                    msg_send6(MOD_MCF, /* src_mod_id */
+                            ilm->src_mod_id, /* dest_mod_id */
+                            MCF_SAP, /* sap_id */
+                            MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+                            (local_para_struct*)ind_ptr, /* local_para_ptr */
+                            NULL); /* peer_buff_ptr */
+                }        
+                return ret;
+            }
+            
+            break;
+
+        default:
+            MD_TRC_MCF_TR_L4_UPDATE_OPOTA_FILE_UNKNOWN_OP(req->op);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            break;
+    }
+    
+            
+    return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_l4_config(ilm_struct *ilm)
+{
+    l4c_mcf_config_req_struct  *req = (l4c_mcf_config_req_struct *)ilm->local_para_ptr;
+    l4c_mcf_config_cnf_struct  *local_para_ptr = NULL;
+    mcf_ota_result_e                    ret = MCF_OTA_R_SUCCESS;
+    
+    local_para_ptr = (l4c_mcf_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_cnf_struct), TD_RESET);
+    if (!local_para_ptr) {
+        ASSERT(0);
+        ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+        return ret;
+    }
+    
+    
+
+    switch (req->op)
+    {
+        case L4C_MCF_CONFIG_INI_OPERATION:
+            ret = mcf_config_ini_info(req, local_para_ptr);
+            break;
+
+        default:
+            MD_TRC_MCF_TR_L4_CONFIG_UNKNOWN_OP(req->op);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            break;
+    }
+    
+    
+    local_para_ptr->src_id = req->src_id;
+    local_para_ptr->op = req->op;
+    local_para_ptr->mcf_result = ret;
+    
+
+    /* Send process result to ATCI */
+    msg_send6(MOD_MCF, /* src_mod_id */
+            ilm->src_mod_id, /* dest_mod_id */
+            MCF_SAP, /* sap_id */
+            MSG_ID_L4C_MCF_CONFIG_CNF, /* msg_id */
+            (local_para_struct*)local_para_ptr, /* local_para_ptr */
+            NULL); /* peer_buff_ptr */
+    
+    return ret;
+}
+
+_STATIC mcf_ota_result_e mcf_l4_query_lid(ilm_struct *ilm)
+{
+    l4c_mcf_config_lid_variable_operation_req_struct       *req_ptr = (l4c_mcf_config_lid_variable_operation_req_struct *)ilm->local_para_ptr;
+    l4c_mcf_config_lid_variable_operation_cnf_struct       *cnf_ptr = NULL;
+    mcf_ota_result_e                                        ret = MCF_OTA_R_SUCCESS;
+
+    switch (req_ptr->op)
+    {
+        case L4C_MCF_CONFIG_LID_VARIABLE_OPERATION:
+            cnf_ptr = (l4c_mcf_config_lid_variable_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_config_lid_variable_operation_cnf_struct), TD_RESET);
+            if (!cnf_ptr) {
+                ASSERT(0);
+                ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                return ret;
+            }
+
+            ret = mcf_config_LID_variable(req_ptr, cnf_ptr);
+            
+            cnf_ptr->src_id = req_ptr->src_id;
+            cnf_ptr->op = req_ptr->op;
+            cnf_ptr->action = req_ptr->action;
+            cnf_ptr->mcf_result = ret;
+
+            msg_send6(MOD_MCF, /* src_mod_id */
+                    ilm->src_mod_id, /* dest_mod_id */
+                    MCF_SAP, /* sap_id */
+                    MSG_ID_L4C_MCF_CONFIG_LID_VARIABLE_OPERATION_CNF, /* msg_id */
+                    (local_para_struct*)cnf_ptr, /* local_para_ptr */
+                    NULL); /* peer_buff_ptr */
+
+            
+            break;
+
+        default:
+            MD_TRC_MCF_TR_L4_QUERY_LID_UNKNOWN_OP(req_ptr->op);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            return ret;
+    }
+
+    return ret;
+}
+_STATIC mcf_ota_result_e mcf_l4_variable_operation(ilm_struct *ilm)
+{
+    l4c_mcf_variable_value_operation_req_struct       *req_ptr = (l4c_mcf_variable_value_operation_req_struct *)ilm->local_para_ptr;
+    l4c_mcf_variable_value_operation_cnf_struct       *cnf_ptr = NULL;
+    mcf_ota_result_e                                   ret = MCF_OTA_R_SUCCESS;
+
+    switch (req_ptr->op)
+    {
+        case L4C_MCF_CONFIG_VARIABLE_VALUE_OPERATION:
+            cnf_ptr = (l4c_mcf_variable_value_operation_cnf_struct *)construct_local_para(sizeof(l4c_mcf_variable_value_operation_cnf_struct), TD_RESET);
+            if (!cnf_ptr) {
+                ASSERT(0);
+                ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                return ret;
+            }
+			switch (req_ptr->action)
+			{
+				case L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OTA:
+				case L4C_MCF_CONFIG_LID_VARIABLE_ACT_READ_OPOTA:
+					ret = mcf_query_variable_value(req_ptr, cnf_ptr);
+					break;
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+				case L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OTA:
+				case L4C_MCF_CONFIG_LID_VARIABLE_ACT_WRITE_OPOTA:
+					ret = mcf_set_variable_value(req_ptr, cnf_ptr);
+					break;
+#endif
+				default:
+					MD_TRC_MCF_TR_L4_VARIABLE_OPERATION_UNKOWN_ACTION(req_ptr->action);
+					break;
+			}
+            
+            
+            cnf_ptr->src_id = req_ptr->src_id;
+            cnf_ptr->op = req_ptr->op;
+            cnf_ptr->format = req_ptr->format;
+            cnf_ptr->action = req_ptr->action;
+            cnf_ptr->mcf_result = ret;
+
+            msg_send6(MOD_MCF, /* src_mod_id */
+                    ilm->src_mod_id, /* dest_mod_id */
+                    MCF_SAP, /* sap_id */
+                    MSG_ID_L4C_MCF_VARIABLE_VALUE_OPERATION_CNF, /* msg_id */
+                    (local_para_struct*)cnf_ptr, /* local_para_ptr */
+                    NULL); /* peer_buff_ptr */
+
+            
+            break;
+
+        default:
+            MD_TRC_MCF_TR_L4_VARIABLE_OPERATION_UNKNOWN_OP(req_ptr->op);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            return ret;
+    }
+
+    return ret;
+}
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+_STATIC mcf_ota_result_e mcf_l4_assign_combined_file_path(ilm_struct *ilm)
+{
+    l4c_mcf_set_config_req_struct       *req_ptr = (l4c_mcf_set_config_req_struct *)ilm->local_para_ptr;
+    l4c_mcf_set_config_cnf_struct       *cnf_ptr = NULL;
+    mcf_ota_result_e                     ret = MCF_OTA_R_SUCCESS;
+
+    switch (req_ptr->op)
+    {
+        case L4C_MCF_CONFIG_ASSIGN_COMBINED_PATH:
+            cnf_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+            if (!cnf_ptr) {
+                ASSERT(0);
+                ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+
+                return ret;
+            }
+
+            ret = mcf_assign_combined_file_path(req_ptr);
+            
+            cnf_ptr->src_id = req_ptr->src_id;
+            cnf_ptr->op = req_ptr->op;
+            cnf_ptr->mcf_result = ret;
+
+            msg_send6(MOD_MCF, /* src_mod_id */
+                    ilm->src_mod_id, /* dest_mod_id */
+                    MCF_SAP, /* sap_id */
+                    MSG_ID_L4C_MCF_ASSIGN_COMBINED_FILE_PATH_CNF, /* msg_id */
+                    (local_para_struct*)cnf_ptr, /* local_para_ptr */
+                    NULL); /* peer_buff_ptr */
+
+            
+            break;
+
+        default:
+            MD_TRC_MCF_TR_L4_ASSIGN_COMBINED_FILE_PATH_UNKNOWN_OP(req_ptr->op);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            return ret;
+    }
+
+    return ret;
+}
+#endif
+_STATIC void mcf_respond_dsbp_result(local_para_struct *local_para_ptr)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+	mcf_l4bsbp_trigger_dsbp_cnf_struct *cnf = (mcf_l4bsbp_trigger_dsbp_cnf_struct *)local_para_ptr;
+    l4c_mcf_set_config_cnf_struct      *cnf_local_para_ptr = NULL;
+    l4c_mcf_update_ota_file_cnf_struct *cnf_update_ota_local_para_ptr = NULL;
+    mcf_l4c_report_state_ind_struct    *ind_ptr = NULL;
+    mcf_ota_result_e                    write_ret = MCF_OTA_R_SUCCESS;
+    mcf_ota_result_e                    mcf_ret = MCF_OTA_R_SUCCESS;
+    kal_uint32                          ret_sprintf;
+	sim_interface_enum                  sim_id = l4c_gemini_get_actual_sim_id(cnf->ps_id);
+    mcf_tlvota_file_t                  *tlvota_file;
+    kal_char                            fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+    kal_char                            apply_filename[MCF_FILE_MAX_NAME_LEN];
+    l4c_mcf_path_type_enum              apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+
+    
+    if (cnf->config_op == L4C_MCF_CONFIG_UPDATE_OPOTA_FILE){
+        pMcf->dsbp_cnf_cnt--;
+        
+        if (cnf->result != MCF_TRIGGER_DSBP_R_SUCCESS && cnf->result != MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
+                pMcf->dsbp_ind_cnt--;
+                pMcf->dsbp_ind_ret = KAL_FALSE;
+                pMcf->dsbp_cnf_ret = KAL_FALSE;
+        }
+        if (cnf->result == MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
+            pMcf->dsbp_ind_cnt--;
+            MD_TRC_MCF_TR_RESPOND_DSBP_RESULT_IND_NO_SIM(cnf->ps_id);
+        }
+        
+        if (cnf->is_dsbp_retry == 0){
+            pMcf->is_critical = KAL_TRUE;
+        }
+        
+        
+        /* When critical OTA is fail to trigger DSBP, Send AT cmd response and send URC to reset MD */
+        if (pMcf->dsbp_cnf_cnt == 0)
+        {
+            if (pMcf->is_critical == KAL_TRUE){
+                cnf_update_ota_local_para_ptr = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+                if (!cnf_update_ota_local_para_ptr) {
+                    ASSERT(0);
+
+                    return;
+                }
+
+                cnf_update_ota_local_para_ptr->src_id = cnf->src_id;
+                cnf_update_ota_local_para_ptr->op = cnf->config_op;
+                if (pMcf->dsbp_cnf_ret == KAL_TRUE){
+                    cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_SUCCESS;
+                }else{
+                    cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_DSBP_FAIL;
+                }
+                
+                
+                
+                /* Send process result to ATCI */
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        cnf->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+                        (local_para_struct*)cnf_update_ota_local_para_ptr, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                        
+                
+                
+                MD_TRC_MCF_TR_RESPOND_DSBP_RESULT_IND_CNT(pMcf->dsbp_ind_cnt);
+                if(pMcf->dsbp_ind_cnt == 0 && pMcf->dsbp_cnf_ret == KAL_FALSE){
+                    ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+                    if (!ind_ptr) {
+                        ASSERT(0);
+                        return;
+                    }
+                    
+
+                    ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+                    ind_ptr->result = MCF_L4C_REPORT_R_RESET_MD;
+
+                    /* Send process result to ATCI */
+                    msg_send6(MOD_MCF, /* src_mod_id */
+                            cnf->src_mod_id, /* dest_mod_id */
+                            MCF_SAP, /* sap_id */
+                            MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+                            (local_para_struct*)ind_ptr, /* local_para_ptr */
+                            NULL); /* peer_buff_ptr */
+                }
+            }else{
+                cnf_update_ota_local_para_ptr = (l4c_mcf_update_ota_file_cnf_struct *)construct_local_para(sizeof(l4c_mcf_update_ota_file_cnf_struct), TD_RESET);
+                if (!cnf_update_ota_local_para_ptr) {
+                    ASSERT(0);
+
+                    return;
+                }
+
+                cnf_update_ota_local_para_ptr->src_id = cnf->src_id;
+                cnf_update_ota_local_para_ptr->op = cnf->config_op;
+                if (pMcf->dsbp_cnf_ret == KAL_TRUE){
+                    cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_SUCCESS;
+                }else{
+                    cnf_update_ota_local_para_ptr->mcf_result = MCF_OTA_R_DSBP_FAIL;
+                }
+
+                /* Send process result to ATCI */
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        cnf->src_mod_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_L4C_MCF_UPDATE_OTA_FILE_CNF, /* msg_id */
+                        (local_para_struct*)cnf_update_ota_local_para_ptr, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                if(pMcf->dsbp_ind_cnt == 0 && pMcf->dsbp_ind_ret == KAL_FALSE){
+                    ind_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+                    if (!ind_ptr) {
+                        ASSERT(0);
+
+                        return;
+                    }
+
+                    ind_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+                    ind_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
+
+                    /* Send process result to ATCI */
+                    msg_send6(MOD_MCF, /* src_mod_id */
+                            cnf->src_mod_id, /* dest_mod_id */
+                            MCF_SAP, /* sap_id */
+                            MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+                            (local_para_struct*)ind_ptr, /* local_para_ptr */
+                            NULL); /* peer_buff_ptr */
+                }
+            }
+            
+        }
+    }else{
+		
+		if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+            MD_TRC_MCF_TR_RESPOND_DSBP_INVALID_SIM_ID(cnf->ps_id, sim_id);
+            mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+            goto out;
+        }
+        
+        tlvota_file = &(pMcf->tlvota_file[sim_id]);
+        
+        if (cnf->result != MCF_TRIGGER_DSBP_R_SUCCESS) {
+			/* Read last updated file */
+			if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA) {
+				strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			} else if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+				strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+			} else {
+				MD_TRC_MCF_TR_RESPOND_DSBP_INVALID_FILE_PATH(cnf->result, tlvota_file->last_file.path_type);
+				pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+				mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+				goto out;
+			}
+
+			mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, tlvota_file->last_file.name, &apply_path_type, apply_filename, pMcf);
+
+			if (mcf_ret != MCF_OTA_R_SUCCESS) {
+				MD_TRC_MCF_TR_RESPOND_DSBP_READ_FILE_FAIL(cnf->result, mcf_ret);
+			}
+
+			pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+		}
+
+out:
+        if(pMcf->dsbp_cnf_cnt > 0){
+            pMcf->dsbp_cnf_cnt--;
+        }
+        
+        if (cnf->result != MCF_TRIGGER_DSBP_R_SUCCESS && cnf->result != MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
+            if(pMcf->dsbp_ind_cnt > 0){
+                pMcf->dsbp_ind_cnt--;
+            }
+            pMcf->dsbp_ind_ret = KAL_FALSE;
+            pMcf->dsbp_cnf_ret = KAL_FALSE;
+            dsbp_ret = cnf->result;
+        }
+        if (cnf->result == MCF_TRIGGER_DSBP_R_FAIL_NO_SIM){
+            if(pMcf->dsbp_ind_cnt > 0){
+                pMcf->dsbp_ind_cnt--;
+            }
+            MD_TRC_MCF_TR_RESPOND_DSBP_RESULT_IND_NO_SIM(cnf->ps_id);
+        }
+        
+        if (pMcf->dsbp_cnf_cnt == 0)
+        {
+            cnf_local_para_ptr = (l4c_mcf_set_config_cnf_struct *)construct_local_para(sizeof(l4c_mcf_set_config_cnf_struct), TD_RESET);
+            if (!cnf_local_para_ptr) {
+                ASSERT(0);
+
+                return;
+            }
+
+            if (pMcf->dsbp_cnf_ret != KAL_TRUE){
+                mcf_ret = MCF_OTA_R_DSBP_FAIL;
+            }
+            
+            cnf_local_para_ptr->src_id = cnf->src_id;
+            cnf_local_para_ptr->op = cnf->config_op;
+            cnf_local_para_ptr->mcf_result = mcf_ret;
+            cnf_local_para_ptr->dsbp_result = dsbp_ret;
+
+
+            /* Send process result to ATCI */
+            msg_send6(MOD_MCF, /* src_mod_id */
+                    cnf->src_mod_id, /* dest_mod_id */
+                    MCF_SAP, /* sap_id */
+                    MSG_ID_L4C_MCF_SET_CONFIG_CNF, /* msg_id */
+                    (local_para_struct*)cnf_local_para_ptr, /* local_para_ptr */
+                    NULL); /* peer_buff_ptr */
+                    
+            /* Support MCF Tool Send AT cmd - clear txt */
+            kal_mem_set(txt_buff, 0, 64);
+            write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, 0);
+            if (write_ret != MCF_OTA_R_SUCCESS) {
+                return;
+            }
+            
+            /* Support MCF Tool Send AT cmd - Write AT cmd result in txt */
+            ret_sprintf = kal_sprintf(txt_buff, "EMCFC=%d,%d,%d%c", cnf->config_op, mcf_ret, dsbp_ret, '\0');
+            if (ret_sprintf < 0 || ret_sprintf > 64){
+                strncpy(txt_buff, "EMCFC unknown error", 63);
+            }
+            MD_TRC_MCF_TR_RESPOND_DSBP_CMD_RESULT(txt_buff);
+            write_ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, strlen(txt_buff));
+            if (write_ret != MCF_OTA_R_SUCCESS) {
+                return;
+            }
+        }
+    }
+    return;
+}
+
+_STATIC kal_bool mcf_report_dsbp_result(local_para_struct *local_para_ptr)
+{
+    mcf_t                                        *pMcf = mcf_get_instance();
+	mcf_l4bsbp_trigger_dsbp_result_ind_struct    *ind = (mcf_l4bsbp_trigger_dsbp_result_ind_struct *)local_para_ptr;
+    kal_bool                                     ret = KAL_TRUE;
+    kal_char                                     urc_result[16];
+    kal_uint32                                   at_len;
+    kal_uint32                                   ret_sprintf;
+
+    switch (ind->config_op)
+    {
+        case L4C_MCF_CONFIG_SET_FILE_PATH_IN_MCF_DSBP_ACTIVE_MODE:
+        {
+            mcf_l4c_report_state_ind_struct            *ind_local_para_ptr = NULL;
+			sim_interface_enum                          sim_id = l4c_gemini_get_actual_sim_id(ind->ps_id);
+            mcf_tlvota_file_t                          *tlvota_file;
+            kal_char                                    fs_root_path[MCF_FILE_MAX_MD_PATH_LEN];
+            kal_char                                    apply_filename[MCF_FILE_MAX_NAME_LEN];
+            l4c_mcf_path_type_enum                      apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+            mcf_ota_result_e                            mcf_ret = MCF_OTA_R_SUCCESS;
+			
+			if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+                MD_TRC_MCF_TR_REPORT_STATE_INVALID_SIM_ID(ind->ps_id, sim_id);
+                mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+                goto out;
+            }
+            
+            tlvota_file = &(pMcf->tlvota_file[sim_id]);
+            
+            if (ind->result == MCF_TRIGGER_DSBP_R_SUCCESS) {
+                /* Store last updated file informantion */
+                kal_mem_cpy(&(tlvota_file->last_file), &(tlvota_file->temp_file), sizeof(mcf_file_info_t));
+            } else {
+                /* Read last updated file */
+                if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA) {
+                    strncpy(fs_root_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                } else if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+                    strncpy(fs_root_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+                } else {
+                    MD_TRC_MCF_TR_REPORT_STATE_INVALID_FILE_PATH(ind->result, tlvota_file->last_file.path_type);
+                    mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+
+                    goto out;
+                }
+
+                /* Read last updated file */
+                mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, fs_root_path, tlvota_file->last_file.name, &apply_path_type, apply_filename, pMcf);
+
+                if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                    MD_TRC_MCF_TR_REPORT_STATE_READ_FILE_FAIL(ind->result, mcf_ret);
+                }
+            }
+
+out:
+            if (sim_id >= 0 && sim_id < MAX_SIM_NUM){
+                pMcf->is_dsbp_ongoing[sim_id] = KAL_FALSE;
+            }
+
+            ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+            if (!ind_local_para_ptr) {
+                ASSERT(0);
+                ret = KAL_FALSE;
+
+                return ret;
+            }
+
+            ind_local_para_ptr->type = MCF_L4C_REPORT_DSBP_RESULT_OF_MCF_DSBP_ACTIVE_MODE;
+            ind_local_para_ptr->result = ind->result;
+
+            /* Send process result to ATCI */
+            msg_send6(MOD_MCF, /* src_mod_id */
+                    MOD_L4C + ind->ps_id, /* dest_mod_id */
+                    MCF_SAP, /* sap_id */
+                    MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+                    (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
+                    NULL); /* peer_buff_ptr */
+                    
+            /* Support MCF Tool Send AT cmd - Write Urc result in txt */
+            kal_mem_set(urc_result,0,16);
+            ret_sprintf = kal_snprintf(urc_result, 15, "%cEMCFRPT=%d,%d%c", '\n', MCF_L4C_REPORT_DSBP_RESULT_OF_MCF_DSBP_ACTIVE_MODE, ind->result, '\0');
+            if (ret_sprintf < 0 || ret_sprintf > 16){
+                strncpy(urc_result, "EMCFRPT error", 15);
+            }
+            at_len = strlen(txt_buff);
+            strncat(txt_buff, urc_result, 15);
+            MD_TRC_MCF_TR_REPORT_STATE_CMD_RESULT(txt_buff);
+            ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, at_len+strlen(urc_result));
+            if (ret != KAL_TRUE) {
+                return ret;
+            }
+
+
+            break;
+        }
+
+        case L4C_MCF_CONFIG_SET_FILE_PATH_AND_AUTO_SELECT_BIN:
+        {
+            mcf_l4c_report_state_ind_struct            *ind_local_para_ptr = NULL;
+
+            if (pMcf->dsbp_ind_cnt > 0){
+                pMcf->dsbp_ind_cnt --;
+            }
+            
+            if (ind->result != MCF_TRIGGER_DSBP_R_SUCCESS){
+                pMcf->dsbp_ind_ret = KAL_FALSE;
+            }
+            
+            
+            if(pMcf->dsbp_ind_cnt == 0){
+            
+                ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+                if (!ind_local_para_ptr) {
+                    ASSERT(0);
+                    ret = KAL_FALSE;
+
+                    return ret;
+                }
+
+                ind_local_para_ptr->type = MCF_L4C_REPORT_MCF_DUMP_RESULT_OF_AUTO_SELECT_BIN;
+                ind_local_para_ptr->result = ind->result;
+
+                /* Send process result to ATCI */
+                msg_send6(MOD_MCF, /* src_mod_id */
+                        MOD_L4C + ind->ps_id, /* dest_mod_id */
+                        MCF_SAP, /* sap_id */
+                        MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+                        (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
+                        NULL); /* peer_buff_ptr */
+                        
+                /* Support MCF Tool Send AT cmd - Write Urc result in txt */
+                kal_mem_set(urc_result,0,16);
+                ret_sprintf = kal_snprintf(urc_result, 15, "%cEMCFRPT=%d,%d%c", '\n', MCF_L4C_REPORT_MCF_DUMP_RESULT_OF_AUTO_SELECT_BIN, ind->result, '\0');
+                if (ret_sprintf < 0 || ret_sprintf > 16){
+                    strncpy(urc_result, "EMCFRPT error", 15);
+                }
+                at_len = strlen(txt_buff);
+                strncat(txt_buff, urc_result, 15);
+                MD_TRC_MCF_TR_REPORT_STATE_CMD_RESULT(txt_buff);
+                ret = mcf_write_buffer(MCF_FS_CUSTOM_FOLDER_PATH, MCF_FS_DEFAULT_AT_CMD_RESULT, (kal_uint8 *)txt_buff, at_len+strlen(urc_result));
+                if (ret != KAL_TRUE) {
+                    return ret;
+                }
+            }
+
+            break;
+        }
+        case L4C_MCF_CONFIG_UPDATE_OPOTA_FILE:
+        {
+            mcf_l4c_report_state_ind_struct            *ind_local_para_ptr = NULL;
+            mcf_t                                      *pMcf = mcf_get_instance();
+            
+            pMcf->dsbp_ind_cnt --;
+            
+            if (ind->result != MCF_TRIGGER_DSBP_R_SUCCESS){
+                pMcf->dsbp_ind_ret = KAL_FALSE;
+            }
+            
+            
+            if(pMcf->dsbp_ind_cnt == 0){
+                if (pMcf->is_critical == KAL_TRUE){
+                    pMcf->is_critical = KAL_FALSE;
+                    ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+                    if (!ind_local_para_ptr) {
+                        ASSERT(0);
+                        ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+                        return ret;
+                    }
+                    
+
+                    ind_local_para_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+                    
+                    if (pMcf->dsbp_ind_ret == KAL_TRUE){
+                        ind_local_para_ptr->result = MCF_L4C_REPORT_R_SUCCESS;
+                    }else{
+                        ind_local_para_ptr->result = MCF_L4C_REPORT_R_RESET_MD;
+                    }
+                    /* Send process result to ATCI */
+                    msg_send6(MOD_MCF, /* src_mod_id */
+                            ind->src_mod_id, /* dest_mod_id */
+                            MCF_SAP, /* sap_id */
+                            MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+                            (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
+                            NULL); /* peer_buff_ptr */
+                }else{
+                    ind_local_para_ptr = (mcf_l4c_report_state_ind_struct *)construct_local_para(sizeof(mcf_l4c_report_state_ind_struct), TD_RESET);
+                    if (!ind_local_para_ptr) {
+                        ASSERT(0);
+                        ret = MCF_OTA_R_ALLOCATE_BUFFER_FAIL;
+                        return ret;
+                    }
+
+                    ind_local_para_ptr->type = MCF_L4C_REPORT_UPDATE_FILE_RESULT;
+                    
+                    if (pMcf->dsbp_ind_ret == KAL_TRUE){
+                        ind_local_para_ptr->result = MCF_L4C_REPORT_R_SUCCESS;
+                    }else{
+                        ind_local_para_ptr->result = MCF_L4C_REPORT_R_AP_RETRY;
+                    }
+                
+
+                    /* Send process result to ATCI */
+                    msg_send6(MOD_MCF, /* src_mod_id */
+                            ind->src_mod_id, /* dest_mod_id */
+                            MCF_SAP, /* sap_id */
+                            MSG_ID_MCF_L4C_REPORT_STATE_IND, /* msg_id */
+                            (local_para_struct*)ind_local_para_ptr, /* local_para_ptr */
+                            NULL); /* peer_buff_ptr */
+                }
+            }
+            
+            
+            break;
+        }
+
+        default:
+            MD_TRC_MCF_TR_REPORT_STATE_INVALID_OP(ind->config_op);
+            ret = KAL_FALSE;
+            break;
+    }
+
+    return ret;
+}
+
+_STATIC kal_bool mcf_em_update_req_hdlr(local_para_struct *local_para_ptr)
+{
+    l4cps_em_update_req_struct *req = (l4cps_em_update_req_struct *)local_para_ptr;
+    kal_bool                    ret = KAL_TRUE;
+
+    /*
+     * Only process Tool source, ignore AP.
+     */
+    if (req->em_src == EM_FROM_ELT) {
+        switch (req->info_request[MCF_EM_OTA_FILE_INFO]) {
+            case EM_ON:
+                com_Mcf.is_em_on = KAL_TRUE;
+                break;
+
+            case EM_OFF:
+                com_Mcf.is_em_on = KAL_FALSE;
+                break;
+
+            case EM_NC:
+                /* No change */
+                break;
+
+            default:
+                ret = KAL_FALSE;
+                MD_TRC_MCF_TR_EM_UPDATE_INVALID_INFO(req->info_request[MCF_EM_OTA_FILE_INFO]);
+                break;
+        }
+    } else {
+        ret = KAL_FALSE;
+        MD_TRC_MCF_TR_EM_UPDATE_INVALID_SOURCE(req->em_src);
+    }
+
+    return ret;
+}
+
+_STATIC void mcf_v1_do_ota_full(mcf_ota_file_t *ota_file)
+{
+    mcf_tool_file_info_t                   *pFile;
+    mcf_tool_ota_file_item_t               *pItem;
+    kal_uint16                              item_cnt = 0;
+    nvram_errno_enum                        nvram_api_ret;
+    kal_bool                                is_read_nvram = KAL_FALSE;
+    nvram_ltable_entry_struct               lid_info = {0};
+    kal_uint8                              *lid_buffer = NULL;
+    nvram_ltable_entry_struct               pre_lid_info = {0};
+    kal_uint16                              pre_record_idx = 0xFFFF;
+    kal_uint8                              *pre_lid_buffer = NULL;
+    kal_uint16                              item_byte_offset;
+    kal_uint16                              item_bit_offset;
+    kal_char                                item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
+    kal_uint32                              item_size;
+    kal_int16                               pos = -1;
+    kal_uint16                              in_pos = 0;
+    mcf_tag_info_struct                     unuse = {0};
+    MCF_DB_STRUCT_VARIABLE                  const *unuse_db_ptr = NULL;
+    
+    pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+
+    /* Read changed items from OTA file */
+    while (item_cnt < pFile->item_num) {
+        if ( (is_read_nvram == KAL_FALSE) || (pItem->lid != pre_lid_info.LID) || (pItem->record_idx != pre_record_idx) ) {
+            nvram_api_ret = nvram_external_get_lid_info(pItem->lid, &lid_info);
+            if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_LID_INFO_FAIL, pItem->lid, nvram_api_ret);
+                mcf_utfwk_printf("Fail to get LID information!! lid(%d), nvram_ret(%d)", pItem->lid, nvram_api_ret);
+                goto next;
+            }
+
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+            /* Store last time modified LID */
+            if ( (pItem->lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
+                    && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
+                if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+                    pos = mcf_binary_search_lid(pItem->lid, nv_int_info.last_mod_lid.lid, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, pItem->lid, pos);
+                    if (pos == -1) {
+                        if(mcf_insert_lid(pItem->lid, nv_int_info.last_mod_lid.lid, nv_int_info.last_mod_lid.lid_cnt, in_pos) != KAL_TRUE){
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, pItem->lid);
+                            mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)", pItem->lid);
+                        }else{
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, pItem->lid, in_pos);
+                        }
+                        nv_int_info.last_mod_lid.lid_cnt++;
+                    }
+                }
+            }
+#else
+		/* Store last time modified LID */
+            if ( (pItem->lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
+                    && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
+				if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+					pos = mcf_binary_search_lid_struct(pItem->lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
+					MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, pItem->lid, pos);
+					if (pos == -1) {
+						if(mcf_insert_lid_struct(pItem->lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, in_pos, nv_int_info.not_reset_ota, KAL_FALSE) != KAL_TRUE){
+							MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, pItem->lid);
+							mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)", pItem->lid);
+						}else{
+							MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, pItem->lid, in_pos);
+						}
+						nv_int_info.last_mod_lid.lid_cnt++;
+					}
+				}
+            }
+#endif
+
+            /* Do not update LID if OTA attribute is not set */
+            if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA) == 0 ) {
+                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR, lid_info.LID, lid_info.attr);
+                mcf_utfwk_printf("OTA attribute is not set, do not write to NVRAM. lid(%d), attribute(%x)", lid_info.LID, lid_info.attr);
+                /* Write previous LID record */
+                if (is_read_nvram == KAL_TRUE && (pItem->lid != pre_lid_info.LID)) {
+                    if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+                        if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+                            com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+                            mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
+                        } else {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+                        }
+                    } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+                    } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+                        mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+                    } else {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+                        mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+                    }
+                    mcf_utfwk_printf("OTA query attribute is set, do not write to NVRAM. lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+
+                    free_ctrl_buffer_set_null(pre_lid_buffer);
+                }
+                
+                is_read_nvram = KAL_FALSE;
+                goto next;
+            }
+
+            /* Write previous LID record */
+            if (is_read_nvram == KAL_TRUE) {
+                if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+                    if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+                        com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+                        mcf_utfwk_printf("Fail to write item LID(%d), record(%d)", pre_lid_info.LID, pre_record_idx);
+                    } else {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+                    }
+                } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+                } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+                    mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)", pre_lid_info.LID, pre_lid_info.attr);
+                } else {
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+                    mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)", pre_lid_info.LID, pre_lid_info.attr);
+                }
+
+                free_ctrl_buffer_set_null(pre_lid_buffer);
+                is_read_nvram = KAL_FALSE;
+            }
+
+            /* Do not reset LID if same with previos one */
+            if (pItem->lid != pre_lid_info.LID) {
+                if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0 ) {
+                    if ( !nvram_external_reset_data(pItem->lid, 1, lid_info.total_records) ) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_LID_FAIL, pItem->lid, lid_info.total_records);
+                        mcf_utfwk_printf("Reset LID(%d) FAIL!!, total_record(%d)", pItem->lid, lid_info.total_records);
+                    }
+                } else {
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_ATTR_NOT_SET, lid_info.LID, lid_info.attr);
+                    mcf_utfwk_printf("OTA reset attribute is not set!! lid(%d), attribute(%x)", lid_info.LID, lid_info.attr);
+                }
+            }
+
+            lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info.size);
+
+            /* Read NVRAM LID */
+            if ( !nvram_external_read_data(pItem->lid, pItem->record_idx, lid_buffer, lid_info.size) ) {
+                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_ITEM_LID_FAIL, pItem->lid, pItem->record_idx);
+                mcf_utfwk_printf("Fail to read item LID(%d), record(%d)", pItem->lid, pItem->record_idx);
+                is_read_nvram = KAL_FALSE;
+                free_ctrl_buffer_set_null(lid_buffer);
+
+                goto next;
+            } else {
+                is_read_nvram = KAL_TRUE;
+            }
+        }
+
+        /* Check if item_tag_len is valid */
+        if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_TAG_LEN, pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+            mcf_utfwk_printf("Invalid item_tag_len(%d)!! max item_tag_len(%d)", pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+
+            goto next;
+        }
+
+        /* Update LID item */
+        if (pItem->is_bit_op == 0) {
+            strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+            item_tag[pItem->item_tag_len] = '\0';
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ITEM_TAG, item_tag);
+            if (mcf_find_tag_offset(pItem->lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+                goto next;
+            }
+
+            if (pItem->op.byte.value_len > item_size) {
+                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_LARGE_VAL_LEN, pItem->op.byte.value_len, item_size);
+                mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d)", pItem->op.byte.value_len, item_size);
+                goto next;
+            }
+
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BYTE_UPDATE, pItem->lid, item_byte_offset, pItem->op.byte.value_len);
+            mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+
+            kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+        } else {
+            kal_uint32 bit_value = 0;
+            kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
+
+            kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.bit.value_len);
+
+            strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+            item_tag[pItem->item_tag_len] = '\0';
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ITEM_TAG, item_tag);
+            if (mcf_find_tag_offset(pItem->lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+                goto next;
+            }
+
+            if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
+                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_LEN, pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+                mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d)", pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+                goto next;
+            }
+
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BIT_UPDATE, pItem->lid, item_byte_offset, item_bit_offset, pItem->op.bit.len, bit_value);
+
+            if (pItem->op.bit.value_len == 1) {
+                kal_uint8 *val_tmp = (kal_uint8 *)(lid_buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            } else if (pItem->op.bit.value_len == 2) {
+                kal_uint16 *val_tmp = (kal_uint16 *)(lid_buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            } else if (pItem->op.bit.value_len == 4) {
+                kal_uint32 *val_tmp = (kal_uint32 *)(lid_buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            }
+        }
+
+
+next:
+        pre_lid_info = lid_info;
+        pre_record_idx = pItem->record_idx;
+        pre_lid_buffer = lid_buffer;
+        pItem = (mcf_tool_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+        item_cnt++;
+    }
+    
+    if (item_cnt > 0) {
+        /* Write previous LID record */
+        if (is_read_nvram == KAL_TRUE) {
+            if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+                if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+                    com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+                    mcf_utfwk_printf("Fail to write item LID(%d), record(%d)", pre_lid_info.LID, pre_record_idx);
+                } else {
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+                }
+            } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+            } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+                mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)", pre_lid_info.LID, pre_lid_info.attr);
+            } else {
+                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+                mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)", pre_lid_info.LID, pre_lid_info.attr);
+            }
+            free_ctrl_buffer_set_null(pre_lid_buffer);
+
+        }
+    }
+
+    
+    return;
+}
+_STATIC mcf_ota_result_e mcf_v1_do_ota_by_lid(mcf_ota_file_t *ota_file, nvram_lid_enum lid, kal_uint16 record_idx, kal_uint16 record_amount, nvram_ltable_entry_struct *lid_info)
+{
+    mcf_ota_result_e            ret = MCF_OTA_R_SUCCESS;
+    mcf_tool_file_info_t       *pFile;
+    mcf_tool_ota_file_item_t   *pItem;
+    kal_bool                    is_read_nvram = KAL_FALSE;
+    kal_uint16                  pre_record_idx = 0xFFFF;
+    kal_bool                    is_found_target = KAL_FALSE;
+    kal_uint8                  *pre_lid_buffer = NULL;
+    kal_uint8                  *lid_buffer = NULL;
+    kal_uint16                  item_cnt = 0;
+    kal_char                    item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
+    kal_uint16                  item_byte_offset;
+    kal_uint16                  item_bit_offset;
+    kal_uint32                  item_size;
+    mcf_tag_info_struct         unuse = {0};
+    MCF_DB_STRUCT_VARIABLE      const *unuse_db_ptr = NULL;
+    
+    
+    pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+    /* Read changed items from OTA file */
+    while (item_cnt < pFile->item_num) {
+        if ( (pItem->lid != lid) || (pItem->record_idx < record_idx) || (pItem->record_idx > (record_idx + record_amount - 1)) ) {
+            if (is_found_target == KAL_FALSE) {
+                goto next;
+            } else {
+                // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
+                break;
+            }
+        }
+
+        if ( (is_read_nvram == KAL_FALSE) || (pItem->record_idx != pre_record_idx) ) {
+            is_found_target = KAL_TRUE;
+
+            /* Write previous LID record */
+            if (is_read_nvram == KAL_TRUE) {
+                if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
+                    MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
+                } else {
+                    MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
+                }
+
+                free_ctrl_buffer_set_null(pre_lid_buffer);
+                is_read_nvram = KAL_FALSE;
+            }
+
+            lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info->size);
+
+            /* Read NVRAM LID */
+            if ( !nvram_external_read_data(pItem->lid, pItem->record_idx, lid_buffer, lid_info->size) ) {
+                MD_TRC_MCF_TR_LID_OTA_READ_ITEM_NVRAM_FAIL(lid, pItem->record_idx);
+                is_read_nvram = KAL_FALSE;
+                free_ctrl_buffer_set_null(lid_buffer);
+
+                goto next;
+            } else {
+                is_read_nvram = KAL_TRUE;
+            }
+        }
+
+        /* Check if item_tag_len is valid */
+        if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
+            MD_TRC_MCF_TR_LID_OTA_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+            goto next;
+        }
+
+        /* Update LID item */
+        if (pItem->is_bit_op == 0) {
+            strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+            item_tag[pItem->item_tag_len] = '\0';
+            if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+                goto next;
+            }
+
+            if (pItem->op.byte.value_len > item_size) {
+                MD_TRC_MCF_TR_LID_OTA_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
+                goto next;
+            }
+
+            MD_TRC_MCF_TR_LID_OTA_BYTE_UPDATE(lid, item_byte_offset, pItem->op.byte.value_len);
+            mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+
+            kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+        } else {
+            kal_uint32 bit_value = 0;
+            kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
+
+            kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.bit.value_len);
+
+            strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+            item_tag[pItem->item_tag_len] = '\0';
+            if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+                goto next;
+            }
+
+            if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
+                MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+
+                goto next;
+            }
+
+            MD_TRC_MCF_TR_LID_OTA_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, pItem->op.bit.len, bit_value);
+
+            if (pItem->op.bit.value_len == 1) {
+                kal_uint8 *val_tmp = (kal_uint8 *)(lid_buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            } else if (pItem->op.bit.value_len == 2) {
+                kal_uint16 *val_tmp = (kal_uint16 *)(lid_buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            } else if (pItem->op.bit.value_len == 4) {
+                kal_uint32 *val_tmp = (kal_uint32 *)(lid_buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            }
+        }
+
+next:
+        pre_record_idx = pItem->record_idx;
+        pre_lid_buffer = lid_buffer;
+        pItem = (mcf_tool_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+        item_cnt++;
+    }
+    if (item_cnt > 0) {
+        /* Write previous LID record */
+        if (is_read_nvram == KAL_TRUE) {
+            if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
+                MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
+                ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+            } else {
+                MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
+            }
+
+            free_ctrl_buffer_set_null(pre_lid_buffer);
+        }
+    }
+    MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    
+    return ret;
+}
+_STATIC void mcf_v1_read_ota_buffer(mcf_ota_file_t *ota_file, nvram_lid_enum lid, kal_uint16 record_idx, kal_uint8 *buffer)
+{
+    mcf_tool_file_info_t       *pFile;
+    mcf_tool_ota_file_item_t   *pItem;
+    kal_uint16                  item_cnt = 0;
+    kal_bool                    is_found_target = KAL_FALSE;
+    kal_char                    item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
+    kal_uint16                  item_byte_offset;
+    kal_uint16                  item_bit_offset;
+    kal_uint32                  item_size;
+    mcf_tag_info_struct         unuse = {0};
+    MCF_DB_STRUCT_VARIABLE      const *unuse_db_ptr = NULL;
+    
+    pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+    pItem = (mcf_tool_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+    /* Read changed items from OTA file */
+    while (item_cnt < pFile->item_num) {
+        if ( (pItem->lid != lid) || (pItem->record_idx != record_idx) ) {
+            if (is_found_target == KAL_FALSE) {
+                goto next;
+            } else {
+                // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
+                break;
+            }
+        }
+        is_found_target = KAL_TRUE;
+
+        /* Check if item_tag_len is valid */
+        if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
+            MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+            mcf_utfwk_printf("Invalid item_tag_len(%d)!! max item_tag_len(%d) \r\n",  pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+            goto next;
+        }
+
+        /* Update LID item */
+        if (pItem->is_bit_op == 0) {
+            strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+            item_tag[pItem->item_tag_len] = '\0';
+            if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+                goto next;
+            }
+
+            if (pItem->op.byte.value_len > item_size) {
+                MD_TRC_MCF_TR_READ_OTA_BUFFER_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
+                mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n",  pItem->op.byte.value_len, item_size);
+
+                goto next;
+            }
+
+            MD_TRC_MCF_TR_READ_OTA_BUFFER_BYTE_UPDATE(lid, item_byte_offset, pItem->op.byte.value_len);
+            mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+
+            kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->item_tag_len, pItem->op.byte.value_len);
+        } else {
+            kal_uint32 bit_value = 0;
+            kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
+
+            kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->item_tag_len, pItem->op.bit.value_len);
+
+            strncpy(item_tag, &(pItem->buff_start), pItem->item_tag_len);
+            item_tag[pItem->item_tag_len] = '\0';
+            if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+                goto next;
+            }
+
+            if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
+                MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+                mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d) \r\n",  pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+
+                goto next;
+            }
+
+            MD_TRC_MCF_TR_READ_OTA_BUFFER_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, pItem->op.bit.len, bit_value);
+
+            if (pItem->op.bit.value_len == 1) {
+                kal_uint8 *val_tmp = (kal_uint8 *)(buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            } else if (pItem->op.bit.value_len == 2) {
+                kal_uint16 *val_tmp = (kal_uint16 *)(buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            } else if (pItem->op.bit.value_len == 4) {
+                kal_uint32 *val_tmp = (kal_uint32 *)(buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            }
+        }
+
+next:
+        pItem = (mcf_tool_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+        item_cnt++;
+    }
+    MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+}
+_STATIC void mcf_v1_read_tlvota_buffer(mcf_tlvota_file_t *tlvota_file, mcf_tlvota_tag_t tag, nvram_lid_enum lid, kal_uint8 *buffer)
+{
+    mcf_tool_file_info_t           *pFile;
+    mcf_tool_tlvota_file_item_t    *pItem;
+    kal_uint16                      item_cnt = 0;
+    kal_char                        item_tag[MCF_FILE_MAX_TAG_LEN] = {0};
+    kal_uint16                      item_byte_offset;
+    kal_uint16                      item_bit_offset;
+    kal_uint32                      item_size;
+    mcf_tag_info_struct             unuse = {0};
+    MCF_DB_STRUCT_VARIABLE          const *unuse_db_ptr = NULL;
+    
+    pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+    pItem = (mcf_tool_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+    /* Read changed items from TLV-OTA file */
+    while (item_cnt < pFile->item_num) {
+        /* Check if LID and tag match */
+        if ( (pItem->lid != lid) || (pItem->tag_type != tag.tag_type) || (strncmp(&(pItem->buff_start), tag.tag, pItem->tag_len) != 0) ) {
+            goto next;
+        }
+        
+
+        /* Check if item_tag_len is valid */
+        if ( (pItem->item_tag_len <= 0) || (pItem->item_tag_len >= MCF_FILE_MAX_TAG_LEN-1) ) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_TAG_LEN(pItem->item_tag_len, MCF_FILE_MAX_TAG_LEN);
+            goto next;
+        }
+
+        /* Update LID item */
+        if (pItem->is_bit_op == 0) {
+            strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
+            item_tag[pItem->item_tag_len] = '\0';
+            if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+                goto next;
+            }
+
+            if (pItem->op.byte.value_len > item_size) {
+                MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_LARGE_VAL_LEN(pItem->op.byte.value_len, item_size);
+
+                goto next;
+            }
+
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BYTE_UPDATE_USIR(lid, tag.tag, item_byte_offset, pItem->op.byte.value_len);
+            mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
+
+            kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.byte.value_len);
+        } else {
+            kal_uint32 bit_value = 0;
+            kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(pItem->op.bit.len);
+
+            kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->item_tag_len, pItem->op.bit.value_len);
+
+            strncpy(item_tag, &(pItem->buff_start) + pItem->tag_len, pItem->item_tag_len);
+            item_tag[pItem->item_tag_len] = '\0';
+            if (mcf_find_tag_offset(lid, item_tag, &item_byte_offset, &item_bit_offset, &item_size, &unuse_db_ptr, &unuse) == KAL_FALSE) {
+                goto next;
+            }
+
+            if ( (pItem->op.bit.value_len > 4) || (pItem->op.bit.len > item_size) ) {
+                MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_LEN(pItem->op.bit.len, item_size, pItem->op.bit.value_len);
+
+                goto next;
+            }
+
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BIT_UPDATE_USIR(lid, tag.tag, item_byte_offset, item_bit_offset, pItem->op.bit.len, bit_value);
+
+            if (pItem->op.bit.value_len == 1) {
+                kal_uint8 *val_tmp = (kal_uint8 *)(buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            } else if (pItem->op.bit.value_len == 2) {
+                kal_uint16 *val_tmp = (kal_uint16 *)(buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            } else if (pItem->op.bit.value_len == 4) {
+                kal_uint32 *val_tmp = (kal_uint32 *)(buffer + item_byte_offset);
+
+                *val_tmp &= ~(bit_mask << item_bit_offset);
+                *val_tmp |= (bit_value << item_bit_offset);
+            }
+        }
+
+next:
+        pItem = (mcf_tool_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+        item_cnt++;
+    }
+    MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+}
+
+/*------------------------------------------------------------------------------
+ * Public fucntions.
+ *----------------------------------------------------------------------------*/
+void mcf_on_ilm(ilm_struct *ilm)
+{
+    switch (ilm->msg_id)
+    {
+        case MSG_ID_L4C_MCF_SET_CONFIG_REQ:
+            mcf_l4_set_config(ilm);
+            break;
+
+        case MSG_ID_L4C_MCF_GET_CONFIG_REQ:
+            mcf_l4_get_config(ilm);
+            break;
+
+        case MSG_ID_L4C_MCF_DUMP_DATA_REQ:
+            mcf_l4_dump_data(ilm);
+            break;
+
+        case MSG_ID_L4C_MCF_CONFIG_LID_VARIABLE_OPERATION_REQ:
+            mcf_l4_query_lid(ilm);
+            break;
+
+        case MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_CNF:
+            mcf_respond_dsbp_result(ilm->local_para_ptr);
+            break;
+
+        case MSG_ID_MCF_L4BSBP_TRIGGER_DSBP_RESULT_IND:
+            mcf_report_dsbp_result(ilm->local_para_ptr);
+            break;
+
+        case MSG_ID_L4CPS_EM_UPDATE_REQ:
+            mcf_em_update_req_hdlr(ilm->local_para_ptr);
+            break;
+
+        case MSG_ID_TIMER_EXPIRY:
+            evshed_timer_handler(mcf_timer_es_g);
+            break;
+
+        case MSG_ID_L4C_MCF_UPDATE_OTA_FILE_REQ:
+            mcf_l4_update_ota(ilm);
+            break;
+            
+        case MSG_ID_L4C_MCF_CONFIG_REQ:
+            mcf_l4_config(ilm);
+            break;
+            
+        case MSG_ID_L4C_MCF_VARIABLE_VALUE_OPERATION_REQ:
+            mcf_l4_variable_operation(ilm);
+            break;
+			
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+		case MSG_ID_L4C_MCF_ASSIGN_COMBINED_FILE_PATH_REQ:
+            mcf_l4_assign_combined_file_path(ilm);
+            break;
+#endif
+            
+#if defined(__MCF_UT_FRAMEWORK_SUPPORT__)
+        case MSG_ID_MCF_UTFWK_INITIAL_ENV_REQ:
+            mcf_utfwk_ilm_initial_env(ilm);
+            break;
+            
+        case MSG_ID_MCF_UTFWK_INITIAL_DSBP_CALLBACK_REQ:
+            mcf_utfwk_ilm_initial_dsbp_callback(ilm);
+            break;
+
+        case MSG_ID_MCF_UTFWK_EXECUTE_REQ:
+            mcf_utfwk_ilm_execute(ilm);
+            break;
+
+        case MSG_ID_MCF_UTFWK_DUMP_RESULT_REQ:
+            mcf_utfwk_ilm_dump_result(ilm);
+            break;
+
+        case MSG_ID_MCF_UTFWK_RESET_REQ:
+            mcf_utfwk_ilm_reset(ilm);
+            break;
+
+#endif
+            
+        default:
+            MD_TRC_MCF_TR_ILM_UNKNOWN_MSG(ilm->msg_id);
+            break;
+    }
+}
+
+mcf_ota_result_e mcf_do_ota_full(void)
+{
+    mcf_t                                  *pMcf = mcf_get_instance();
+    mcf_ota_result_e                        ret = MCF_OTA_R_SUCCESS;
+    mcf_tool_file_info_t                   *pFile;
+    mcf_tool_gid_ota_file_item_t           *pItem;
+    mcf_ota_file_t                         *ota_file = &(pMcf->ota_file);
+    mcf_tlvota_file_t                      *tlvota_file;
+    kal_uint16                              item_cnt = 0;
+    nvram_ef_mcf_ota_file_info_struct       nv_ota_file;
+    nvram_ef_mcf_tlvota_file_info_struct    nv_tlvota_file;
+    nvram_ef_mcf_sw_info_struct             nv_sw_info;
+    nvram_ltable_entry_struct               lid_info = {0};
+    em_mcf_read_ota_file_info_struct        read_file_info;
+    kal_uint8                              *lid_buffer = NULL;
+    kal_char                                apply_filename[MCF_FILE_MAX_NAME_LEN];
+    l4c_mcf_path_type_enum                  apply_path_type;
+    kal_uint32                              i;
+    nvram_errno_enum                        nvram_api_ret;
+    kal_bool                                is_read_nvram = KAL_FALSE;
+    kal_uint32                              start_time;
+    kal_int16                               pos = -1;
+    kal_uint16                              in_pos = 0;
+    nvram_ltable_entry_struct               pre_lid_info = {0};
+    kal_uint16                              pre_record_idx = 0xFFFF;
+    kal_uint8                              *pre_lid_buffer = NULL;
+    kal_uint16                              item_byte_offset;
+    kal_uint16                              item_bit_offset;
+    kal_uint32                              item_size;
+    kal_char                                array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+    kal_bool                                item_is_bit = KAL_FALSE;
+    kal_uint16                              item_lid;
+    kal_char                                tool_version[MCF_FILE_MAX_TOOL_VERSION_LEN]={0};
+    kal_uint32                              total_start_time = GET_CURRENT_TIME();
+    mcf_ota_result_e                        tlvota_ret;
+
+    /* This API can only be used by NVRAM while init */
+    MCF_UT_DUMMY_ASSERT(kal_query_systemInit() == KAL_TRUE);
+
+    mcf_create_custom_folder(pMcf);
+	kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+
+    /* Read MCF SW information in NVRAM */
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_SW_INFO_LID, 1);
+        com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_SW_INFO_LID_FAIL;
+        mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_SW_INFO_LID, 1);
+    }
+    /* Read MCF Internal information in NVRAM */
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
+        com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_INT_INFO_LID_FAIL;
+        mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
+        ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+        return ret;
+    }
+    
+    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NOT_RESET, nv_int_info.not_reset_ota);
+	kal_mem_cpy(&mcf_general_tlvota_last_mod_lid_g, &nv_int_info.general_tlvota_last_mod_lid, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+	kal_mem_cpy(&mcf_tlvota_last_mod_lid_g, &nv_int_info.tlvota_last_mod_lid, sizeof(nvram_mcf_lid_info_struct)*MAX_SIM_NUM);
+    
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        pMcf->is_ignore_dsbp[i] = nv_int_info.tlvota_is_ignore_dsbp[i];
+    }
+    pMcf->general_is_ignore_dsbp = nv_int_info.general_is_ignore_dsbp;
+    
+    /* Read general TLV-OTA file into cache buffer */
+    apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+    kal_mem_set(apply_filename, 0, MCF_FILE_MAX_NAME_LEN);
+
+    /* Read MCF general TLV-OTA file into cache buffer */
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1);
+        com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_FILE_LID_FAIL;
+        mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_GENERAL_TLVOTA_FILE_LID, 1);
+    }
+	
+	ret = mcf_read_general_tlvota_file(KAL_TRUE, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+    // Set General OPOTA - Get tlvota result
+    if (pMcf->general_is_ignore_dsbp == KAL_TRUE){
+        for(i = 0; i < MAX_SIM_NUM; i++){
+            com_Mcf.tlvota_result[i] = ret;
+        }
+        /* Check if file type is TLV-OTA file */
+        tlvota_file = &(pMcf->general_tlvota_file);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file) {
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+                kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+                mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_FILE, str_tmp);
+                for(i = 0; i < MAX_SIM_NUM; i++){
+                    com_Mcf.tlvota_result[i] = MCF_OTA_R_INVALID_FILE;
+                }
+            }
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        }else{
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
+        }
+    }
+	if (ret == MCF_OTA_R_SUCCESS) {
+		tlvota_file = &(pMcf->general_tlvota_file);
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file) {
+			pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+			/* Store last updated file informantion */
+			tlvota_file->last_file.path_type = apply_path_type;
+			strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+			if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+				strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+				tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+			} else {
+				MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+			}
+			if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+				strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+				tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+			} else {
+				MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+			}
+			/*
+			 *  No need to Update TLV-OTA information if 
+			 *  1. SW version and generated time in OTA file and NVRAM are same
+			 *  2. Current SW version and build time are the same as last MCF OTA SW
+			 */
+			if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
+				if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_general_tlvota_file.sw_version, pFile->sw_version_len) != 0) ||
+				(strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_general_tlvota_file.gen_time, pFile->gen_time_len) != 0) ||
+				(strncmp(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
+				(strncmp(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)) {
+					/* Write updated MCF TLV-OTA file information to NVRAM */
+					if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+						strncpy(nv_sw_info.last_update_general_tlvota_file.sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
+						nv_sw_info.last_update_general_tlvota_file.sw_version[pFile->sw_version_len] = '\0';
+					} else {
+						MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+					}
+
+					if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+						strncpy(nv_sw_info.last_update_general_tlvota_file.gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
+						nv_sw_info.last_update_general_tlvota_file.gen_time[pFile->gen_time_len] = '\0';
+					} else {
+						MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+					}
+					strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+					strncpy(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+					for(i = 0; i < MAX_SIM_NUM; i++){
+						is_read_general_tlvota[i] = KAL_TRUE;
+					}
+				}
+			}else if (apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+				if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_general_tlvota_file.sw_version, pFile->sw_version_len) != 0) ||
+				(strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_general_tlvota_file.gen_time, pFile->gen_time_len) != 0) ||
+				(strncmp(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
+				(strncmp(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)) {
+					/* Write updated MCF TLV-OTA file information to NVRAM */
+					if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+						strncpy(nv_sw_info.last_update_general_tlvota_file.sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
+						nv_sw_info.last_update_general_tlvota_file.sw_version[pFile->sw_version_len] = '\0';
+					} else {
+						MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+					}
+
+					if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+						strncpy(nv_sw_info.last_update_general_tlvota_file.gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
+						nv_sw_info.last_update_general_tlvota_file.gen_time[pFile->gen_time_len] = '\0';
+					} else {
+						MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+					}
+					strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+					strncpy(nv_sw_info.last_update_general_tlvota_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+					for(i = 0; i < MAX_SIM_NUM; i++){
+						is_read_general_tlvota[i] = KAL_TRUE;
+					}
+				}
+				
+			}
+						
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		}else{
+			MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_GENERAL_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
+		}
+		MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_GENERAL_TLVOTA_FILE_INFO, apply_path_type, apply_filename);
+    
+	}
+    
+    
+
+    /* Read TLV-OTA file into cache buffer */
+    for (i = 0; i < MAX_SIM_NUM; i++) {
+        apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+        kal_mem_set(apply_filename, 0, MCF_FILE_MAX_NAME_LEN);
+        kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+		com_Mcf.update_tlvota[i] = KAL_FALSE;
+		com_Mcf.update_general_tlvota[i] = KAL_FALSE;
+        
+        tlvota_file = &(pMcf->tlvota_file[i]);
+        
+        read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_BOOT_UP;
+        read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+        read_file_info.ps_id = l4c_gemini_get_switched_sim_id(i);
+
+        /* Read MCF TLV-OTA file into cache buffer */
+        if ( !nvram_external_read_data(NVRAM_EF_MCF_TLVOTA_FILE_LID, i + 1, (kal_uint8 *)&nv_tlvota_file, sizeof(nvram_ef_mcf_tlvota_file_info_struct))) {
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_TLVOTA_FILE_LID, i + 1);
+            com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_FILE_LID_FAIL;
+            mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_TLVOTA_FILE_LID, i + 1);
+        }
+
+        read_file_info.start_time = kal_get_systicks();
+
+        ret = mcf_read_tlvota_file(KAL_TRUE, i, nv_tlvota_file.path, nv_tlvota_file.name, &apply_path_type, apply_filename, pMcf);
+        tlvota_ret = ret;
+        if (ret == MCF_OTA_R_SUCCESS) {
+            MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+            if (tlvota_file) {
+                pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+
+                /* Store last updated file informantion */
+                tlvota_file->last_file.path_type = apply_path_type;
+                strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+                if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+                    strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+                    tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+                } else {
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+                }
+                if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+                    strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+                    tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+                } else {
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+                }
+				/*
+				 *  No need to Update TLV-OTA information if 
+				 *  1. SW version and generated time in OTA file and NVRAM are same
+				 *  2. Current SW version and build time are the same as last MCF OTA SW
+				 */
+				if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
+					if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_tlvota_file[i].sw_version, pFile->sw_version_len) != 0) ||
+						(strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_tlvota_file[i].gen_time, pFile->gen_time_len) != 0) ||
+						(strncmp(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
+						(strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)){
+						
+						/* Write updated MCF TLV-OTA file information to NVRAM */
+						if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+							strncpy(nv_sw_info.last_update_tlvota_file[i].sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
+							nv_sw_info.last_update_tlvota_file[i].sw_version[pFile->sw_version_len] = '\0';
+						} else {
+							MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+						}
+
+						if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+							strncpy(nv_sw_info.last_update_tlvota_file[i].gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
+							nv_sw_info.last_update_tlvota_file[i].gen_time[pFile->gen_time_len] = '\0';
+						} else {
+							MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+						}
+						strncpy(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+						strncpy(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+						is_read_tlvota[i] = KAL_TRUE;
+						
+					}
+				}else if(apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME){
+					if ( (strncmp(tlvota_file->last_file.sw_version, nv_sw_info.last_update_tlvota_file[i].sw_version, pFile->sw_version_len) != 0) ||
+						(strncmp(tlvota_file->last_file.gen_time, nv_sw_info.last_update_tlvota_file[i].gen_time, pFile->gen_time_len) != 0) ||
+						(strncmp(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN) != 0) ||
+						(strncmp(nv_sw_info.last_update_tlvota_file[i].path,  MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) != 0)){
+							/* Write updated MCF TLV-OTA file information to NVRAM */
+							if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+								strncpy(nv_sw_info.last_update_tlvota_file[i].sw_version, tlvota_file->last_file.sw_version, pFile->sw_version_len);
+								nv_sw_info.last_update_tlvota_file[i].sw_version[pFile->sw_version_len] = '\0';
+							} else {
+								MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+							}
+
+							if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+								strncpy(nv_sw_info.last_update_tlvota_file[i].gen_time, tlvota_file->last_file.gen_time, pFile->gen_time_len);
+								nv_sw_info.last_update_tlvota_file[i].gen_time[pFile->gen_time_len] = '\0';
+							} else {
+								MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+							}
+							strncpy(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+							strncpy(nv_sw_info.last_update_tlvota_file[i].name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+							is_read_tlvota[i] = KAL_TRUE;
+							
+					}
+					
+				}
+				
+                MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+            }else{
+				MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
+			}
+            
+            read_file_info.path_type = apply_path_type;
+            strncpy(read_file_info.file_name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_INFO, i, apply_path_type, apply_filename);	
+        }else{
+			/* Copy last updated file informantion */
+			MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+            if (tlvota_file) {
+				if ((strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0)) {
+					tlvota_file->last_file.path_type = L4C_MCF_PATH_TYPE_OTA;
+				}else if ((strncmp(nv_sw_info.last_update_tlvota_file[i].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0)) {
+					tlvota_file->last_file.path_type = L4C_MCF_PATH_TYPE_RUNTIME;
+				}
+				strncpy(tlvota_file->last_file.name, nv_sw_info.last_update_tlvota_file[i].name, MCF_FILE_MAX_NAME_LEN - 1);
+				strncpy(tlvota_file->last_file.sw_version, nv_sw_info.last_update_tlvota_file[i].sw_version, MCF_FILE_MAX_SW_VERSION_LEN-1);
+				strncpy(tlvota_file->last_file.gen_time, nv_sw_info.last_update_tlvota_file[i].gen_time, MCF_FILE_MAX_GEN_TIME_LEN - 1);
+				MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			}else{
+				MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
+			}
+
+		}
+        read_file_info.result = ret;
+        read_file_info.end_time = kal_get_systicks();
+
+        mcf_em_send_ota_file_info(&read_file_info);
+        
+        if (pMcf->is_ignore_dsbp[i] == KAL_TRUE){
+            set_op_read_ret[i] = tlvota_ret;
+            /* Check if file type is TLV-OTA file */
+            MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+            if (tlvota_file) {
+                if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+                    kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+                    mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_FILE, str_tmp);
+                    com_Mcf.tlvota_result[i] = MCF_OTA_R_INVALID_FILE;
+                }
+                MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+            }else{
+				MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_TLVOTA_FILE_TAKE_READ_LOCK_FAIL);
+			}
+        }
+    }
+
+    kal_mem_set(&read_file_info, 0, sizeof(em_mcf_read_ota_file_info_struct));
+    read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_BOOT_UP;
+    read_file_info.config_type = L4C_MCF_CONFIG_TYPE_DEFAULT_BIN;
+
+    /* Read MCF OTA file into cache buffer */
+    if ( !nvram_external_read_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct))) {
+        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_LID_FAIL, NVRAM_EF_MCF_OTA_FILE_LID, 1);
+        com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_READ_FILE_LID_FAIL;
+        mcf_utfwk_printf("Fail to read MCF LID(%d)!! record_idx(%d) \r\n", NVRAM_EF_MCF_OTA_FILE_LID, 1);
+    }
+	
+	nv_int_info.update_ota_result = KAL_FALSE;
+    apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+    kal_mem_set(apply_filename, 0, MCF_FILE_MAX_NAME_LEN);
+    read_file_info.start_time = kal_get_systicks();
+
+    ret = mcf_read_ota_file(KAL_TRUE, nv_ota_file.path, nv_ota_file.name, &apply_path_type, apply_filename, pMcf);
+
+    if (ret == MCF_OTA_R_SUCCESS) {
+        read_file_info.path_type = apply_path_type;
+        strncpy(read_file_info.file_name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_OTA_FILE_INFO, apply_path_type, apply_filename);
+    } else {
+        /* Cannot do OTA if fail to read OTA file */
+        read_file_info.result = ret;
+        read_file_info.end_time = kal_get_systicks();
+
+        mcf_em_send_ota_file_info(&read_file_info);
+
+        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_OTA_FILE_FAIL);
+        com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_FULL_OTA_FAIL;
+        mcf_utfwk_printf("Fail to read OTA file, cannot do full OTA!! \r\n");
+
+        return ret;
+    }
+    
+
+    MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+        /* Check if file type is OTA file */
+        if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+            kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+
+            ret = MCF_OTA_R_INVALID_FILE;
+            read_file_info.result = ret;
+            read_file_info.end_time = kal_get_systicks();
+
+            mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+            MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+            mcf_em_send_ota_file_info(&read_file_info);
+
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_FILE, str_tmp);
+            com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_INVALID_FILE;
+            mcf_utfwk_printf("Invalid file type(%s)!! \r\n", str_tmp);
+
+            return ret;
+        }
+
+        /*
+         *  No need to do OTA if 
+         *  1. SW version and generated time in OTA file and NVRAM are same
+         *  2. Current SW version and build time are the same as last MCF OTA SW
+         */
+        if ( (strncmp(nv_sw_info.last_update_file.sw_version, &(pFile->buff_start), pFile->sw_version_len) == 0) &&
+            (strncmp(nv_sw_info.last_update_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len) == 0) &&
+            (strncmp(nv_sw_info.version, release_verno(), MCF_SW_VERNO_LEN) == 0) &&
+            (strncmp(nv_sw_info.build_time, build_date_time(), MCF_SW_BUILD_TIME_LEN) == 0) ) {
+            if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
+                if ((strncmp(nv_sw_info.last_update_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0) &&
+                    (strncmp(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) == 0) ) {
+                    MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+                    read_file_info.result = ret;
+                    read_file_info.end_time = kal_get_systicks();
+
+                    mcf_em_send_ota_file_info(&read_file_info);
+
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED1);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED2, nv_sw_info.last_update_file.sw_version, nv_sw_info.last_update_file.gen_time);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED3, nv_sw_info.version, nv_sw_info.build_time);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TOTAL_RESET_TIME, CALCULATE_LETENCY_DURATION(total_start_time, GET_CURRENT_TIME()));
+                    com_Mcf.boot_trace_flag |= (MCF_BOOT_TRACE_F_NO_NEED | MCF_BOOT_TRACE_F_FULL_OTA_SUCCESS);
+                    mcf_utfwk_printf("MD version is not changed, no need to do full OTA!!\r\n");
+
+                    return ret;
+                }
+            } else if (apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+                if ((strncmp(nv_sw_info.last_update_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN) == 0) &&
+                    (strncmp(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN) == 0) ) {
+                    MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+                    read_file_info.result = ret;
+                    read_file_info.end_time = kal_get_systicks();
+
+                    mcf_em_send_ota_file_info(&read_file_info);
+
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED1);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED2, nv_sw_info.last_update_file.sw_version, nv_sw_info.last_update_file.gen_time);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_NO_NEED3, nv_sw_info.version, nv_sw_info.build_time);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TOTAL_RESET_TIME, CALCULATE_LETENCY_DURATION(total_start_time, GET_CURRENT_TIME()));
+                    com_Mcf.boot_trace_flag |= (MCF_BOOT_TRACE_F_NO_NEED | MCF_BOOT_TRACE_F_FULL_OTA_SUCCESS);
+                    mcf_utfwk_printf("MD version is not changed, no need to do full OTA!!\r\n");
+
+                    return ret;
+                }
+            }
+        }
+
+
+        /* Reset LID to default value */
+        if((pFile->operation_mask & MCF_FILE_OP_NOT_RESET_LID) == 0) {
+            /* Copy last modified LID list to global variable */
+            kal_mem_cpy(&mcf_last_mod_lid_g, &nv_int_info.last_mod_lid, sizeof(nvram_mcf_lid_info_struct));
+
+            start_time = GET_CURRENT_TIME();
+            if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+               for(i = 0; i < nv_int_info.last_mod_lid.lid_cnt; i++){
+                    nvram_api_ret = nvram_external_get_lid_info(MCF_LAST_MODIFIED_LID, &lid_info);
+                    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+                        mcf_utfwk_printf("is_reset_all(%d). Fail to get all LID information!! lid(%d), nvram_ret(%d)\r\n", 0, MCF_LAST_MODIFIED_LID, nvram_api_ret);
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_ALL_LID_INFO_FAIL, 0, MCF_LAST_MODIFIED_LID, nvram_api_ret);
+                        continue;
+                    }
+                    if((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) {
+                        if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0) {
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+                            if(nv_int_info.not_reset_ota == KAL_FALSE || nv_int_info.last_mod_lid.lid_conf[i].not_reset == KAL_FALSE)
+#endif
+							{
+								MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID, 0, MCF_LAST_MODIFIED_LID);
+								if ( !nvram_external_reset_data(MCF_LAST_MODIFIED_LID, 1, lid_info.total_records) ) {
+									MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID_FAIL, 0, MCF_LAST_MODIFIED_LID, lid_info.total_records);
+									mcf_utfwk_printf("is_reset_all(%d). Reset All LID(%d) FAIL!!, total_record(%d)\r\n", 0, MCF_LAST_MODIFIED_LID, lid_info.total_records);
+								}
+							}
+                        } else {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_ATTR_NOT_SET, 0, lid_info.LID, lid_info.attr);
+                            mcf_utfwk_printf("is_reset_all(%d). OTA all reset LID attribute is not set!! lid(%d), attribute(%x)\r\n", 0, lid_info.LID, lid_info.attr);
+                        }
+						
+                    }
+                }
+            }else{
+                for(i = 0; i < MCF_LID_MAPPING_TBL_SIZE; i++){
+                    nvram_api_ret = nvram_external_get_lid_info(mcf_db_lid_mapping_tbl[i].lid_num, &lid_info);
+                    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_ALL_LID_INFO_FAIL, 1, mcf_db_lid_mapping_tbl[i].lid_num, nvram_api_ret);
+                        mcf_utfwk_printf("is_reset_all(%d). Fail to get all LID information!! lid(%d), nvram_ret(%d)\r\n", 1, mcf_db_lid_mapping_tbl[i].lid_num, nvram_api_ret);
+                        continue;
+                    }
+                    if((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) {
+                        if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0) {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID, 1, mcf_db_lid_mapping_tbl[i].lid_num);
+                            if ( !nvram_external_reset_data(mcf_db_lid_mapping_tbl[i].lid_num, 1, lid_info.total_records) ) {
+                                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_LID_FAIL, 1, mcf_db_lid_mapping_tbl[i].lid_num, lid_info.total_records);
+                                mcf_utfwk_printf("is_reset_all(%d). Reset All LID(%d) FAIL!!, total_record(%d)\r\n", 1, mcf_db_lid_mapping_tbl[i].lid_num, lid_info.total_records);
+                            }
+                        } else {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_ALL_RESET_ATTR_NOT_SET, 1, lid_info.LID, lid_info.attr);
+                            mcf_utfwk_printf("is_reset_all(%d). OTA all reset LID attribute is not set!! lid(%d), attribute(%x)\r\n", 1, lid_info.LID, lid_info.attr);
+                        }
+                    }
+                }
+            }
+
+            kal_mem_set(&nv_int_info.last_mod_lid, 0, sizeof(nvram_mcf_lid_info_struct));
+
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_TIME, CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
+        }
+
+        
+        /* Update MCF OTA file flow - MCF2.0 */
+        if (pFile->file_version == 3) {
+            pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+            pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+
+            /* Read changed items from OTA file */
+            while (item_cnt < pFile->item_num) {
+                /* Check if array_tag_len is valid */
+                if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ARRAY_INDEX_LEN, pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+                    mcf_utfwk_printf("Invalid array_index_len(%d)!! max array_index_len(%d)\r\n", pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+                    goto next;
+                }
+                strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
+                array_tag[pItem->array_index_len] = '\0';
+                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GID_ARRAY_INDEX, pItem->global_id, array_tag);
+                
+                /* Find GID corresponding LID */
+                item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+                if (item_lid == 65535){
+                    //-1(65535) means not found
+                    goto next;
+                }
+                
+                if ( (is_read_nvram == KAL_FALSE) || (item_lid != pre_lid_info.LID) || (pItem->record_idx != pre_record_idx) ) {
+                    nvram_api_ret = nvram_external_get_lid_info(item_lid, &lid_info);
+                    if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GET_LID_INFO_FAIL, item_lid, nvram_api_ret);
+                        mcf_utfwk_printf("Fail to get LID information!! lid(%d), nvram_ret(%d)\r\n", item_lid, nvram_api_ret);
+                        goto next;
+                    }
+
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+                    /* Store last time modified LID */
+                    if ( (item_lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
+                            && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
+                        if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+                            pos = mcf_binary_search_lid(item_lid, nv_int_info.last_mod_lid.lid, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, item_lid, pos);
+                            if (pos == -1) {
+                                if(mcf_insert_lid(item_lid, nv_int_info.last_mod_lid.lid, nv_int_info.last_mod_lid.lid_cnt, in_pos) != KAL_TRUE){
+                                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, item_lid);
+                                    mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)\r\n", item_lid);
+                                }else{
+                                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, item_lid, in_pos);
+                                }
+                                nv_int_info.last_mod_lid.lid_cnt++;
+                            }
+                        }
+                    }
+#else				
+					/* Store last time modified LID */
+                    if ( (item_lid != pre_lid_info.LID) && ((lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0)
+                            && (((lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) || ((lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0)) ) {
+                        if (nv_int_info.last_mod_lid.lid_cnt < NVRAM_MCF_SAVE_LAST_LID_CNT){
+                            pos = mcf_binary_search_lid_struct(item_lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, &in_pos);
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_SEARCH_STORE_LID, item_lid, pos);
+                            if (pos == -1) {
+                                if(mcf_insert_lid_struct(item_lid, nv_int_info.last_mod_lid.lid_conf, nv_int_info.last_mod_lid.lid_cnt, in_pos, nv_int_info.not_reset_ota, KAL_FALSE) != KAL_TRUE){
+                                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID_FAIL, item_lid);
+                                    mcf_utfwk_printf("Save Last modified LID fail!!! LID buffer is full(%d)\r\n", item_lid);
+                                }else{
+                                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_STORE_LID, item_lid, in_pos);
+                                }
+                                nv_int_info.last_mod_lid.lid_cnt++;
+                            }
+                        }
+                    }
+#endif
+
+                    /* Do not update LID if OTA attribute is not set */
+                    if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA) == 0 ) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR, lid_info.LID, lid_info.attr);
+                        mcf_utfwk_printf("OTA attribute is not set, do not write to NVRAM. lid(%d), attribute(%x)\r\n", lid_info.LID, lid_info.attr);
+                        /* Write previous LID record */
+						if (is_read_nvram == KAL_TRUE && (item_lid != pre_lid_info.LID)) {
+							if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+								if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+									MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+									com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+									mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
+								} else {
+									MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+								}
+							} else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+								MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+							} else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+								MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+								mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+							} else {
+								MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+								mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+							}
+							mcf_utfwk_printf("OTA query attribute is set, do not write to NVRAM. lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+
+							free_ctrl_buffer_set_null(pre_lid_buffer);
+						}
+						
+						is_read_nvram = KAL_FALSE;
+                        goto next;
+                    }
+
+                    /* Write previous LID record */
+                    if (is_read_nvram == KAL_TRUE) {
+                        if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+                            if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+                                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+                                com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+                                mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
+                            } else {
+                                MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+                            }
+                        } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+                        } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+                            mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+                        } else {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+                            mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+                        }
+                        mcf_utfwk_printf("OTA query attribute is set, do not write to NVRAM. lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+
+                        free_ctrl_buffer_set_null(pre_lid_buffer);
+                        is_read_nvram = KAL_FALSE;
+                    }
+
+                    /* Do not reset LID if same with previos one */
+                    if (item_lid != pre_lid_info.LID) {
+                        if ( (lid_info.attr & NVRAM_ATTR_OTA_RESET) != 0 ) {
+                            if(nv_int_info.not_reset_ota == KAL_FALSE){
+                                if ( !nvram_external_reset_data(item_lid, 1, lid_info.total_records) ) {
+                                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_LID_FAIL, item_lid, lid_info.total_records);
+                                    mcf_utfwk_printf("Reset LID(%d) FAIL!!, total_record(%d)\r\n", item_lid, lid_info.total_records);
+                                }
+                            }
+                        } else {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_RESET_ATTR_NOT_SET, lid_info.LID, lid_info.attr);
+                            mcf_utfwk_printf("OTA reset attribute is not set!! lid(%d), attribute(%x)\r\n", lid_info.LID, lid_info.attr);
+                        }
+                    }
+
+                    lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info.size);
+
+                    /* Read NVRAM LID */
+                    if ( !nvram_external_read_data(item_lid, pItem->record_idx, lid_buffer, lid_info.size) ) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_READ_ITEM_LID_FAIL, item_lid, pItem->record_idx);
+                        mcf_utfwk_printf("Fail to read item LID(%d), record(%d)\r\n", item_lid, pItem->record_idx);
+                        is_read_nvram = KAL_FALSE;
+                        free_ctrl_buffer_set_null(lid_buffer);
+
+                        goto next;
+                    } else {
+                        is_read_nvram = KAL_TRUE;
+                    }
+                }
+                
+                if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+                    goto next;
+                }
+
+                /* Update LID item */
+                if (item_is_bit == 0) {
+                    if (pItem->value_len > item_size) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_LARGE_VAL_LEN, pItem->value_len, item_size);
+                        mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d)\r\n", pItem->value_len, item_size);
+                        goto next;
+                    }
+
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BYTE_UPDATE, item_lid, item_byte_offset, pItem->value_len);
+                    mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+
+                    kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+					nv_int_info.update_ota_result = KAL_TRUE;
+                } else {
+                    kal_uint32 bit_value = 0;
+                    kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+					kal_uint32 offset = 0;
+					kal_uint32 var_size = 1;
+					kal_uint32 val_tmp = 0;
+
+                    kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+                    
+                    if (pItem->value_len > 4) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_LEN, pItem->value_len, item_size, pItem->value_len);
+                        mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d)\r\n", item_size, item_size, pItem->value_len);
+                        goto next;
+                    }
+
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_BIT_UPDATE, item_lid, item_byte_offset, item_bit_offset, item_size, bit_value);
+					
+					if (item_size > 8 && item_size <= 16) {
+					    var_size = 2;
+					}else if (item_size > 16 && item_size <= 24) {
+					    var_size = 3;
+					}else if (item_size > 24 && item_size <= 32) {
+					    var_size = 4;
+					}
+
+                    if (item_bit_offset > 0 && item_bit_offset < 8){
+						offset = 0;
+					}else if(item_bit_offset >= 8 && item_bit_offset < 16){
+						offset = 1;
+					}else if(item_bit_offset >= 16 && item_bit_offset < 24){
+						offset = 2;
+					}else if(item_bit_offset >= 24 && item_bit_offset < 32){
+						offset = 3;
+					}else if (item_bit_offset >= 32){
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_OFFSET, item_bit_offset, item_size, pItem->value_len);
+                        mcf_utfwk_printf("Invalid item_bit_offset(%d)!! current item len(%d), bit_value_len(%d) \r\n",  item_bit_offset, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    if (item_bit_offset > 0) {
+                        if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+                            var_size+=((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+                        }
+                    }
+					
+                    if (var_size > 4) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_BIT_LEN, var_size, item_size, pItem->value_len);
+                        mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d)\r\n", var_size, item_size, pItem->value_len);
+                        goto next;
+                    }
+					
+                    if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        item_bit_offset -= 8;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        item_bit_offset -= 16;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        item_bit_offset -= 24;
+                    }
+					
+
+					kal_mem_cpy(&val_tmp, lid_buffer + item_byte_offset + offset, var_size);
+					val_tmp &= ~(bit_mask << item_bit_offset);
+                    val_tmp |= (bit_value << item_bit_offset);
+					
+					kal_mem_cpy(lid_buffer + item_byte_offset + offset, &val_tmp, var_size);
+					
+					nv_int_info.update_ota_result = KAL_TRUE;
+                }
+
+
+        next:
+                pre_lid_info = lid_info;
+                pre_record_idx = pItem->record_idx;
+                pre_lid_buffer = lid_buffer;
+                pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+                item_cnt++;
+            }
+            
+            if (item_cnt > 0) {
+                /* Write previous LID record */
+                if (is_read_nvram == KAL_TRUE) {
+                    if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0 ) {
+                        if ( !nvram_external_write_data(pre_lid_info.LID, pre_record_idx, pre_lid_buffer, pre_lid_info.size) ) {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_FAIL, pre_lid_info.LID, pre_record_idx);
+                            com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_ITEM_LID_FAIL;
+                            mcf_utfwk_printf("Fail to write item LID(%d), record(%d)\r\n", pre_lid_info.LID, pre_record_idx);
+                        } else {
+                            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_ITEM_NVRAM_SUCCESS, pre_lid_info.LID, pre_record_idx);
+                        }
+                    } else if ( (pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_QUERY_ATTR_SET, pre_lid_info.LID, pre_lid_info.attr);
+                    } else if ( ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA) != 0) && ((pre_lid_info.attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0) ) {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR2, pre_lid_info.LID, pre_lid_info.attr);
+                        mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+                    } else {
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_ATTR3, pre_lid_info.LID, pre_lid_info.attr);
+                        mcf_utfwk_printf("ERROR!! Both OTA normal and query attribute are not set! lid(%d), attribute(%x)\r\n", pre_lid_info.LID, pre_lid_info.attr);
+                    }
+                    free_ctrl_buffer_set_null(pre_lid_buffer);
+
+                }
+            }
+            if (ret != MCF_OTA_R_SUCCESS){
+                MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+                return ret;
+            }
+        }else if (pFile->file_version == 2){
+            mcf_v1_do_ota_full(ota_file);
+        }
+
+        /* Write updated MCF OTA file information to NVRAM */
+        if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+            strncpy(nv_sw_info.last_update_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+            nv_sw_info.last_update_file.sw_version[pFile->sw_version_len] = '\0';
+			MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_SW_VERSION, nv_sw_info.last_update_file.sw_version);
+        } else {
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_VERSION, pFile->sw_version_len);
+            mcf_utfwk_printf("Invalid OTA file SW version!! file_version_len(%d)!!\r\n", pFile->sw_version_len);
+        }
+
+        if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+            strncpy(nv_sw_info.last_update_file.gen_time, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len);
+            nv_sw_info.last_update_file.gen_time[pFile->gen_time_len] = '\0';
+			MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_GEN_TIME, nv_sw_info.last_update_file.gen_time);
+        } else {
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_INVALID_SW_GEN_TIME, pFile->gen_time_len);
+            mcf_utfwk_printf("Invalid OTA file SW gen time!! file_gen_time_len(%d)!!\r\n", pFile->gen_time_len);
+        }
+		
+		if (pFile->tool_version_len < MCF_FILE_MAX_TOOL_VERSION_LEN && pFile->tool_version_len > 0) {
+            strncpy(tool_version, (&(pFile->buff_start) + pFile->sw_version_len + pFile->gen_time_len), pFile->tool_version_len);
+            tool_version[pFile->tool_version_len] = '\0';
+			MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_TOOL_VERSION, tool_version);
+        } else if (pFile->tool_version_len >= MCF_FILE_MAX_TOOL_VERSION_LEN){
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_FILE_INVALID_TOOL_VERSION, pFile->tool_version_len);
+            mcf_utfwk_printf("Invalid OTA file tool version!! file_tool_version_len(%d)!!\r\n", pFile->tool_version_len);
+        }
+
+        if (apply_path_type == L4C_MCF_PATH_TYPE_OTA) {
+            strncpy(nv_sw_info.last_update_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+            strncpy(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+        } else if (apply_path_type == L4C_MCF_PATH_TYPE_RUNTIME) {
+            strncpy(nv_sw_info.last_update_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+            strncpy(nv_sw_info.last_update_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+        }
+
+        if ( !nvram_external_write_data(NVRAM_EF_MCF_OTA_FILE_LID, 1, (kal_uint8 *)&nv_ota_file, sizeof(nvram_ef_mcf_ota_file_info_struct)) ) {
+            MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_LID_FAIL, NVRAM_EF_MCF_OTA_FILE_LID, 1);
+            com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_FILE_LID_FAIL;
+            mcf_utfwk_printf("Fail to write MCF LID(%d)!! record_idx(%d)\r\n", NVRAM_EF_MCF_OTA_FILE_LID, 1);
+            ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+
+            read_file_info.result = ret;
+            read_file_info.end_time = kal_get_systicks();
+
+            mcf_em_send_ota_file_info(&read_file_info);
+
+            return ret;
+        }
+        MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    } else {
+        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TAKE_READ_LOCK_FAIL);
+        com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_TAKE_READ_LOCK_FAIL;
+        mcf_utfwk_printf("Read OTA, Fail to take read lock!!\r\n");
+
+        ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+        read_file_info.result = ret;
+        read_file_info.end_time = kal_get_systicks();
+
+        mcf_em_send_ota_file_info(&read_file_info);
+
+        return ret;
+    }
+
+    /* Copy current modified LID list to global variable */
+    kal_mem_cpy(&mcf_curr_mod_lid_g, &nv_int_info.last_mod_lid, sizeof(nvram_mcf_lid_info_struct));
+
+    /* Write updated MCF SW information in NVRAM */
+    strncpy(nv_sw_info.version, release_verno(), MCF_SW_VERNO_LEN - 1);
+    strncpy(nv_sw_info.build_time, build_date_time(), MCF_SW_BUILD_TIME_LEN - 1);
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_LID_FAIL, NVRAM_EF_MCF_SW_INFO_LID, 1);
+        mcf_utfwk_printf("Fail to write MCF LID(%d)!! record_idx(%d)\r\n", NVRAM_EF_MCF_SW_INFO_LID, 1);
+        com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_SW_INFO_LID_FAIL;
+    }
+    /* Write updated MCF internal information in NVRAM */
+    if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_WRITE_LID_FAIL, NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
+        mcf_utfwk_printf("Fail to write MCF LID(%d)!! record_idx(%d)\r\n", NVRAM_EF_MCF_INTERNAL_INFO_LID, 1);
+        com_Mcf.boot_trace_flag |= MCF_BOOT_TRACE_F_WRITE_INT_INFO_LID_FAIL;
+    }
+
+    read_file_info.result = ret;
+    read_file_info.end_time = kal_get_systicks();
+
+    mcf_em_send_ota_file_info(&read_file_info);
+
+    MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_TOTAL_RESET_TIME, CALCULATE_LETENCY_DURATION(total_start_time, GET_CURRENT_TIME()));
+
+    return ret;
+}
+
+mcf_ota_result_e mcf_do_ota_by_lid(
+    nvram_lid_enum lid,
+    kal_uint16 record_idx,
+    kal_uint16 record_amount,
+    nvram_ltable_entry_struct *lid_info)
+{
+    mcf_t                          *pMcf = mcf_get_instance();
+    mcf_ota_result_e                ret = MCF_OTA_R_SUCCESS;
+    mcf_tool_file_info_t           *pFile;
+    mcf_tool_gid_ota_file_item_t   *pItem;
+    mcf_ota_file_t                 *ota_file = &(pMcf->ota_file);
+    kal_bool                        is_read_nvram = KAL_FALSE;
+    kal_uint16                      pre_record_idx = 0xFFFF;
+    kal_bool                        is_found_target = KAL_FALSE;
+    kal_uint8                      *pre_lid_buffer = NULL;
+    kal_uint8                      *lid_buffer = NULL;
+    kal_uint16                      item_cnt = 0;
+    kal_char                        array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+    kal_uint16                      item_byte_offset;
+    kal_uint16                      item_bit_offset;
+    kal_uint32                      item_size;
+    kal_bool                        item_is_bit = KAL_FALSE;
+    kal_uint16                      item_lid;
+
+    DEBUG_ASSERT(lid_info);
+    if (!lid_info) {
+        MD_TRC_MCF_TR_LID_OTA_LID_INVALID_PARA(lid, lid_info);
+        ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return ret;
+    }
+    MD_TRC_MCF_TR_LID_OTA_START(lid, record_idx, record_amount);
+
+    MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+        
+
+        /* Check if file type is OTA file */
+        if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+            kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+            mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+            MD_TRC_MCF_TR_LID_OTA_LID_INVALID_FILE(str_tmp);
+            ret = MCF_OTA_R_INVALID_FILE;
+            MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        /* If NVRAM_ATTR_MCF_OTA is not set, do not OTA */
+        if ( (lid_info->attr & NVRAM_ATTR_MCF_OTA) == 0 ) {
+            MD_TRC_MCF_TR_LID_OTA_INVALID_ATTR(lid, lid_info->attr);
+            ret = MCF_OTA_R_INVALID_ATTR;
+            MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        /* Not allow to set both NVRAM_ATTR_MCF_OTA and NVRAM_ATTR_MCF_OTA_FOR_QUERY */
+        if ( (lid_info->attr & NVRAM_ATTR_MCF_OTA_FOR_QUERY) != 0 ) {
+            MD_TRC_MCF_TR_LID_OTA_DOUBLE_ATTR(lid, lid_info->attr);
+            ret = MCF_OTA_R_INVALID_ATTR;
+            MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+        
+        /* MCF 1.0 update flow */
+        if (pFile->file_version == 2){
+            ret = mcf_v1_do_ota_by_lid (ota_file, lid, record_idx, record_amount, lid_info);
+            if(ret != MCF_OTA_R_SUCCESS)
+            {
+                return ret;
+            }
+        }else if (pFile->file_version == 3){
+            pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+            pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+            /* Read changed items from OTA file */
+            while (item_cnt < pFile->item_num) {
+                if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+                    MD_TRC_MCF_TR_LID_OTA_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+                    goto next;
+                }
+                strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
+                array_tag[pItem->array_index_len] = '\0';
+                
+                /* Find GID corresponding LID */
+                item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+                if (item_lid == 65535){
+                    //-1(65535) means not found
+                    goto next;
+                }
+
+                if ( (item_lid != lid) || (pItem->record_idx < record_idx) || (pItem->record_idx > (record_idx + record_amount - 1)) ) {
+                    if (is_found_target == KAL_FALSE) {
+                        goto next;
+                    } else {
+                        // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
+                        break;
+                    }
+                }
+
+                if ( (is_read_nvram == KAL_FALSE) || (pItem->record_idx != pre_record_idx) ) {
+                    is_found_target = KAL_TRUE;
+
+                    /* Write previous LID record */
+                    if (is_read_nvram == KAL_TRUE) {
+                        if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
+                            MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
+                        } else {
+                            MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
+                        }
+
+                        free_ctrl_buffer_set_null(pre_lid_buffer);
+                        is_read_nvram = KAL_FALSE;
+                    }
+
+                    lid_buffer = (kal_uint8 *)get_ctrl_buffer(lid_info->size);
+
+                    /* Read NVRAM LID */
+                    if ( !nvram_external_read_data(item_lid, pItem->record_idx, lid_buffer, lid_info->size) ) {
+                        MD_TRC_MCF_TR_LID_OTA_READ_ITEM_NVRAM_FAIL(lid, pItem->record_idx);
+                        is_read_nvram = KAL_FALSE;
+                        free_ctrl_buffer_set_null(lid_buffer);
+
+                        goto next;
+                    } else {
+                        is_read_nvram = KAL_TRUE;
+                    }
+                }
+                
+                if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+                    goto next;
+                }
+
+                /* Update LID item */
+                if (item_is_bit == 0) {
+                    if (pItem->value_len > item_size) {
+                        MD_TRC_MCF_TR_LID_OTA_LARGE_VAL_LEN(pItem->value_len, item_size);
+                        goto next;
+                    }
+
+                    MD_TRC_MCF_TR_LID_OTA_BYTE_UPDATE(lid, item_byte_offset, pItem->value_len);
+                    mcf_dump_data(KAL_FALSE, &(pItem->buff_start)+pItem->array_index_len, pItem->value_len);
+
+                    kal_mem_cpy( (lid_buffer + item_byte_offset), &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+                } else {
+                    kal_uint32 bit_value = 0;
+                    kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+					kal_uint32 offset = 0;
+					kal_uint32 var_size = 1;
+					kal_uint32 val_tmp = 0;
+
+                    kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+
+                    if (pItem->value_len > 4) {
+                        MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    MD_TRC_MCF_TR_LID_OTA_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, item_size, bit_value);
+
+                    if (item_size > 8 && item_size <= 16) {
+                        var_size = 2;
+                    }else if (item_size > 16 && item_size <= 24) {
+                        var_size = 3;
+                    }else if (item_size > 24 && item_size <= 32) {
+                        var_size = 4;
+                    }
+
+                    if (item_bit_offset > 0 && item_bit_offset < 8) {
+                        offset = 0;
+                    }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        offset = 1;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        offset = 2;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        offset = 3;
+                    }else if (item_bit_offset >= 32){
+                        MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    if (item_bit_offset > 0) {
+                        if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+                            var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+                        }
+                    }
+                    
+                    if (var_size > 4) {
+                        MD_TRC_MCF_TR_LID_OTA_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
+                        goto next;
+                    }
+
+                    if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        item_bit_offset -= 8;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        item_bit_offset -= 16;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        item_bit_offset -= 24;
+                    }
+
+
+                    kal_mem_cpy(&val_tmp, lid_buffer + item_byte_offset + offset, var_size);
+                    val_tmp &= ~(bit_mask << item_bit_offset);
+                    val_tmp |= (bit_value << item_bit_offset);
+
+                    kal_mem_cpy(lid_buffer + item_byte_offset + offset, &val_tmp, var_size);
+                }
+
+    next:
+                pre_record_idx = pItem->record_idx;
+                pre_lid_buffer = lid_buffer;
+                pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+                item_cnt++;
+            }
+            if (item_cnt > 0) {
+                /* Write previous LID record */
+                if (is_read_nvram == KAL_TRUE) {
+                    if ( !nvram_external_write_data(lid, pre_record_idx, pre_lid_buffer, lid_info->size) ) {
+                        MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_FAIL(lid, pre_record_idx);
+                        ret = MCF_OTA_R_WRITE_NVRAM_FAIL;
+                    } else {
+                        MD_TRC_MCF_TR_LID_OTA_WRITE_ITEM_NVRAM_SUCCESS(lid, pre_record_idx);
+                    }
+
+                    free_ctrl_buffer_set_null(pre_lid_buffer);
+                }
+            }
+            MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+        }
+    } else {
+        MD_TRC_MCF_TR_LID_OTA_TAKE_READ_LOCK_FAIL(lid);
+        ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+    }
+
+    return ret;
+}
+
+mcf_ota_result_e mcf_read_ota_buffer(
+    nvram_lid_enum lid,
+    kal_uint16 record_idx,
+    kal_uint8 *buffer,
+    kal_uint32 size)
+{
+    mcf_t                          *pMcf = mcf_get_instance();
+    mcf_ota_result_e                ret = MCF_OTA_R_SUCCESS;
+    nvram_ltable_entry_struct       lid_info = {0};
+    mcf_tool_file_info_t           *pFile;
+    mcf_tool_gid_ota_file_item_t   *pItem;
+    mcf_ota_file_t                 *ota_file = &(pMcf->ota_file);
+    kal_uint16                      item_cnt = 0;
+    nvram_errno_enum                nvram_api_ret;
+    kal_bool                        is_found_target = KAL_FALSE;
+    kal_char                        array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+    kal_uint16                      item_byte_offset;
+    kal_uint16                      item_bit_offset;
+    kal_uint32                      item_size;
+    kal_bool                        item_is_bit = KAL_FALSE;
+    kal_uint16                      item_lid;
+    kal_uint32                      start_time = GET_CURRENT_TIME();
+
+    if (!(buffer && (size > 0))) {
+        MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_PARA(lid, buffer, size);
+        MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_PARA, lid, buffer, size);
+        mcf_utfwk_printf("Invalid parameters!! LID(%d), buffer(%x), size(%d) \r\n", lid, buffer, size);
+        ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return ret;
+    }
+    MD_TRC_MCF_TR_READ_OTA_BUFFER_START(lid, record_idx, buffer, size);
+
+    MCF_R_LOCK_OBJECT(ota_file, mcf_enhmutex_g);
+    if (ota_file) {
+        pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+
+        /* Check if file type is OTA file */
+        if (strcmp(pFile->file_type, MCF_FILE_TYPE_OTA) != 0) {
+            kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+            mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+            MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_FILE, str_tmp);
+            MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_FILE(str_tmp);
+            ret = MCF_OTA_R_INVALID_FILE;
+            MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+        if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+            MD_TRC_MCF_TR_READ_OTA_BUFFER_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+            MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_GET_LID_INFO_FAIL, lid, nvram_api_ret);
+            mcf_utfwk_printf("Fail to get LID information!! LID(%d), nvram_api_ret(%d) \r\n", lid, nvram_api_ret);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        if (size != lid_info.size) {
+            MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_SIZE(size, lid_info.size);
+            MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_SIZE, size, lid_info.size);
+            mcf_utfwk_printf("Invalid buffer_size(%d)!! record_size(%d) \r\n", size, lid_info.size);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+#if 0 //Bypass attribute check because NVRAM_ATTR_MCF_OTA will also use this API
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+        /*MCF 1.0 Read OTA buffer Update flow */
+        if (pFile->file_version == 2){
+            mcf_v1_read_ota_buffer(ota_file, lid, record_idx, buffer);
+        }
+        else if (pFile->file_version == 3){
+            pFile = (mcf_tool_file_info_t *)(ota_file->buff);
+            pItem = (mcf_tool_gid_ota_file_item_t *)(ota_file->buff + pFile->total_len);
+            /* Read changed items from OTA file */
+            while (item_cnt < pFile->item_num) {
+                if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+                    MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+                    MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_ARRAY_INDEX_LEN, pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+                    mcf_utfwk_printf("Invalid array_index_len(%d)!! max array_index_len(%d) \r\n",  pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+                    goto next;
+                }
+                strncpy(array_tag, &(pItem->buff_start), pItem->array_index_len);
+                array_tag[pItem->array_index_len] = '\0';
+                
+                /* Find GID corresponding LID */
+                item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+                if (item_lid == 65535){
+                    //-1(65535) means not found
+                    goto next;
+                }
+
+                if ( (item_lid != lid) || (pItem->record_idx != record_idx) ) {
+                    if (is_found_target == KAL_FALSE) {
+                        goto next;
+                    } else {
+                        // Item in file has been sorted. If target has been found, stop searching while next item is not the one we are searching
+                        break;
+                    }
+                }
+                is_found_target = KAL_TRUE;
+                
+                if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+                    goto next;
+                }
+
+                /* Update LID item */
+                if (item_is_bit == 0) {
+                    if (pItem->value_len > item_size) {
+                        MD_TRC_MCF_TR_READ_OTA_BUFFER_LARGE_VAL_LEN(pItem->value_len, item_size);
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_LARGE_VAL_LEN, pItem->value_len, item_size);
+                        mcf_utfwk_printf("Invalid value len(%d)!! larger than current item len(%d) \r\n",  pItem->value_len, item_size);
+
+                        goto next;
+                    }
+
+                    MD_TRC_MCF_TR_READ_OTA_BUFFER_BYTE_UPDATE(lid, item_byte_offset, pItem->value_len);
+                    if (kal_query_systemInit() == KAL_TRUE){
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GID_ARRAY_INDEX, pItem->global_id, array_tag);
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_BYTE_UPDATE, lid, item_byte_offset, pItem->value_len);
+                        mcf_dump_data(KAL_TRUE, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+                    }
+                    mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+
+                    kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+					nv_int_info.update_general_tlvota_result = KAL_TRUE;
+                } else {
+                    kal_uint32 bit_value = 0;
+                    kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+					kal_uint32 offset = 0;
+					kal_uint32 var_size = 1;
+					kal_uint32 val_tmp = 0;
+
+                    kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->array_index_len, pItem->value_len);
+
+
+                    if (pItem->value_len > 4) {
+                        MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_INVALID_BIT_LEN, item_size, item_size, pItem->value_len);
+                        mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d) \r\n",  item_size, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    MD_TRC_MCF_TR_READ_OTA_BUFFER_BIT_UPDATE(lid, item_byte_offset, item_bit_offset, item_size, bit_value);
+                    if (kal_query_systemInit() == KAL_TRUE){
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_DO_OTA_FULL_GID_ARRAY_INDEX, pItem->global_id, array_tag);                       
+                        MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_BIT_UPDATE, lid, item_byte_offset, item_bit_offset, item_size, bit_value);
+                    }
+                    
+                    if (item_size > 8 && item_size <= 16) {
+                        var_size = 2;
+                    }else if (item_size > 16 && item_size <= 24) {
+                        var_size = 3;
+                    }else if (item_size > 24 && item_size <= 32) {
+                        var_size = 4;
+                    }
+
+                    if (item_bit_offset > 0 && item_bit_offset < 8) {
+                        offset = 0;
+                    }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        offset = 1;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        offset = 2;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        offset = 3;
+                    }else if (item_bit_offset >= 32){
+                        MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
+                        mcf_utfwk_printf("Invalid item_bit_offset(%d)!! current item len(%d), bit_value_len(%d) \r\n",  item_bit_offset, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    if (item_bit_offset > 0) {
+                        if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+                            var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+                        }
+                    }
+                    
+                    if (var_size > 4) {
+                        MD_TRC_MCF_TR_READ_OTA_BUFFER_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
+                        mcf_utfwk_printf("Invalid bit_len(%d)!! current item len(%d), bit_value_len(%d) \r\n", var_size, item_size, pItem->value_len);
+                        goto next;
+                    }
+
+                    if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        item_bit_offset -= 8;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        item_bit_offset -= 16;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        item_bit_offset -= 24;
+                    }
+
+
+                    kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
+                    val_tmp &= ~(bit_mask << item_bit_offset);
+                    val_tmp |= (bit_value << item_bit_offset);
+
+                    kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
+					nv_int_info.update_general_tlvota_result = KAL_TRUE;
+                }
+
+        next:
+                pItem = (mcf_tool_gid_ota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+                item_cnt++;
+            }
+            MCF_R_UNLOCK_OBJECT(ota_file, mcf_enhmutex_g);
+        }
+    } else {
+        MD_TRC_MCF_TR_READ_OTA_BUFFER_TAKE_READ_LOCK_FAIL(lid);
+        MCF_BOOT_TRACE(MCF_BOOT_TR_READ_OTA_BUFFER_TAKE_READ_LOCK_FAIL, lid);
+        mcf_utfwk_printf("Fail to take read lock!! LID(%d)!! \r\n",  lid);
+        ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+    }
+    
+    // calculate total duration when boot up
+    if (kal_query_systemInit() == KAL_TRUE){
+        com_Mcf.ota_api_duration += CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME());
+    }
+    MD_TRC_MCF_TR_READ_OTA_BUFFER_DURATION(lid, record_idx, CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
+
+    return ret;
+}
+
+mcf_ota_result_e mcf_read_tlvota_buffer(
+    kal_uint8 ps_id,
+    mcf_tlvota_tag_t tag,
+    nvram_lid_enum lid,
+    kal_uint8 *buffer,
+    kal_uint32 size)
+{
+    mcf_t                              *pMcf = mcf_get_instance();
+    mcf_tool_file_info_t               *pFile;
+    mcf_tool_gid_tlvota_file_item_t    *pItem;
+    sim_interface_enum                  sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+    mcf_tlvota_file_t                  *tlvota_file = &(pMcf->general_tlvota_file);
+    nvram_ltable_entry_struct           lid_info = {0};
+    nvram_errno_enum                    nvram_api_ret;
+    mcf_ota_result_e                    ret = MCF_OTA_R_SUCCESS;
+    kal_char                            array_tag[MCF_FILE_MAX_ARRAY_TAG_LEN]={0};
+    kal_uint16                          item_byte_offset;
+    kal_uint16                          item_bit_offset;
+    kal_uint32                          item_size;
+    kal_bool                            item_is_bit = KAL_FALSE;
+    kal_uint16                          item_lid;
+    kal_uint16                          item_cnt = 0;
+
+    if (!buffer || (size < 0) || !tag.tag) {
+        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_PARA(ps_id, lid, buffer, size, tag.tag);
+        ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return ret;
+    }
+    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_START_USIR(ps_id, sim_id, lid, buffer, size, tag.tag);
+
+    MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff); 
+
+        /* Check if file type is TLV-OTA file */
+        if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+            kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+            mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_FILE(str_tmp);
+            ret = MCF_OTA_R_INVALID_FILE;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        nvram_api_ret = nvram_external_get_lid_info(lid, &lid_info);
+        if (nvram_api_ret != NVRAM_ERRNO_SUCCESS) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_GET_LID_INFO_FAIL(lid, nvram_api_ret);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        if (size != lid_info.size) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_SIZE(size, lid, lid_info.size);
+            ret = MCF_OTA_R_INVALID_PARAMETER;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+
+        if ( (lid_info.attr & NVRAM_ATTR_MCF_OTA_BY_OP) == 0 ) {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_ATTR_NOT_SET(lid, lid_info.attr);
+            ret = MCF_OTA_R_INVALID_ATTR;
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+            return ret;
+        }
+        /*MCF 1.0 read tlvota buffer update flow */
+        if (pFile->file_version == 2){
+            mcf_v1_read_tlvota_buffer(tlvota_file, tag, lid, buffer);
+        }
+        else if (pFile->file_version == 3){
+            pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+            pItem = (mcf_tool_gid_tlvota_file_item_t *)(tlvota_file->buff + pFile->total_len);
+            /* Read changed items from TLV-OTA file */
+            while (item_cnt < pFile->item_num) {
+                /* Check if array_index_len is valid */
+                if ( (pItem->array_index_len < 0) || (pItem->array_index_len >= MCF_FILE_MAX_ARRAY_TAG_LEN-1) ) {
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_ARRAY_INDEX_LEN(pItem->array_index_len, MCF_FILE_MAX_ARRAY_TAG_LEN);
+                    goto next;
+                }
+                strncpy(array_tag, &(pItem->buff_start)+pItem->tag_len, pItem->array_index_len);
+                array_tag[pItem->array_index_len] = '\0';
+                
+                /* Find GID corresponding LID */
+                item_lid = mcf_find_gid_return_lid_num(pItem->global_id);
+                if (item_lid == 65535){
+                    //-1(65535) means not found
+                    goto next;
+                }
+
+                /* Check if LID and tag match */
+                if ( (item_lid != lid) || (pItem->tag_type != tag.tag_type) || (strncmp(&(pItem->buff_start), tag.tag, pItem->tag_len) != 0) ) {
+                    goto next;
+                }
+                
+                
+                if(mcf_find_gid_offset(pItem->global_id, array_tag, &item_lid, &item_byte_offset, &item_bit_offset, &item_size, &item_is_bit) == KAL_FALSE){
+                    goto next;
+                }
+
+                /* Update LID item */
+                if (item_is_bit == 0) {
+                    if (pItem->value_len > item_size) {
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_LARGE_VAL_LEN(pItem->value_len, item_size);
+
+                        goto next;
+                    }
+
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BYTE_UPDATE_USIR(lid, tag.tag, item_byte_offset, pItem->value_len);
+                    mcf_dump_data(KAL_FALSE, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+                    kal_mem_cpy( (buffer + item_byte_offset), &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+                } else {
+                    kal_uint32 bit_value = 0;
+                    kal_uint32 bit_mask = (kal_uint32)MCF_GEN_BIT_MASK(item_size);
+					kal_uint32 offset = 0;
+					kal_uint32 var_size = 1;
+					kal_uint32 val_tmp = 0;
+
+                    kal_mem_cpy(&bit_value, &(pItem->buff_start) + pItem->tag_len + pItem->array_index_len, pItem->value_len);
+
+                    if (pItem->value_len > 4) {
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_LEN(pItem->value_len, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_BIT_UPDATE_USIR(lid, tag.tag, item_byte_offset, item_bit_offset, item_size, bit_value);
+
+                    if (item_size > 8 && item_size <= 16) {
+                        var_size = 2;
+                    }else if (item_size > 16 && item_size <= 24) {
+                        var_size = 3;
+                    }else if (item_size > 24 && item_size <= 32) {
+                        var_size = 4;
+                    }
+
+                    if (item_bit_offset > 0 && item_bit_offset < 8) {
+                        offset = 0;
+                    }else if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        offset = 1;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        offset = 2;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        offset = 3;
+                    }else if (item_bit_offset >= 32){
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_OFFSET(item_bit_offset, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    if (item_bit_offset > 0) {
+                        if ((item_bit_offset) / 8 != (item_size + item_bit_offset) / 8) {
+                            var_size += ((item_size + item_bit_offset) / 8 - item_bit_offset / 8);
+                        }
+                    }
+                    if(var_size > 4){
+                        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_INVALID_BIT_LEN(var_size, item_size, pItem->value_len);
+
+                        goto next;
+                    }
+
+                    if (item_bit_offset >= 8 && item_bit_offset < 16) {
+                        item_bit_offset -= 8;
+                    }else if (item_bit_offset >= 16 && item_bit_offset < 24) {
+                        item_bit_offset -= 16;
+                    }else if (item_bit_offset >= 24 && item_bit_offset < 32) {
+                        item_bit_offset -= 24;
+                    }
+
+
+                    kal_mem_cpy(&val_tmp, buffer + item_byte_offset + offset, var_size);
+                    val_tmp &= ~(bit_mask << item_bit_offset);
+                    val_tmp |= (bit_value << item_bit_offset);
+
+                    kal_mem_cpy(buffer + item_byte_offset + offset, &val_tmp, var_size);
+                }
+
+        next:
+                pItem = (mcf_tool_gid_tlvota_file_item_t *)((kal_uint8 *)pItem + pItem->total_len);
+                item_cnt++;
+            }
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        }
+    } else {
+        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_TAKE_READ_LOCK_FAIL();
+        ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+    }
+
+    return ret;
+}
+
+mcf_ota_result_e mcf_read_tlvota_buffer_sbp_tag(
+    kal_uint8 ps_id,
+    mcf_tlvota_sbp_tag_t sbp_tag,
+    nvram_lid_enum lid,
+    kal_uint8 *buffer,
+    kal_uint32 size)
+{
+    mcf_ota_result_e                    tlvota_ret = MCF_OTA_R_MAX;
+    mcf_ota_result_e                    ret = MCF_OTA_R_MAX;
+    mcf_tlvota_tag_t                    tag_entry[6];
+    kal_uint32                          tag_num = 0;
+    kal_char                            tag[6][MCF_MAX_TAG_LEN];
+    mcf_t                              *pMcf = mcf_get_instance();
+    sim_interface_enum                  sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+    mcf_tlvota_file_t                  *tlvota_file = &(pMcf->tlvota_file[sim_id]);
+    mcf_tlvota_tag_t                    iccid_tag;
+    kal_char                            iccid[21];
+    kal_int32                           ret_snprintf;
+    kal_uint32                          start_time = GET_CURRENT_TIME();
+    
+    kal_mem_set(tag, 0, sizeof(kal_char) * 6 * MCF_MAX_TAG_LEN);
+
+    if (!(buffer && (size > 0))) {
+        MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_INVALID_PARA(ps_id, lid, buffer, size);
+        ret = MCF_OTA_R_INVALID_PARAMETER;
+        mcf_utfwk_printf("Invalid parameters!! ps_id(%d), LID(%d), buffer(%x), size(%d) \r\n", ps_id, lid, buffer, size);
+
+        return ret;
+    }
+    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_START(ps_id, lid, buffer, size, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+
+    /* Fill tag entry */
+    if (sbp_tag.sbp_id != SBP_ID_INVALID) {
+        if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
+            if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // sbpid_mcc_mnc case
+                /* NA_NA_NA, NA_mcc_NA and NA_mcc_mnc case should be updated first */
+                /* NA_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+                
+                /* NA_mcc_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+
+                /* NA_mcc_mnc */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+
+                tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+                /* Reuse tag_entry */
+                tag_num = 0;
+
+                /* NA_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+                
+                /* sbpid_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+
+                /* sbpid_mcc_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+
+                /* sbpid_mcc_mnc */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_%s_%s", sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "SBP_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+            } else { // sbpid_mcc_NA case
+                /* NA_NA_NA and NA_mcc_NA case should be updated first */
+                /* NA_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+                
+                /* NA_mcc_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+
+                tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+                /* Reuse tag_entry */
+                tag_num = 0;
+
+                /* NA_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+                
+                /* sbpid_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+
+                /* sbpid_mcc_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_%s_NA", sbp_tag.sbp_id, sbp_tag.mcc);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "SBP_mcc_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+            }
+        } else {
+            if (strcmp((kal_char *)sbp_tag.mnc, "") == 0) { // sbpid_NA_NA case
+                /* NA_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+
+                tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+                /* Reuse tag_entry */
+                tag_num = 0;
+
+                /* NA_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+                
+                /* sbpid_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "%d_NA_NA", sbp_tag.sbp_id);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "SBP_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+            } else { // sbpid_NA_mnc case is not allowed!!
+                MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                ret = MCF_OTA_R_INVALID_SBP_TAG;
+
+                return ret;
+            }
+        }
+    } else {
+        if (strcmp((kal_char *)sbp_tag.mcc, "") != 0) {
+            if (strcmp((kal_char *)sbp_tag.mnc, "") != 0) { // NA_mcc_mnc case
+                /* NA_NA_NA, NA_mcc_NA and NA_mcc_mnc case should be updated first */
+                /* NA_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+                
+                /* NA_mcc_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+
+                /* NA_mcc_mnc */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_%s", (kal_char *)sbp_tag.mcc, (kal_char *)sbp_tag.mnc);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_mcc_mnc", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+
+                tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+                /* Reuse tag_entry */
+                tag_num = 0;
+                
+                /* NA_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+            } else { // NA_mcc_NA case
+                /* NA_mcc_NA and NA_mcc_mnc case should be updated first */
+                /* NA_mcc_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+                
+                
+                /* NA_mcc_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_%s_NA", (kal_char *)sbp_tag.mcc);
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_mcc_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+
+                tlvota_ret = mcf_read_tlvota_buffer_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+
+                /* Reuse tag_entry */
+                tag_num = 0;
+                
+                /* NA_NA_NA */
+                tag_entry[tag_num].tag_type = MCF_TLVOTA_TAG_SBPID;
+                ret_snprintf = kal_snprintf(tag[tag_num], MCF_MAX_TAG_LEN, "NA_NA_NA");
+                if(ret_snprintf < 0 || ret_snprintf > MCF_MAX_TAG_LEN){
+                    strncpy(tag[tag_num], "NA_NA_NA", MCF_MAX_TAG_LEN - 1);
+                    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_SNPRINTF_FAIL(tag[tag_num], sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+                }
+                tag_entry[tag_num].tag_len = strlen(tag[tag_num]);
+                tag_entry[tag_num].tag = tag[tag_num];
+                tag_num++;
+            }
+        } else { // NA_NA_mnc cases is not allowed!!
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_INVALID_SBP_TAG(sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+            mcf_utfwk_printf("Invalid SBP tag!! sbp_id(%d), mcc(%s), mnc(%d) \r\n", sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+            ret = MCF_OTA_R_INVALID_SBP_TAG;
+
+            return ret;
+        }
+    }
+
+    ret = mcf_read_tlvota_buffer_sbp_multi_tag(ps_id, tag_entry, tag_num, lid, buffer, size);
+    
+    /*If general TLV-OTA is iccid tag, need to call read_tlv_ota_buffer to update OTA file with iccid tag*/
+    
+    if (com_Mcf.is_iccid == KAL_TRUE){
+        kal_mem_set(&iccid_tag, 0, sizeof(mcf_tlvota_tag_t));
+        iccid_tag.tag_type = MCF_TLVOTA_TAG_ICCID;
+        
+        MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file){
+            kal_mem_cpy(&iccid, tlvota_file->iccid, 21);
+            iccid_tag.tag = iccid;
+            iccid_tag.tag_len = strlen((kal_char *)tlvota_file->iccid);
+            
+            MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        }else {
+            MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_TAKE_READ_LOCK_FAIL();
+            ret = MCF_OTA_R_TAKE_READ_LOCK_FAIL;
+            return ret;
+        }
+        ret = mcf_read_tlvota_buffer(ps_id, iccid_tag, lid, buffer, size);
+    }
+    
+    if ( (tlvota_ret == MCF_OTA_R_SUCCESS) || (ret == MCF_OTA_R_SUCCESS) ) {
+        ret = MCF_OTA_R_SUCCESS;
+    }
+    
+    MD_TRC_MCF_TR_READ_TLVOTA_BUFFER_SBP_DURATION(lid, ps_id, CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
+
+    return ret;
+}
+
+mcf_ota_result_e mcf_read_nvram_and_tlvota_buffer_sbp_tag(
+    kal_uint8 ps_id,
+    mcf_tlvota_sbp_tag_t sbp_tag,
+    nvram_lid_enum lid,
+    kal_uint16 record_idx,
+    kal_uint8 *buffer,
+    kal_uint32 size)
+{
+    mcf_ota_result_e    ret = MCF_OTA_R_SUCCESS;
+
+    if (!(buffer && (size > 0))) {
+        MD_TRC_MCF_TR_READ_NVRAM_TLVOTA_BUFFER_SBP_INVALID_PARA(ps_id, lid, buffer, size);
+        ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return ret;
+    }
+    MD_TRC_MCF_TR_READ_NVRAM_TLVOTA_BUFFER_SBP_START(ps_id, lid, record_idx, buffer, size, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+
+    if ( !nvram_external_read_data(lid, record_idx, buffer, size)) {
+        ret = MCF_OTA_R_READ_NVRAM_FAIL;
+
+        return ret;
+    }
+
+    ret = mcf_read_tlvota_buffer_sbp_tag(ps_id, sbp_tag, lid, buffer, size);
+
+    return ret;
+}
+
+kal_bool mcf_custom_dump_mcf_data(mcf_custom_dump_param_struct *param_ptr)
+{
+    kal_bool ret = KAL_TRUE;
+    sim_interface_enum sim_slot_id  = 0;
+
+    switch (param_ptr->lid)
+    {
+        case NVRAM_EF_MCF_TEST_OTA_LID:
+        {
+            mcf_tlvota_sbp_tag_t    sbp_tag = {0};
+            mcf_ota_result_e        mcf_ret;
+
+            if (param_ptr->type == MCF_TYPE_OTA_BY_OP) {
+                *(param_ptr->size) = sizeof(nvram_ef_mcf_test_struct);
+                sbp_tag.sbp_id = param_ptr->sbp_id;
+                kal_mem_cpy(sbp_tag.mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
+                kal_mem_cpy(sbp_tag.mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
+
+                /* Record_id = sim_id + 1 */
+                sim_slot_id = l4c_gemini_get_actual_sim_id(param_ptr->ps_id);
+                
+                if (!nvram_external_read_data(param_ptr->lid, sim_slot_id + 1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct))) {
+                    MD_TRC_MCF_TR_DUMP_MCF_LID_READ_NVRAM_FAIL(param_ptr->lid, sim_slot_id + 1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+                    ret = KAL_FALSE;
+                    return ret;
+                }
+
+                mcf_ret = mcf_read_tlvota_buffer_sbp_tag(param_ptr->ps_id, sbp_tag, param_ptr->lid, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+                if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                    MD_TRC_MCF_TR_DUMP_MCF_LID_FAIL(param_ptr->lid, mcf_ret);
+                }
+            } else {
+                MD_TRC_MCF_TR_DUMP_MCF_LID_INVALID_TYPE(param_ptr->lid, param_ptr->type);
+                ret = KAL_FALSE;
+            }
+            break;
+        }
+
+        case NVRAM_EF_MCF_TEST_OTA_QUERY_LID:
+        {
+            mcf_tlvota_sbp_tag_t    sbp_tag = {0};
+            mcf_ota_result_e        mcf_ret;
+
+            switch (param_ptr->type)
+            {
+                case MCF_TYPE_OTA:
+                    *(param_ptr->size) = sizeof(nvram_ef_mcf_test_struct);
+                    if (!nvram_external_read_data(param_ptr->lid, param_ptr->record_idx, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct))) {
+                        MD_TRC_MCF_TR_DUMP_MCF_LID_READ_NVRAM_FAIL(param_ptr->lid, param_ptr->record_idx, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+                        ret = KAL_FALSE;
+                        return ret;
+                    }
+
+                    mcf_ret = mcf_read_ota_buffer(param_ptr->lid, param_ptr->record_idx, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+                    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                        MD_TRC_MCF_TR_DUMP_MCF_LID_QUERY_MCF_FAIL(param_ptr->lid, param_ptr->record_idx, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+                    }
+
+                    break;
+
+                case MCF_TYPE_OTA_BY_OP:
+                    *(param_ptr->size) = sizeof(nvram_ef_mcf_test_struct);
+                    sbp_tag.sbp_id = param_ptr->sbp_id;
+                    kal_mem_cpy(sbp_tag.mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
+                    kal_mem_cpy(sbp_tag.mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
+
+                    if (!nvram_external_read_data(param_ptr->lid, param_ptr->ps_id + 1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct))) {
+                        MD_TRC_MCF_TR_DUMP_MCF_LID_READ_NVRAM_FAIL(param_ptr->lid, param_ptr->ps_id + 1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+                        ret = KAL_FALSE;
+                        return ret;
+                    }
+                    /* Record_id = sim_id + 1 */
+                    sim_slot_id = l4c_gemini_get_actual_sim_id(param_ptr->ps_id);
+                    mcf_ret = mcf_read_ota_buffer(param_ptr->lid, sim_slot_id+1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+                    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                        MD_TRC_MCF_TR_DUMP_MCF_LID_QUERY_MCF_FAIL(param_ptr->lid, sim_slot_id+1, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+                    }
+                    
+                    mcf_ret = mcf_read_tlvota_buffer_sbp_tag(param_ptr->ps_id, sbp_tag, param_ptr->lid, param_ptr->buffer, sizeof(nvram_ef_mcf_test_struct));
+                    if (mcf_ret != MCF_OTA_R_SUCCESS) {
+                        MD_TRC_MCF_TR_DUMP_MCF_LID_FAIL(param_ptr->lid, mcf_ret);
+                    }
+
+                    break;
+
+                default:
+                    MD_TRC_MCF_TR_DUMP_MCF_LID_INVALID_TYPE(param_ptr->lid, param_ptr->type);
+                    ret =  KAL_FALSE;
+                    break;
+            }
+            break;
+        }
+
+        default:
+            MD_TRC_MCF_TR_DUMP_MCF_LID_UNKNOWN_LID(param_ptr->lid);
+            ret =  KAL_FALSE;
+            break;
+    }
+
+    return ret;
+}
+
+kal_bool mcf_auto_select_tlvota_file(sbp_reconfig_custom_param_struct *param_ptr)
+{
+    mcf_t                                  *pMcf = &mcf_inst_g;
+    sim_interface_enum                      sim_id = l4c_gemini_get_actual_sim_id(param_ptr->ps_id);
+    mcf_tlvota_file_t                      *tlvota_file;
+    kal_char                                file_name[MCF_FILE_MAX_NAME_LEN];
+    kal_char                                apply_filename[MCF_FILE_MAX_NAME_LEN];
+    kal_wchar                               fs_filename[MCF_FILE_MAX_MD_PATH_LEN + MCF_FILE_MAX_NAME_LEN];
+    kal_char                                file_path[MCF_FILE_MAX_MD_PATH_LEN];
+    l4c_mcf_path_type_enum                  apply_path_type = L4C_MCF_PATH_TYPE_OTA;
+    em_mcf_read_ota_file_info_struct        read_file_info = {0};
+    FS_FileDetail                           fs_file_detail[L4C_MCF_PATH_TYPE_MAX] = {0};
+    mcf_ota_result_e                        mcf_ret;
+    mcf_ota_result_e                        gen_mcf_ret;
+    kal_bool                                ret = KAL_TRUE;
+    kal_bool                                gen_ret = KAL_TRUE;
+    kal_int32                               fs_api_ret[L4C_MCF_PATH_TYPE_MAX];
+    kal_uint32                              i;
+    kal_uint32                              ret_sprintf;
+    mcf_tool_file_info_t                   *pFile;
+    mcf_tlvota_sbp_tag_t                    sbp_tag;
+    kal_bool                                is_read_nvram = KAL_FALSE;
+    kal_char                                tool_version[MCF_FILE_MAX_TOOL_VERSION_LEN]={0};
+    mcf_ota_result_e                        tlvota_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+    kal_uint64                              last_mod_time = 0;
+    kal_uint32                              start_time = GET_CURRENT_TIME();
+
+    MD_TRC_MCF_TR_AUTO_SELECT_BIN_START(param_ptr->ps_id, sim_id, param_ptr->sbp_id, param_ptr->mcc, param_ptr->mnc);
+    
+    if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+        MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_INVALID_SIM_ID(param_ptr->ps_id, sim_id);
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+        ret = KAL_FALSE;
+
+        return ret;
+    }
+
+    tlvota_file = &(pMcf->tlvota_file[sim_id]);
+    
+    sbp_tag.sbp_id = param_ptr->sbp_id;
+    kal_mem_cpy(sbp_tag.mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
+    kal_mem_cpy(sbp_tag.mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
+    
+    kal_mem_set(&mcf_tlvota_last_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_general_tlvota_last_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
+    kal_mem_set(&mcf_general_tlvota_curr_mod_lid_g[sim_id], 0, sizeof(nvram_mcf_lid_info_struct));
+    
+    
+    if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+		/* Read MCF General TLV-OTA info into cache buffer */
+		if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+			MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+			ret = KAL_FALSE;
+		}
+		is_read_nvram = KAL_TRUE;
+		
+		if(is_read_tlvota[sim_id] == KAL_TRUE){
+			kal_mem_cpy(&mcf_tlvota_last_mod_lid_g[sim_id], &nv_int_info.tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)	
+			if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE) != MCF_OTA_R_SUCCESS){
+				ret = KAL_FALSE;
+			}
+#else
+			if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE, nv_int_info.not_reset_tlvota[sim_id], KAL_FALSE) != MCF_OTA_R_SUCCESS){
+				ret = KAL_FALSE;
+			}
+#endif
+			is_update_tlvota[sim_id] = KAL_TRUE;
+		}
+	}
+    
+    if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
+		/* Read MCF General TLV-OTA info into cache buffer */
+		if(is_read_nvram == KAL_FALSE){
+            if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+                MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+                ret = KAL_FALSE;
+            }
+            is_read_nvram = KAL_TRUE;
+        }
+		
+		if(is_read_general_tlvota[sim_id] == KAL_TRUE){
+			kal_mem_cpy(&mcf_general_tlvota_last_mod_lid_g[sim_id], &nv_int_info.general_tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)			
+			if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE) != MCF_OTA_R_SUCCESS){
+				ret = KAL_FALSE;
+			}
+#else
+			if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE, nv_int_info.not_reset_general_tlvota, KAL_FALSE) != MCF_OTA_R_SUCCESS){
+				ret = KAL_FALSE;
+			}
+#endif
+			is_update_tlvota[sim_id] = KAL_TRUE;
+		}
+	}
+    
+
+    MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+    if (tlvota_file){
+        tlvota_file->sbp_id = param_ptr->sbp_id;
+        tlvota_file->ps_id = param_ptr->ps_id;
+        kal_mem_cpy(tlvota_file->mcc, param_ptr->mcc, MAX_MCC_STR_LEN);
+        kal_mem_cpy(tlvota_file->mnc, param_ptr->mnc, MAX_MNC_STR_LEN);
+        kal_mem_cpy(tlvota_file->iccid, param_ptr->iccid, 21);
+        
+        MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+
+        // Check if need to auto select TLV-OTA file
+        if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+            MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_NO_NEED(pMcf->is_ignore_dsbp[sim_id]);
+            com_Mcf.tlvota_result[sim_id] = set_op_read_ret[sim_id];
+            goto read_gengeral_opota;
+        }
+    }else {
+        MD_TRC_MCF_TR_AUTO_SELECT_BIN_TLVOTA_FILE_TAKE_WRITE_LOCK_FAIL();
+        ret = KAL_FALSE;
+
+        // Check if need to auto select TLV-OTA file
+        if (pMcf->is_ignore_dsbp[sim_id] == KAL_TRUE) {
+            MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_NO_NEED(pMcf->is_ignore_dsbp[sim_id]);
+            com_Mcf.tlvota_result[sim_id] = set_op_read_ret[sim_id];
+            goto read_gengeral_opota;
+        }
+
+        goto read_gengeral_opota;
+    }
+
+    ret_sprintf = kal_snprintf(file_name, MCF_FILE_MAX_NAME_LEN - 1, "%s_%d.mcfopota%c", MCF_FS_TLVOTA_FILE_PREFIX, tlvota_file->sbp_id, '\0');
+    if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+        MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_TLVOTA_FILE_FILENAME_ERROR(tlvota_file->sbp_id, ret_sprintf);
+        ret = KAL_FALSE;
+        return ret;
+    }
+
+    /* Compare modified time of OP-OTA file to select which file to be applied */
+    kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, file_name);
+    fs_api_ret[L4C_MCF_PATH_TYPE_OTA] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_OTA]);
+    MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_FILE_MODIFIED_TIME(tlvota_file->sbp_id, L4C_MCF_PATH_TYPE_OTA, fs_api_ret[L4C_MCF_PATH_TYPE_OTA],
+                    (kal_uint32)((fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime >> 32) & 0xFFFFFFFF), (kal_uint32)(fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime & 0xFFFFFFFF));
+    if (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] != FS_NO_ERROR) {
+        kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_OTA], 0, sizeof(FS_FileDetail));
+    }
+
+    kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, file_name);
+    fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME]);
+    MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_FILE_MODIFIED_TIME(tlvota_file->sbp_id, L4C_MCF_PATH_TYPE_RUNTIME, fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME],
+                    (kal_uint32)((fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime >> 32) & 0xFFFFFFFF), (kal_uint32)(fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime & 0xFFFFFFFF));
+    if (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] != FS_NO_ERROR) {
+        kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME], 0, sizeof(FS_FileDetail));
+    }
+
+    if ( (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] == FS_NO_ERROR) || (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] == FS_NO_ERROR) ) {
+        if (fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime > fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime) {
+            ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_DEFAULT_FOLDER_PATH, '\0');
+            if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                strncpy(file_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
+                file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
+            }
+            last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime;
+        } else {
+            ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_CUSTOM_FOLDER_PATH, '\0');
+            if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                strncpy(file_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
+                file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
+            }
+            last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime;
+        }
+    } else {
+        MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_FILE_COMPARE_FAIL();
+        ret = KAL_FALSE;
+        tlvota_ret = MCF_OTA_R_READ_OTA_FILE_FAIL;
+
+        goto read_gengeral_opota;
+    }
+
+    read_file_info.trigger_type = EM_MCF_TRIGGER_TYPE_BY_SIM;
+    read_file_info.config_type = L4C_MCF_CONFIG_TYPE_CARRIER_BIN;
+    read_file_info.ps_id = tlvota_file->ps_id;
+    read_file_info.start_time = kal_get_systicks();
+
+    // last updated file information
+    mcf_make_file_info(&old_file_info, tlvota_file->last_file.path_type, tlvota_file->last_file.name, tlvota_file->last_file.sw_version, tlvota_file->last_file.sw_version_len, tlvota_file->last_file.gen_time, tlvota_file->last_file.gen_time_len, tlvota_file->last_file.last_mod_time, tlvota_file->last_file.checksum);
+    
+    mcf_ret = mcf_read_tlvota_file(KAL_FALSE, sim_id, file_path, file_name, &apply_path_type, apply_filename, pMcf);
+    tlvota_ret = mcf_ret;
+
+
+    if (mcf_ret == MCF_OTA_R_SUCCESS) {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+        
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file){
+            // current updated file information
+            mcf_make_file_info(&new_file_info, apply_path_type, apply_filename, &(pFile->buff_start), pFile->sw_version_len, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len, last_mod_time, pFile->checksum);
+            /* Check TLV-OTA is need update */
+            if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
+                // Need to update TLV-OTA file
+                com_Mcf.update_tlvota[sim_id] = KAL_TRUE;
+                
+                /* Do not reset LIDs if the same file as last one */
+                is_read_tlvota[sim_id] = KAL_TRUE;
+                
+                /* Store last updated file informantion */
+                /* Store TLV-OTA file information */
+                tlvota_file->last_file.path_type = apply_path_type;
+                strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+                if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+                    strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+                    tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+                    tlvota_file->last_file.sw_version_len = pFile->sw_version_len;
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_SW_VERSION(tlvota_file->last_file.sw_version);
+                } else {
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_SW_VERSION(pFile->sw_version_len);
+                }
+                if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+                    strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+                    tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+                    tlvota_file->last_file.gen_time_len = pFile->gen_time_len;
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_GEN_TIME(tlvota_file->last_file.gen_time);
+                } else {
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_GEN_TIME(pFile->gen_time_len);
+                }
+                if (pFile->tool_version_len < MCF_FILE_MAX_TOOL_VERSION_LEN && pFile->tool_version_len > 0) {
+                    strncpy(tool_version, (&(pFile->buff_start) + pFile->sw_version_len + pFile->gen_time_len), pFile->tool_version_len);
+                    tool_version[pFile->tool_version_len] = '\0';
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_TOOL_VERSION(tool_version);
+                } else if (pFile->tool_version_len >= MCF_FILE_MAX_TOOL_VERSION_LEN){
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_TOOL_VERSION(pFile->tool_version_len);
+                }
+
+                tlvota_file->last_file.checksum = pFile->checksum;
+                tlvota_file->last_file.last_mod_time = last_mod_time;
+                tlvota_file->last_file.sw_version_len = pFile->sw_version_len;
+                tlvota_file->last_file.gen_time_len = pFile->gen_time_len;
+            }else{
+                if (com_Mcf.update_tlvota[sim_id] != KAL_TRUE){
+                    tlvota_ret = mcf_ret;
+                    
+                    //TLV-OTA file does not change. No need to trigger dsbp.
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_TLVOTA_FILE_NOT_CHANGE(apply_path_type, com_Mcf.update_tlvota[sim_id]);
+                }
+            }
+            /* Check if file type is TLV-OTA file */
+            if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+                kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+                mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+                MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_FILE(str_tmp);
+                tlvota_ret = MCF_OTA_R_INVALID_FILE;
+            }
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        }
+        read_file_info.path_type = apply_path_type;
+        strncpy(read_file_info.file_name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+    } else {
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+        /* Store last updated file informantion */
+        MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        if (tlvota_file){
+            mcf_make_file_info(&new_file_info, apply_path_type, apply_filename, &(pFile->buff_start), pFile->sw_version_len, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len, last_mod_time, pFile->checksum);
+            /* Check TLV-OTA is need update */
+            if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
+                com_Mcf.update_tlvota[sim_id] = KAL_TRUE;
+            }
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        }
+        MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_FILE_FAIL(mcf_ret);
+        ret = KAL_FALSE;
+    }
+    
+    read_file_info.result = mcf_ret;
+    read_file_info.end_time = kal_get_systicks();
+
+    mcf_em_send_ota_file_info(&read_file_info);
+
+    com_Mcf.tlvota_result[sim_id] = tlvota_ret;
+    
+read_gengeral_opota:
+    // TODO: general OP-OTA file CHR implementation
+
+    // Check if need to auto select TLV-OTA file
+    if (pMcf->general_is_ignore_dsbp == KAL_TRUE) {
+        MD_TRC_MCF_TR_AUTO_SELECT_BIN_GENERAL_TLVOTA_FILE_NO_NEED(pMcf->general_is_ignore_dsbp);
+        return ret;
+    }
+    tlvota_file = &(pMcf->general_tlvota_file);
+    ret_sprintf = kal_snprintf(file_name, MCF_FILE_MAX_NAME_LEN - 1, "%s%c", MCF_FS_GENERAL_TLVOTA_FILE_NAME, '\0');
+    if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_NAME_LEN){
+        strncpy(file_name, MCF_FS_GENERAL_TLVOTA_FILE_NAME, MCF_FILE_MAX_NAME_LEN-1);
+        file_name[MCF_FILE_MAX_NAME_LEN-1] = '\0';
+    }
+
+    /* Compare modified time of general OP-OTA file to select which file to be applied */
+    kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_DEFAULT_FOLDER_PATH, file_name);
+    fs_api_ret[L4C_MCF_PATH_TYPE_OTA] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_OTA]);
+    MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_MODIFIED_TIME(L4C_MCF_PATH_TYPE_OTA, fs_api_ret[L4C_MCF_PATH_TYPE_OTA],
+                    (kal_uint32)((fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime >> 32) & 0xFFFFFFFF), (kal_uint32)(fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime & 0xFFFFFFFF));
+    if (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] != FS_NO_ERROR) {
+        kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_OTA], 0, sizeof(FS_FileDetail));
+    }
+
+    kal_wsprintf(fs_filename, "%s\\%s\0", MCF_FS_CUSTOM_FOLDER_PATH, file_name);
+    fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] = FS_GetFileDetail(fs_filename, &fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME]);
+    MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_MODIFIED_TIME(L4C_MCF_PATH_TYPE_RUNTIME, fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME],
+                    (kal_uint32)((fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime >> 32) & 0xFFFFFFFF), (kal_uint32)(fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime & 0xFFFFFFFF));
+    if (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] != FS_NO_ERROR) {
+        kal_mem_set(&fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME], 0, sizeof(FS_FileDetail));
+    }
+
+    if ( (fs_api_ret[L4C_MCF_PATH_TYPE_OTA] == FS_NO_ERROR) || (fs_api_ret[L4C_MCF_PATH_TYPE_RUNTIME] == FS_NO_ERROR) ) {
+        if (fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime > fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime) {
+            if (tlvota_file->last_mod_time == fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime) {
+                // General TLV-OTA file does not change. No need to read again.
+                MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_NOT_CHANGE(L4C_MCF_PATH_TYPE_OTA);
+                goto out;
+            } else {
+                ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_DEFAULT_FOLDER_PATH, '\0');
+                if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                    strncpy(file_path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
+                    file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
+                }
+                last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_OTA].LastStatusChangeTime;
+            }
+        } else {
+            if (tlvota_file->last_mod_time == fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime) {
+                // General TLV-OTA file does not change. No need to read again.
+                MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_NOT_CHANGE(L4C_MCF_PATH_TYPE_RUNTIME);
+                goto out;
+            } else {
+                ret_sprintf = kal_snprintf(file_path, MCF_FILE_MAX_MD_PATH_LEN - 1, "%s%c", MCF_FS_CUSTOM_FOLDER_PATH, '\0');
+                if (ret_sprintf < 0 || ret_sprintf > MCF_FILE_MAX_MD_PATH_LEN){
+                    strncpy(file_path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN-1);
+                    file_path[MCF_FILE_MAX_MD_PATH_LEN-1] = '\0';
+                }
+                last_mod_time = fs_file_detail[L4C_MCF_PATH_TYPE_RUNTIME].LastStatusChangeTime;
+            }
+        }
+    } else {
+        MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_COMPARE_FAIL();
+        gen_ret = KAL_FALSE;
+
+        goto out;
+    }
+    
+    mcf_make_file_info(&old_file_info, tlvota_file->last_file.path_type, tlvota_file->last_file.name, tlvota_file->last_file.sw_version, tlvota_file->last_file.sw_version_len, tlvota_file->last_file.gen_time, tlvota_file->last_file.gen_time_len, tlvota_file->last_file.last_mod_time, tlvota_file->last_file.checksum);
+    gen_mcf_ret = mcf_read_general_tlvota_file(KAL_FALSE, file_path, file_name, &apply_path_type, apply_filename, pMcf);
+
+    if (gen_mcf_ret != MCF_OTA_R_SUCCESS) {
+        MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_FAIL(gen_mcf_ret);
+        gen_ret = KAL_FALSE;
+        pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		/* Store last updated file informantion */
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file){
+			mcf_make_file_info(&new_file_info, apply_path_type, apply_filename, &(pFile->buff_start), pFile->sw_version_len, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len, last_mod_time, pFile->checksum);
+            if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
+                //If General TLV-OTA update, every SIM need to update
+                for (i = 0; i < MAX_SIM_NUM; i++){
+                    is_read_general_tlvota[i] = KAL_TRUE;
+                    com_Mcf.update_general_tlvota[i] = KAL_TRUE;
+                }
+            }
+            MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+        }
+    }else{
+		pFile = (mcf_tool_file_info_t *)(tlvota_file->buff);
+		/* Store last updated file informantion */
+		MCF_W_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		if (tlvota_file){
+			mcf_make_file_info(&new_file_info, apply_path_type, apply_filename, &(pFile->buff_start), pFile->sw_version_len, (&(pFile->buff_start) + pFile->sw_version_len), pFile->gen_time_len, last_mod_time, pFile->checksum);
+            
+            /* Check TLV-OTA is need update */
+            if (mcf_compare_file_info(&old_file_info, &new_file_info) == KAL_FALSE){
+                //If General TLV-OTA update, every SIM need to update
+                for (i = 0; i < MAX_SIM_NUM; i++){
+                    is_read_general_tlvota[i] = KAL_TRUE;
+                    com_Mcf.update_general_tlvota[i] = KAL_TRUE;
+                }
+                //Store file information
+                tlvota_file->last_file.path_type = apply_path_type;
+                strncpy(tlvota_file->last_file.name, apply_filename, MCF_FILE_MAX_NAME_LEN - 1);
+                if (pFile->sw_version_len < MCF_FILE_MAX_SW_VERSION_LEN) {
+                    strncpy(tlvota_file->last_file.sw_version, &(pFile->buff_start), pFile->sw_version_len);
+                    tlvota_file->last_file.sw_version[pFile->sw_version_len] = '\0';
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_SW_VERSION(tlvota_file->last_file.sw_version);
+                } else {
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_SW_VERSION(pFile->sw_version_len);
+                }
+                if (pFile->gen_time_len < MCF_FILE_MAX_GEN_TIME_LEN) {
+                    strncpy(tlvota_file->last_file.gen_time, &(pFile->buff_start) + pFile->sw_version_len, pFile->gen_time_len);
+                    tlvota_file->last_file.gen_time[pFile->gen_time_len] = '\0';
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_GEN_TIME(tlvota_file->last_file.gen_time);
+                } else {
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_GEN_TIME(pFile->gen_time_len);
+                }
+                if (pFile->tool_version_len < MCF_FILE_MAX_TOOL_VERSION_LEN && pFile->tool_version_len > 0) {
+                    strncpy(tool_version, (&(pFile->buff_start) + pFile->sw_version_len + pFile->gen_time_len), pFile->tool_version_len);
+                    tool_version[pFile->tool_version_len] = '\0';
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_FILE_TOOL_VERSION(tool_version);
+                } else if (pFile->tool_version_len >= MCF_FILE_MAX_TOOL_VERSION_LEN){
+                    MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_TOOL_VERSION(pFile->tool_version_len);
+                }
+                tlvota_file->last_file.checksum = pFile->checksum;
+                tlvota_file->last_file.last_mod_time = last_mod_time;
+                tlvota_file->last_file.sw_version_len = pFile->sw_version_len;
+                tlvota_file->last_file.gen_time_len = pFile->gen_time_len;
+            }else{
+                //General TLV-OTA file does not change. No need to read again.
+                MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_GENERAL_FILE_NOT_CHANGE(apply_path_type);
+            }
+            /* Check if file type is TLV-OTA file */
+            if (strcmp(pFile->file_type, MCF_FILE_TYPE_TLVOTA) != 0) {
+                kal_char    str_tmp[MCF_MAX_DHL_LOGGING_LEN] = {0};
+                mcf_snprintf(str_tmp, MCF_MAX_DHL_LOGGING_LEN - 1, "%s", pFile->file_type);
+                MD_TRC_MCF_TR_AUTO_SELECT_BIN_INVALID_FILE(str_tmp);
+                gen_mcf_ret = MCF_OTA_R_INVALID_FILE;
+            }
+			MCF_W_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+		}
+		
+	}
+
+out:
+    if ( (ret == KAL_TRUE) || (gen_ret == KAL_TRUE) ) {
+        ret = KAL_TRUE;
+    } else {
+        ret = KAL_FALSE;
+    }
+    
+	
+	/* If have updated, store modified LIDs */
+    if (com_Mcf.update_tlvota[sim_id] == KAL_TRUE){
+		nv_int_info.update_tlvota_result[sim_id] = KAL_FALSE;
+		if(is_read_nvram == KAL_FALSE){
+			/* Read MCF TLV-OTA file info into cache buffer */
+			if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+				MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+				ret = KAL_FALSE;
+			}
+			is_read_nvram = KAL_TRUE;
+		}
+		
+		kal_mem_cpy(&mcf_tlvota_last_mod_lid_g[sim_id], &nv_int_info.tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+		if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE) != MCF_OTA_R_SUCCESS){
+			ret = KAL_FALSE;
+		}
+#else
+		if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_FALSE, nv_int_info.not_reset_tlvota[sim_id], KAL_FALSE) != MCF_OTA_R_SUCCESS){
+			ret = KAL_FALSE;
+		}
+#endif
+		is_update_tlvota[sim_id] = KAL_TRUE;
+	}
+	if (is_read_general_tlvota[sim_id] == KAL_TRUE){
+		nv_int_info.update_general_tlvota_result = KAL_FALSE;
+		if(is_read_nvram == KAL_FALSE){
+			/* Read MCF TLV-OTA file info into cache buffer */
+			if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+				MD_TRC_MCF_TR_AUTO_SELECT_BIN_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+				ret = KAL_FALSE;
+			}
+			is_read_nvram = KAL_TRUE;
+		}
+		kal_mem_cpy(&mcf_general_tlvota_last_mod_lid_g[sim_id], &nv_int_info.general_tlvota_last_mod_lid[sim_id], sizeof(nvram_mcf_lid_info_struct));
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+		if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE) != MCF_OTA_R_SUCCESS){
+			ret = KAL_FALSE;
+		}
+#else
+		if(mcf_store_tlvota_modified_lid(sim_id, sbp_tag, KAL_TRUE, nv_int_info.not_reset_general_tlvota, KAL_FALSE) != MCF_OTA_R_SUCCESS){
+			ret = KAL_FALSE;
+		}
+#endif
+		
+		is_update_tlvota[sim_id] = KAL_TRUE;
+	}
+	MD_TRC_MCF_TR_AUTO_SELECT_BIN_DURATION(CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
+
+    return ret;
+}
+
+kal_bool mcf_set_config_after_dsbp(protocol_id_enum ps_id)
+{
+    kal_bool                      ret = KAL_TRUE;
+    sim_interface_enum            sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+	nvram_ef_mcf_sw_info_struct   nv_sw_info;
+	mcf_t                        *pMcf = mcf_get_instance();
+	mcf_tlvota_file_t            *tlvota_file;
+	kal_uint32                    start_time = GET_CURRENT_TIME();
+	
+	if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+        MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_INVALID_SIM_ID(ps_id, sim_id);
+
+        return KAL_FALSE;
+    }
+	
+	tlvota_file = &(pMcf->tlvota_file[sim_id]);
+	
+	MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_START(ps_id, is_update_tlvota[sim_id]);
+	
+	
+	
+	// When SIM have updated, need to reset to FALSE
+    if(com_Mcf.update_tlvota[sim_id] == KAL_TRUE){
+        com_Mcf.update_tlvota[sim_id] = KAL_FALSE;
+    }
+	
+	if (com_Mcf.update_general_tlvota[sim_id] == KAL_TRUE){
+		com_Mcf.update_general_tlvota[sim_id] = KAL_FALSE;
+	}
+
+    if (is_update_tlvota[sim_id] == KAL_TRUE){
+        kal_mem_set(&nv_int_info, 0, sizeof(nvram_ef_mcf_internal_info_struct));
+		/* Read MCF internal info into cache buffer */
+		if ( !nvram_external_read_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct))) {
+			MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_READ_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+			ret = KAL_FALSE;
+			return ret;
+		}
+		/* Read MCF sw info into cache buffer */
+		if ( !nvram_external_read_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+			MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_READ_LID_FAIL(NVRAM_EF_MCF_SW_INFO_LID);
+			ret = KAL_FALSE;
+			return ret;
+		}
+		
+		if(is_read_tlvota[sim_id] == KAL_TRUE){
+			kal_mem_cpy(&nv_int_info.tlvota_last_mod_lid[sim_id], &mcf_tlvota_curr_mod_lid_g[sim_id], sizeof(nvram_mcf_lid_info_struct));
+			is_read_tlvota[sim_id] = KAL_FALSE;
+			MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+            if (tlvota_file) {
+				/* Write updated MCF TLV-OTA file information to NVRAM */
+				strncpy(nv_sw_info.last_update_tlvota_file[sim_id].sw_version, tlvota_file->last_file.sw_version, MCF_FILE_MAX_SW_VERSION_LEN - 1);
+				strncpy(nv_sw_info.last_update_tlvota_file[sim_id].gen_time, tlvota_file->last_file.gen_time, MCF_FILE_MAX_GEN_TIME_LEN - 1);
+				strncpy(nv_sw_info.last_update_tlvota_file[sim_id].name, tlvota_file->last_file.name, MCF_FILE_MAX_NAME_LEN - 1);
+				if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA){
+					strncpy(nv_sw_info.last_update_tlvota_file[sim_id].path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				}else if(tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME){
+					strncpy(nv_sw_info.last_update_tlvota_file[sim_id].path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				}
+				MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			}else{
+				MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_TAKE_READ_LOCK_FAIL();
+			}
+		}
+		
+		if (is_read_general_tlvota[sim_id] == KAL_TRUE){
+			kal_mem_cpy(&nv_int_info.general_tlvota_last_mod_lid[sim_id], &mcf_general_tlvota_curr_mod_lid_g[sim_id], sizeof(nvram_mcf_lid_info_struct));
+			is_read_general_tlvota[sim_id] = KAL_FALSE;
+			tlvota_file = &(pMcf->general_tlvota_file);
+			MCF_R_LOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+            if (tlvota_file) {
+				/* Write updated MCF TLV-OTA file information to NVRAM */
+				strncpy(nv_sw_info.last_update_general_tlvota_file.sw_version, tlvota_file->last_file.sw_version, MCF_FILE_MAX_SW_VERSION_LEN - 1);
+				strncpy(nv_sw_info.last_update_general_tlvota_file.gen_time, tlvota_file->last_file.gen_time, MCF_FILE_MAX_GEN_TIME_LEN - 1);
+				strncpy(nv_sw_info.last_update_general_tlvota_file.name, tlvota_file->last_file.name, MCF_FILE_MAX_NAME_LEN - 1);
+				if (tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_OTA){
+					strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_DEFAULT_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				}else if(tlvota_file->last_file.path_type == L4C_MCF_PATH_TYPE_RUNTIME){
+					strncpy(nv_sw_info.last_update_general_tlvota_file.path, MCF_FS_CUSTOM_FOLDER_PATH, MCF_FILE_MAX_MD_PATH_LEN - 1);
+				}
+				MCF_R_UNLOCK_OBJECT(tlvota_file, mcf_enhmutex_g);
+			}else{
+				MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_TAKE_READ_LOCK_FAIL();
+			}
+		}
+
+		/* Write MCF internal info into NVRAM */
+		if ( !nvram_external_write_data(NVRAM_EF_MCF_INTERNAL_INFO_LID, 1, (kal_uint8 *)&nv_int_info, sizeof(nvram_ef_mcf_internal_info_struct)) ) {
+			MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_WRITE_LID_FAIL(NVRAM_EF_MCF_INTERNAL_INFO_LID);
+			ret = KAL_FALSE;
+			return ret;
+		}
+		/* Write MCF sw info into NVRAM */
+		if ( !nvram_external_write_data(NVRAM_EF_MCF_SW_INFO_LID, 1, (kal_uint8 *)&nv_sw_info, sizeof(nvram_ef_mcf_sw_info_struct))) {
+			MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_WRITE_LID_FAIL(NVRAM_EF_MCF_SW_INFO_LID);
+			ret = KAL_FALSE;
+			return ret;
+		}
+		
+		is_update_tlvota[sim_id] = KAL_FALSE;
+		
+    }
+	
+	MD_TRC_MCF_TR_SET_CONFIG_AFTER_DSBP_DURATION(CALCULATE_LETENCY_DURATION(start_time, GET_CURRENT_TIME()));
+	
+    return ret;
+}
+
+kal_bool mcf_check_lid_need_reset(nvram_lid_enum lid)
+{
+    kal_int16   pos1 = -1;
+    kal_int16   pos2 = -1;
+    kal_uint16  new_pos = 0;
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+	kal_bool    reset = KAL_FALSE;
+#endif
+    MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_START(lid);
+
+    /* Search last modified LID list */
+    if (mcf_last_mod_lid_g.lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+        /* If last modified LID list is full, all LIDs are needed to be reset */
+        return KAL_TRUE;
+    }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+    pos1 = mcf_binary_search_lid(lid, mcf_last_mod_lid_g.lid, mcf_last_mod_lid_g.lid_cnt, &new_pos);
+#else
+	pos1 = mcf_binary_search_lid_struct(lid, mcf_last_mod_lid_g.lid_conf, mcf_last_mod_lid_g.lid_cnt, &new_pos);
+	if(pos1 != -1 && pos1 >= 0){
+		if(nv_int_info.not_reset_ota == KAL_FALSE || mcf_last_mod_lid_g.lid_conf[pos1].not_reset == KAL_FALSE){
+			reset = KAL_TRUE;
+		}
+	}
+#endif
+
+    /* Search current modified LID list */
+    if (mcf_curr_mod_lid_g.lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+        /* If current modified LID list is full, all LIDs are needed to be reset */
+        return KAL_TRUE;
+    }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+    pos2 = mcf_binary_search_lid(lid, mcf_curr_mod_lid_g.lid, mcf_curr_mod_lid_g.lid_cnt, &new_pos);
+#else
+	pos2 = mcf_binary_search_lid_struct(lid, mcf_curr_mod_lid_g.lid_conf, mcf_curr_mod_lid_g.lid_cnt, &new_pos);
+    if(pos2 != -1 && pos2 >= 0){
+		if(nv_int_info.not_reset_ota == KAL_FALSE || mcf_curr_mod_lid_g.lid_conf[pos2].not_reset == KAL_FALSE){
+			reset = KAL_TRUE;
+		}
+	}
+#endif
+
+    if ( (pos1 != -1) || (pos2 != -1) ) {
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+		if (reset == KAL_TRUE)
+#endif
+		{
+			MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_FOUND(pos1, pos2);
+            return KAL_TRUE;
+		}
+    }
+
+    MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_NOT_FOUND(lid, pos1, pos2);
+
+    return KAL_FALSE;
+}
+
+kal_bool mcf_check_lid_need_reset_by_psid(nvram_lid_enum lid, kal_uint8 ps_id)
+{
+    kal_int16   pos1 = -1;
+    kal_int16   pos2 = -1;
+    kal_uint16  new_pos = 0;
+    sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+	kal_bool    reset = KAL_FALSE;
+#endif
+
+    MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_START(lid, ps_id);
+	
+	if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+        MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_INVALID_SIM_ID(ps_id, sim_id);
+
+        return KAL_FALSE;
+    }
+       
+    /* Search tlvota last modified LID list */
+    if (mcf_tlvota_last_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+        /* If last modified LID list is full, all LIDs are needed to be reset */
+        return KAL_TRUE;
+    }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+    pos1 = mcf_binary_search_lid(lid, mcf_tlvota_last_mod_lid_g[sim_id].lid, mcf_tlvota_last_mod_lid_g[sim_id].lid_cnt, &new_pos);
+#else
+	pos1 = mcf_binary_search_lid_struct(lid, mcf_tlvota_last_mod_lid_g[sim_id].lid_conf, mcf_tlvota_last_mod_lid_g[sim_id].lid_cnt, &new_pos);
+	if(pos1 != -1 && pos1 >= 0){
+		if(nv_int_info.not_reset_tlvota[sim_id] == KAL_FALSE || mcf_tlvota_last_mod_lid_g[sim_id].lid_conf[pos1].not_reset == KAL_FALSE){
+			reset = KAL_TRUE;
+		}
+	}
+#endif
+
+    /* Search tlvota current modified LID list */
+    if (mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+        /* If current modified LID list is full, all LIDs are needed to be reset */
+        return KAL_TRUE;
+    }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+    pos2 = mcf_binary_search_lid(lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &new_pos);
+#else
+	pos2 = mcf_binary_search_lid_struct(lid, mcf_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &new_pos);
+	if(pos2 != -1 && pos2 >= 0){
+		if(nv_int_info.not_reset_tlvota[sim_id] == KAL_FALSE || mcf_tlvota_curr_mod_lid_g[sim_id].lid_conf[pos2].not_reset == KAL_FALSE){
+			reset = KAL_TRUE;
+		}
+	}
+#endif
+
+    if ( (pos1 != -1) || (pos2 != -1) ) {
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+		if (reset == KAL_TRUE)
+#endif
+		{
+			MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_TLVOTA_FOUND(lid);
+            return KAL_TRUE;
+		}
+    }
+	
+	pos1 = -1;
+    pos2 = -1;
+	
+	/* Search general tlvota last modified LID list */
+    if (mcf_general_tlvota_last_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+        /* If last modified LID list is full, all LIDs are needed to be reset */
+        return KAL_TRUE;
+    }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+    pos1 = mcf_binary_search_lid(lid, mcf_general_tlvota_last_mod_lid_g[sim_id].lid, mcf_general_tlvota_last_mod_lid_g[sim_id].lid_cnt, &new_pos);
+#else
+	pos1 = mcf_binary_search_lid_struct(lid, mcf_general_tlvota_last_mod_lid_g[sim_id].lid_conf, mcf_general_tlvota_last_mod_lid_g[sim_id].lid_cnt, &new_pos);
+	if(pos1 != -1 && pos1 >= 0){
+		if(nv_int_info.not_reset_general_tlvota == KAL_FALSE || mcf_general_tlvota_last_mod_lid_g[sim_id].lid_conf[pos1].not_reset == KAL_FALSE){
+			reset = KAL_TRUE;
+		}
+	}
+#endif
+
+    /* Search general tlvota current modified LID list */
+    if (mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt >= NVRAM_MCF_SAVE_LAST_LID_CNT) {
+        /* If current modified LID list is full, all LIDs are needed to be reset */
+        return KAL_TRUE;
+    }
+#if !defined(__MCF_COMBINE_FILE_SUPPORT__)
+    pos2 = mcf_binary_search_lid(lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &new_pos);
+#else
+	pos2 = mcf_binary_search_lid_struct(lid, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_conf, mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_cnt, &new_pos);
+    if(pos2 != -1 && pos2 >= 0){
+		if(nv_int_info.not_reset_general_tlvota == KAL_FALSE || mcf_general_tlvota_curr_mod_lid_g[sim_id].lid_conf[pos2].not_reset == KAL_FALSE){
+			reset = KAL_TRUE;
+		}
+	}
+#endif
+
+    if ( (pos1 != -1) || (pos2 != -1) ) {
+#ifdef __MCF_COMBINE_FILE_SUPPORT__
+		if (reset == KAL_TRUE)
+#endif
+		{
+			MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_GENERAL_TLVOTA_FOUND(lid);
+            return KAL_TRUE;
+		}
+    }
+
+    MD_TRC_MCF_TR_CHECK_LID_NEED_RESET_BY_PSID_NOT_FOUND(lid);
+
+    return KAL_FALSE;
+}
+
+
+mcf_ota_result_e mcf_check_reset_and_tlvota_buffer_sbp_tag(kal_uint8 ps_id, mcf_tlvota_sbp_tag_t sbp_tag, nvram_lid_enum lid , kal_uint8 *buffer, kal_uint32 size, kal_uint16 record_idx)
+{
+    mcf_ota_result_e    ret = MCF_OTA_R_SUCCESS;
+    
+    if (!(buffer && (size > 0))) {
+        MD_TRC_MCF_TR_CHECK_RESET_AND_TLVOTA_BUFFER_SBP_TAG_INVALID_PARA(ps_id, lid, buffer, size);
+        ret = MCF_OTA_R_INVALID_PARAMETER;
+
+        return ret;
+    }
+    if(mcf_check_lid_need_reset_by_psid(lid, ps_id) == KAL_TRUE){
+        if (NVRAM_DEFAULT_VALUE_POINT != nvram_get_default_value(lid, ps_id, &buffer))
+        {
+            MD_TRC_MCF_TR_CHECK_RESET_AND_TLVOTA_BUFFER_SBP_TAG_GET_DEFAULT_VALUE_FAIL(lid);
+            ret = MCF_OTA_R_READ_NVRAM_FAIL;
+            return ret;
+        }
+    }else{
+        if ( !nvram_external_read_data(lid, record_idx, buffer, size)) {
+            ret = MCF_OTA_R_READ_NVRAM_FAIL;
+            return ret;
+        }
+    }
+    
+    ret = mcf_read_ota_buffer(lid, record_idx, buffer, size);
+    if (ret != MCF_OTA_R_SUCCESS){
+        return ret;
+    }
+    ret = mcf_read_tlvota_buffer_sbp_tag(ps_id, sbp_tag, lid, buffer, size);
+    
+    return ret;
+}
+
+kal_bool mcf_check_ota_need_update(protocol_id_enum ps_id, mcf_tlvota_sbp_tag_t sbp_tag, kal_uint8* iccid)
+{
+    kal_bool is_need_update = KAL_FALSE;
+    kal_bool ret = KAL_FALSE;
+    sbp_reconfig_custom_param_struct param_ptr;
+	sim_interface_enum sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+	
+	if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+		MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_INVALID_SIM_ID(ps_id, sim_id);
+		ret = MCF_OTA_R_INVALID_PARAMETER;
+
+		return ret;
+	}
+
+    MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_START(ps_id, sbp_tag.sbp_id, sbp_tag.mcc, sbp_tag.mnc);
+    param_ptr.ps_id = ps_id;
+    param_ptr.sbp_id = sbp_tag.sbp_id;
+    kal_mem_cpy(param_ptr.mcc, sbp_tag.mcc, MAX_MCC_STR_LEN);
+    kal_mem_cpy(param_ptr.mnc, sbp_tag.mnc, MAX_MNC_STR_LEN);
+    kal_mem_cpy(param_ptr.iccid, iccid, 21);
+    
+    
+    ret = mcf_auto_select_tlvota_file(&param_ptr);
+    if (ret == KAL_FALSE){
+        is_need_update = KAL_FALSE;
+        MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_FAIL(ps_id, ret);
+    }
+    
+    if (com_Mcf.update_tlvota[sim_id] == KAL_TRUE || com_Mcf.update_general_tlvota[sim_id] == KAL_TRUE){
+        is_need_update = KAL_TRUE;
+    }
+    MD_TRC_MCF_TR_CHECK_OTA_NEED_UPDATE_RESULT(ps_id, is_need_update);
+
+    return is_need_update;
+}
+
+mcf_ota_result_e mcf_get_tlvota_file_result(protocol_id_enum ps_id){
+    mcf_ota_result_e      mcf_ret = MCF_OTA_R_SUCCESS;
+    sim_interface_enum    sim_id = l4c_gemini_get_actual_sim_id(ps_id);
+    
+    MD_TRC_MCF_TR_GET_TLVOTA_FILE_RESULT_START(ps_id);
+	
+	if (sim_id < 0 || sim_id >= MAX_SIM_NUM){
+        MD_TRC_MCF_TR_GET_TLVOTA_FILE_RESULT_INVALID_SIM_ID(ps_id, sim_id);
+        mcf_ret = MCF_OTA_R_INVALID_PARAMETER;
+        return mcf_ret;
+    }
+    
+    mcf_ret = com_Mcf.tlvota_result[sim_id];
+    com_Mcf.tlvota_result[sim_id] = MCF_OTA_R_INVALID_PARAMETER;
+    
+    MD_TRC_MCF_TR_GET_TLVOTA_FILE_RESULT_RETURN_RESULT(ps_id, mcf_ret);
+    
+    return mcf_ret;
+}