Merge "[Bugfix][API-1211][rtp] there is noise in second rtp media play        Only Configure:No        Affected branch:unknown        Affected module:unknown        Is it affected on both ZXIC and MTK:ZK and Gsw        Self-test:No        Doc Update:No" into GSW3.0-No-Connman
diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-misc/liblynq-misc.bb b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-misc/liblynq-misc.bb
new file mode 100755
index 0000000..cc0b881
--- /dev/null
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/liblynq-misc/liblynq-misc.bb
@@ -0,0 +1,55 @@
+inherit externalsrc package

+

+DESCRIPTION = "liblynq-misc.so"

+LICENSE = "MobileTekProprietary"

+LIC_FILES_CHKSUM = "file://LICENSE;md5=b1e07e8d88e26263e71d3a9e2aa9a2ff"

+DEPENDS += "platform-libs"

+inherit workonsrc

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

+

+TARGET_CC_ARCH += "${LDFLAGS}"

+BB_INCLUDE_ADD = "--sysroot=${STAGING_DIR_HOST}"

+BB_LDFLAGS_ADD = "--sysroot=${STAGING_DIR_HOST} -Wl,--hash-style=gnu"

+

+

+FILES_${PN} = "${base_libdir}/*.so "

+

+FILES_${PN}-dev = "/test \

+                   ${includedir}"

+

+FILES_${PN}-doc = "/doc"

+

+FILES_${PN}-dbg ="${base_bindir}/.debug \

+                  ${base_libdir}/.debug \

+                  ${base_sbindir}/.debug"

+

+INSANE_SKIP_${PN} += "already-stripped"

+INSANE_SKIP_${PN} += "installed-vs-shipped"

+

+

+#INHIBIT_PACKAGE_STRIP = "1"

+do_compile () {

+	if [ "${PACKAGE_ARCH}" = "cortexa7hf-vfp-vfpv4-neon" ]; then

+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE"

+	elif [ "${PACKAGE_ARCH}" = "cortexa7hf-neon-vfpv4" ]; then

+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE"

+	elif [ "${PACKAGE_ARCH}" = "cortexa53hf-neon-fp-armv8" ]; then

+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -mhard-float -Wl,--hash-style=gnu -DTELEPHONYWARE -mhard-float -mfpu=neon-fp-armv8 -mfloat-abi=hard -mcpu=cortex-a53 -mtune=cortex-a53"

+	else

+		oe_runmake all ROOT=${STAGING_DIR_HOST} OFLAGS="--sysroot=${STAGING_DIR_HOST} -Os -Wl,--hash-style=gnu -DTELEPHONYWARE"

+	fi

+}

+

