Merge "[Bugfix][API-789][network] lynq_set_prefferred_networktype sometimes return 8004" into MR3.0-merge
diff --git a/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf b/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf
index e6d3f7b..0d37d9c 100755
--- a/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf
+++ b/meta/meta-mediatek-mt2735/conf/machine/auto2735evb-ivt-main.conf
@@ -87,3 +87,6 @@
 
 #MOBILETEK_RTK_CFG:"enable","disable"
 MOBILETEK_RTK_CFG = "disable"
+
+#MOBILETEK_QSER_CFG:"enable","disable"
+MOBILETEK_QSER_CFG = "enable"
\ No newline at end of file
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 1adce6a..202527b 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
@@ -68,4 +68,8 @@
 RDEPENDS_packagegroup-lync-mt2735 += "\
         ${@bb.utils.contains('MOBILETEK_RTK_CFG', 'enable', ' liblynq-rtk', '', d)} \
 "
+
+RDEPENDS_packagegroup-lync-mt2735 += "\
+        ${@bb.utils.contains('MOBILETEK_QSER_CFG', 'enable', ' liblynq-qser-data liblynq-qser-sms liblynq-qser-sim liblynq-qser-voice', '', d)} \
+"
   
diff --git a/meta/meta-mediatek-mt2735/recipes-telephonyware/atcid/atci_1.0.0.bb b/meta/meta-mediatek-mt2735/recipes-telephonyware/atcid/atci_1.0.0.bb
index c614084..9022fdd 100755
--- a/meta/meta-mediatek-mt2735/recipes-telephonyware/atcid/atci_1.0.0.bb
+++ b/meta/meta-mediatek-mt2735/recipes-telephonyware/atcid/atci_1.0.0.bb
@@ -21,8 +21,8 @@
                      -I${STAGING_DIR_HOST}/${libdir}\
                      -DENABLE_TRM \
 "
-
-EXTRA_OEMAKE = "'LYNQ_ATSVC_SUPPORT = ${LYNQ_ATSVC_SUPPORT}'"
+EXTRA_OEMAKE = "'LYNQ_ATSVC_SUPPORT = ${LYNQ_ATSVC_SUPPORT}'\
+                'MOBILETEK_ATCID_CFG = ${MOBILETEK_ATCID_CFG}'"
 
 CFLAGS_append = "${ATCID_CFLAGS_ADD}"
 CXXFLAGS_append = "${ATCID_CFLAGS_ADD}"
diff --git a/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 6dd83e1..af2d73f 100755
--- a/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/src/kernel/linux/v4.19/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -486,7 +486,8 @@
 	regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val);
 
 	/* couple phydev to net_device */
-	if (mtk_phy_connect_node(eth, mac, np))
+	err = mtk_phy_connect_node(eth, mac, np);
+	if (err)
 		goto err_phy;
 
 	dev->phydev->autoneg = AUTONEG_ENABLE;
@@ -519,11 +520,72 @@
 {
 	struct mtk_mac *mac = netdev_priv(dev);
 
-	phy_disconnect(dev->phydev);
+	if (dev->phydev)
+		phy_disconnect(dev->phydev);
 	if (of_phy_is_fixed_link(mac->of_node))
 		of_phy_deregister_fixed_link(mac->of_node);
 }
 
