[][kernel][mt7988][eth][phy: mediatek-2p5ge: Fix duplex detection]
[Description]
Fix duplex detection
[Release-log]
N/A
Change-Id: Icfe1246bc65baeebc282cbbefe10f97fed1dd97e
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7361226
diff --git a/target/linux/mediatek/files-5.4/drivers/net/phy/mediatek-2p5ge.c b/target/linux/mediatek/files-5.4/drivers/net/phy/mediatek-2p5ge.c
index f5964c3..32ae8ea 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/phy/mediatek-2p5ge.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/phy/mediatek-2p5ge.c
@@ -22,6 +22,10 @@
#define PHY_AUX_DPX_MASK GENMASK(5, 5)
#define PHY_AUX_SPEED_MASK GENMASK(4, 2)
+/* Registers on MDIO_MMD_VEND1 */
+#define MTK_PHY_LINK_STATUS_MISC (0xa2)
+#define MTK_PHY_FDX_ENABLE BIT(5)
+
/* Registers on MDIO_MMD_VEND2 */
#define MTK_PHY_LED0_ON_CTRL (0x24)
#define MTK_PHY_LED0_POLARITY BIT(14)
@@ -190,8 +194,6 @@
if (ret < 0)
return ret;
- /* Actually this phy supports only FDX */
- phydev->duplex = (ret & PHY_AUX_DPX_MASK) ? DUPLEX_FULL : DUPLEX_HALF;
switch (FIELD_GET(PHY_AUX_SPEED_MASK, ret)) {
case PHY_AUX_SPD_10:
phydev->speed = SPEED_10;
@@ -204,10 +206,14 @@
break;
case PHY_AUX_SPD_2500:
phydev->speed = SPEED_2500;
- phydev->duplex = DUPLEX_FULL; /* 2.5G must be FDX */
break;
}
+ ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_LINK_STATUS_MISC);
+ if (ret < 0)
+ return ret;
+ phydev->duplex = (ret & MTK_PHY_FDX_ENABLE) ? DUPLEX_FULL : DUPLEX_HALF;
+
return 0;
}