[][kernel][mt7988][Fix USXGMII to SGMII mode change issue]

[Description]
Fix USXGMII to SGMII mode change issue.

In the mt7988, the USXGMII and SGMII share the same PHYA.
In order to make sure the SGMII driver can reconfigure PHYA, it has to
check PCS link status when phylink calling to mtk_sgmii_pcs_config().

If without this patch, the SGMII driver might not be able to reconfigure
PHYA when changing the USXGMII to the SGMII.

[Release-log]


Change-Id: Iab56d70ac32bc0f6b4c7235027ac0ebb430a4a01
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7464574
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 9aef092..c42b28a 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,6 +144,18 @@
 	mdelay(1);
 }
 
+int mtk_sgmii_need_powerdown(struct mtk_sgmii_pcs *mpcs)
+{
+	u32 val;
+
+	/* need to power down sgmii if link down */
+	regmap_read(mpcs->regmap, SGMSYS_PCS_CONTROL_1, &val);
+	if (!(val & SGMII_LINK_STATYS))
+		return true;
+
+	return false;
+}
+
 void mtk_sgmii_setup_phya_gen1(struct mtk_sgmii_pcs *mpcs)
 {
 	if (!mpcs->regmap_pextp)
@@ -419,7 +431,8 @@
 			sgm_mode = SGMII_IF_MODE_SGMII;
 	}
 
-	if (mpcs->interface != interface) {
+	if (mpcs->interface != interface ||
+	    mtk_sgmii_need_powerdown(mpcs)) {
 		link_timer = phylink_get_link_timer_ns(interface);
 		if (link_timer < 0)
 			return link_timer;