+static void mtk_phy_start(struct net_device *dev) {
+
+	struct mtk_mac *mac = netdev_priv(dev);
+	u32 mcr;
+
+	if (dev->phydev)
+		if (dev->phydev->link)
+			phy_start(dev->phydev);
+		else {
+#if defined(CONFIG_HW_NAT)
+			int i = 0;
+
+			for (i = 0; i < MAX_IF_NUM; i++)
+				if (mtk_fast_path[i])
+					break;
+
+			if (i < MAX_IF_NUM) {
+				mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id));
+				mcr |= MAC_MCR_FORCE_LINK;
+				mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
+				netif_carrier_on(dev);
+			}
+
+			pr_notice("%s: no PHY link, enable sw-fast-path\n", __func__);
+#endif
+		}
+	else
+		pr_notice("%s: no PHY device\n", __func__);
+}
+
+static void mtk_phy_stop(struct net_device *dev) {
+
+	struct mtk_mac *mac = netdev_priv(dev);
+	u32 mcr;
+
+	if (dev->phydev)
+		if (dev->phydev->link)
+			phy_stop(dev->phydev);
+		else {
+#if defined(CONFIG_HW_NAT)
+			int i = 0;
+
+			for (i = 0; i < MAX_IF_NUM; i++)
+				if (mtk_fast_path[i])
+					break;
+
+			if (i < MAX_IF_NUM) {
+				mcr = mtk_r32(mac->hw, MTK_MAC_MCR(mac->id));
+				mcr &= ~MAC_MCR_FORCE_LINK;
+				mtk_w32(mac->hw, mcr, MTK_MAC_MCR(mac->id));
+				netif_carrier_off(dev);
+			}
+
+			pr_notice("%s: no PHY link, disable sw-fast-path\n", __func__);
+#endif
+		}
+	else
+		pr_notice("%s: no PHY device\n", __func__);
+}
+
 static int mtk_mdio_init(struct mtk_eth *eth)
 {
 	struct device_node *mii_np;
@@ -3246,7 +3308,7 @@
 		refcount_inc(&eth->dma_refcnt);
 
 	if (!MTK_HAS_CAPS(eth->soc->caps, MTK_DISABLE_PHY))
-		phy_start(dev->phydev);
+		mtk_phy_start(dev);
 
 	netif_start_queue(dev);
 
@@ -3284,7 +3346,7 @@
 	netif_tx_disable(dev);
 
 	if (!MTK_HAS_CAPS(eth->soc->caps, MTK_DISABLE_PHY))
-		phy_stop(dev->phydev);
+		mtk_phy_stop(dev);
 
 	/* only shutdown DMA if this is the last user */
 	if (!refcount_dec_and_test(&eth->dma_refcnt))
@@ -4553,7 +4615,7 @@
 			if (!eth->netdev[i])
 				continue;
 
-			phy_stop(eth->netdev[i]->phydev);
+			mtk_phy_stop(eth->netdev[i]);
 		}
 	}
 	pr_notice("ethernet suspend time  kerenel stop = %lx\n", jiffies);
@@ -4757,7 +4819,7 @@
 			if (!eth->netdev[i])
 				continue;
 
-			phy_start(eth->netdev[i]->phydev);
+			mtk_phy_start(eth->netdev[i]);
 		}
 	}
 
diff --git a/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h b/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
index 277f4da..a54a7b4 100755
--- a/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
+++ b/src/lynq/lib/liblynq-data/include/libdata/lynq_data.h
@@ -1,5 +1,5 @@
 #ifndef LYNQ_DATA_H
-#define LYNQ_DATA_H 1
+#define LYNQ_DATA_H 
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -48,6 +48,14 @@
                                    Value <= 0 means network has either not sent a value or
                                    sent an invalid value */
 } lynq_data_call_response_v11_t;
+
+typedef struct
+{
+    int index;
+    char apn[LYNQ_APN_MAX_LEN];
+    char apnType[LYNQ_APN_TYPE_MAX_LEN];
+}lynq_apn_info;
+
 int lynq_init_data(int uToken);
 int lynq_deinit_data();
 int lynq_setup_data_call(int *handle);
@@ -58,6 +66,7 @@
 int lynq_wait_data_call_state_change(int *handle);
 int lynq_modify_apn_db(const int cmd,char *id,char *mcc,char *mnc,char *apn,char *apntype,char *user,char *password,char *normalprotocol,char *roamingprotocol,char *carrier,char *out);
 int lynq_reset_apn(char *result);
+int lynq_get_apn_table(int *size,lynq_apn_info **list);
 
 #ifdef __cplusplus
 }
diff --git a/src/lynq/lib/liblynq-data/lynq_data.cpp b/src/lynq/lib/liblynq-data/lynq_data.cpp
index 27f0849..4bf04f0 100755
--- a/src/lynq/lib/liblynq-data/lynq_data.cpp
+++ b/src/lynq/lib/liblynq-data/lynq_data.cpp
@@ -145,7 +145,7 @@
     lynq_apn_table[apnId].hasTimeout = 0;
     lynq_apn_table[apnId].hasUsed = 0;
     bzero(lynq_apn_table[apnId].apn,LYNQ_APN_MAX_LEN);
-    //bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);
+    bzero(lynq_apn_table[apnId].apnType,LYNQ_APN_TYPE_MAX_LEN);
     bzero(lynq_apn_table[apnId].ifaceName,LYNQ_IFACE_NAME_MAX_LEN);
     return;
 }
