[][kernel][mt7988][eth][internal 2.5Gphy: Fix link speed error]
[Description]
Fix link speed error.
[Release-log]
N/A
Change-Id: I257a1696ac89d550bbac09e56a50a7d8064d7ae3
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/6930063
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 d292dbe..544bb50 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
@@ -13,6 +13,10 @@
#define MD32_EN_CFG 0x18
#define MD32_EN BIT(0)
+#define BASE100T_STATUS_EXTEND (0x10)
+#define BASE1000T_STATUS_EXTEND (0x11)
+#define EXTEND_CTRL_AND_STATUS (0x16)
+
static int mt798x_2p5ge_phy_config_init(struct phy_device *phydev)
{
int ret;
@@ -90,6 +94,38 @@
return 0;
}
+static int mt798x_2p5ge_phy_read_status(struct phy_device *phydev)
+{
+ int ret;
+ u16 reg;
+
+ ret = genphy_read_status(phydev);
+
+ reg = phy_read(phydev, BASE1000T_STATUS_EXTEND);
+ if (FIELD_GET(BIT(2), reg)) {
+ phydev->speed = SPEED_2500;
+ goto end;
+ } else if (FIELD_GET(BIT(12), reg)) {
+ phydev->speed = SPEED_1000;
+ goto end;
+ }
+
+ reg = phy_read(phydev, BASE100T_STATUS_EXTEND);
+ if (FIELD_GET(BIT(12), reg)) {
+ phydev->speed = SPEED_100;
+ goto end;
+ }
+
+ reg = phy_read(phydev, EXTEND_CTRL_AND_STATUS);
+ if (FIELD_GET(BIT(6), reg)) {
+ phydev->speed = SPEED_10;
+ goto end;
+ }
+
+end:
+ return ret;
+}
+
static struct phy_driver mtk_gephy_driver[] = {
{
PHY_ID_MATCH_EXACT(0x00339c11),
@@ -97,6 +133,7 @@
.config_init = mt798x_2p5ge_phy_config_init,
.config_aneg = genphy_c45_config_aneg,
.get_features = mt798x_2p5ge_phy_get_features,
+ .read_status = mt798x_2p5ge_phy_read_status,
//.config_intr = genphy_no_config_intr,
//.handle_interrupt = genphy_no_ack_interrupt,
//.suspend = genphy_suspend,