Merge "[BugFix][audio][API-1405] sos occasional call probability no sound problem, optimize dialing process" into GSW3.0-No-Connman
diff --git a/meta/meta-mediatek-mt2735/recipes-core/images/mtk-image-2735.bb b/meta/meta-mediatek-mt2735/recipes-core/images/mtk-image-2735.bb
index 7a28f31..68e4183 100755
--- a/meta/meta-mediatek-mt2735/recipes-core/images/mtk-image-2735.bb
+++ b/meta/meta-mediatek-mt2735/recipes-core/images/mtk-image-2735.bb
@@ -217,6 +217,15 @@
        echo "${NATA_SERIAL_NUMBER}" >> ${IMAGE_ROOTFS}/sdcard/nata_serial.txt
 }
 ROOTFS_POSTPROCESS_COMMAND += " gen_feature_property;"
+
+set_tmpconfig() {
+       echo "x /tmp/ap_speech" >> ${IMAGE_ROOTFS}/usr/lib/tmpfiles.d/tmp.conf
+       echo "x /tmp/audio_ctrl_service" >> ${IMAGE_ROOTFS}/usr/lib/tmpfiles.d/tmp.conf
+       echo "x /tmp/libmodem-afe-ctrl" >> ${IMAGE_ROOTFS}/usr/lib/tmpfiles.d/tmp.conf
+       echo "x /tmp/tel_demo_single_proc.lock" >> ${IMAGE_ROOTFS}/usr/lib/tmpfiles.d/tmp.conf
+}
+ROOTFS_POSTPROCESS_COMMAND += " set_tmpconfig;"
+
 #xf.li 2022.11.17 modify for userdata recover start
 do_packdata() {
 	origin=$(pwd)
diff --git a/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover b/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
index cc27802..97e16c4 100644
--- a/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
+++ b/meta/meta-mediatek-mt2735/recipes-core/initial/files/lynq_data_recover
@@ -84,8 +84,38 @@
     format_ubi
 
 }
-cd /
+recover_tmp_conf()
+{
+    FIND_FILE="/usr/lib/tmpfiles.d/tmp.conf"
+    FIND_STR="x /tmp/ap_speech"
 
+    if [ `grep -c "$FIND_STR" $FIND_FILE` -ne '0' ];then
+        echo "This str exit" > /dev/kmsg
+    else
+        echo "$FIND_STR" >> "$FIND_FILE"
+    fi 
+    FIND_STR2="x /tmp/audio_ctrl_service"
+    if [ `grep -c "$FIND_STR2" $FIND_FILE` -ne '0' ];then
+        echo "This str2 exit" > /dev/kmsg
+    else
+        echo "$FIND_STR2" >> "$FIND_FILE"
+    fi 
+    FIND_STR3="x /tmp/libmodem-afe-ctrl"
+    if [ `grep -c "$FIND_STR3" $FIND_FILE` -ne '0' ];then
+        echo "This str3 exit" > /dev/kmsg
+    else
+        echo "$FIND_STR3" >> "$FIND_FILE"
+    fi 
+    FIND_STR4="x /tmp/tel_demo_single_proc.lock"
+    if [ `grep -c "$FIND_STR4" $FIND_FILE` -ne '0' ];then
+        echo "This str4 exit" > /dev/kmsg
+    else
+        echo "$FIND_STR4" >> "$FIND_FILE"
+    fi
+}
+
+cd /
+#recover some files start
 echo "$TAG: Before recover radio_property" > /dev/kmsg
 rm -rf /etc/config/.*.uci*
 
@@ -94,6 +124,8 @@
 cp /data_backup/terminal_controller.conf /data/atsvc/terminal_controller.conf
 echo "$TAG: After recover radio_property" > /dev/kmsg
 
+recover_tmp_conf
+#recover some files end
 IFRO="$(cat /sys/class/ubi/ubi1/ro_mode)"
 echo "$TAG the ro_mode:$IFRO" > /dev/kmsg
 
diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb
index 49244e3..3304725 100755
--- a/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-data/liblynq-data.bb
@@ -3,7 +3,7 @@
 DESCRIPTION = "lynq call"

 LICENSE = "MediaTekProprietary"

 LIC_FILES_CHKSUM = "file://LICENSE;md5=e1696b147d49d491bcb4da1a57173fff"

-DEPENDS += "platform-libs audio-mixer-ctrl libpal gstreamer1.0 glib-2.0 dtmf libapn liblynq-log liblynq-shm"

+DEPENDS += "platform-libs audio-mixer-ctrl libpal gstreamer1.0 glib-2.0 dtmf libapn liblynq-log liblynq-shm liblynq-uci"

 inherit workonsrc

 WORKONSRC = "${TOPDIR}/../src/lynq/lib/liblynq-data"

 

diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/suspend-service/files/autosuspend_wakeup_count.c b/meta/meta-mediatek-mt2735/recipes-lynq/suspend-service/files/autosuspend_wakeup_count.c
index 8e78587..fd8e9dd 100755
--- a/meta/meta-mediatek-mt2735/recipes-lynq/suspend-service/files/autosuspend_wakeup_count.c
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/suspend-service/files/autosuspend_wakeup_count.c
@@ -322,11 +322,12 @@
        if(adb_debug_mode == 2)
         {
             system("echo 12 | emdlogger_ctrl");
+            sleep(1);
+            system("echo 6 | emdlogger_ctrl");//start modem log SD mode
         }
         else
         {
-            system("mdlogctl start");
-            system("echo 8 | emdlogger_ctrl");
+            system("echo 6 | emdlogger_ctrl");//start modem log SD mode
         }
 
        usleep(200000); 
@@ -336,18 +337,18 @@
 
     if (lynq_screen(1) != 0)  // notify ril for screen on
     {
-    ALOGI("lynq_screen on fail\n");
-
+        ALOGI("lynq_screen on fail\n");
     }
 
      if(adb_debug_mode == 2)
     {
         system("echo 12 | emdlogger_ctrl");
+        sleep(1);
+        system("echo 6 | emdlogger_ctrl");//start modem log SD mode
     }
      else
     {
-        system("mdlogctl start");
-        system("echo 8 | emdlogger_ctrl");
+        system("echo 6 | emdlogger_ctrl");//start modem log SD mode
     }
 
     usleep(300000); //delay 2s for ril handling screen on,at least 70ms
diff --git a/src/bsp/lk/platform/mt2735/drivers/rtc/rtc.c b/src/bsp/lk/platform/mt2735/drivers/rtc/rtc.c
index df570c8..3620798 100644
--- a/src/bsp/lk/platform/mt2735/drivers/rtc/rtc.c
+++ b/src/bsp/lk/platform/mt2735/drivers/rtc/rtc.c
@@ -888,8 +888,10 @@
         check_mode_flag = true;
     }
 
+	/*
     RTC_LOG("%s#1 powerkey1 = 0x%x, powerkey2 = 0x%x, %s LPD\n", __func__, RTC_Read(RTC_POWERKEY1), RTC_Read(RTC_POWERKEY2)
              , (RTC_Read(RTC_CON) & RTC_CON_LPSTA_RAW) ? "with" : "without" );
+			 */
 
     RTC_LOG("bbpu = 0x%x, con = 0x%x, osc32con = 0x%x, sec = 0x%x, yea = 0x%x\n", RTC_Read(RTC_BBPU), RTC_Read(RTC_CON), RTC_Read(RTC_OSC32CON)
              , RTC_Read(RTC_AL_SEC), RTC_Read(RTC_AL_YEA));