+do_install () {

+    oe_runmake install ROOT=${D}

+	

+    if [ -d "${WORKONSRC}" ] ; then

+        install -d ${D}${includedir}/lynq_misc

+        cp -arf ${S}/include/* ${D}${includedir}/lynq_misc/	    	

+    fi 

+}

+

+addtask bachclean

+do_bachclean () {

+    oe_runmake clean

+}

diff --git a/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb b/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
index 60fe23a..7c3b8a5 100755
--- a/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
+++ b/meta/meta-mediatek-mt2735/recipes-lynq/packagegroups/packagegroup-lync-mt2735.bb
@@ -56,4 +56,5 @@
     tzdata \
     lynq-tester-service \
     liblynq-shm \
+    liblynq-misc \
     "
diff --git a/meta/poky/meta/recipes-core/systemd/systemd-serialgetty/serial-getty@.service b/meta/poky/meta/recipes-core/systemd/systemd-serialgetty/serial-getty@.service
index e8b027e..36a26c3 100644
--- a/meta/poky/meta/recipes-core/systemd/systemd-serialgetty/serial-getty@.service
+++ b/meta/poky/meta/recipes-core/systemd/systemd-serialgetty/serial-getty@.service
@@ -21,7 +21,9 @@
 
 [Service]
 Environment="TERM=xterm"
+ExecStartPre=/usr/share/init/init_console_log_level %I StartPre
 ExecStart=-/sbin/agetty -8 -L %I @BAUDRATE@ $TERM
+ExecStopPost=/usr/share/init/init_console_log_level %I StopPost
 Type=idle
 Restart=always
 RestartSec=0
diff --git a/meta/poky/meta/recipes-core/systemd/systemd/init_console_log_level b/meta/poky/meta/recipes-core/systemd/systemd/init_console_log_level
new file mode 100644
index 0000000..384e538
--- /dev/null
+++ b/meta/poky/meta/recipes-core/systemd/systemd/init_console_log_level
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+if [ "$1" = "ttyS0" ]; then
+   if [ "$2" = "StartPre" ]; then
+	   cat /proc/sys/kernel/printk | awk '{print "echo 1 "$2" "$3" "$4" > /proc/sys/kernel/printk"}' | sh
+   elif [ "$2" = "StopPost" ]; then
+	   cat /proc/sys/kernel/printk | awk '{print "echo 1 "$2" "$3" "$4" > /proc/sys/kernel/printk"}' | sh
+   fi
+fi
+
diff --git a/meta/poky/meta/recipes-core/systemd/systemd_239.bb b/meta/poky/meta/recipes-core/systemd/systemd_239.bb
index a8120a9..3b1f630 100755
--- a/meta/poky/meta/recipes-core/systemd/systemd_239.bb
+++ b/meta/poky/meta/recipes-core/systemd/systemd_239.bb
@@ -17,6 +17,7 @@
 SRC_URI += "file://touchscreen.rules \
            file://00-create-volatile.conf \
            file://init \
+           file://init_console_log_level \
            file://0001-binfmt-Don-t-install-dependency-links-at-install-tim.patch \
            file://0002-use-lnr-wrapper-instead-of-looking-for-relative-opti.patch \
            file://0003-implment-systemd-sysv-install-for-OE.patch \
@@ -306,6 +307,9 @@
 	ln ${D}${base_bindir}/udevadm ${D}${libexecdir}/${MLPREFIX}udevadm	
 	
 	rm -rf ${D}/etc/systemd/system/sysinit.target.wants/systemd-timesyncd.service	
+
+	install -d ${D}/usr/share/init
+	install -m 0755 ${WORKDIR}/init_console_log_level ${D}${datadir}/init/init_console_log_level
 }
 
 
@@ -558,6 +562,7 @@
                 ${datadir}/dbus-1/system.d/org.freedesktop.login1.conf \
                 ${datadir}/dbus-1/system.d/org.freedesktop.timesync1.conf \
                 ${datadir}/dbus-1/system.d/org.freedesktop.portable1.conf \
+                ${datadir}/init/init_console_log_level \
                "
 
 FILES_${PN}-dev += "${base_libdir}/security/*.la ${datadir}/dbus-1/interfaces/ ${sysconfdir}/rpm/macros.systemd"
diff --git a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt2735.dtsi b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt2735.dtsi
index 50ee280..ad2444c 100644
--- a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt2735.dtsi
+++ b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/mt2735.dtsi
@@ -387,7 +387,7 @@
 			compatible = "mediatek,reserve-memory-medmcu_share";
 			no-map;
 			alignment = <0 0x10000>;
-			reg = <0 0x60040000 0 0x328700>;
+			reg = <0 0x60040000 0 0x330000>;
 		};
 		
 		reserve-memory-sspm_share {
diff --git a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/Makefile b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/Makefile
index 00b81ea..ea2fdf2 100755
--- a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/Makefile
+++ b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/Makefile
@@ -149,6 +149,7 @@
 # Set PM 2 always regardless suspend/resume
 DHDCFLAGS += -DSUPPORT_PM2_ONLY
 
+DHDCFLAGS += -DDISABLE_FW_ROAM
 # FT roam
 DHDCFLAGS += -DWLFBT -DGTK_OFFLOAD_SUPPORT
 DHDCFLAGS += -DBCMCCX
diff --git a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.c b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.c
index c020db9..1d0bdc4 100755
--- a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.c
+++ b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/dhd_linux.c
@@ -10327,7 +10327,11 @@
 	wl_el_tag_params_t *el_tag = NULL;
 #endif /* DHD_8021X_DUMP */
 #ifdef ROAM_ENABLE
+#ifdef DISABLE_FW_ROAM
+        uint roamvar = 1;
+#else
 	uint roamvar = 0;
+#endif
 	int roam_trigger[2] = {CUSTOM_ROAM_TRIGGER_SETTING, WLC_BAND_ALL};
 	int roam_scan_period[2] = {10, WLC_BAND_ALL};
 	int roam_delta[2] = {CUSTOM_ROAM_DELTA_SETTING, WLC_BAND_ALL};
diff --git a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/wl_cfg80211.c
index 5735440..dab598c 100755
--- a/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/wl_cfg80211.c
+++ b/src/kernel/linux/v4.19/drivers/net/wireless/bcmdhd/wl_cfg80211.c
@@ -177,6 +177,7 @@
 #endif /* WL_FW_OCE_AP_SELECT && (ROAM_ENABLE || BCMFW_ROAM_ENABLE) */
 module_param(fw_ap_select, uint, 0660);
 /* this flag enable triggerrs bgscan method from supplicant */
+
 uint us_ap_select = false;
 module_param(us_ap_select, uint, 0660);
 
@@ -2443,6 +2444,13 @@
 				/* Enable buffering of PTK key till EAPOL 4/4 is sent out */
 				wldev_iovar_setint(ndev, "buf_key_b4_m4", 1);
 			}