@@ -1409,4 +1409,31 @@
     return 0;
 }
 
+int lynq_get_apn_table(int *size,lynq_apn_info **list)
+{
+    if (NULL == size || NULL == list)
+    {
+        LYERRLOG("size or list  is NULL");
+        return LYNQ_E_NULL_ANONALY;
+    }
+    int count = 0;
+    int i = 0;
+    for (i = 0;i < LYNQ_APN_CHANNEL_MAX;i++)
+    {
+        if (lynq_apn_table[i].hasUsed == 1)
+        {
+            if (NULL ==  list[count])
+            {
+                LYERRLOG("list[%d] is NULL",count);
+                return LYNQ_E_NULL_ANONALY;
+            }
+            list[count]->index = i;
+            memcpy(list[count]->apn,lynq_apn_table[i].apn,strlen(lynq_apn_table[i].apn)+1);
+            memcpy(list[count]->apnType,lynq_apn_table[i].apnType,strlen(lynq_apn_table[i].apnType)+1);
+            count++;
+        }
+    }
+    *size = count;
+    return 0;
+}
 /*Typethree add for T800 platform 2022/04/21 end*/
diff --git a/src/telephonyware/3.0/atcid/atci/src/Makefile b/src/telephonyware/3.0/atcid/atci/src/Makefile
index 77f997a..36e2eae 100755
--- a/src/telephonyware/3.0/atcid/atci/src/Makefile
+++ b/src/telephonyware/3.0/atcid/atci/src/Makefile
@@ -7,6 +7,10 @@
     FLAGS += -DLYNQ_ATSVC 
 endif
 
+ifeq ($(strip $(MOBILETEK_ATCID_CFG)), WOM)
+    FLAGS += -DCONFIG_WOM_ATCID
+endif
+
 INCLUDES := -I. \
          -I./platform \
          -I./lynq-private \
@@ -55,4 +59,4 @@
 .PHONY: clean
 clean:
 	$(warning "makefile atcid clean")
-	rm -rf $(OBJS) $(CXXOBJS) $(TARGET)
\ No newline at end of file
+	rm -rf $(OBJS) $(CXXOBJS) $(TARGET)
diff --git a/src/telephonyware/3.0/atcid/atci/src/atcid.c b/src/telephonyware/3.0/atcid/atci/src/atcid.c
index 0eaff4f..54f1c5e 100755
--- a/src/telephonyware/3.0/atcid/atci/src/atcid.c
+++ b/src/telephonyware/3.0/atcid/atci/src/atcid.c
@@ -94,6 +94,27 @@
         listenVCOM = 1;
     }
 #else
+#ifdef CONFIG_WOM_ATCID
+    /*dongyu@2023.5.2 VCOM port as AT port in WOM platform meta mode, ELT port as AT port in normal mode start*/
+    snprintf(serial.devicename[0], strlen(TTY_GS0) + 1, "%s", TTY_GS0);
+    int listenVCOM = 1;
+    int bootMode = readSys_int(BOOTMODE_PATH);
+
+    LOGATCI(LOG_INFO, "bootMode = %d", bootMode);
+
+    if(bootMode == META_BOOT)
+    {
+        LOGATCI(LOG_INFO, "meta mode for CPE/ IVT, listen VCOM");
+        listenVCOM = 0;
+    }
+    else if(bootMode == NORMAL_BOOT)
+    {
+        LOGATCI(LOG_INFO, "normal mode for CPE/ IVT, listen ELT");
+        snprintf(serial.devicename[0], strlen(TTY_GS3) + 1, "%s", TTY_GS3);
+        listenVCOM = 1;
+    }
+    /*dongyu@2023.4.2 VCOM port as AT port in WOM platform meta mode, ELT port as AT port in normal mode end*/
+#else
     //for CPE / IVT listen TTYGS0
     snprintf(serial.devicename[0], strlen(TTY_GS0) + 1, "%s", TTY_GS0);
     int listenVCOM = 1; //listen ETS port as default
@@ -106,6 +127,7 @@
         listenVCOM = 0;
     }
 #endif
+#endif
 
     if (listenVCOM == 1) {
         for (i = 0; i < MAX_DEVICE_VCOM_NUM; i++) {