@@ -900,7 +902,7 @@
         }
     } else {
         /* normally HW reload is done in BROM but check again here */
-        RTC_LOG("%s#2 powerkey1 = 0x%x, powerkey2 = 0x%x\n", __func__, RTC_Read(RTC_POWERKEY1), RTC_Read(RTC_POWERKEY2));
+        //RTC_LOG("%s#2 powerkey1 = 0x%x, powerkey2 = 0x%x\n", __func__, RTC_Read(RTC_POWERKEY1), RTC_Read(RTC_POWERKEY2));
         RTC_Write(RTC_BBPU, RTC_Read(RTC_BBPU) | RTC_BBPU_KEY | RTC_BBPU_RELOAD);
         if (!Write_trigger()) {
             rtc_recovery_flow();
@@ -910,7 +912,7 @@
             } else {
                 RTC_LOG("%s Writeif_unlock\n", __func__);
                 if (RTC_Read(RTC_POWERKEY1) != RTC_POWERKEY1_KEY || RTC_Read(RTC_POWERKEY2) != RTC_POWERKEY2_KEY) {
-                    RTC_LOG("%s#3 powerkey1 = 0x%x, powerkey2 = 0x%x\n", __func__, RTC_Read(RTC_POWERKEY1), RTC_Read(RTC_POWERKEY2));
+                    //RTC_LOG("%s#3 powerkey1 = 0x%x, powerkey2 = 0x%x\n", __func__, RTC_Read(RTC_POWERKEY1), RTC_Read(RTC_POWERKEY2));
                     if (!rtc_first_boot_init(result)) {
                         rtc_recovery_flow();
                     }
diff --git a/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/drivers/spm/constraints/mt_spm_rc_bus26m.c b/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/drivers/spm/constraints/mt_spm_rc_bus26m.c
index 3fd9057..6a568c9 100644
--- a/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/drivers/spm/constraints/mt_spm_rc_bus26m.c
+++ b/src/bsp/trustzone/atf/v1.6/mt2xxx/plat/mediatek/mt2735/drivers/spm/constraints/mt_spm_rc_bus26m.c
@@ -57,7 +57,7 @@
 static struct mt_spm_cond_tables cond_bus26m = {
 	.table_cg = {
 		0x00C68504,	/* MTCMOS1 */
-		0x02010816,	/* INFRA0  */
+		0x02010014,	/* INFRA0  */
 		0x03AFC200,	/* INFRA1  */
 		0x80000670,	/* INFRA2  */
 		0x00000000,	/* INFRA3  */
diff --git a/src/bsp/trustzone/teeloader/mt2735/src/security/seclib.c b/src/bsp/trustzone/teeloader/mt2735/src/security/seclib.c
index 59419d8..8aae8a5 100644
--- a/src/bsp/trustzone/teeloader/mt2735/src/security/seclib.c
+++ b/src/bsp/trustzone/teeloader/mt2735/src/security/seclib.c
@@ -43,7 +43,7 @@
 /**************************************************************************
  *  DEBUG FUNCTIONS
  **************************************************************************/
-#define TEE_DEBUG
+//#define TEE_DEBUG
 #ifdef TEE_DEBUG
 #define DBG_MSG(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
 #define DBG_INFO(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
@@ -97,4 +97,4 @@
 int seclib_get_hwid_key(u8 *key, u32 key_size)
 {
     return seclib_get_key(SOC_DATA, key, key_size, 2);
-}
\ No newline at end of file
+}
diff --git a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_emi_mpu.c b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_emi_mpu.c
index d7e006b..9441d09 100644
--- a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_emi_mpu.c
+++ b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_emi_mpu.c
@@ -47,7 +47,7 @@
 #define writel(b,addr) __raw_writel(b,addr)
 #define IOMEM(reg) (reg)
 
-#define TEE_DEBUG
+//#define TEE_DEBUG
 #ifdef TEE_DEBUG
 #define DBG_MSG(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
 #define DBG_INFO(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
diff --git a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_init.c b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_init.c
index fa9e374..b261180 100644
--- a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_init.c
+++ b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_init.c
@@ -53,7 +53,7 @@
  **************************************************************************/
 #define MOD "[TZ_INIT]"
 
-#define TEE_DEBUG
+//#define TEE_DEBUG
 #ifdef TEE_DEBUG
 #define DBG_MSG(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
 #define DBG_INFO(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
diff --git a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_sec_cfg.c b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_sec_cfg.c
index dd49816..fc44ba0 100644
--- a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_sec_cfg.c
+++ b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_sec_cfg.c
@@ -39,7 +39,7 @@
 
 #define MOD "[TZ_SEC_CFG]"
 
-#define TEE_DEBUG
+//#define TEE_DEBUG
 #ifdef TEE_DEBUG
 #define DBG_MSG(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
 #else
diff --git a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_tbase.c b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_tbase.c
index 8e14488..2311550 100644
--- a/src/bsp/trustzone/teeloader/mt2735/src/security/tz_tbase.c
+++ b/src/bsp/trustzone/teeloader/mt2735/src/security/tz_tbase.c
@@ -43,7 +43,7 @@
 
 #define MOD "[TZ_TBASE]"
 
-#define TEE_DEBUG
+//#define TEE_DEBUG
 #ifdef TEE_DEBUG
 #define DBG_MSG(str, ...) do {print(str, ##__VA_ARGS__);} while(0)
 #else
diff --git a/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_utility.h b/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_utility.h
index 9b6d74b..30d3aa5 100644
--- a/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_utility.h
+++ b/src/connectivity/gps/2.0/gps_hal/mnldinf/inc/mnldinf_utility.h
@@ -21,6 +21,7 @@
 
 #define DUMP_BYTES_PER_LINE 16
 #define DUMP_MAX_PRINT_LINE 10
+#define SOCKET_RETRY_MAX_COUNT 20
 
 #define MNLDINF_DUMP_MEM(addr, len) do{\
     int i = 0, j = 0;\
diff --git a/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_utility.c b/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_utility.c
old mode 100644
new mode 100755
index 3141c69..052a9ba
--- a/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_utility.c
+++ b/src/connectivity/gps/2.0/gps_hal/mnldinf/src/mnldinf_utility.c
@@ -427,6 +427,7 @@
     int fd;
     int size;
     struct sockaddr_un addr;
+    int socket_retry_counter=0;
 
     memset(&addr, 0, sizeof(addr));
     addr.sun_family = AF_UNIX;
@@ -447,13 +448,23 @@
             strerror(errno), errno);
         return -1;
     }
-    if(connect(fd, (struct sockaddr*)&addr, size) == -1) {
-        LOGE("mnldinf_socket_tcp_client_connect_local() connect() failed, abstruct=%d name=[%s] reason=[%s]%d",
+/* retry connection if socket connection fail, 500000us*20 times */
+    while (1){
+        if(connect(fd, (struct sockaddr*)&addr, size) == -1) {
+            LOGE("mnldinf_socket_tcp_client_connect_local() connect() failed, abstruct=%d name=[%s] reason=[%s]%d",
             abstract, name, strerror(errno), errno);
-        close(fd);
-        return -1;
+        }else{
+            break;
+        }
+        if(socket_retry_counter >= SOCKET_RETRY_MAX_COUNT) {
+            LOGE("retry connect() for 20 times");
+            close(fd);
+            return -1;
+        }
+        socket_retry_counter++;
+        LOGE("retry connect() socket_retry_counter=%d", socket_retry_counter);
+        usleep(500000);
     }
-
     return fd;
 }
 
@@ -720,19 +731,24 @@
 void mnldinf_wake_lock_take() {
 #if !defined(__LIBMNL_SIMULATOR__)    //no permission to open wake_lock on Linux
     time_t time_cur = 0;
+    int timer_ret;
+    int mutex_ret = 0;
+
+    mutex_ret = mnldinf_wakeup_mutex_lock();
     time_cur = mnldinf_get_time_in_millisecond();
 
     if(time_cur > (wlock_ctx.time_last_refresh + MNLDINF_WAKE_LOCK_LATENCY)) {
-        int mutex_ret = 0;
-        mnldinf_stop_timer(wlock_ctx.unlock_timer);
-        mutex_ret = mnldinf_wakeup_mutex_lock();
+        timer_ret = mnldinf_stop_timer(wlock_ctx.unlock_timer);
+        LOGD("hal stop unlock_timer, ret=%d", timer_ret);
         if(wlock_ctx.wake_lock_acquired == false) {
             wlock_ctx.wake_lock_acquired = true;
             mnldinf_wake_lock();
+            LOGD("mnldinf_wake_lock");
         }
-        if(mutex_ret == 0) {
-            mnldinf_wakeup_mutex_unlock();
-        }
+    }
+
+    if(mutex_ret == 0) {
+        mnldinf_wakeup_mutex_unlock();
     }
 #endif
 }
@@ -740,12 +756,22 @@
 void mnldinf_wake_lock_give() {
 #if !defined(__LIBMNL_SIMULATOR__)    //no permission to open wake_lock on Linux
     time_t time_cur = 0;
+    int timer_ret;
+    int mutex_ret = 0;
+
+    mutex_ret = mnldinf_wakeup_mutex_lock();
+
     //delay to do wake_unlock to ensure the msg can be deliveried to other process
     time_cur = mnldinf_get_time_in_millisecond();
     if(time_cur > (wlock_ctx.time_last_refresh + MNLDINF_WAKE_LOCK_LATENCY)) {  //Only refresh timer when over latency time
-        mnldinf_start_timer(wlock_ctx.unlock_timer, MNLDINF_WAKE_LOCK_TIMEOUT);
+        timer_ret = mnldinf_start_timer(wlock_ctx.unlock_timer, MNLDINF_WAKE_LOCK_TIMEOUT);
+        LOGD("hal start unlock_timer, ret=%d", timer_ret);
         wlock_ctx.time_last_refresh = mnldinf_get_time_in_millisecond();
     }
+
+    if(mutex_ret == 0) {
+        mnldinf_wakeup_mutex_unlock();
+    }
 #endif
 }
 
@@ -757,6 +783,7 @@
     if(wlock_ctx.wake_lock_acquired == true) {
         wlock_ctx.wake_lock_acquired = false;
         mnldinf_wake_unlock();
+        LOGD("mnldinf_wake_unlock");
     }
     if(mutex_ret == 0) {
         mnldinf_wakeup_mutex_unlock();
@@ -819,10 +846,10 @@
     }
     LOGD("wake_lock:[%s]", buff_read);
     close(fd);
-    retry_timer = wlock_ctx.unlock_timer;
-    wlock_ctx.unlock_timer = INVALID_TIMERID;
-    mnldinf_deinit_timer(retry_timer);
-    pthread_mutex_destroy(&wlock_ctx.mutex);
+    // retry_timer = wlock_ctx.unlock_timer;
+    // wlock_ctx.unlock_timer = INVALID_TIMERID;
+    // mnldinf_deinit_timer(retry_timer);
+    // pthread_mutex_destroy(&wlock_ctx.mutex);
 #endif
 }
 
diff --git a/src/connectivity/gps/2.0/gps_hal/src/gpshal.c b/src/connectivity/gps/2.0/gps_hal/src/gpshal.c
old mode 100644
new mode 100755
index 9ddfa3d..9aad141
--- a/src/connectivity/gps/2.0/gps_hal/src/gpshal.c
+++ b/src/connectivity/gps/2.0/gps_hal/src/gpshal.c
@@ -86,7 +86,7 @@
     .vzw_debug_cbs     = NULL,
     .gps_name          = "MTK_MNLD_default,MNL_VER_default",
     .proxy_apps        = {0},
-    .mnl_retry_timer   = NULL,
+    .mnl_retry_timer   = INVALID_TIMERID,
 };
 
 #ifdef FREQUENCE_START
@@ -139,7 +139,7 @@
 //     Do not deinit resources
 //         We want to have a simple design for a built-in service
 //         "Deinit" is for an installable / removable service
-static void gpshal_resource_init(GpsCallbacks_ext* src) {
+static int gpshal_resource_init(GpsCallbacks_ext* src) {
     unsigned int capabilities = 0;
     unsigned int year = 0;
     char *name = g_gpshal_ctx.gps_name;//"Version: MNLD, MNL";
@@ -155,50 +155,56 @@
     system_info.size = sizeof(GnssSystemInfo);
     g_gpshal_ctx.gps_cbs->set_system_info_cb(&system_info);
 
-    if (GPSHAL_STATE_UNKNOWN != g_gpshal_ctx.gps_state_intent) return;  // at most once
+    if (GPSHAL_STATE_UNKNOWN != g_gpshal_ctx.gps_state_intent){
+        return 0;  // already set
+    } // at most once
 
     g_gpshal_ctx.fd_mnl2hal_basic = create_mnl2hal_fd_basic();
-    if (-1 == g_gpshal_ctx.fd_mnl2hal_basic) return;  // error
+    if (-1 == g_gpshal_ctx.fd_mnl2hal_basic){
+        return -1;  // error
+    }
 
     g_gpshal_ctx.fd_mnl2hal_ext = create_mnl2hal_fd_ext();
-    if (-1 == g_gpshal_ctx.fd_mnl2hal_ext) return;  // error
+    if (-1 == g_gpshal_ctx.fd_mnl2hal_ext){
+        return -1;  // error
+    }
 
     g_gpshal_ctx.fd_worker_epoll = epoll_create(MAX_EPOLL_EVENT);
     if (-1 == g_gpshal_ctx.fd_worker_epoll) {
         LOGE("Fail to create epoll reason=[%s]%d",
                 strerror(errno), errno);
-        return;  // error
+        return -1;  // error
     }
 
     if (mnldinf_epoll_add_fd(
             g_gpshal_ctx.fd_worker_epoll,
             g_gpshal_ctx.fd_mnl2hal_basic) == -1) {
         LOGE("Fail to add fd_mnl2hal basic");
-        return;  // error
+        return -1;  // error
     }
 
     if (mnldinf_epoll_add_fd(
             g_gpshal_ctx.fd_worker_epoll,
             g_gpshal_ctx.fd_mnl2hal_ext) == -1) {
         LOGE("Fail to add fd_mnl2hal ext");
-        return;  // error
+        return -1;  // error
     }
     g_gpshal_ctx.thd_worker = g_gpshal_ctx.gps_cbs->create_thread_cb(
             GPSHAL_WORKER_THREAD_NAME, gpshal_worker_thread, NULL);
     if (!g_gpshal_ctx.thd_worker) {
         LOGE("Fail to create %s", GPSHAL_WORKER_THREAD_NAME);
-        return;  // error
+        return -1;  // error
     }
 
     gpshal_set_gps_state(GPSHAL_STATE_RESOURCE);
+    return 0;
 }
 
 int gpshal_gpscbs_save(GpsCallbacks_ext* src) {
 // assert(NULL != src);
     if (sizeof(GpsCallbacks_ext) == src->size) {
         LOGD("Use GpsCallbacks");
-        gpshal_resource_init(src);
-        return 0;
+        return gpshal_resource_init(src);
     }
     LOGE("Bad callback, size: %zd, expected: %zd",
             src->size, sizeof(GpsCallbacks_ext));
diff --git a/src/connectivity/gps/2.0/gps_hal/src/gpshal_worker.c b/src/connectivity/gps/2.0/gps_hal/src/gpshal_worker.c
index 8b07e58..bd2b62b 100644
--- a/src/connectivity/gps/2.0/gps_hal/src/gpshal_worker.c
+++ b/src/connectivity/gps/2.0/gps_hal/src/gpshal_worker.c
@@ -639,6 +639,7 @@
    // GPSHAL_DEBUG_FUNC_SCOPE;
     struct epoll_event events[MAX_EPOLL_EVENT];
     UNUSED(arg);
+    mnldinf_wake_lock_init();
 
     while (true) {
         int i;
diff --git a/src/connectivity/gps/2.0/gps_hal/src/gpsinf.c b/src/connectivity/gps/2.0/gps_hal/src/gpsinf.c
index 4de9894..1dc85f0 100644
--- a/src/connectivity/gps/2.0/gps_hal/src/gpsinf.c
+++ b/src/connectivity/gps/2.0/gps_hal/src/gpsinf.c
@@ -323,7 +323,7 @@
 static int gpsinf_init(GpsCallbacks_ext* callbacks) {
     // GPSHAL_DEBUG_FUNC_SCOPE2(g_gpshal_ctx.mutex_gps_state_intent);
 
-    mnldinf_wake_lock_init();
+    // mnldinf_wake_lock_init();
 
     if (gpshal_gpscbs_save(callbacks) != 0) {
         return -1;    //  error
@@ -338,6 +338,10 @@
 // Thread: BackgroundThread
 static int gpsinf_start(void) {
     // GPSHAL_DEBUG_FUNC_SCOPE2(g_gpshal_ctx.mutex_gps_state_intent);
+    if (GPSHAL_STATE_UNKNOWN == g_gpshal_ctx.gps_state_intent){
+        LOGE("gpsinf_start failed: gps_state_intent=UNKNOWN");
+        return -1;
+    }
     memset(&mnlDebugData, 0, sizeof(DebugData));//clear debug data every session
     gpshal_set_gps_state_intent(GPSHAL_STATE_START);
     gpshal2mnl_gps_start();
@@ -347,6 +351,10 @@
 // Thread: BackgroundThread
 static int gpsinf_stop(void) {
     // GPSHAL_DEBUG_FUNC_SCOPE2(g_gpshal_ctx.mutex_gps_state_intent);
+    if (GPSHAL_STATE_UNKNOWN == g_gpshal_ctx.gps_state_intent){
+        LOGE("gpsinf_stop failed: gps_state_intent=UNKNOWN");
+        return -1;
+    }
     gpshal_set_gps_state_intent(GPSHAL_STATE_STOP);
     gpshal2mnl_gps_stop();
     return 0;  // OK to stop
@@ -354,6 +362,10 @@
 
 // Thread: BackgroundThread
 static void gpsinf_cleanup(void) {
+    if (GPSHAL_STATE_UNKNOWN == g_gpshal_ctx.gps_state_intent){
+        LOGE("gpsinf_cleanup failed: gps_state_intent=UNKNOWN");
+        return -1;
+    }
     timer_t retry_timer;
     // GPSHAL_DEBUG_FUNC_SCOPE2(g_gpshal_ctx.mutex_gps_state_intent);
     gpshal_set_gps_state_intent(GPSHAL_STATE_CLEANUP);
diff --git a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnld.c b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnld.c
index 3411b98..d32a295 100755
--- a/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnld.c
+++ b/src/connectivity/gps/2.0/mtk_mnld/mnld_entity/src/mnld.c
@@ -7,6 +7,8 @@
 #include <stdio.h>
 #include <sys/time.h>
 #include <sys/socket.h>
+#include <sys/types.h>
+#include <fcntl.h>
 #include <time.h>
 #include <signal.h>
 #if defined(__ANDROID_OS__)
@@ -3530,7 +3532,7 @@
 int main(int argc, char** argv) {
     mnld_wake_lock_init();
     mnld_wake_lock_take();
-    LOGD("mnld version=%s\n", MNLD_VERSION);
+    LOGE("mnld version=%s\n", MNLD_VERSION);
     daemon_parse_commandline(argc, argv);
 
     set_signal_ignore(SIGPIPE);
@@ -3595,9 +3597,11 @@
     if ((argc >= 3)  //Parameter count check
         && (!strncmp(argv[2], "meta", 4) || !strncmp(argv[2], "factory", 7)
         || !strncmp(argv[2], "test", 4) || !strncmp(argv[2], "PDNTest", 7))) {
+        LOGE("enter not normal mode\n");
         mnld_factory_test_entry(argc, argv);
         mnld_wake_lock_give();
     } else {
+        LOGE("enter normal mode\n");
         gps_control_init();
         epo_downloader_init();
         qepo_downloader_init();
@@ -3607,6 +3611,21 @@
         mpe_function_init();
     #endif
         mnld_init();
+
+        /*lcz add mnld.server to determined if mnld is ready.start. 2023/10/26/ */
+        int fd=0;
+        fd = open("/tmp/mnld.server",O_CREAT|O_RDONLY,0744);
+        LOGE("tmp-file open\n");
+        if(fd < 0)
+        {
+            LOGE("open error: %d (%s)\n", errno, strerror(errno));
+        }
+        else
+        {
+            close(fd);
+        }
+        /*lcz add mnld.server to determined if mnld is ready.end. 2023/10/26/ */
+
         // For MNL5.9 and later version, we move flp_monitor_init after mnld_init,
         // creating that the monitor thread after mnld msg socket initialized,
         // then the screen status can be send to mnld main thread without concern
diff --git a/src/connectivity/gps/2.0/mtk_mnld/utility/src/mtk_lbs_utility.c b/src/connectivity/gps/2.0/mtk_mnld/utility/src/mtk_lbs_utility.c
old mode 100644
new mode 100755
index 790982e..1921c42
--- a/src/connectivity/gps/2.0/mtk_mnld/utility/src/mtk_lbs_utility.c
+++ b/src/connectivity/gps/2.0/mtk_mnld/utility/src/mtk_lbs_utility.c
@@ -1254,19 +1254,24 @@
 void mnld_wake_lock_take() {
 #if !defined(__LIBMNL_SIMULATOR__)    //no permission to open wake_lock on Linux
     UINT64 time_cur = 0;
+    int timer_ret;
+    int mutex_ret = 0;
+
+    mutex_ret = mnld_wakeup_mutex_lock();
     time_cur = get_time_in_millisecond();
 
     if(time_cur > (wlock_ctx.time_last_refresh + MNLD_WAKE_LOCK_LATENCY)) {
-        int mutex_ret = 0;
-        stop_timer(wlock_ctx.unlock_timer);
-        mutex_ret = mnld_wakeup_mutex_lock();
+        timer_ret = stop_timer(wlock_ctx.unlock_timer);
+        LOGD("stop unlock_timer, ret=%d", timer_ret);
         if(wlock_ctx.wake_lock_acquired == false) {
             wlock_ctx.wake_lock_acquired = true;
             mnld_wake_lock();
+            LOGD("mnld_wake_lock");
         }
-        if(mutex_ret == 0) {
-            mnld_wakeup_mutex_unlock();
-        }
+    }
+
+    if(mutex_ret == 0) {
+        mnld_wakeup_mutex_unlock();
     }
 #endif
 }
@@ -1274,12 +1279,21 @@
 void mnld_wake_lock_give() {
 #if !defined(__LIBMNL_SIMULATOR__)    //no permission to open wake_lock on Linux
     UINT64 time_cur = 0;
+    int timer_ret;
+    int mutex_ret = 0;
+
+    mutex_ret = mnld_wakeup_mutex_lock();
     //delay to do wake_unlock to ensure the msg can be deliveried to other process
     time_cur = get_time_in_millisecond();
     if(time_cur > (wlock_ctx.time_last_refresh + MNLD_WAKE_LOCK_LATENCY)) {  //Only refresh timer when over latency time
-        start_timer(wlock_ctx.unlock_timer, MNLD_WAKE_LOCK_TIMEOUT);
+        timer_ret = start_timer(wlock_ctx.unlock_timer, MNLD_WAKE_LOCK_TIMEOUT);
+        LOGD("start unlock_timer, ret=%d", timer_ret);
         wlock_ctx.time_last_refresh = get_time_in_millisecond();
     }
+
+    if(mutex_ret == 0) {
+        mnld_wakeup_mutex_unlock();
+    }
 #endif
 }
 
@@ -1291,6 +1305,7 @@
     if(wlock_ctx.wake_lock_acquired == true) {
         wlock_ctx.wake_lock_acquired = false;
         mnld_wake_unlock();
+        LOGD("mnld_wake_unlock");
     }
     if(mutex_ret == 0) {
         mnld_wakeup_mutex_unlock();
diff --git a/src/lynq/framework/lynq-audio-service/src/lynq_audio_service.c b/src/lynq/framework/lynq-audio-service/src/lynq_audio_service.c
index 9e1957c..cdf425d 100755
--- a/src/lynq/framework/lynq-audio-service/src/lynq_audio_service.c
+++ b/src/lynq/framework/lynq-audio-service/src/lynq_audio_service.c
@@ -5,7 +5,8 @@
 
 int main()
 {
-    system("/usr/bin/pulseaudio -D");
+    RLOGD("Open the pulseaudio service\n");
+    system("/usr/bin/pulseaudio -D --system");
     while(1)
     {
         sleep(UINT32_MAX);
diff --git a/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp b/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
index 980ebd8..3ea7719 100755
--- a/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/data/data_gdbus.cpp
@@ -107,6 +107,18 @@
     }
     bool apnHasCreated = FALSE;
     Parcel p;
+    if(urc_response->pdnState == PDN_TIMEOUT_CANCEL)
+    {
+        p.writeInt32(1);
+        p.writeInt32(LYNQ_URC_DATA_CALL_STATUS_IND);
+        p.writeInt32(0);//temporary plan
+        p.writeInt32(urc_response->pdnState);
+        writeStringToParcel(p,urc_response->apnName);
+        writeStringToParcel(p,urc_response->apnType);
+        writeStringToParcel(p,urc_response->ifname);
+        android::LYNQ_RIL_urcBroadcast(p,LYNQ_URC_DATA_CALL_STATUS_IND);
+        return 0;
+    }
     if(urc_response->cId > 0)
     {
         if(urc_response->pdnState==PDN_DISCONNECTED)//if user disable data call,the pdn state wiil change to disconnected.
@@ -121,6 +133,7 @@
                 {
                     bzero(apn_table[i].apn,LYNQ_APN_LEN_MAX);
                     bzero(apn_table[i].apntype,LYNQ_APNTPYE_LEN_MAX);
+                    bzero(apn_table[i].ifaceName,LYNQ_APNTPYE_LEN_MAX);
                     apn_table[i].used = 0;
                     apn_table[i].netId = 0;
                     apn_table[i].pdpstate = PDN_DISCONNECTED;
@@ -280,6 +293,7 @@
                 {
                     bzero(apn_table[i].apn,LYNQ_APN_LEN_MAX);
                     bzero(apn_table[i].apntype,LYNQ_APNTPYE_LEN_MAX);
+                    bzero(apn_table[i].ifaceName,LYNQ_APNTPYE_LEN_MAX);
                     apn_table[i].used = 0;
                     apn_table[i].netId = 0;
                     apn_table[i].pdpstate = PDN_DISCONNECTED;
@@ -312,6 +326,7 @@
                     else
                     {
                         memcpy(iface_t,urc_response->ifname,strlen(urc_response->ifname)+1);
+                        memcpy(apn_table[i].ifaceName,urc_response->ifname,strlen(urc_response->ifname)+1);
                     }
                     if(NULL == urc_response->addresses)
                     {
@@ -363,6 +378,7 @@
                 else
                 {
                     memcpy(iface_t,urc_response->ifname,strlen(urc_response->ifname)+1);
+                    memcpy(apn_table[i].ifaceName,urc_response->ifname,strlen(urc_response->ifname)+1);
                 }
                 if(NULL == urc_response->addresses)
                 {
@@ -413,6 +429,8 @@
         return "PDN_RETRYING";
     case RIL_Data_Call_PdnState::PDN_SCANNING:
         return "PDN_SCANNING";
+    case RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL:
+        return "PDN_TIMEOUT_CANCEL";
     default:
         return "UNKNOWN";
     }
diff --git a/src/lynq/framework/lynq-ril-service/src/mtk_ril_unsol_commands.h b/src/lynq/framework/lynq-ril-service/src/mtk_ril_unsol_commands.h
index 5c461f4..bdd73e2 100755
--- a/src/lynq/framework/lynq-ril-service/src/mtk_ril_unsol_commands.h
+++ b/src/lynq/framework/lynq-ril-service/src/mtk_ril_unsol_commands.h
@@ -50,3 +50,4 @@
 { RIL_UNSOL_ECC_NUM,responseString, WAKE_PARTIAL},
 {RIL_UNSOL_SIP_CALL_PROGRESS_INDICATOR, responseStrings, WAKE_PARTIAL},
 {RIL_UNSOL_CALL_INFO_INDICATION, responseStrings, WAKE_PARTIAL},
+{RIL_UNSOL_TELEPHONY_RESTART, responseVoid, WAKE_PARTIAL}
diff --git a/src/lynq/framework/lynq-ril-service/src/ril.cpp b/src/lynq/framework/lynq-ril-service/src/ril.cpp
index ccd0e01..011a083 100755
--- a/src/lynq/framework/lynq-ril-service/src/ril.cpp
+++ b/src/lynq/framework/lynq-ril-service/src/ril.cpp
@@ -26,6 +26,7 @@
 #include <hardware_legacy/power.h>
 #include <vendor-ril/telephony/ril.h>
 #include <telephony/ril_cdma_sms.h>
+#include <telephony/mtk_ril_sp.h>
 #include <cutils/jstring.h>
 #include <telephony/record_stream.h>
 #include <utils/SystemClock.h>
@@ -163,6 +164,7 @@
 // Enable RILC log
 #define RILC_LOG 1
 /*Warren add for t800 RIL service 2021_12_10 start*/
+#define LYNQ_RIL_FWK_IP "127.0.0.1"
 #define LYNQ_SOCKET_ENVNT_FD_MAX 100
 #define LYNQ_SERVICE_PORT 8088
 #define LYNQ_AT_SERVICE_PORT 8087
@@ -5396,6 +5398,7 @@
         case LYNQ_REQUEST_SET_DEFAULT_SIM_ALL:return "SET_DEFAULT_SIM_ALL";
         case LYNQ_REQUEST_CHANGE_SCREEN_STATE:return "LYNQ_REQUEST_CHANGE_SCREEN_STATE";/*jb.qi add for two sim sleep 2022/9/19*/
         case LYNQ_REQUEST_CHANGE_RADIO:return "LYNQ_REQUEST_CHANGE_RADIO";/*lei add for factory test of sleep 2022/9/19*/
+        case RIL_UNSOL_TELEPHONY_RESTART:return "RIL_UNSOL_TELEPHONY_RESTART";/*xy.he add for t800 ril service 2023/10/23*/
         /*warren add for t800 ril service 2022/1/22 end*/
         default: return "<unknown request>";
     }
@@ -5694,6 +5697,7 @@
         case RIL_UNSOL_ECALL_MSDHACK: return 1;
         case RIL_UNSOL_TX_POWER: return 1;
         case RIL_UNSOL_NETWORK_INFO: return 1;
+        case RIL_UNSOL_TELEPHONY_RESTART: return 1;
 #ifdef ECALL_SUPPORT
         case RIL_UNSOL_ECALL_INDICATIONS: return 1;
 #endif /*ECALL_SUPPORT*/
@@ -5927,7 +5931,7 @@
     struct sockaddr_in lynqClient_addr;
     bzero(&server_addr, sizeof(server_addr));
     server_addr.sin_family = AF_INET;
-    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
+    server_addr.sin_addr.s_addr = inet_addr(LYNQ_RIL_FWK_IP);
     server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
     /* create socket */
     //int server_socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
diff --git a/src/lynq/framework/lynq-sdk-ready/src/timer/lynq_timer.cpp b/src/lynq/framework/lynq-sdk-ready/src/timer/lynq_timer.cpp
index 17c3e40..e007262 100755
--- a/src/lynq/framework/lynq-sdk-ready/src/timer/lynq_timer.cpp
+++ b/src/lynq/framework/lynq-sdk-ready/src/timer/lynq_timer.cpp
@@ -115,6 +115,18 @@
         /*set uci*/

         return NULL;

     }

+    struct sockaddr_in liblynq_data_socket;

+    bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));

+    //set this lib socket config 

+    liblynq_data_socket.sin_family = AF_INET;

+    liblynq_data_socket.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);

+    int ret = bind(sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));

+    if (-1 == ret)

+    {

+        RLOGE("liblynq_data_socket bind fail,errno:%d",errno);

+        return NULL;

+    }

+    

     struct timeval timeOut;

     timeOut.tv_sec = 3;//timeout time 3s

     timeOut.tv_usec = 0;

diff --git a/src/lynq/lib/liblynq-call/lynq_module_socket.cpp b/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
index ff45c02..3b084e0 100755
--- a/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
+++ b/src/lynq/lib/liblynq-call/lynq_module_socket.cpp
@@ -666,6 +666,19 @@
         return -1;

     }

 

+    struct sockaddr_in liblynq_data_socket;

+    bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));

+    //set this lib socket config 

+    liblynq_data_socket.sin_family = AF_INET;

+    liblynq_data_socket.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);

+    int ret = bind(module_rc_sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));

+    if (-1 == ret)

+    {

+        LYERRLOG("liblynq_data_socket bind fail,errno:%d",errno);

+        return -1;

+    }

+

+

     LYINFLOG("module_rc_sock_fd = %d",module_rc_sock_fd);

 

     memset(&module_rc_addr_serv, 0, sizeof(module_rc_addr_serv));

@@ -684,7 +697,6 @@
     BLOCK_RECV_MSG_UNLOCK(); 

 

 //    pthread_attr_t attr;

-    int ret;

 

     pthread_mutex_init(&s_sendto_mutex, NULL);   

     pthread_mutex_init(&s_RecvMsgBlockMutex, NULL);   

diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index b7498a6..248000d 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -19,6 +19,8 @@
 #include "lynq_data_urc.h"
 
 #define LYNQ_SERVICE_PORT 8088
+#define LYNQ_RIL_FWK_IP "127.0.0.1"
+
 #define LYNQ_REC_BUF 8192
 #define LYNQ_REQUEST_PARAM_BUF 8192
 #define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
@@ -26,6 +28,7 @@
 
 #define LYNQ_DATA_UCI_BUF 258
 #define LYNQ_DATA_TIME_OUT 1000*120
+#define TELEPHONY_RESTART 10
 
 
 using ::android::Parcel;
@@ -59,12 +62,25 @@
     LYNQ_E_NULL_ANONALY=9001
 }LYNQ_E;
 
+typedef enum {
+    PDN_IDLE,
+    PDN_CONNECTING,
+    PDN_CONNECTED,
+    PDN_DISCONNECTING,
+    PDN_DISCONNECTED,
+    PDN_RETRYING,
+    PDN_FAILED,
+    PDN_SCANNING,
+    PDN_TIMEOUT_CANCEL,
+} RIL_Data_Call_PdnState;
+
 int lynq_client_sockfd = 0;
 int Global_uToken = 0;
 struct sockaddr_in lynq_data_socket_server_addr;
 int lynq_data_socket_server_addr_len;
 
 int lynq_data_call_change_id = -1;
+int lynq_telephony_restart_g = 0;
 pthread_t lynq_data_tid =-1;
 static pthread_mutex_t s_data_call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
 static pthread_cond_t s_data_call_state_change_cond = PTHREAD_COND_INITIALIZER;
@@ -98,6 +114,7 @@
 * @brief temp of apn result info
 */
 char g_lynq_apn_result[1024] = {};
+int g_data_call_timeout_value = LYNQ_DATA_TIME_OUT;
 
 static std::vector<int> s_data_urc_wait_list;
 
@@ -115,6 +132,8 @@
 lynq_data_call_response_v11_t lynq_data_call_lists[LYNQ_APN_CHANNEL_MAX] = {};
 int lynq_data_call = 0;
 
+int radio_switch(int status);
+
 int getLynqApnID(char apnType[])
 {
     int ret = 0;
@@ -497,10 +516,10 @@
 int send_request(int sockfd,lynq_client_t *client_tmp)
 {
     int ret=0;
-    ret = write(sockfd, client_tmp, LYQN_SEDN_BUF);
+    ret = sendto(sockfd,client_tmp,LYQN_SEDN_BUF,0,(struct sockaddr *)&lynq_data_socket_server_addr,lynq_data_socket_server_addr_len);
     if(ret==-1)
     {
-        perror("write error");
+        LYERRLOG("%s:errno code:%d",__FUNCTION__,errno);
         return -1;
     }
     return 0;
@@ -521,32 +540,36 @@
 /*Warren add for T800 platform 2021/11/19 start*/
 int lynq_socket_client_start()
 {
-    /* init lynq_socket_server_addr */
-    bzero(&lynq_data_socket_server_addr, sizeof(lynq_data_socket_server_addr));
-    lynq_data_socket_server_addr.sin_family = AF_INET;
-    lynq_data_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
-    lynq_data_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);
-    lynq_data_socket_server_addr_len = sizeof(lynq_data_socket_server_addr);
-    /*
-    if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
-    {
-        printf("[%s] is not a valid IPaddress\n", argv[1]);
-        exit(1);
-    }
-*/
-    lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
-    struct timeval timeOut; 
+    int ret;
+    struct timeval timeOut;
+    struct sockaddr_in liblynq_data_socket;
 
+    ret = 0;
     timeOut.tv_sec = 30;
     timeOut.tv_usec = 0; 
+    bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));
+    bzero(&lynq_data_socket_server_addr, sizeof(lynq_data_socket_server_addr));
+    
+    //set this lib socket config 
+    liblynq_data_socket.sin_family = AF_INET;
+    liblynq_data_socket.sin_addr.s_addr = inet_addr(LYNQ_RIL_FWK_IP);
 
+    //set ril service socket config
+    lynq_data_socket_server_addr.sin_family = AF_INET;
+    lynq_data_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
+    lynq_data_socket_server_addr.sin_addr.s_addr = inet_addr(LYNQ_RIL_FWK_IP);
+    lynq_data_socket_server_addr_len = sizeof(lynq_data_socket_server_addr);
+
+    lynq_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
+    ret = bind(lynq_client_sockfd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));
+    if (-1 == ret)
+    {
+        LYERRLOG("liblynq_data_socket bind fail,errno:%d",errno);
+        return -1;
+    }
     if (setsockopt(lynq_client_sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0) 
     { 
-        LYERRLOG("time out setting failed"); 
-    } 
-    if(connect(lynq_client_sockfd, (struct sockaddr *)&lynq_data_socket_server_addr, sizeof(lynq_data_socket_server_addr)) == -1)
-    {
-        perror("connect error");
+        LYERRLOG("time out setting failed,errno:%d",errno);
         return -1;
     }
     return 0;
@@ -560,6 +583,7 @@
 
         case LYNQ_URC_MODIFY_APNDB:
         case LYNQ_URC_RESET_APNDB:
+        case LYNQ_TELEPHONY_RESTART:
             return true;                
         default:
             return false;
@@ -616,7 +640,7 @@
             bzero(apn,LYNQ_APN_MAX_LEN);
             bzero(apnType,LYNQ_APN_TYPE_MAX_LEN);
             bzero(ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
-            if(pdnState!=4)//PDN_DISCONNECTED
+            if(pdnState != RIL_Data_Call_PdnState::PDN_DISCONNECTED)//PDN_DISCONNECTED
             {
                 urc_msg = strdupReadString_p(p);
                 int len = strlen(urc_msg);
@@ -698,8 +722,15 @@
                         LYERRLOG("client still without res");
                         break;
                     }
+                    if(pdnState == RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL)
+                    {
+                        lynq_data_call = LYNQ_E_TIME_OUT;
+                    }
+                    else
+                    {
+                        lynq_data_call = 0;
+                    }
                     sendSignalDataCallStateChange();
-                    lynq_data_call = 0;
                     data_timelimit = 0;
                 }
                 printf_apn_table_debug(__FUNCTION__,__LINE__);
@@ -796,6 +827,23 @@
                 }
                 free(urc_msg);
             }
+        case LYNQ_TELEPHONY_RESTART:
+            {
+                if(slot_id == 0)
+                {
+                    RLOGI("data has received telephony has restart");
+                    RLOGI("handle set to 10");
+                    lynq_telephony_restart_g = 1;
+                    pthread_mutex_lock(&s_lynq_urc_vector_mutex);
+                    s_data_urc_wait_list.push_back(TELEPHONY_RESTART);
+                    pthread_mutex_unlock(&s_lynq_urc_vector_mutex);
+                    radio_switch(0);
+                    sleep(1);
+                    radio_switch(1);
+                    sleep(1);
+                    sendSignalPdnChange();
+                }
+            }
         default:
             break;
     }
@@ -813,7 +861,8 @@
 }
 int get_imsi();
 int check_apn_status();
-int radio_switch(int status);
+
+int get_timeout_value();
 int lynq_init_data(int uToken)
 {
     if (g_lynq_data_init_flag == 1)
@@ -826,6 +875,15 @@
     Global_uToken = uToken;
     LYLOGSET(LOG_INFO);
     LYLOGEINIT(USER_LOG_TAG);
+    int ret = get_timeout_value();
+    if(ret >= 30000)
+    {
+        g_data_call_timeout_value = ret;
+    }
+    else
+    {
+        LYERRLOG("timeout must greater or equal to 30s!!!");
+    }
     result = lynq_socket_client_start();
     pthread_mutex_init(&g_lynq_data_sendto_mutex, NULL);
     if(result!=0)
@@ -924,6 +982,11 @@
 int lynq_setup_data_call(int *handle)
 {
     int error = -1;
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return error;
+    }
     #ifdef GSW_RIL_CFG  //becuase gsw not have connman,data can not be triggered by connman.
     LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
     error = lynq_setup_data_call_sp(handle,NULL,"default",NULL,NULL,NULL,NULL,NULL);
@@ -977,7 +1040,7 @@
     if(error==0)
     {
         data_timelimit = 1;
-        if (waitDataCallstateChange(LYNQ_DATA_TIME_OUT) == ETIMEDOUT)
+        if (waitDataCallstateChange(g_data_call_timeout_value) == ETIMEDOUT)
         {
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
@@ -991,6 +1054,13 @@
             printf_apn_table_debug(__FUNCTION__,__LINE__);
             return error;
         }
+        if(lynq_data_call == LYNQ_E_TIME_OUT)
+        {
+            error = LYNQ_E_TIME_OUT;
+            LYERRLOG("PDN_TIMEOUT_CANCLE:wait data Call state fail!!!");
+            printf_apn_table_debug(__FUNCTION__,__LINE__);
+            return error;
+        }
     }
     printf_apn_table_debug(__FUNCTION__,__LINE__);
     #endif //GSW_RIL_CFG
@@ -1007,6 +1077,11 @@
     int error = -1;
     int lynq_data_call_id = -1;
     int ret = 0;
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return error;
+    }
     if(handle==NULL)
     {
         LYERRLOG("handle is null!!!");
@@ -1078,6 +1153,11 @@
     int error = -1;
     int lynq_data_call_id = -1;
     char *argv[10] = {};
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return error;
+    }
     #ifdef GSW_RIL_CFG
     LYINFLOG("[%s][%d]",__FUNCTION__,__LINE__);
     if(handle==NULL||apnType==NULL)
@@ -1181,7 +1261,7 @@
     if(error==0)
     {
         data_timelimit = 1;
-        if(waitDataCallstateChange(LYNQ_DATA_TIME_OUT)==ETIMEDOUT)
+        if(waitDataCallstateChange(g_data_call_timeout_value)==ETIMEDOUT)
         {
             error = LYNQ_E_TIME_OUT;
             LYERRLOG("timeout:wait data Call state fail!!!");
@@ -1195,6 +1275,13 @@
             printf_apn_table_debug(__FUNCTION__,__LINE__);
             return error;
         }
+        if(lynq_data_call == LYNQ_E_TIME_OUT)
+        {
+            error = LYNQ_E_TIME_OUT;
+            LYERRLOG("PDN_TIMEOUT_CANCLE:wait data Call state fail!!!");
+            printf_apn_table_debug(__FUNCTION__,__LINE__);
+            return error;
+        }
     }
     printf_apn_table_debug(__FUNCTION__,__LINE__);
     return error;
@@ -1362,6 +1449,11 @@
     int number = 0;
     int lynq_data_call_id = 0;
     int error = 0;
+    if (g_lynq_data_init_flag == 0)
+    {
+        LYERRLOG("[%s][%d]Invalid operation",__FUNCTION__,__LINE__);
+        return -1;
+    }
     lynq_data_call_id = *handle;
     if((handle==NULL) || (dataCallList==NULL))
     {
@@ -1902,6 +1994,24 @@
     }
     return 0;
 }