+/*change for fix sta no disconnect event by IFX patch @20230823*/
+#ifdef DISABLE_FW_ROAM
+			if (wl_iftype == WL_IF_TYPE_STA){
+				wldev_iovar_setint(ndev,"roam_off", 1);
+			}
+#endif
+
 			break;
 
 		default:
@@ -16597,9 +16605,10 @@
 
 	if (!profile)
 		return WL_INVALID;
+/*change for fix sta no disconnect event by IFX patch,change by qs.xiong @20230823*/
+//	if (!us_ap_select)
+//		return 0;
 
-	if (!us_ap_select)
-		return 0;
 
 	WL_DBG(("Enter: event %d (%d), status=%d\n",
 		ntoh32(e->event_type), ntoh32(e->status), ntoh32(e->reason)));
diff --git a/src/lynq/framework/lynq-audio-service/src/lynq_audio.service b/src/lynq/framework/lynq-audio-service/src/lynq_audio.service
index c9b68cc..19d6a99 100755
--- a/src/lynq/framework/lynq-audio-service/src/lynq_audio.service
+++ b/src/lynq/framework/lynq-audio-service/src/lynq_audio.service
@@ -5,11 +5,11 @@
 #Requires=mtkfusionrild.service
 
 [Service]
-StandardOutput=kmsg+console
+StandardOutput=kmsg
 Type=simple
 RemainAfterExit=no
 ExecStart=/usr/bin/lynq-audio-service
 
 [Install]
 Alias=pwrwifid
-WantedBy=multi-user.target
\ No newline at end of file
+WantedBy=multi-user.target
diff --git a/src/lynq/framework/lynq-logrotate-service/src/lynq_logrotate.service b/src/lynq/framework/lynq-logrotate-service/src/lynq_logrotate.service
index 1b1839f..0c9aeec 100755
--- a/src/lynq/framework/lynq-logrotate-service/src/lynq_logrotate.service
+++ b/src/lynq/framework/lynq-logrotate-service/src/lynq_logrotate.service
@@ -5,7 +5,7 @@
 #Requires=mtkfusionrild.service
 
 [Service]
-StandardOutput=kmsg+console
+StandardOutput=kmsg
 Type=simple
 RemainAfterExit=no
 #ExecStart=/usr/bin/lynq-default
diff --git a/src/lynq/framework/lynq-ndis-uevent/src/lynq_ndis_uevent.service b/src/lynq/framework/lynq-ndis-uevent/src/lynq_ndis_uevent.service
index f28df24..288f8fa 100755
--- a/src/lynq/framework/lynq-ndis-uevent/src/lynq_ndis_uevent.service
+++ b/src/lynq/framework/lynq-ndis-uevent/src/lynq_ndis_uevent.service
@@ -3,7 +3,7 @@
 After=init_usb.service
 
 [Service]
-StandardOutput=kmsg+console
+StandardOutput=kmsg
 Type=simple
 RemainAfterExit=no
 ExecStart=/usr/bin/lynq-ndis-uevent
@@ -12,4 +12,4 @@
 Group=root
 
 [Install]
-WantedBy=multi-user.target
\ No newline at end of file
+WantedBy=multi-user.target
diff --git a/src/lynq/framework/lynq-ril-service/src/lynq_ril_service.service b/src/lynq/framework/lynq-ril-service/src/lynq_ril_service.service
index 86df0f9..a547fd4 100755
--- a/src/lynq/framework/lynq-ril-service/src/lynq_ril_service.service
+++ b/src/lynq/framework/lynq-ril-service/src/lynq_ril_service.service
@@ -4,7 +4,7 @@
 Requires=mtkfusionrild.service
 
 [Service]
-StandardOutput=kmsg+console
+StandardOutput=kmsg
 Type=simple
 RemainAfterExit=no
 ExecStart=/usr/bin/lynq-ril-service
@@ -16,4 +16,4 @@
 
 [Install]
 Alias=rilsvc
-WantedBy=multi-user.target
\ No newline at end of file
+WantedBy=multi-user.target
diff --git a/src/lynq/framework/lynq-sdk-ready/src/lynq_sdk_ready.service b/src/lynq/framework/lynq-sdk-ready/src/lynq_sdk_ready.service
index 5132c86..a771fc0 100755
--- a/src/lynq/framework/lynq-sdk-ready/src/lynq_sdk_ready.service
+++ b/src/lynq/framework/lynq-sdk-ready/src/lynq_sdk_ready.service
@@ -3,7 +3,7 @@
 After=lynq_ril_service.service

 

 [Service]

