[][kernel][common][eth][Add PHYA power down sanity check to SGMII initial sequence]

[Description]
Add PHYA power down sanity check to SGMII initial sequence.

When we configure phylink as fixed-link mode, the kernel will
call mac_config() to initial SGMII several times during the boot
procedure. This behavior might cause SGMII link down.
Therefore, we add a PHYA power down sanity check that make sure
PHYA is powered down when needed.

If without this patch, SGMII might link down after system bring up.

[Release-log]
N/A


Change-Id: Ie2f52852d055ef721d2cb380115644f2d80729ad
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7117100
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 ac77ef2..5d792ae 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
@@ -110,6 +110,28 @@
 	mdelay(1);
 }
 
+int mtk_sgmii_need_powerdown(struct mtk_xgmii *ss, int id, int speed)
+{
+	u32 val;
+
+	/* need to power down sgmii if link down */
+	regmap_read(ss->regmap_sgmii[id], SGMSYS_PCS_CONTROL_1, &val);
+	if (!(val & SGMII_LINK_STATYS))
+		return true;
+
+	/* need to power down sgmii if link speed changed */
+	regmap_read(ss->regmap_sgmii[id], ss->ana_rgc3, &val);
+	if (speed == SPEED_2500) {
+		if (!(val & RG_PHY_SPEED_3_125G))
+			return true;
+	} else {
+		if (val & RG_PHY_SPEED_3_125G)
+			return true;
+	}
+
+	return false;
+}
+
 void mtk_sgmii_setup_phya_gen1(struct mtk_xgmii *ss, int mac_id)
 {
 	u32 id = mtk_mac2xgmii_id(ss->eth, mac_id);
@@ -245,8 +267,10 @@
 		mtk_sgmii_reset(ss, mac_id);
 	}
 
-	/* Assert PHYA power down state */
-	regmap_write(ss->regmap_sgmii[id], SGMSYS_QPHY_PWR_STATE_CTRL, SGMII_PHYA_PWD);
+	/* Assert PHYA power down state when needed */
+	if (mtk_sgmii_need_powerdown(ss, id, SPEED_1000))
+		regmap_write(ss->regmap_sgmii[id], SGMSYS_QPHY_PWR_STATE_CTRL,
+			     SGMII_PHYA_PWD);
 
 	/* Reset SGMII PCS state */
 	regmap_write(ss->regmap_sgmii[id], SGMII_RESERVED_0, SGMII_SW_RESET);
@@ -302,8 +326,10 @@
 		mtk_sgmii_reset(ss, mac_id);
 	}
 
-	/* Assert PHYA power down state */
-	regmap_write(ss->regmap_sgmii[id], SGMSYS_QPHY_PWR_STATE_CTRL, SGMII_PHYA_PWD);
+	/* Assert PHYA power down state when needed */
+	if (mtk_sgmii_need_powerdown(ss, id, state->speed))
+		regmap_write(ss->regmap_sgmii[id], SGMSYS_QPHY_PWR_STATE_CTRL,
+			     SGMII_PHYA_PWD);
 
 	/* Reset SGMII PCS state */
 	regmap_write(ss->regmap_sgmii[id], SGMII_RESERVED_0, SGMII_SW_RESET);