+int get_timeout_value()
+{
+    LYINFLOG("get_timeout_value enter");
+    int ret = -1;
+    char timeout_value[8] ={0};//get get_timeout_value
+    ret = lynq_get_value("lynq_uci","data_call","timeout",timeout_value);
+    if(ret == 0)
+    {
+        LYINFLOG("data_call.timeout is %s",timeout_value);
+        return atoi(timeout_value);
+    }
+    else
+    {
+        LYERRLOG("get_timeout_value");
+        return -1;
+    }
+}
+
 int radio_switch(int status)
 {
     Parcel *p =NULL;
diff --git a/src/lynq/lib/liblynq-data/lynq_data_urc.h b/src/lynq/lib/liblynq-data/lynq_data_urc.h
index 7ac4f75..59f9f9d 100755
--- a/src/lynq/lib/liblynq-data/lynq_data_urc.h
+++ b/src/lynq/lib/liblynq-data/lynq_data_urc.h
@@ -16,6 +16,7 @@
 #define LYNQ_REQUEST_SET_DTMF_VOLUME (LYNQ_REQUEST_VENDOR_BASE +3)
 #define LYNQ_URC_MODIFY_APNDB (LYNQ_URC_VENDOR_BASE+4)
 #define LYNQ_URC_RESET_APNDB (LYNQ_URC_VENDOR_BASE+5)
+#define LYNQ_TELEPHONY_RESTART 3113
 
 typedef struct{
     int resp_type;
diff --git a/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c b/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
index 4d79d0f..a812738 100755
--- a/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
+++ b/src/lynq/lib/liblynq-gnss/src/lynq_gnss.c
@@ -72,6 +72,7 @@
 

 int lynq_gnss_callback_reg(lynq_gnss_cb* callbacks)

 {   

+    int i=0;

     if (NULL == callbacks)

     {

         RLOGD("illegal callbacks!!!");

@@ -85,9 +86,23 @@
         RLOGD("callbacks error");

         return -1;

     }

-    if(gpshal_gpscbs_save(turn_cbs) != 0)

+    for(i=0;i<5;i++)

     {

-        RLOGD("For cbs save error\r\n");

+        RLOGD("The callback_gps_state:%s",gpshal_state_to_string(g_gpshal_ctx.gps_state));

+        if(gpshal_gpscbs_save(turn_cbs) != 0)

+        {

+            RLOGD("For cbs save error\r\n");

+        }

+        RLOGD("The callback_gps_state:%s",gpshal_state_to_string(g_gpshal_ctx.gps_state));

+        if(g_gpshal_ctx.gps_state != GPSHAL_STATE_UNKNOWN)

+        {

+            break;

+        }

+        sleep(1);

+    }

+    if(i>=5)

+    {

+        RLOGD("For cbs save error2\r\n");

         return -1;

     }

     g_lynq_gnss_calback_flag = 1;

@@ -122,6 +137,11 @@
 

 int lynq_gnss_start(void)

 {

+    if (g_lynq_gnss_init_flag == 0)

+    {

+        RLOGD("start is not allowed");

+        return -1;

+    }

     //memset(&lynq_debug_data, 0, sizeof(DebugData));

     gpshal_set_gps_state_intent(GPSHAL_STATE_START);

     gpshal2mnl_gps_start();

@@ -130,6 +150,11 @@
 

 int lynq_gnss_stop(void)

 {

+    if (g_lynq_gnss_init_flag == 0)

+    {

+        RLOGD("stop is not allowed");

+        return -1;

+    }

     gpshal_set_gps_state_intent(GPSHAL_STATE_STOP);

     gpshal2mnl_gps_stop();

     return 0;

diff --git a/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h b/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
index ba7c1f4..00c5669 100755
--- a/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
+++ b/src/lynq/lib/liblynq-network/include/lynq_network/lynq_network.h
@@ -78,6 +78,9 @@
 int lynq_set_ims(const int ims_mode);

 int lynq_wait_signalchanges(int *handle);

 int lynq_get_urc_info(const int handle,signalStrength_t *solSigStren,int *slot_id);

+int lynq_set_feature_config_sbp(int sbp_flag);

+int lynq_query_feature_config_sbp(int *sbp_status );

+

 

 typedef enum {

     NETWORK_STATE_BUFFER_TYPE_VOICE_REG,

diff --git a/src/lynq/lib/liblynq-network/lynq_module_socket.cpp b/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
index c3f7334..8ab8f34 100755
--- a/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_module_socket.cpp
@@ -666,6 +666,18 @@
         return -1;

     }

 

+    struct sockaddr_in liblynq_data_socket;

+    bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));

+    //set this lib socket config 

+    liblynq_data_socket.sin_family = AF_INET;

+    liblynq_data_socket.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);

+    int ret = bind(module_rc_sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));

+    if (-1 == ret)

+    {

+        LYERRLOG("liblynq_data_socket bind fail,errno:%d",errno);

+        return -1;

+    }

+

     LYINFLOG("module_rc_sock_fd = %d",module_rc_sock_fd);

 

     memset(&module_rc_addr_serv, 0, sizeof(module_rc_addr_serv));

@@ -684,7 +696,6 @@
     BLOCK_RECV_MSG_UNLOCK(); 

 

 //    pthread_attr_t attr;

-    int ret;

 

     pthread_mutex_init(&s_sendto_mutex, NULL);   

     pthread_mutex_init(&s_RecvMsgBlockMutex, NULL);   

diff --git a/src/lynq/lib/liblynq-network/lynq_network.cpp b/src/lynq/lib/liblynq-network/lynq_network.cpp
index c025404..ec580e2 100755
--- a/src/lynq/lib/liblynq-network/lynq_network.cpp
+++ b/src/lynq/lib/liblynq-network/lynq_network.cpp
@@ -25,6 +25,12 @@
 /*in CR AUTO00207414, in modem, 23G detach need 10s, 5g ims detach need 5s, so set length to 12s */

 #define WAIT_TIME_LENGTH_FOR_SET_PREFFERRED_NETWORK_TYPE (12) 

 

+#define SET_SBP_OPEN    " AT+ESBP=5,\"SBP_NRRC_BAR_CELL_WITH_CONNECTION_FAILURE\",1 "

+#define SET_SBP_CLOSE   " AT+ESBP=5,\"SBP_NRRC_BAR_CELL_WITH_CONNECTION_FAILURE\",0 "

+#define QUERY_SBP_STATUS    "AT+ESBP=7,\"SBP_NRRC_BAR_CELL_WITH_CONNECTION_FAILURE\""

+#define OPEN    1

+#define CLOSE    0

+

 

 using ::android::Parcel;

 

@@ -1109,6 +1115,106 @@
     return RESULT_OK;   

 }

 