-StandardOutput=kmsg+console

+StandardOutput=kmsg

 Type=simple

 RemainAfterExit=no

 ExecStart=/usr/bin/lynq-sdk-ready

@@ -13,4 +13,4 @@
 

 [Install]

 Alias=rilsvc

-WantedBy=multi-user.target
\ No newline at end of file
+WantedBy=multi-user.target

diff --git a/src/lynq/framework/lynq-tester-service/src/lynq_tester.service b/src/lynq/framework/lynq-tester-service/src/lynq_tester.service
index f88b325..906a5a8 100755
--- a/src/lynq/framework/lynq-tester-service/src/lynq_tester.service
+++ b/src/lynq/framework/lynq-tester-service/src/lynq_tester.service
@@ -5,7 +5,7 @@
 #Requires=mtkfusionrild.service
 
 [Service]
-StandardOutput=kmsg+console
+StandardOutput=kmsg
 Type=simple
 RemainAfterExit=no
 ExecStart=/usr/bin/lynq-tester-service
diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index f73b76f..1351300 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -232,6 +232,36 @@
     }
     return ret;
 }
+//@return 
+//other:this apn has been used in apn table
+//-1:this apn not has been used in apn table
+int check_used_apn(char apnType[])
+{
+    LYINFLOG("check_used_apn.apnType:%s",apnType);
+    int ret = 0;
+    int len = 0;
+    for(ret;ret<LYNQ_APN_CHANNEL_MAX;ret++)
+    {
+        len = strlen(apnType);
+        if(strncmp(lynq_apn_table[ret].apnType,apnType,len)==0)
+        {
+            LYINFLOG("check_used_apn.apnType:%s in apn table",apnType);
+            return ret;
+        }
+    }
+    return -1;
+}
+int get_handle(char apnType[])
+{
+    int call_id = 0;
+    call_id = check_used_apn(apnType);
+    if(call_id == -1)
+    {
+        call_id = updateApn(apnType);
+    }
+    LYINFLOG("handle:%d",call_id);
+    return call_id;
+}
 
 int handleCheck(int handle)
 {
@@ -914,7 +944,7 @@
     client.paramLen = 0;
     bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
     LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
-    lynq_data_call_id = updateApn("default");
+    lynq_data_call_id = get_handle("default");
     if (lynq_data_call_id < 0)
     {
         LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
@@ -1119,7 +1149,7 @@
     sprintf(client.param,"%s %s %s %s %s %s %s",apn,apnType,argv[1],argv[2],argv[3],argv[4],argv[5]);
     #endif  //GSW_RIL_CFG
     LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
-    lynq_data_call_id = updateApn(apnType);
+    lynq_data_call_id = get_handle(apnType);
     if (lynq_data_call_id < 0)
     {
         LYERRLOG("update apn table fail error id = %d",lynq_data_call_id);
diff --git a/src/lynq/lib/liblynq-misc/LICENSE b/src/lynq/lib/liblynq-misc/LICENSE
new file mode 100755
index 0000000..605b7ea
--- /dev/null
+++ b/src/lynq/lib/liblynq-misc/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MobileTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MobileTek Inc. and/or its licensors. Without
+the prior written permission of MobileTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MobileTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MobileTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MobileTek SOFTWARE")
+RECEIVED FROM MobileTek AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MobileTek 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 MobileTek PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MobileTek SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MobileTek
+SOFTWARE. MobileTek SHALL ALSO NOT BE RESPONSIBLE FOR ANY MobileTek SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MobileTek'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MobileTek SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MobileTek'S OPTION, TO REVISE OR REPLACE THE
+MobileTek SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MobileTek FOR SUCH MobileTek SOFTWARE AT ISSUE.
diff --git a/src/lynq/lib/liblynq-misc/include/lynq_misc.h b/src/lynq/lib/liblynq-misc/include/lynq_misc.h
new file mode 100755
index 0000000..4207191
--- /dev/null
+++ b/src/lynq/lib/liblynq-misc/include/lynq_misc.h
@@ -0,0 +1,28 @@
+/**

+ * @file misc.h

+ * @author you.chen

+ * @brief 

+ * @version 1.0

+ * @date 2023-08-21

+ * 

+ * @copyright Copyright (c) 2023

+ * 

+ */

+#ifndef __LYNQ_MISC_H__

+#define __LYNQ_MISC_H__

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/**

+ * @brief lynq_get_security_boot_flag get the flag in efuse

+ * @param enable_flag (output param, 1 for enabled)

+ * @return 0 success, -1 some error occur

+ */

+int lynq_get_security_boot_flag(int * enabled_flag);

+

+#ifdef __cplusplus

+}

+#endif 

+#endif //#ifndef __LYNQ_MISC_H__

diff --git a/src/lynq/lib/liblynq-misc/lynq_misc.cpp b/src/lynq/lib/liblynq-misc/lynq_misc.cpp
new file mode 100755
index 0000000..1bada46
--- /dev/null
+++ b/src/lynq/lib/liblynq-misc/lynq_misc.cpp
@@ -0,0 +1,42 @@
+#include <stdio.h>

+#include "lynq_misc.h"

+#include "log/log.h"

+

+#undef LOG_TAG

+#define LOG_TAG "MISC"

+

+int lynq_get_security_boot_flag(int * enabled_flag)

+{

+    int value, ret;

+    if (enabled_flag == NULL)

+    {

+        RLOGE("input param is null ptr");

+        return -1;

+    }

+    *enabled_flag = 0;

+    FILE *pfile=fopen("/proc/device-tree/chosen/atag,devinfo", "r");

+    if (pfile == NULL)

+    {

+        RLOGE("open devinfo fail");

+        return -1;

+    }

+    ret = fseek(pfile, 0x428, 0);

+    if (ret != 0)

+    {

+        RLOGE("seek file fail");

+        fclose(pfile);

+        return -1;

+    }

+    ret = fread(&value, sizeof (value), 1, pfile);

+    if (ret != 1)

+    {

+        RLOGE("read file fail");

+        fclose(pfile);

+        return -1;

+    }

+    fclose(pfile);

+

+    // the third bit of 32bits at 0x428 (big endian?), 1 for enabled, 0 not enabled

+    *enabled_flag = (value & 0x20) == 0 ? 0 : 1;

+    return 0;

+}

diff --git a/src/lynq/lib/liblynq-misc/makefile b/src/lynq/lib/liblynq-misc/makefile
new file mode 100755
index 0000000..5864273
--- /dev/null
+++ b/src/lynq/lib/liblynq-misc/makefile
@@ -0,0 +1,58 @@
+SHELL = /bin/sh
+RM = rm -f
+
+LOCAL_CFLAGS := -Wall \
+                -g -Os \
+                -flto \
+                -fPIC       
+
+PWD := $(shell pwd)
+
+$(warning ################# lynq misc ROOT: $(ROOT),includedir:$(includedir), PWD :$(PWD))
+LOCAL_PATH   = .
+
+LOCAL_C_INCLUDES = \
+  -I. \
+  -I$(LOCAL_PATH)/include \
+  -I$(ROOT)$(includedir) \
+
+LOCAL_LIBS := \
+    -L. \
+    -ldl \
+    -llog \
+
+SOURCES = $(wildcard *.cpp)
+
+EXECUTABLE = liblynq-misc.so
+
+OBJECTS=$(SOURCES:.c=.o)
+all: $(EXECUTABLE)
+
+$(EXECUTABLE): $(OBJECTS)
+	$(CXX) -shared -Wl,--no-undefined $(OBJECTS) $(LOCAL_LIBS) $(LOCAL_CFLAGS) $(LOCAL_C_INCLUDES) -o $@
+
+%.o : %.c
+	$(CC) $(LOCAL_C_INCLUDES) $(LOCAL_CFLAGS) $(LOCAL_LIBS) -o $@ -c $<
+
+build:  $(EXECUTABLE)
+	$(warning ########## build $(EXECUTABLE)  ##########)
+
+install:
+	$(warning ################# lynq misc EXECUTABLE: $(EXECUTABLE),base:$(base_libdir))
+	mkdir -p $(ROOT)$(base_libdir)/
+	install $(EXECUTABLE) $(ROOT)$(base_libdir)/
+
+pack_rootfs:
+	$(warning ################# lynq misc PACK: $(PACK_INITRAMFS_TO),base:$(base_libdir))
+	mkdir -p $(PACK_INITRAMFS_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_INITRAMFS_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_INITRAMFS_TO)$(base_libdir)/$(EXECUTABLE)
+	mkdir -p $(PACK_TO)$(base_libdir)/
+	cp -af $(EXECUTABLE) $(PACK_TO)$(base_libdir)/
+	$(CROSS)strip $(PACK_TO)$(base_libdir)/$(EXECUTABLE)
+
+.PHONY: clean
+clean:
+	$(RM) $(OBJECTS) $(EXECUTABLE)
+
+
diff --git a/src/lynq/lib/liblynq-wifi6/include/libwifi6.h b/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
index 8caf003..f99af3d 100755
--- a/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
+++ b/src/lynq/lib/liblynq-wifi6/include/libwifi6.h
@@ -157,9 +157,11 @@
 int lynq_wifi_sta_connect_timeout(lynq_wifi_index_e idx, char *ssid, lynq_wifi_auth_s auth, char *psw, int timeout);
 //disconnect 
 int lynq_wifi_sta_disconnect(lynq_wifi_index_e idx,char *ssid);
+int lynq_wifi_sta_disconnect_ap(lynq_wifi_index_e idx,char *ssid);
 
 //start sta mode;enable sta
 int lynq_wifi_sta_start(lynq_wifi_index_e idx);
+int lynq_wifi_sta_start_auto(lynq_wifi_index_e idx);
 //stop sta:disable sta
 int lynq_wifi_sta_stop(lynq_wifi_index_e idx);
 
diff --git a/src/lynq/lib/liblynq-wifi6/libwifi6.c b/src/lynq/lib/liblynq-wifi6/libwifi6.c
index 2772668..f56cc2d 100755
--- a/src/lynq/lib/liblynq-wifi6/libwifi6.c
+++ b/src/lynq/lib/liblynq-wifi6/libwifi6.c
@@ -46,11 +46,6 @@
 volatile int g_ap_watcher_stop_flag = 0;
 volatile int g_ap_watcher_started_flag = 0;
 
-pthread_t g_ap_tmp_watcher_pid = 0;
-volatile int g_ap_tmp_watcher_stop_flag = 0;
-
-
-
 pthread_t g_sta_watcher_pid = 0;
 volatile int g_sta_watcher_stop_flag = 0;
 volatile int g_sta_scan_finish_flag = 1;
@@ -495,34 +490,6 @@
     }
 }
 
-
-static void APTmpWatcherThreadProc() {
-
-    int i = 0;
-    g_ap_tmp_watcher_stop_flag = 0;
-    int delytimes = 1800;
-
-    RLOGD("APTmpWatcherThreadProc ----> ThreadProc start");
-    while(1)
-    {
-        sleep(1);
-        i++;
-        if( i == delytimes )
-        {
-            i = 0;
-            system("wl reinit");
-            RLOGD("APTmpWatcherThreadProc ----- > do cmd reinit");
-        }
-        if( g_ap_tmp_watcher_stop_flag == 1 )
-        {
-           RLOGD("APTmpWatcherThreadProc ----- > ap closed or wifi disabled");
-           return;
-        }
-    }
-
-}
-
-
 static void inner_check_connect_error(const char * event_msg, lynq_wifi_sta_status_s state, error_number_s error_num)
 {
     char * p;
@@ -574,9 +541,10 @@
     sprintf(LYNQ_DISABLE_CMD,"DISABLE_NETWORK %d",networkid);
     RLOGD("LYNQ_DISABLE_CMD is:%d\n",LYNQ_DISABLE_CMD);
     DO_OK_FAIL_REQUEST(LYNQ_DISABLE_CMD);
-    
+    DO_OK_FAIL_REQUEST(cmd_save_config);
+
     return 0;
-    
+
 }
 
 
@@ -1158,15 +1126,12 @@
     g_ap_watcher_stop_flag = 1;
     g_sta_watcher_stop_flag = 1;
     g_sta_auto_watcher_stop_flag = 1;
-    g_ap_tmp_watcher_stop_flag = 1;
     if (g_ap_watcher_pid != 0)
         pthread_join(g_ap_watcher_pid, NULL);
     if (g_sta_watcher_pid != 0)
         pthread_join(g_sta_watcher_pid, NULL);
     if (g_sta_auto_watcher_pid != 0)
         pthread_join(g_sta_auto_watcher_pid, NULL);
-    if (g_ap_tmp_watcher_pid != 0)
-        pthread_join(g_ap_tmp_watcher_pid, NULL);
     if (g_lynq_wpa_ctrl[0] != NULL)
         wpa_ctrl_close(g_lynq_wpa_ctrl[0]);
     if (g_lynq_wpa_ctrl[1] != NULL)
@@ -1174,7 +1139,6 @@
     g_ap_watcher_pid = 0;
     g_sta_watcher_pid = 0;
     g_sta_auto_watcher_pid = 0;
-    g_ap_tmp_watcher_pid = 0;
     g_lynq_wpa_ctrl[0] = NULL;
     g_lynq_wpa_ctrl[1] = NULL;
     system("systemctl stop wg870_drv_insmod.service");
@@ -2317,17 +2281,6 @@
 
     check_tether_and_notify();
 
-    if (g_ap_tmp_watcher_pid == 0)
-    {
-        if(pthread_create(&g_ap_tmp_watcher_pid,NULL,APTmpWatcherThreadProc,NULL) < 0)
-        {
-            g_ap_tmp_watcher_pid = 0;
-            RLOGE("[wifi error]create APTmpWatcherThreadProc fail");
-            return -1;
-        }
-        RLOGD("[lynq_wifi_ap_start] creat APTmpWatcherThreadProc ok");
-    }
-
     return 0;
 }
 
@@ -2356,10 +2309,7 @@
         RLOGE("lynq_wifi_ap_start excute script fail");
         return -1;
     }
-    g_ap_tmp_watcher_stop_flag = 1;
-    if (g_ap_tmp_watcher_pid != 0)
-        pthread_join(g_ap_tmp_watcher_pid, NULL);
-    g_ap_tmp_watcher_pid = 0;
+
     return 0;
 }
 
@@ -3285,6 +3235,42 @@
     return inner_sta_start_stop(curr_state.net_no, 0, 0);
 }
 
