diff options
author | Chukun Pan <amadeus@jmu.edu.cn> | 2023-11-13 16:40:00 +0100 |
---|---|---|
committer | Marek Behún <kabel@kernel.org> | 2023-11-13 16:40:00 +0100 |
commit | a7931b1e7b8bdade3975606bc26446fdccc6a40e (patch) | |
tree | 68a2c59280474bad4f31b15e8d35502c39c1008b | |
parent | 4fe58bb3747187a50abe20324d5507b0279d71ae (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.c | 24 |
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) |