+

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

+* @brief:sned at request ,close or open SBP

+* @param count [IN]:sbp_flag 0:close 1:open

+* @param sum [OUT]:NA

+* @return :NA

+* @todo:

+* @see:NA

+* @warning:NA

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

+int lynq_set_feature_config_sbp(int sbp_flag)

+{

+    int ret = 0;

+     Parcel* p=NULL;

+     

+    if(sbp_flag != OPEN && sbp_flag != CLOSE)

+    {

+         LYERRLOG("Bad input paramater ,you need input 0 or 1 !!!");

+         return RESULT_ERROR;

+    }

+    if(sbp_flag == OPEN)

+    {

+        ret = lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s",SET_SBP_OPEN);

+    }

+    else if(sbp_flag == CLOSE)

+    {

+        ret = lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s",SET_SBP_CLOSE);

+    }

+    if(ret != RESULT_OK)

+    {

+

+        LYERRLOG("%s  lynq_send_common_request failure, ret is %d",__func__,ret);

+        return ret;  

+    }     

+       return 0;

+}

+

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

+* @brief:send at request,get sbp status

+* @param count [IN]:NA

+* @param sum [OUT]:sbp_status

+* @return :NA

+* @todo:

+* @see:NA

+* @warning:NA

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

+int lynq_query_feature_config_sbp(int *sbp_status )