+int lynq_wifi_sta_disconnect_ap(lynq_wifi_index_e idx, char *ssid)
+{
+    ap_info_s ap;
+    curr_status_info curr_state;
+    ap.ap_ssid[0] = '\0';
+
+    if (ssid == NULL || *ssid == '\0')
+    {
+        RLOGE("input ssid is NULL\n");
+        return -1;
+    }
+
+    CHECK_IDX(idx, CTRL_STA);
+
+
+    curr_state.ap = &ap;
+    curr_state.state = NULL;
+
+    if (inner_get_status_info(CTRL_STA, &curr_state) != 0)
+    {
+        return 0;
+    }
+
+    if (strcmp(ap.ap_ssid, ssid) != 0)
+    {
+        return 0;
+    }
+
+    pthread_mutex_lock(&s_global_check_mutex);
+    s_sta_status = INNER_STA_STATUS_DISCONNECTING;
+    pthread_mutex_unlock(&s_global_check_mutex);
+    return lynq_wifi_sta_stop_network(idx, curr_state.net_no);
+
+}
+
+
 int lynq_wifi_sta_start(lynq_wifi_index_e idx)
 {
 //    const char *lynq_reconfigure_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 RECONFIGURE /data/wifi/wg870/wpa_supplicant.conf";
@@ -3315,6 +3301,29 @@
     curr_state.state = state;
     return inner_get_status_info(interface, &curr_state);
 }
