aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChukun Pan <amadeus@jmu.edu.cn>2023-11-13 16:40:00 +0100
committerMarek Behún <kabel@kernel.org>2023-11-13 16:40:00 +0100
commita7931b1e7b8bdade3975606bc26446fdccc6a40e (patch)
tree68a2c59280474bad4f31b15e8d35502c39c1008b
parent4fe58bb3747187a50abe20324d5507b0279d71ae (diff)
net: phy: realtek: switch interface mode RTL8221B-CG seriesrealtek-sfp-work
The RTL8221B-CG series changes interface mode according to copper speed. Signed-off-by: Chukun Pan <amadeus@jmu.edu.cn> Signed-off-by: Daniel Golle <daniel@makrotopia.org> [ refactored and changed commit message ] Signed-off-by: Marek Behún <kabel@kernel.org>
-rw-r--r--drivers/net/phy/realtek.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
index 32a3009250f6ae..d4b07358f97006 100644
--- a/drivers/net/phy/realtek.c
+++ b/drivers/net/phy/realtek.c
@@ -924,7 +924,7 @@ static int rtl822x_cg_config_aneg(struct phy_device *phydev)
static int rtl822x_cg_read_status(struct phy_device *phydev)
{
- int val;
+ int ret, val;
if (phydev->autoneg == AUTONEG_ENABLE) {
val = phy_read_mmd(phydev, MDIO_MMD_VEND2, RTL8221_GANLPAR);
@@ -934,7 +934,27 @@ static int rtl822x_cg_read_status(struct phy_device *phydev)
mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, val);
}
- return genphy_c45_read_status(phydev);
+ ret = genphy_c45_read_status(phydev);
+ if (ret < 0)
+ return ret;
+
+ /* PHY changes SerDes mode between 2500base-x and sgmii based on
+ * copper speed
+ */
+ switch (phydev->speed) {
+ case SPEED_2500:
+ phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
+ break;
+ case SPEED_1000:
+ case SPEED_100:
+ case SPEED_10:
+ phydev->interface = PHY_INTERFACE_MODE_SGMII;
+ break;
+ default:
+ break;
+ }
+
+ return 0;
}
static bool rtlgen_supports_2_5gbps(struct phy_device *phydev)