From: Markus Stockhausen Date: Mon, 12 Jan 2026 09:29:44 +0000 (+0100) Subject: realtek: phy: simplify RTL8214FC configuration X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=10ae743260b57d2a371efce11b35c25db8d97d0b;p=thirdparty%2Fopenwrt.git realtek: phy: simplify RTL8214FC configuration Initialization of the RTL8214FC was coded like "put the cart before the horse". Configuration was called from probing and only when called for the last port. Testing showed that there is no need to overcomplicate things. Reorganize the setup as follows: - Let probe() & config() do what they are meant for - Split the config part between a package and a port sequence Signed-off-by: Markus Stockhausen Link: https://github.com/openwrt/openwrt/pull/21508 Signed-off-by: Robert Marko --- diff --git a/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c b/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c index 92591d0eff6..e1a60ce55e8 100644 --- a/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c +++ b/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c @@ -800,48 +800,41 @@ static int rtl8218b_config_init(struct phy_device *phydev) static int rtl8214fc_config_init(struct phy_device *phydev) { static int regs[] = {16, 19, 20, 21}; - struct phy_device *portphy; - int port; - - /* Hardware is similar to RTL8218B reuse coding for serdes and copper init */ - rtl8218b_config_init(phydev); + int ret; - if (phydev->mdio.addr % 8) - return 0; + /* Step 1 - package setup: Due to similar design reuse RTL8218B coding */ + ret = rtl8218b_config_init(phydev); + if (ret) + return ret; - for (port = 0; port < 4; port++) { - portphy = get_package_phy(phydev, port); - - phy_write(phydev, RTL821XEXT_MEDIA_PAGE_SELECT, 0x8); - /* setup basic fiber control in base phy and default to copper */ - phy_write_paged(phydev, 0x266, regs[port], 0x0f95); - phy_write(phydev, RTL821XEXT_MEDIA_PAGE_SELECT, 0x0); - - phy_write(portphy, RTL821XEXT_MEDIA_PAGE_SELECT, 0x3); - /* set fiber SerDes RX to negative edge */ - phy_modify_paged(portphy, 0x8, 0x17, 0, BIT(14)); - /* auto negotiation disable link on */ - phy_modify_paged(portphy, 0x8, 0x14, 0, BIT(2)); - /* disable fiber 100MBit */ - phy_modify_paged(portphy, 0x8, 0x11, BIT(5), 0); - phy_write(portphy, RTL821XEXT_MEDIA_PAGE_SELECT, 0x0); - - /* Disable EEE. 0xa5d/0x10 is the same as MDIO_MMD_AN / MDIO_AN_EEE_ADV */ - phy_write_paged(portphy, 0xa5d, 0x10, 0x0000); + if (phydev->mdio.addr % 8 == 0) { + for (int port = 0; port < 4; port++) { + phy_write(phydev, RTL821XEXT_MEDIA_PAGE_SELECT, 0x8); + /* setup basic fiber control in base phy and default to copper */ + phy_write_paged(phydev, 0x266, regs[port], 0x0f95); + phy_write(phydev, RTL821XEXT_MEDIA_PAGE_SELECT, 0x0); + } } + /* Step 2 - port setup */ + phy_write(phydev, RTL821XEXT_MEDIA_PAGE_SELECT, 0x3); + /* set fiber SerDes RX to negative edge */ + phy_modify_paged(phydev, 0x8, 0x17, 0, BIT(14)); + /* auto negotiation disable link on */ + phy_modify_paged(phydev, 0x8, 0x14, 0, BIT(2)); + /* disable fiber 100MBit */ + phy_modify_paged(phydev, 0x8, 0x11, BIT(5), 0); + phy_write(phydev, RTL821XEXT_MEDIA_PAGE_SELECT, 0x0); + + /* Disable EEE. 0xa5d/0x10 is the same as MDIO_MMD_AN / MDIO_AN_EEE_ADV */ + phy_write_paged(phydev, 0xa5d, 0x10, 0x0000); + return 0; } static int rtl8214fc_phy_probe(struct phy_device *phydev) { - int ret = 0; - - if (rtl821x_package_join(phydev, 4) == RTL821X_JOIN_LAST) { - ret = rtl8214fc_config_init(get_base_phy(phydev)); - if (ret) - return ret; - } + rtl821x_package_join(phydev, 4); return phy_sfp_probe(phydev, &rtl8214fc_sfp_ops); } @@ -861,7 +854,7 @@ static struct phy_driver rtl83xx_phy_driver[] = { .match_phy_device = rtl8214fc_match_phy_device, .name = "Realtek RTL8214FC", .config_aneg = rtl8214fc_config_aneg, - .config_init = rtl821x_config_init, + .config_init = rtl8214fc_config_init, .get_features = rtl8214fc_get_features, .get_tunable = rtl8214fc_get_tunable, .probe = rtl8214fc_phy_probe,