[][kernel][common][eth][Refactor HSGMII initial sequence]

[Description]
Refactor HSGMII initial sequence.

If without this patch, HSGMII is not able to apply correct setting during 2.5G Fixed and 1G AN dynamic switching.

[Release-log]
N/A

Change-Id: Ic929fb365933f0c0e948c53f4801073857c8cd9d
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/6368423
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 f1c079e..bd70441 100755
--- 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
@@ -381,7 +381,7 @@
 		if (state->interface != PHY_INTERFACE_MODE_SGMII)
 			err = mtk_sgmii_setup_mode_force(eth->sgmii, sid,
 							 state);
-		else if (phylink_autoneg_inband(mode))
+		else
 			err = mtk_sgmii_setup_mode_an(eth->sgmii, sid);
 
 		if (err) {
@@ -538,7 +538,8 @@
 	case PHY_INTERFACE_MODE_2500BASEX:
 		phylink_set(mask, 1000baseX_Full);
 		phylink_set(mask, 2500baseX_Full);
-		break;
+		phylink_set(mask, 2500baseT_Full);
+		/* fall through; */
 	case PHY_INTERFACE_MODE_GMII:
 	case PHY_INTERFACE_MODE_RGMII:
 	case PHY_INTERFACE_MODE_RGMII_ID:
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 dacdf3c..8198c7c 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
@@ -44,6 +44,13 @@
 	if (!ss->regmap[id])
 		return -EINVAL;
 
+	/* Assert PHYA power down state */
+	regmap_write(ss->regmap[id], SGMSYS_QPHY_PWR_STATE_CTRL, SGMII_PHYA_PWD);
+
+	regmap_read(ss->regmap[id], ss->ana_rgc3, &val);
+	val &= ~RG_PHY_SPEED_3_125G;
+	regmap_write(ss->regmap[id], ss->ana_rgc3, val);
+
 	/* Setup the link timer and QPHY power up inside SGMIISYS */
 	regmap_write(ss->regmap[id], SGMSYS_PCS_LINK_TIMER,
 		     SGMII_LINK_TIMER_DEFAULT);
@@ -52,8 +59,15 @@
 	val |= SGMII_REMOTE_FAULT_DIS;
 	regmap_write(ss->regmap[id], SGMSYS_SGMII_MODE, val);
 
+	/* SGMII AN mode setting */
+	regmap_read(ss->regmap[id], SGMSYS_SGMII_MODE, &val);
+	val &= ~SGMII_IF_MODE_MASK;
+	val |= SGMII_SPEED_DUPLEX_AN;
+	regmap_write(ss->regmap[id], SGMSYS_SGMII_MODE, val);
+
 	regmap_read(ss->regmap[id], SGMSYS_PCS_CONTROL_1, &val);
 	val |= SGMII_AN_RESTART;
+	val |= SGMII_AN_ENABLE;
 	regmap_write(ss->regmap[id], SGMSYS_PCS_CONTROL_1, val);
 
 	if(MTK_HAS_FLAGS(ss->flags[id],MTK_SGMII_PN_SWAP))
@@ -74,6 +88,9 @@
 	if (!ss->regmap[id])
 		return -EINVAL;
 
+	/* Assert PHYA power down state */
+	regmap_write(ss->regmap[id], SGMSYS_QPHY_PWR_STATE_CTRL, SGMII_PHYA_PWD);
+
 	regmap_read(ss->regmap[id], ss->ana_rgc3, &val);
 	val &= ~RG_PHY_SPEED_MASK;
 	if (state->interface == PHY_INTERFACE_MODE_2500BASEX)