[openwrt/openwrt] realtek: simplify RTL8214FC handling

LEDE Commits lede-commits at lists.infradead.org
Fri Aug 29 15:20:45 PDT 2025


hauke pushed a commit to openwrt/openwrt.git, branch main:
https://git.openwrt.org/fa1b362ae9d1a832a6e1acb6b67d72fcb79fe4b5

commit fa1b362ae9d1a832a6e1acb6b67d72fcb79fe4b5
Author: Markus Stockhausen <markus.stockhausen at gmx.de>
AuthorDate: Tue Aug 19 06:46:41 2025 -0400

    realtek: simplify RTL8214FC handling
    
    Now that we have a get_base_phy() function a lot code of the RTL8214FC
    handling can be cleaned up. To name a few:
    
    - use phy_read/phy_write instead of mdiobus functions or the even worse
      phy_package_..._paged() helpers
    - replace messages with phydev_info()
    - remove if/else statements around copper/fibre handling
    
    Signed-off-by: Markus Stockhausen <markus.stockhausen at gmx.de>
    Link: https://github.com/openwrt/openwrt/pull/19810
    Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
---
 .../files-6.12/drivers/net/phy/rtl83xx-phy.c       | 76 +++++++---------------
 1 file changed, 25 insertions(+), 51 deletions(-)

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 01f24080b8..edac8f2c4d 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
@@ -844,24 +844,18 @@ static int rtl8380_configure_ext_rtl8218b(struct phy_device *phydev)
 
 static bool __rtl8214fc_media_is_fibre(struct phy_device *phydev)
 {
-	struct mii_bus *bus = phydev->mdio.bus;
+	struct phy_device *basephy = get_base_phy(phydev);
 	static int regs[] = {16, 19, 20, 21};
-	int addr = phydev->mdio.addr & ~3;
 	int reg = regs[phydev->mdio.addr & 3];
 	int oldpage, val;
 
-	/*
-	 * The fiber status cannot be read directly from the phy. It is a package "global"
-	 * attribute and therefore located in the first phy. To avoid state handling assume
-	 * an aligment to addresses divisible by 4.
-	 */
-
-	oldpage = __mdiobus_read(bus, addr, RTL8XXX_PAGE_SELECT);
-	__mdiobus_write(bus, addr, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_INTERNAL);
-	__mdiobus_write(bus, addr, RTL8XXX_PAGE_SELECT, RTL821X_PAGE_PORT);
-	val = __mdiobus_read(bus, addr, reg);
-	__mdiobus_write(bus, addr, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
-	__mdiobus_write(bus, addr, RTL8XXX_PAGE_SELECT, oldpage);
+	/* The fiber status is a package "global" in the first phy. */
+	oldpage = __phy_read(basephy, RTL8XXX_PAGE_SELECT);
+	__phy_write(basephy, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_INTERNAL);
+	__phy_write(basephy, RTL8XXX_PAGE_SELECT, RTL821X_PAGE_PORT);
+	val = __phy_read(basephy, reg);
+	__phy_write(basephy, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
+	__phy_write(basephy, RTL8XXX_PAGE_SELECT, oldpage);
 
 	return !(val & BMCR_PDOWN);
 }
@@ -883,10 +877,8 @@ static void rtl8214fc_power_set(struct phy_device *phydev, int port, bool on)
 	int page = port == PORT_FIBRE ? RTL821X_MEDIA_PAGE_FIBRE : RTL821X_MEDIA_PAGE_COPPER;
 	int pdown = on ? 0 : BMCR_PDOWN;
 
-	pr_info("%s: Powering %s %s (port %d)\n", __func__,
-		on ? "on" : "off",
-		port == PORT_FIBRE ? "FIBRE" : "COPPER",
-		phydev->mdio.addr);
+	phydev_info(phydev, "power %s %s\n", on ? "on" : "off",
+		    port == PORT_FIBRE ? "fibre" : "copper");
 
 	phy_write(phydev, RTL821XINT_MEDIA_PAGE_SELECT, page);
 	phy_modify_paged(phydev, RTL821X_PAGE_POWER, 0x10, BMCR_PDOWN, pdown);
@@ -903,47 +895,29 @@ static int rtl8214fc_suspend(struct phy_device *phydev)
 
 static int rtl8214fc_resume(struct phy_device *phydev)
 {
-	if (rtl8214fc_media_is_fibre(phydev)) {
-		rtl8214fc_power_set(phydev, PORT_MII, false);
-		rtl8214fc_power_set(phydev, PORT_FIBRE, true);
-	} else {
-		rtl8214fc_power_set(phydev, PORT_FIBRE, false);
-		rtl8214fc_power_set(phydev, PORT_MII, true);
-	}
+	bool set_fibre = rtl8214fc_media_is_fibre(phydev);
+
+	rtl8214fc_power_set(phydev, PORT_MII, !set_fibre);
+	rtl8214fc_power_set(phydev, PORT_FIBRE, set_fibre);
 
 	return 0;
 }
 
 static void rtl8214fc_media_set(struct phy_device *phydev, bool set_fibre)
 {
-	int mac = phydev->mdio.addr;
-
-	static int reg[] = {16, 19, 20, 21};
-	int val;
-
-	pr_info("%s: port %d, set_fibre: %d\n", __func__, mac, set_fibre);
-	phy_package_write_paged(phydev, RTL838X_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_INTERNAL);
-	val = phy_package_read_paged(phydev, RTL821X_PAGE_PORT, reg[mac % 4]);
-
-	val |= BIT(10);
-	if (set_fibre) {
-		val &= ~BMCR_PDOWN;
-	} else {
-		val |= BMCR_PDOWN;
-	}
+	struct phy_device *basephy = get_base_phy(phydev);
+	int pdown = set_fibre ? 0 : BMCR_PDOWN;
+	static int regs[] = {16, 19, 20, 21};
+	int reg = regs[phydev->mdio.addr & 3];
 
-	phy_package_write_paged(phydev, RTL838X_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_INTERNAL);
-	phy_package_write_paged(phydev, RTL821X_PAGE_PORT, reg[mac % 4], val);
-	phy_package_write_paged(phydev, RTL838X_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
+	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_modify_paged(basephy, RTL821X_PAGE_PORT, reg, BMCR_PDOWN, pdown);
+	phy_write_paged(basephy, RTL838X_PAGE_RAW, RTL821XINT_MEDIA_PAGE_SELECT, RTL821X_MEDIA_PAGE_AUTO);
 
 	if (!phydev->suspended) {
-		if (set_fibre) {
-			rtl8214fc_power_set(phydev, PORT_MII, false);
-			rtl8214fc_power_set(phydev, PORT_FIBRE, true);
-		} else {
-			rtl8214fc_power_set(phydev, PORT_FIBRE, false);
-			rtl8214fc_power_set(phydev, PORT_MII, true);
-		}
+		rtl8214fc_power_set(phydev, PORT_MII, !set_fibre);
+		rtl8214fc_power_set(phydev, PORT_FIBRE, set_fibre);
 	}
 }
 
@@ -3558,7 +3532,7 @@ static int rtl8214fc_sfp_insert(void *upstream, const struct sfp_eeprom_id *id)
 	sfp_parse_support(phydev->sfp_bus, id, support, interfaces);
 	iface = sfp_select_interface(phydev->sfp_bus, support);
 
-	dev_info(&phydev->mdio.dev, "%s SFP module inserted\n", phy_modes(iface));
+	phydev_info(phydev, "%s SFP module inserted\n", phy_modes(iface));
 
 	rtl8214fc_media_set(phydev, true);
 




More information about the lede-commits mailing list