[Bugfix][API-1149]fix eth2 link down

Change-Id: Id23b62c9b8e64f4c275bd6012bb13a47f1e7d84a
diff --git a/meta-sdk/meta/meta-lynqSDK-T800/recipes-kernel/linux/files/auto2735evb.dts b/meta-sdk/meta/meta-lynqSDK-T800/recipes-kernel/linux/files/auto2735evb.dts
index d0f02dd..fa22ff4 100755
--- a/meta-sdk/meta/meta-lynqSDK-T800/recipes-kernel/linux/files/auto2735evb.dts
+++ b/meta-sdk/meta/meta-lynqSDK-T800/recipes-kernel/linux/files/auto2735evb.dts
@@ -1573,18 +1573,45 @@
 };
 /*Lxf add in 2022/12/2 for gpio init*/
 &gpio_init{
-	phy_power_gpio_24{
-		gpio_num = <24>;
-		gpio_mode = <0>;
-		gpio_dir = <1>;
-		gpio_dout = <1>;
-	};
-	phy_switch_gpio_178{
-		gpio_num = <178>;
-		gpio_mode = <0>;
-		gpio_dir = <1>;
-		gpio_dout = <1>;
-	};
+        phy_power_gpio_24_down{
+                gpio_num = <24>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <0>;
+        };
+        phy_switch_gpio_178_down{
+                gpio_num = <178>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <0>;
+        };
+        phy_switch_gpio_26_down{
+                gpio_num = <26>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <0>;
+                post_mdelay_time = <30>;
+        };
+        phy_power_gpio_24_up{
+                gpio_num = <24>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <1>;
+        };
+        phy_switch_gpio_178_up{
+                gpio_num = <178>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <1>;
+                post_mdelay_time = <30>;
+        };
+        phy_switch_gpio_26_up{
+                gpio_num = <26>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <1>;
+                post_mdelay_time = <15>;
+        };
 };
 /*Lxf add in 2022/12/2 for gpio init end*/
 /*youchen@2023-01-05 add for lpm suspend actions begin*/
diff --git a/src/bsp/lk/platform/mt2735/drivers/gpio/mt_gpio.c b/src/bsp/lk/platform/mt2735/drivers/gpio/mt_gpio.c
index 0915b9c..5276983 100755
--- a/src/bsp/lk/platform/mt2735/drivers/gpio/mt_gpio.c
+++ b/src/bsp/lk/platform/mt2735/drivers/gpio/mt_gpio.c
@@ -858,6 +858,11 @@
 //	mt_set_gpio_dir(GPIO24, GPIO_DIR_OUT);
 //	mt_set_gpio_out(GPIO24, GPIO_OUT_ZERO);
 //xf.li2023/03/07 modify for phy gpio end
+        /* GPIO26 */
+	mt_set_gpio_mode(GPIO26, 0);
+	mt_set_gpio_dir(GPIO26, GPIO_DIR_OUT);
+	mt_set_gpio_out(GPIO26, GPIO_OUT_ZERO);
+
 	mt_set_gpio_mode(GPIO25, 0);
 	mt_set_gpio_dir(GPIO25, GPIO_DIR_OUT);
 	mt_set_gpio_out(GPIO25, GPIO_OUT_ZERO);
diff --git a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts
index 8bc1189..c1af865 100755
--- a/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts
+++ b/src/kernel/linux/v4.19/arch/arm64/boot/dts/mediatek/auto2735evb.dts
@@ -1573,18 +1573,45 @@
 };
 /*Lxf add in 2022/12/2 for gpio init*/
 &gpio_init{
-	phy_power_gpio_24{
-		gpio_num = <24>;
-		gpio_mode = <0>;
-		gpio_dir = <1>;
-		gpio_dout = <1>;
-	};
-	phy_switch_gpio_178{
-		gpio_num = <178>;
-		gpio_mode = <0>;
-		gpio_dir = <1>;
-		gpio_dout = <1>;
-	};
+        phy_power_gpio_24_down{
+                gpio_num = <24>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <0>;
+        };
+        phy_switch_gpio_178_down{
+                gpio_num = <178>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <0>;
+        };
+        phy_switch_gpio_26_down{
+                gpio_num = <26>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <0>;
+                post_mdelay_time = <30>;
+        };
+        phy_power_gpio_24_up{
+                gpio_num = <24>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <1>;
+        };
+        phy_switch_gpio_178_up{
+                gpio_num = <178>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <1>;
+                post_mdelay_time = <30>;
+        };
+        phy_switch_gpio_26_up{
+                gpio_num = <26>;
+                gpio_mode = <0>;
+                gpio_dir = <1>;
+                gpio_dout = <1>;
+                post_mdelay_time = <15>;
+        };
 };
 /*Lxf add in 2022/12/2 for gpio init end*/
 /*youchen@2023-01-05 add for lpm suspend actions begin*/
