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

Change-Id: Id23b62c9b8e64f4c275bd6012bb13a47f1e7d84a
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;
 }