+{

+    int ret = 0;

+    Parcel* p=NULL;

+    

+    ret = lynq_send_common_request(p,g_wait_time,RIL_REQUEST_OEM_HOOK_RAW,1,"%s",QUERY_SBP_STATUS);

+    if(ret != RESULT_OK)

+    {

+

+       LYERRLOG("%s  lynq_send_common_request failure, ret is %d",__func__,ret);

+       return ret;  

+    }     

+    

+   

+    const char* data;

+    int data_len;

+    char* data_str;

+    char* start;

+    char status[8] = {'0'};

+    data = lynq_get_raw_data(p,&data_len);

+    if(data==NULL || data_len == 0)

+    {

+        LYERRLOG("%s lynq_get_raw_data NULL or data_len is 0",__func__);    

+        delete p;

+        return LYNQ_E_INNER_ERROR; 

+    }

+    data_str = (char*) calloc(1,data_len+1);

+    if (NULL == data_str) 

+    {

+         LYERRLOG("%s alloc mem error, data_len is %d",__func__,data_len+1);         

+         delete p;

+         return LYNQ_E_MALLOC_ERROR;

+    }

+    memmove(data_str, data, data_len);     

+    data_str[data_len]='\0';           

+    LYINFLOG("%s return string is %s",__func__,data_str);  

+    start = strchr(data_str,':');

+    if(start != NULL)

+    {

+        strncpy(status,start+1,4);

+        *sbp_status = atoi(status);

+        LYINFLOG("Query sbp status is %d",*sbp_status);

+        return RESULT_OK;

+        

+    }

+    else 

+    {

+        LYERRLOG("Query sbp status Failed");

+        return LYNQ_E_INNER_ERROR;

+    }

+    

+}