+
+int lynq_wifi_sta_start_auto(lynq_wifi_index_e idx)
+{
+
+    const char *lynq_reconnect_cmd = "wpa_cli -iwpa_wlan0_cmd -p/var/run/ IFNAME=wlan0 reconnect";
+
+    CHECK_IDX(idx, CTRL_STA);
+    CHECK_WPA_CTRL(CTRL_STA);
+
+    ret = system_call_v("%s %s", start_stop_sta_script, "start");
+    if (ret != 0)
+    {
+        RLOGE("lynq_wifi_ap_start excute script fail");
+        return -1;
+    }
+
+//    system(lynq_enable_sta_cmd);
+    system(lynq_reconnect_cmd);
+
+    return 0;
+}
+
+
 int lynq_wifi_sta_stop(lynq_wifi_index_e idx)
 {
 //    char lynq_disable_network_cmd[MAX_CMD];
@@ -3352,7 +3361,7 @@
         RLOGD("lynq_wifi_ap_start curr state %s", state);
         usleep(SLEEP_TIME_ON_IDLE);
     }
-
+    
     return 0;
 //    return system("connmanctl disable wifi");
 }
diff --git a/src/lynq/lib/libpoweralarm/format_change.c b/src/lynq/lib/libpoweralarm/format_change.c
index d9cac51..8d3e3b1 100644
--- a/src/lynq/lib/libpoweralarm/format_change.c
+++ b/src/lynq/lib/libpoweralarm/format_change.c
@@ -1,4 +1,4 @@
-#include"./include/format_change.h"
+#include"format_change.h"
 #include<log/log.h>
 
 
