]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: phy: optimize RTL8214FC register usage during media set
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Sun, 18 Jan 2026 12:05:30 +0000 (13:05 +0100)
committerRobert Marko <robimarko@gmail.com>
Sat, 24 Jan 2026 10:44:10 +0000 (11:44 +0100)
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 <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/21582
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c

index 8d0700d5ca076bf0a45ef5aca18fa146b3eb3e1a..b47e88aa98b5a265474669572389ac1709e8192a 100644 (file)
@@ -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);