+  

+

 static pthread_mutex_t urc_signal_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;

 static pthread_cond_t urc_signal_state_change_cond = PTHREAD_COND_INITIALIZER;

 

diff --git a/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp b/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
index 1fa5578..0099537 100755
--- a/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
+++ b/src/lynq/lib/liblynq-sim/src/lynq_sim.cpp
@@ -102,6 +102,19 @@
     {
         return sock_fd;
     }
+
+    struct sockaddr_in liblynq_data_socket;
+    bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));
+    //set this lib socket config 
+    liblynq_data_socket.sin_family = AF_INET;
+    liblynq_data_socket.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
+    int ret = bind(sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));
+    if (-1 == ret)
+    {
+        RLOGE("liblynq_data_socket bind fail,errno:%d",errno);
+        return -1;
+    }
+    
     struct timeval timeOut;
     timeOut.tv_sec = 60;
     timeOut.tv_usec = 0;
diff --git a/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp b/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp
index 4b6f020..d7c654e 100755
--- a/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp
+++ b/src/lynq/lib/liblynq-sms/lynq_module_socket.cpp
@@ -692,6 +692,18 @@
         return -1;

     }

 

+    struct sockaddr_in liblynq_data_socket;

+    bzero(&liblynq_data_socket, sizeof(liblynq_data_socket));

