From: Javen Xu Add support for rtl8116af dummy phy driver, match phy id and read link speed from MII_BMCR. Signed-off-by: Javen Xu --- drivers/net/phy/realtek/realtek_main.c | 54 ++++++++++++++++++++++++++ include/net/phy/realtek_phy.h | 1 + 2 files changed, 55 insertions(+) diff --git a/drivers/net/phy/realtek/realtek_main.c b/drivers/net/phy/realtek/realtek_main.c index 27268811f564..9b92828c49d9 100644 --- a/drivers/net/phy/realtek/realtek_main.c +++ b/drivers/net/phy/realtek/realtek_main.c @@ -2659,6 +2659,47 @@ static int rtlgen_sfp_get_features(struct phy_device *phydev) return 0; } +static int rtl8116af_sfp_get_features(struct phy_device *phydev) +{ + linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, + phydev->supported); + + phydev->speed = SPEED_1000; + phydev->duplex = DUPLEX_FULL; + + phydev->port = PORT_FIBRE; + + return 0; +} + +static int rtl8116af_sfp_read_status(struct phy_device *phydev) +{ + int val, err; + + err = genphy_update_link(phydev); + if (err) + return err; + + if (!phydev->link) + return 0; + + val = phy_read(phydev, MII_BMCR); + if (val < 0) + return val; + + if (val & BMCR_SPEED1000) + phydev->speed = SPEED_1000; + else if (val & BMCR_SPEED100) + phydev->speed = SPEED_100; + + if (val & BMCR_FULLDPLX) + phydev->duplex = DUPLEX_FULL; + else + phydev->duplex = DUPLEX_HALF; + + return 0; +} + static int rtlgen_sfp_read_status(struct phy_device *phydev) { int val, err; @@ -2947,6 +2988,19 @@ static struct phy_driver realtek_drvs[] = { .write_page = rtl821x_write_page, .read_mmd = rtl822x_read_mmd, .write_mmd = rtl822x_write_mmd, + }, { + PHY_ID_MATCH_EXACT(PHY_ID_RTL8116AF_DUMMY), + .name = "RTL8116af PHY Mode", + .flags = PHY_IS_INTERNAL, + .get_features = rtl8116af_sfp_get_features, + .config_aneg = rtlgen_sfp_config_aneg, + .read_status = rtl8116af_sfp_read_status, + .suspend = genphy_suspend, + .resume = rtlgen_resume, + .read_page = rtl821x_read_page, + .write_page = rtl821x_write_page, + .read_mmd = rtl822x_read_mmd, + .write_mmd = rtl822x_write_mmd, }, { PHY_ID_MATCH_EXACT(0x001ccad0), .name = "RTL8224 2.5Gbps PHY", diff --git a/include/net/phy/realtek_phy.h b/include/net/phy/realtek_phy.h index d683bc1b0659..cbf91af0ead6 100644 --- a/include/net/phy/realtek_phy.h +++ b/include/net/phy/realtek_phy.h @@ -3,5 +3,6 @@ #define _REALTEK_PHY_H #define PHY_ID_RTL_DUMMY_SFP 0x001ccbff +#define PHY_ID_RTL8116AF_DUMMY 0x001ccbfe #endif /* _REALTEK_PHY_H */ -- 2.43.0