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 92591d0eff..e1a60ce55e 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; + int ret; - /* Hardware is similar to RTL8218B reuse coding for serdes and copper init */ - rtl8218b_config_init(phydev); + /* Step 1 - package setup: Due to similar design reuse RTL8218B coding */ + ret = rtl8218b_config_init(phydev); + if (ret) + return ret; - if (phydev->mdio.addr % 8) - return 0; - - 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,