+    //set this lib socket config 

+    liblynq_data_socket.sin_family = AF_INET;

+    liblynq_data_socket.sin_addr.s_addr = inet_addr(LYNQ_ADDRESS);

+    int ret = bind(module_rc_sock_fd, (struct sockaddr *)&liblynq_data_socket, sizeof(liblynq_data_socket));

+    if (-1 == ret)

+    {

+        LYERRLOG("liblynq_data_socket bind fail,errno:%d",errno);

+        return -1;

+    }

+

     LYINFLOG("module_rc_sock_fd = %d",module_rc_sock_fd);

 

     memset(&module_rc_addr_serv, 0, sizeof(module_rc_addr_serv));

@@ -710,7 +722,6 @@
     BLOCK_RECV_MSG_UNLOCK();

 

 //    pthread_attr_t attr;

-    int ret;

 

     pthread_mutex_init(&s_sendto_mutex, NULL);   

     pthread_mutex_init(&s_RecvMsgBlockMutex, NULL);   

diff --git a/src/lynq/lib/liblynq-wifi6/libwifi6.c b/src/lynq/lib/liblynq-wifi6/libwifi6.c
index 082f9bc..0a5a4e3 100755
--- a/src/lynq/lib/liblynq-wifi6/libwifi6.c
+++ b/src/lynq/lib/liblynq-wifi6/libwifi6.c
@@ -54,6 +54,7 @@
 volatile int g_sta_scan_finish_flag = 1;
 volatile int g_sta_watcher_started_flag = 0;
 volatile int g_sta_conncet_status_flag = 0;
+volatile int g_sta_fake_scan_finish_flag = 0;
 
 pthread_t g_sta_auto_watcher_pid = 0;
 volatile int g_sta_auto_watcher_stop_flag = 0;
@@ -96,7 +97,7 @@
     pthread_mutex_t mutex;
 };
 
-int g_history_disconnect_valid_num = 0;
+volatile int g_history_disconnect_valid_num = 0;
 int g_history_disconnect_net[128];
 
 static pthread_mutex_t s_check_wpa_ctrl_mutex = PTHREAD_MUTEX_INITIALIZER;
@@ -143,6 +144,73 @@
 static int s_service_invoke_timeout_cnt=0;
 const int FAKE_MAX_INT_VALUE = 99999;
 
+static void print_disconnect_list()
+{
+    int i;
+    for( i = 0; i < g_history_disconnect_valid_num; i++ )
+    {
+        RLOGD(" list of g_history_disconnect_valid_num is  %d histroy_list[%d]:%d --------- %d",g_history_disconnect_valid_num,i,g_history_disconnect_net[i],__LINE__);
+    }
+
+    return;
+}
+
+// idex  ----> history_disconnect_list[x]  index
+static int removeElement(int idex)
+{
+    RLOGD("into removeElement");
+    if( index < 0 )
+    {
+        RLOGD("WIFI [removeElement] input idex < 0,idex is %d: ",idex);
+        return -1;
+    }
+    RLOGD("%s line: %d  g_history_disconnect_net[%d]: %d  end g_history_disconnect_net[%d]:%d",__func__,__LINE__,idex,g_history_disconnect_net[idex],g_history_disconnect_valid_num-1, g_history_disconnect_net[g_history_disconnect_valid_num-1]);
+    g_history_disconnect_net[idex] = g_history_disconnect_net[g_history_disconnect_valid_num-1];    //g_history_disconnect_vaild_num  -1 for get last index
+    g_history_disconnect_valid_num --;
+    RLOGD("end removeElement");
+    return 0;
+}
+static int check_history_disconenct_ap_list(int val)
+{
+    print_disconnect_list();
+    RLOGD("WIFI[check_history_disconenct_ap_list]into check_history_disconenct_ap_list && input val is %d g_history_disconnect_valid_num is %d line",val,g_history_disconnect_valid_num,__LINE__);
+    int i;
+    for( i = 0; i < g_history_disconnect_valid_num; i++)
+    {
+        if( val == g_history_disconnect_net[i] )
+        {
+             RLOGD("[wifi]-----input val is %d,g_history_disconnect_net[%d]:%d",val,i,g_history_disconnect_net[i]);
+             RLOGD("end check_history_disconenct_ap_list && return network index");
+             return i;
+        }
+    }
+    RLOGD("end check_history_disconenct_ap_list && return fail,didn't need remove networkid %d from list  g_history_disconnect_valid_num is %d line %d",val,g_history_disconnect_valid_num,__LINE__);
+    return -1;
+}
+
+
+static void lynq_sta_removeElement(int net_no)
+{
+    int ret;
+
+    ret = check_history_disconenct_ap_list(net_no);
+    if( ret == -1 )
+    {
+        RLOGD("curr_net_no not in history_disconenct_lsit,return 0 %s %d",__func__,__LINE__);
+        return;
+    }else
+    {
+        ret = removeElement(ret);
+        if( ret == 0 )
+        {
+            RLOGD("removeElement pass %s %d",__func__,__LINE__);
+            return;
+        }
+    }
+
+    return;
+}
+
 static void notify_service_invoke_fail(int error)
 {
     struct local_wpa_ctrl *lynq_wpa_ctrl = NULL;
@@ -837,19 +905,27 @@
 */
 static void lynq_two_arr_merge(int dis_net_list[],int valid_num,int out[],int * outlen)
 {
+    RLOGD("enter %s %d",__func__,__LINE__);
+    print_disconnect_list();
     int count,ncount,index;
     int flag = 0;
     int merge_index = 0;
     int net_no_list[128];
 
+    for(ncount = 0;ncount < valid_num; ncount++ )
+    {
+        RLOGD("input history disconenct_list[%d] %d %d",ncount,dis_net_list[ncount],__LINE__);
+    }
+
     index =lynq_get_network_number_list(0, 0, net_no_list,NULL);
     for( count = 0; count < index; count++)
     {
         for(ncount = 0; ncount < valid_num; ncount++)
         {
+            RLOGD(" %s dis_net_list[%d]->%d %d",__func__,ncount,dis_net_list[ncount],__LINE__);
             if(net_no_list[count] == dis_net_list[ncount])
             {
-                RLOGD("[wifi]this is history disconnect idx ----> ",net_no_list[count]);
+                RLOGD("[wifi]this is history disconnect idx ----> %d %d",net_no_list[count],__LINE__);
                 flag = 1;
                 break;
             }
@@ -857,6 +933,7 @@
         if( flag != 1 )
         {
             out[merge_index] = net_no_list[count];
+            RLOGD("out[%d]: %d    net_no_list[%d]: %d %d",merge_index,out[merge_index],count,net_no_list[count],__LINE__);
             merge_index ++;
         }
         flag = 0;
@@ -891,7 +968,7 @@
     if (strstr(modify, "CTRL-EVENT-CONNECTED") != NULL)
     {
         *state = LYNQ_WIFI_STA_STATUS_CONNECT;
-        RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d\n",*state,*error);
+        RLOGD("CTRL-EVENT-CONNECTED state:%d,error:%d",*state,*error);
         g_sta_conncet_status_flag = 0;
         return;
     }
@@ -1012,6 +1089,20 @@
         return;
     }
 
+    // add by qs.xiong 20231026   tmp fix sta association request to the driver failed
+    if (strstr(modify, "Association request to the driver failed") != NULL)
+    {
+        RLOGD("Association request to the driver failed --- recover");
+        system("wl down");
+        system("wl up");
+        *error = LYNQ_UNSPECIFIED_REASON;
+        *state = LYNQ_WIFI_STA_STATUS_DISCONNECT;
+        RLOGD("CTRL-EVENT-DISCONNECTED state:%d,error:%d\n",*state,*error);
+        return;
+    }
+    // add by qs.xiong 20231026   tmp fix sta association request to the driver failed end
+
+
     RLOGD("EVENT : %s\n", modify);
     *error = LYNQ_UNSPECIFIED_REASON;
     *state = LYNQ_WIFI_STATUS_EGNORE;
@@ -1218,6 +1309,11 @@
             {
                 notify_connect_status(LYNQ_WIFI_STA_STATUS_DISCONNECT, error);
             }
+            else if (state == LYNQ_WIFI_STA_STATUS_SCAN_RESULT &&
+                     s_sta_status != INNER_STA_STATUS_INIT && g_sta_conncet_status_flag != 0)
+            {
+                RLOGD("donot report scan result during in call connect manual");
+            }
             else
             {
                 notify_connect_status(state, error);
@@ -1238,7 +1334,13 @@
                         system_call_v("%s %s", sta_status_change_script, "disconnect");
                     }
                 }
+
                 last_state = state;
+                if (g_sta_fake_scan_finish_flag == 1)
+                {
+                    g_sta_fake_scan_finish_flag = 0;
+                    notify_connect_status(LYNQ_WIFI_STA_STATUS_SCAN_RESULT, 0);
+                }
             }
         }
     }
@@ -2144,6 +2246,10 @@
     DO_OK_FAIL_REQUEST(lynq_wifi_frequency_cmd);
     DO_OK_FAIL_REQUEST(lynq_cmd_mode);
     DO_OK_FAIL_REQUEST(cmd_save_config);
+//@ tmp do down/up to fix 5G AP turn to 2.4G cannot be conenct
+    system("wl down");
+    system("wl up");
+    RLOGD("[%s] -- run cmd down/up --%d",__func__,__LINE__);
 
     return 0;
 }
@@ -3552,6 +3658,7 @@
 
                 pthread_mutex_lock(&s_global_check_mutex);
                 s_sta_status = INNER_STA_STATUS_CONNECTED;
+                lynq_sta_removeElement(net_no);
                 pthread_cond_signal(&s_global_check_cond);
                 pthread_mutex_unlock(&s_global_check_mutex);
                 return 0;
@@ -3606,10 +3713,15 @@
     system("echo \"\" > /tmp/wlan0_dhcpcd_router");
     usleep(200*1000);
 