diff --git a/src/kernel/linux/v4.19/drivers/lynq_gpio_init/lynq_gpio_init.h b/src/kernel/linux/v4.19/drivers/lynq_gpio_init/lynq_gpio_init.h
index 1d58455..e2e1241 100755
--- a/src/kernel/linux/v4.19/drivers/lynq_gpio_init/lynq_gpio_init.h
+++ b/src/kernel/linux/v4.19/drivers/lynq_gpio_init/lynq_gpio_init.h
@@ -11,6 +11,7 @@
 #include <linux/sysfs.h> 
 #include <linux/stat.h> 
 #include <linux/slab.h>
+#include <linux/delay.h>
 
 #include "../pinctrl/mediatek/pinctrl-mtk-common-v2_debug.h"
 #include "../pinctrl/mediatek/pinctrl-mtk-common-v2.h"
@@ -25,6 +26,8 @@
 	int gpio_dir;
 	int gpio_dout;
 	int gpio_din;
+    int pre_mdelay_time;
+    int post_mdelay_time;
 };
 
 //struct gpio_node *gpio_test;
@@ -112,7 +115,7 @@
 int set_gpio(struct device_node *gpio_node, int num)
 {
     int ret = 0;
-    unsigned int gpio_num, gpio_mode, gpio_dir, gpio_dout, gpio_din;
+    unsigned int gpio_num, gpio_mode, gpio_dir, gpio_dout, gpio_din, pre_mdelay_time, post_mdelay_time;
     int read_mode = -1;
 
     gpio_node_list[num].gpio_num = -1;
@@ -121,6 +124,23 @@
     gpio_node_list[num].gpio_din = -1;
     gpio_node_list[num].gpio_dout = -1;
 
+    ret = of_property_read_u32(gpio_node, "pre_mdelay_time", &pre_mdelay_time);
+    if(ret == -EINVAL || ret == -ENODATA)
+    {
+        printk("no value or no node");
+        log_offset += sprintf(log_info + log_offset,"No pre_mdelay_time\n");
+    }
+    else if(ret < 0)
+    {
+        printk("GPIO_INIT:READ ERROR: %d", ret);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: read num ERROR: %d\n", ret);
+        return ret;
+    }
+    else
+    {
+        mdelay(pre_mdelay_time);
+    }
+
     //get the gpio hw
     ret = of_property_read_u32(gpio_node, "gpio_num", &gpio_num);
     if(ret == -EINVAL || ret == -ENODATA)
@@ -311,5 +331,23 @@
             error_offset += sprintf(error_info + error_offset, "GPIO_INIT: din: %u out of the range 0-1\n", gpio_din);
         }
     }
+
+    ret = of_property_read_u32(gpio_node, "post_mdelay_time", &post_mdelay_time);
+    if(ret == -EINVAL || ret == -ENODATA)
+    {
+        printk("no value or no node");
+        log_offset += sprintf(log_info + log_offset,"No post_mdelay_time\n");
+    }
+    else if(ret < 0)
+    {
+        printk("GPIO_INIT:READ ERROR: %d", ret);
+        log_offset += sprintf(log_info + log_offset, "GPIO_INIT: read num ERROR: %d\n", ret);
+        return ret;
+    }
+    else
+    {
+        mdelay(post_mdelay_time);
+    }
+
     return ret;
 }
diff --git a/src/kernel/linux/v4.19/drivers/net/phy/marvell-88q.c b/src/kernel/linux/v4.19/drivers/net/phy/marvell-88q.c
index ab00fb0..930c382 100755
--- a/src/kernel/linux/v4.19/drivers/net/phy/marvell-88q.c
+++ b/src/kernel/linux/v4.19/drivers/net/phy/marvell-88q.c
@@ -153,6 +153,7 @@
 	phydev->state = PHY_NOLINK;
 	phydev->autoneg = AUTONEG_DISABLE;
 	phy_write(phydev, MII_ADDR_C45 | 0x038033, 0x6801);
+	phy_write(phydev, MII_ADDR_C45 | 0x070200, 0x0000U);
 	phy_write(phydev, MII_ADDR_C45 | 0x010000, 0x840);
 	phy_write(phydev, MII_ADDR_C45 | 0x03FE1B, 0x48);
 	phy_write(phydev, MII_ADDR_C45 | 0x01FFE4, 0x6B6);
@@ -169,6 +170,9 @@
 	phy_write(phydev, MII_ADDR_C45 | 0x078032, 0x2020);
 	phy_write(phydev, MII_ADDR_C45 | 0x078031, 0xA28);
 	phy_write(phydev, MII_ADDR_C45 | 0x078031, 0xC28);
+	phy_write(phydev, MII_ADDR_C45 | 0x03FFDB, 0xFC10);
+	phy_write(phydev, MII_ADDR_C45 | 0x03FE1B, 0x58);
+
 	phy_write(phydev, MII_ADDR_C45 | 0x03803A, 0xDA44);
 	phy_write(phydev, MII_ADDR_C45 | 0x038039, 0x2C0B);
 
@@ -176,7 +180,7 @@
 	q2110_timing_init(phydev);
 
 	q2110_dts_init(phydev);
-
+	printk("phy init ok\n");
 	return 0;
 }