From: Markus Stockhausen Date: Sun, 18 Jan 2026 12:05:30 +0000 (+0100) Subject: realtek: phy: optimize RTL8214FC register usage during media set X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=45fb8f9739272fc6d12ee4bc44cae5c217341a10;p=thirdparty%2Fopenwrt.git realtek: phy: optimize RTL8214FC register usage during media set There are some shortcomings in rtl8214fc_media_set() - It always uses the mdio raw page (4095) of RTL838x for writes. That is wrong when the phy is attached to an RTL839x (raw = 8191) - It uses the internal write only extended page companion (29) - The extended page content is not preserved Fix the three issues. Signed-off-by: Markus Stockhausen Link: https://github.com/openwrt/openwrt/pull/21582 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 8d0700d5ca0..b47e88aa98b 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 @@ -498,14 +498,15 @@ static int rtl8214fc_resume(struct phy_device *phydev) static void rtl8214fc_media_set(struct phy_device *phydev, bool set_fibre) { struct phy_device *basephy = get_base_phy(phydev); + int oldxpage = phy_read(basephy, RTL821XEXT_MEDIA_PAGE_SELECT); int copper = set_fibre ? 0 : RTL8214FC_MEDIA_COPPER; static int regs[] = {16, 19, 20, 21}; int reg = regs[phydev->mdio.addr & 3]; phydev_info(phydev, "switch to %s\n", set_fibre ? "fibre" : "copper"); - phy_write_paged(basephy, RTL838X_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_INTERNAL); + phy_write(basephy, RTL821XEXT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_INTERNAL); phy_modify_paged(basephy, RTL821X_PAGE_PORT, reg, RTL8214FC_MEDIA_COPPER, copper); - phy_write_paged(basephy, RTL838X_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO); + phy_write(basephy, RTL821XEXT_MEDIA_PAGE_SELECT, oldxpage); if (!phydev->suspended) { rtl8214fc_power_set(phydev, PORT_MII, !set_fibre);