@@ -130,4 +130,4 @@
     regfree(&reg_sec);
     
     return sec;
-}
\ No newline at end of file
+}
diff --git a/src/lynq/lib/libpoweralarm/include/format_change.h b/src/lynq/lib/libpoweralarm/format_change.h
similarity index 99%
rename from src/lynq/lib/libpoweralarm/include/format_change.h
rename to src/lynq/lib/libpoweralarm/format_change.h
index 0656c9f..e84c985 100644
--- a/src/lynq/lib/libpoweralarm/include/format_change.h
+++ b/src/lynq/lib/libpoweralarm/format_change.h
@@ -12,4 +12,4 @@
 ssize_t format_change(char *buffer);
 
 
-#endif
\ No newline at end of file
+#endif
diff --git a/src/lynq/lib/libpoweralarm/include/lynq_alarm.h b/src/lynq/lib/libpoweralarm/include/lynq_alarm.h
new file mode 100644
index 0000000..b72e0f0
--- /dev/null
+++ b/src/lynq/lib/libpoweralarm/include/lynq_alarm.h
@@ -0,0 +1,27 @@
+#ifndef _LYNQ_ALARM_H_
+#define _LYNQ_ALARM_H_
+
+
+#include<stdio.h>
+#include<stdlib.h>
+#include<regex.h>
+#include<stdbool.h>
+#include<time.h>
+#include<string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+ssize_t wakealarm(char *buffer);
+
+ssize_t poweralarm(char *buffer);
+
+int cancel_wakealarm(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/lynq/lib/libpoweralarm/libpoweralarm.c b/src/lynq/lib/libpoweralarm/libpoweralarm.c
index b63d663..aeb3933 100755
--- a/src/lynq/lib/libpoweralarm/libpoweralarm.c
+++ b/src/lynq/lib/libpoweralarm/libpoweralarm.c
@@ -3,24 +3,14 @@
 #include<unistd.h>
 #include<stdbool.h>
 #include<log/log.h>
-#include"./include/format_change.h"
-
+#include"./include/lynq_alarm.h"
+#include"format_change.h"
 
 #define LOG_TAG "libpoweralarm" 
 #define RTCFILE_POWERALARM "/sys/class/rtc/rtc0/poweralarm"
 
 #define RTCFILE_WAKEALARM "/sys/class/rtc/rtc0/wakealarm"
 
-extern "C" ssize_t wakealarm(char *buffer);
-
-
-extern "C" ssize_t poweralarm(char *buffer);
-
-ssize_t poweralarm(char *buffer);
-
-ssize_t wakealarm(char *buffer);
-
-int cancel_wakealarm(void);
 
 /*****************************************************************************
 * 
@@ -31,6 +21,7 @@
 *   Return Value : -1: error ; >0: set to wake up the devices after seconds
 *
 *****************************************************************************/
+
 ssize_t poweralarm(char *buffer)
 {
     ssize_t sec;
@@ -101,8 +92,9 @@
 
 int cancel_wakealarm(void)
 {
-     int ret;
+    int ret;
     ret = system("echo +0 > /sys/class/rtc/rtc0/wakealarm");
+    ret = system("echo +315360000 > /sys/class/rtc/rtc0/wakealarm");
     RLOGD("close wakealarm ret= %d\n", ret);
     return ret;
 
diff --git a/src/lynq/packages/thirdpart/lynq-wg870/wpa_supplicant/.config b/src/lynq/packages/thirdpart/lynq-wg870/wpa_supplicant/.config
index 0199bde..afa24ab 100755
--- a/src/lynq/packages/thirdpart/lynq-wg870/wpa_supplicant/.config
+++ b/src/lynq/packages/thirdpart/lynq-wg870/wpa_supplicant/.config
@@ -511,7 +511,7 @@
 #CONFIG_MATCH_IFACE=y
 
 # Disable roaming in wpa_supplicant
-#CONFIG_NO_ROAMING=y
+CONFIG_NO_ROAMING=y
 
 # AP mode operations with wpa_supplicant
 # This can be used for controlling AP mode operations with wpa_supplicant. It
diff --git a/src/lynq/packages/thirdpart/lynq-wg870/wpa_supplicant/events.c b/src/lynq/packages/thirdpart/lynq-wg870/wpa_supplicant/events.c
index 6b36e5e..912bcc9 100755
--- a/src/lynq/packages/thirdpart/lynq-wg870/wpa_supplicant/events.c
+++ b/src/lynq/packages/thirdpart/lynq-wg870/wpa_supplicant/events.c
@@ -2213,6 +2213,10 @@
 		return 1; /* we are not associated; continue */
 	if (wpa_s->current_ssid == NULL)
 		return 1; /* unknown current SSID */
+	//you.chen@20230826 add not roam when connected begin
+	if (wpa_s->wpa_state == WPA_COMPLETED)
+		return 0;
+	//you.chen@20230826 add not roam when connected end
 	if (wpa_s->current_ssid != ssid)
 		return 1; /* different network block */