+    pthread_mutex_lock(&s_global_check_mutex);
+    lynq_sta_removeElement(net_no);
+    pthread_mutex_unlock(&s_global_check_mutex);
+
     ret = inner_sta_start_stop(net_no, 1, 1);
 
     pthread_mutex_lock(&s_global_check_mutex);
     s_sta_status = INNER_STA_STATUS_CONNECTING;
+    g_sta_conncet_status_flag = 1;
     strcpy(s_sta_current_connecting_ssid, ssid);
     struct timeval now;
     gettimeofday(&now,NULL);
@@ -3660,9 +3772,11 @@
 
 int lynq_wifi_sta_disconnect_ap(lynq_wifi_index_e idx, char *ssid)
 {
+    int i,check_history_idx_flag;
     ap_info_s ap;
     curr_status_info curr_state;
     ap.ap_ssid[0] = '\0';
+    check_history_idx_flag = 0;
 
     if (ssid == NULL || *ssid == '\0')
     {
@@ -3688,8 +3802,25 @@
 
     pthread_mutex_lock(&s_global_check_mutex);
     s_sta_status = INNER_STA_STATUS_DISCONNECTING;
-    g_history_disconnect_net[g_history_disconnect_valid_num] = curr_state.net_no;
-    g_history_disconnect_valid_num++;
+    RLOGD("WIFI[lynq_wifi_sta_disconnect_ap]g_history_disconnect_valid_num is %d",g_history_disconnect_valid_num);
+    for( i = 0; i< g_history_disconnect_valid_num ; i++)
+    {
+        RLOGD("WIFI[lynq_wifi_sta_disconnect_ap]g_history_disconnect_net[%d] is %d,current disconnet network is %d",i,g_history_disconnect_net[i],curr_state.net_no);
+        if( g_history_disconnect_net[i] == curr_state.net_no)
+        {
+            RLOGD("current disconenct ap idx is %d && last aready into g_history_disconenct_net",curr_state.net_no);
+            check_history_idx_flag = 1;
+            break;
+        }
+    }
+    if ( check_history_idx_flag == 0)
+    {
+        RLOGD("current need add ap idx is %d ,g_history_disconnect_valid_num is %d line %d",curr_state.net_no,g_history_disconnect_valid_num,__LINE__);
+        g_history_disconnect_net[g_history_disconnect_valid_num] = curr_state.net_no;
+        g_history_disconnect_valid_num++;
+    }
+    RLOGD("%s %d",__func__,__LINE__);
+    print_disconnect_list();
     pthread_mutex_unlock(&s_global_check_mutex);
     return lynq_wifi_sta_stop_network(idx, curr_state.net_no);
 
@@ -3985,6 +4116,7 @@
     int count, net_no, index;
     int net_no_list[128];
     lynq_wifi_auth_s net_auth;
+
     char lynq_remove_cmd[MAX_CMD];
 
     if (ssid == NULL || *ssid == '\0')
@@ -4018,6 +4150,15 @@
     sprintf(lynq_remove_cmd, "REMOVE_NETWORK %d", net_no);
 
     DO_OK_FAIL_REQUEST(lynq_remove_cmd);
+
+    RLOGD("WIFI[lynq_sta_forget_ap][check_history_disconenct_ap_list] input net_no is %d",net_no);
+
+    pthread_mutex_lock(&s_global_check_mutex);
+    lynq_sta_removeElement(net_no);
+    pthread_mutex_unlock(&s_global_check_mutex);
+
+    RLOGD("%s %d",__func__,__LINE__);
+    print_disconnect_list();
     DO_OK_FAIL_REQUEST(cmd_save_config);
 
     return 0;
@@ -4080,11 +4221,18 @@
 
 int lynq_wifi_sta_start_scan(lynq_wifi_index_e idx)
 {
-    if ( g_sta_conncet_status_flag != 0 )
+    if ( s_sta_status == INNER_STA_STATUS_INIT && g_sta_conncet_status_flag != 0 )
     {
-        RLOGD("current sta is connecting dest ap");
+        RLOGD("current sta is autoconnecting dest ap,fake scan result");
+        g_sta_fake_scan_finish_flag = 1;
+        return 0;
+    }
+    else if (g_sta_conncet_status_flag != 0)
+    {
+        RLOGD("current sta is connecting dest ap, don't scan");
         return 1;
     }
+
     const char *clean_last_re ="wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 bss_flush";
     const char *lynq_scan_cmd = "SCAN";
 
diff --git a/src/lynq/lib/liblynq-wifi6/scripts/start_stop_ap.sh b/src/lynq/lib/liblynq-wifi6/scripts/start_stop_ap.sh
index ff0c59c..441a0ee 100755
--- a/src/lynq/lib/liblynq-wifi6/scripts/start_stop_ap.sh
+++ b/src/lynq/lib/liblynq-wifi6/scripts/start_stop_ap.sh
@@ -17,12 +17,12 @@
         echo "dhcp-authoritative" >> $conf_file
 	echo "dhcp-range=192.168.15.2,192.168.15.14,255.255.255.240,1h"  >> $conf_file
 	echo "dhcp-option=3,192.168.15.1"  >> $conf_file
-	echo "dhcp-option=6,192.168.15.1"  >> $conf_file
+	echo "dhcp-option=6,192.168.15.1,114.114.114.114"  >> $conf_file
 	echo "dhcp-range=192.168.15.2,192.168.15.14,255.255.255.240,1h"  >> $conf_file
 	echo "dhcp-leasefile=/run/wg870/ap0.lease" >> $conf_file
 	ps -eo "%p %a" | grep "/usr/bin/dnsmasq -x /run/wg870/dnsmasq.pid" | grep -v grep 
 	if [ $? != 0 ]; then
-		/usr/bin/dnsmasq -x /run/wg870/dnsmasq.pid -7 /run/wg870/dnsmasq.d --local-service -C $conf_file -r /run/wg870
+		/usr/bin/dnsmasq -x /run/wg870/dnsmasq.pid -7 /run/wg870/dnsmasq.d --local-service -C $conf_file -r /run/wg870 --dhcp-broadcast
 	fi
 
 elif [ "$1" == "stop" ]; then
diff --git a/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h b/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
index dad33d5..dfc2f46 100644
--- a/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
+++ b/src/telephonyware/3.0/libvendor-ril/include/telephony/mtk_ril_ivt.h
@@ -405,6 +405,7 @@
     PDN_RETRYING,
     PDN_FAILED,
     PDN_SCANNING,
+    PDN_TIMEOUT_CANCEL,
 } RIL_Data_Call_PdnState;
 /// @}
 
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/socket_channel.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/socket_channel.cpp
index 15a17ab..dca7898 100755
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/socket_channel.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/socket_channel.cpp
@@ -647,7 +647,11 @@
 #if defined(TELEPHONYWARE)
 static void send_restart_unsol(RIL_SOCKET_ID slot){
 #if defined(ANDROID_MULTI_SIM) && !defined(MODE_DSSS)
+    RLOGI("start send RIL_UNSOL_TELEPHONY_RESTART111111");
     RFX_onUnsolicitedResponse(RIL_UNSOL_TELEPHONY_RESTART, NULL, 0, slot);
+#else
+    //RFX_onUnsolicitedResponse(RIL_UNSOL_TELEPHONY_RESTART, NULL, 0, slot);
+    RLOGI("don't defined ANDROID_MULIT_SIM and MODE_DSSS");
 #endif
     return;
 }
@@ -657,6 +661,11 @@
 void *ril_socket_reader_looper(void *arg) {
     while (1) {
         RilpSocket *socket = (RilpSocket *)arg;
+    #if defined(TELEPHONYWARE)
+        RLOGI("[ril_socket_reader_looper]TELEPHONY HAS RESTART");
+        RLOGI("has defined TELEPHONYWARE");
+        send_restart_unsol(socket->id);
+    #endif
         socket->readerLooper();
         rfx_close_socket(socket->group, socket->id);
 
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
index 4cb9bd2..758f54a 100644
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/ApnContext.cpp
@@ -365,7 +365,19 @@
             ApnContext::mRpDataController->notifyWorld(urc);
         }
         break;
+    case RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL:
+    {
+        urcParcel = urc->getParcel();
+        urcParcel->setDataPosition(sizeof(int32_t) * 2);
 
+        RpDataUtils::fillDataCallResponse(urcParcel, Data_Call_Response_v1);
+
+        RFX_LOG_D(RFX_LOG_TAG, "ApnContext(%s) ::notifyStateChange with newState = %s, with Urc: %s",
+                   mApnType.c_str(), RpDataUtils::apnState2string(newState), RpDataUtils::requestOrUrcToString(urc->getId()));
+
+        ApnContext::mRpDataController->notifyWorld(urc);
+        break;
+    }
     case RIL_Data_Call_PdnState::PDN_IDLE:
     default:
         RFX_LOG_D(RFX_LOG_TAG, "ApnContext(%s)::notifyStateChange: unknown state.", mApnType.c_str());
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
index 640cff1..aeb0699 100755
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/DcTracker.cpp
@@ -1203,13 +1203,17 @@
             RFX_LOG_D(RFX_LOG_TAG, "reTrySetupData, retry with apnType: %s, request: RIL_REQUEST_SETUP_DATA_CALL, delay time: %ld",
                 apnType.c_str(),
                 delay);
-            if (apnType == TEXT_APN_TYPE_DEFAULT) {
+            if (apnType == TEXT_APN_TYPE_DEFAULT || apnType == TEXT_IOT_APN_TYPE_DEFAULT) {
 		DcTracker::mRpDataController->retryRequest(apnType, setupDataMessage, reason, delay);
             } else {
                 DcTracker::mRpDataController->retryRequest2(apnType, setupDataMessage, reason, delay);
             }
             return;
         }
+        apnContext->setSate(RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL);
+        RFX_LOG_D(RFX_LOG_TAG, "reTrySetupData, retry with apnType: %s,RIL_Data_Call_PdnState::PDN_FAILED, delay time: %ld",
+                apnType.c_str(),
+                delay);
     } else {
         string str;
         if (!apnContext->isEnabled()) {
diff --git a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp
index df79299..7f2a987 100644
--- a/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp
+++ b/src/telephonyware/3.0/libvendor-ril/mtk-rilproxy/telephony/data/RpDataUtils.cpp
@@ -354,6 +354,8 @@
         return "PDN_RETRYING";
     case RIL_Data_Call_PdnState::PDN_SCANNING:
         return "PDN_SCANNING";
+    case RIL_Data_Call_PdnState::PDN_TIMEOUT_CANCEL:
+        return "PDN_TIMEOUT_CANCEL";
     }
 }