[][kernel][common][eth][Fix a traffic stuck issue when changing the SGMII autoneg mode]

[Description]
Fix a traffic stuck issue when changing the SGMII autoneg mode.

Without this patch, the users may encounter a traffic stuck issue when
they change the SGMII autoneg mode using the ethtool.

[Release-log]
N/A


Change-Id: I5f3f9fe3716a81aa619ba1fefee27e972c8856c9
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8260077
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 6cf9fc5..6dfa6da 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -702,6 +702,9 @@
 		regmap_write(eth->ethsys, ETHSYS_SYSCFG0, val);
 		spin_unlock(&eth->syscfg0_lock);
 
+		/* Save the syscfg0 value for mac_finish */
+		mac->syscfg0 = val;
+
 		mac->interface = state->interface;
 	}
 
@@ -721,9 +724,6 @@
 		/* Decide how GMAC and SGMIISYS be mapped */
 		sid = (MTK_HAS_CAPS(eth->soc->caps, MTK_SHARED_SGMII)) ?
 		       0 : mac->id;
-
-		/* Save the syscfg0 value for mac_finish */
-		mac->syscfg0 = val;
 		spin_unlock(&eth->syscfg0_lock);
 	} else if (state->interface == PHY_INTERFACE_MODE_USXGMII ||
 		   state->interface == PHY_INTERFACE_MODE_10GKR ||
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_sgmii.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_sgmii.c
index 3cc8f90..bdb6662 100755
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_sgmii.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_sgmii.c
@@ -144,7 +144,7 @@
 	mdelay(1);
 }
 
-int mtk_sgmii_need_powerdown(struct mtk_sgmii_pcs *mpcs)
+int mtk_sgmii_need_powerdown(struct mtk_sgmii_pcs *mpcs, unsigned int bmcr)
 {
 	u32 val;
 
@@ -153,6 +153,10 @@
 	if (!(val & SGMII_LINK_STATYS))
 		return true;
 
+	/* need to power down sgmii if autoneg change */
+	if ((val & SGMII_AN_ENABLE) != bmcr)
+		return true;
+
 	return false;
 }
 
@@ -455,7 +459,7 @@
 	}
 
 	if (mpcs->interface != interface ||
-	    mtk_sgmii_need_powerdown(mpcs)) {
+	    mtk_sgmii_need_powerdown(mpcs, bmcr)) {
 		link_timer = phylink_get_link_timer_ns(interface);
 		if (link_timer < 0)
 			return link_timer;