[openwrt/openwrt] realtek: drop RTL8226/RTL8221B downstream PHY driver

LEDE Commits lede-commits at lists.infradead.org
Fri Sep 5 04:36:50 PDT 2025


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

commit 3d7b0bc5c18fb044d9363c1cd73430e609180c76
Author: Markus Stockhausen <markus.stockhausen at gmx.de>
AuthorDate: Sat Aug 30 12:12:34 2025 -0400

    realtek: drop RTL8226/RTL8221B downstream PHY driver
    
    Since we are using upstream PHY drivers there is no more need
    for the downstream version. Side effect is that the SoC dependent
    polling functions are no longer needed. This was always wrong
    in this driver.
    
    Signed-off-by: Markus Stockhausen <markus.stockhausen at gmx.de>
    Link: https://github.com/openwrt/openwrt/pull/19906
    Signed-off-by: Hauke Mehrtens <hauke at hauke-m.de>
---
 .../files-6.12/drivers/net/phy/rtl83xx-phy.c       | 285 ---------------------
 .../files-6.12/drivers/net/phy/rtl83xx-phy.h       |   2 -
 2 files changed, 287 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 7d38070091..8e1abef20e 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
@@ -87,13 +87,6 @@ extern int rtmdio_931x_write_sds_phy_new(int sds, int page, int regnum, u16 val)
 #define RTSDS_930X_PLL_LC		0x3
 #define RTSDS_930X_PLL_RING		0x1
 
-/* This lock protects the state of the SoC automatically polling the PHYs over the SMI
- * bus to detect e.g. link and media changes. For operations on the PHYs such as
- * patching or other configuration changes such as EEE, polling needs to be disabled
- * since otherwise these operations may fails or lead to unpredictable results.
- */
-DEFINE_MUTEX(poll_lock);
-
 static const struct firmware rtl838x_8380_fw;
 static const struct firmware rtl838x_8214fc_fw;
 static const struct firmware rtl838x_8218b_fw;
@@ -108,67 +101,6 @@ static inline struct phy_device *get_base_phy(struct phy_device *phydev)
 	return get_package_phy(phydev, 0);
 }
 
-static u64 disable_polling(int port)
-{
-	u64 saved_state;
-
-	mutex_lock(&poll_lock);
-
-	switch (soc_info.family) {
-	case RTL8380_FAMILY_ID:
-		saved_state = sw_r32(RTL838X_SMI_POLL_CTRL);
-		sw_w32_mask(BIT(port), 0, RTL838X_SMI_POLL_CTRL);
-		break;
-	case RTL8390_FAMILY_ID:
-		saved_state = sw_r32(RTL839X_SMI_PORT_POLLING_CTRL + 4);
-		saved_state <<= 32;
-		saved_state |= sw_r32(RTL839X_SMI_PORT_POLLING_CTRL);
-		sw_w32_mask(BIT(port % 32), 0,
-		            RTL839X_SMI_PORT_POLLING_CTRL + ((port >> 5) << 2));
-		break;
-	case RTL9300_FAMILY_ID:
-		saved_state = sw_r32(RTL930X_SMI_POLL_CTRL);
-		sw_w32_mask(BIT(port), 0, RTL930X_SMI_POLL_CTRL);
-		break;
-	case RTL9310_FAMILY_ID:
-		saved_state = sw_r32(RTL931X_SMI_PORT_POLLING_CTRL + 4);
-		saved_state <<= 32;
-		saved_state |= sw_r32(RTL931X_SMI_PORT_POLLING_CTRL);
-		sw_w32_mask(BIT(port % 32), 0, RTL931X_SMI_PORT_POLLING_CTRL + ((port >> 5) << 2));
-		break;
-	}
-
-	mutex_unlock(&poll_lock);
-
-	return saved_state;
-}
-
-static int resume_polling(u64 saved_state)
-{
-	mutex_lock(&poll_lock);
-
-	switch (soc_info.family) {
-	case RTL8380_FAMILY_ID:
-		sw_w32(saved_state, RTL838X_SMI_POLL_CTRL);
-		break;
-	case RTL8390_FAMILY_ID:
-		sw_w32(saved_state >> 32, RTL839X_SMI_PORT_POLLING_CTRL + 4);
-		sw_w32(saved_state, RTL839X_SMI_PORT_POLLING_CTRL);
-		break;
-	case RTL9300_FAMILY_ID:
-		sw_w32(saved_state, RTL930X_SMI_POLL_CTRL);
-		break;
-	case RTL9310_FAMILY_ID:
-		sw_w32(saved_state >> 32, RTL931X_SMI_PORT_POLLING_CTRL + 4);
-		sw_w32(saved_state, RTL931X_SMI_PORT_POLLING_CTRL);
-		break;
-	}
-
-	mutex_unlock(&poll_lock);
-
-	return 0;
-}
-
 static int rtl821x_match_phy_device(struct phy_device *phydev)
 {
 	int oldpage, oldxpage, chip_mode, chip_cfg_mode;
@@ -360,197 +292,6 @@ static int rtl821x_write_page(struct phy_device *phydev, int page)
 	return __phy_write(phydev, RTL8XXX_PAGE_SELECT, page);
 }
 
-static int rtl8226_read_status(struct phy_device *phydev)
-{
-	int ret = 0;
-	u32 val;
-
-/* TODO: ret = genphy_read_status(phydev);
- * 	if (ret < 0) {
- * 		pr_info("%s: genphy_read_status failed\n", __func__);
- * 		return ret;
- * 	}
- */
-
-	/* Link status must be read twice */
-	for (int i = 0; i < 2; i++)
-		val = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA402);
-
-	phydev->link = val & BIT(2) ? 1 : 0;
-	if (!phydev->link)
-		goto out;
-
-	/* Read duplex status */
-	val = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA434);
-	if (val < 0)
-		goto out;
-	phydev->duplex = !!(val & BIT(3));
-
-	/* Read speed */
-	val = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA434);
-	switch (val & 0x0630) {
-	case 0x0000:
-		phydev->speed = SPEED_10;
-		break;
-	case 0x0010:
-		phydev->speed = SPEED_100;
-		break;
-	case 0x0020:
-		phydev->speed = SPEED_1000;
-		break;
-	case 0x0200:
-		phydev->speed = SPEED_10000;
-		break;
-	case 0x0210:
-		phydev->speed = SPEED_2500;
-		break;
-	case 0x0220:
-		phydev->speed = SPEED_5000;
-		break;
-	default:
-		break;
-	}
-
-out:
-	return ret;
-}
-
-static int rtl8226_advertise_aneg(struct phy_device *phydev)
-{
-	int ret = 0;
-	u32 v;
-
-	pr_info("In %s\n", __func__);
-
-	v = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE);
-	if (v < 0)
-		goto out;
-
-	v |= ADVERTISE_10HALF;
-	v |= ADVERTISE_10FULL;
-	v |= ADVERTISE_100HALF;
-	v |= ADVERTISE_100FULL;
-
-	ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE, v);
-
-	/* Allow 1GBit */
-	v = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA412);
-	if (v < 0)
-		goto out;
-	v |= ADVERTISE_1000FULL;
-
-	ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, 0xA412, v);
-	if (ret < 0)
-		goto out;
-
-	/* Allow 2.5G */
-	v = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL);
-	if (v < 0)
-		goto out;
-
-	v |= MDIO_AN_10GBT_CTRL_ADV2_5G;
-	ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, v);
-
-out:
-	return ret;
-}
-
-static int rtl8226_config_aneg(struct phy_device *phydev)
-{
-	int ret = 0;
-	u32 v;
-
-	pr_debug("In %s\n", __func__);
-	if (phydev->autoneg == AUTONEG_ENABLE) {
-		ret = rtl8226_advertise_aneg(phydev);
-		if (ret)
-			goto out;
-		/* AutoNegotiationEnable */
-		v = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
-		if (v < 0)
-			goto out;
-
-		v |= MDIO_AN_CTRL1_ENABLE; /* Enable AN */
-		ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1, v);
-		if (ret < 0)
-			goto out;
-
-		/* RestartAutoNegotiation */
-		v = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA400);
-		if (v < 0)
-			goto out;
-		v |= MDIO_AN_CTRL1_RESTART;
-
-		ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, 0xA400, v);
-	}
-
-/*	TODO: ret = __genphy_config_aneg(phydev, ret); */
-
-out:
-	return ret;
-}
-
-static int rtl8226_get_eee(struct phy_device *phydev, struct ethtool_keee *e)
-{
-	u32 val;
-	int addr = phydev->mdio.addr;
-
-	pr_debug("In %s, port %d, was enabled: %d\n", __func__, addr, e->eee_enabled);
-
-	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV);
-	if (e->eee_enabled) {
-		e->eee_enabled = !!(val & MDIO_EEE_100TX);
-		if (!e->eee_enabled) {
-			val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2);
-			e->eee_enabled = !!(val & MDIO_EEE_2_5GT);
-		}
-	}
-	pr_debug("%s: enabled: %d\n", __func__, e->eee_enabled);
-
-	return 0;
-}
-
-static int rtl8226_set_eee(struct phy_device *phydev, struct ethtool_keee *e)
-{
-	int port = phydev->mdio.addr;
-	u64 poll_state;
-	bool an_enabled;
-	u32 val;
-
-	pr_info("In %s, port %d, enabled %d\n", __func__, port, e->eee_enabled);
-
-	poll_state = disable_polling(port);
-
-	/* Remember aneg state */
-	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
-	an_enabled = !!(val & MDIO_AN_CTRL1_ENABLE);
-
-	/* Setup 100/1000MBit */
-	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV);
-	if (e->eee_enabled)
-		val |= (MDIO_EEE_100TX | MDIO_EEE_1000T);
-	else
-		val &= (MDIO_EEE_100TX | MDIO_EEE_1000T);
-	phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, val);
-
-	/* Setup 2.5GBit */
-	val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2);
-	if (e->eee_enabled)
-		val |= MDIO_EEE_2_5GT;
-	else
-		val &= MDIO_EEE_2_5GT;
-	phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2, val);
-
-	/* RestartAutoNegotiation */
-	val = phy_read_mmd(phydev, MDIO_MMD_VEND2, 0xA400);
-	val |= MDIO_AN_CTRL1_RESTART;
-	phy_write_mmd(phydev, MDIO_MMD_VEND2, 0xA400, val);
-
-	resume_polling(poll_state);
-
-	return 0;
-}
-
 static struct fw_header *rtl838x_request_fw(struct phy_device *phydev,
 					    const struct firmware *fw,
 					    const char *name)
@@ -3756,32 +3497,6 @@ static struct phy_driver rtl83xx_phy_driver[] = {
 		.write_mmd	= rtl821x_write_mmd,
 		.write_page	= rtl821x_write_page,
 	},
-	{
-		PHY_ID_MATCH_MODEL(PHY_ID_RTL8221B),
-		.name           = "REALTEK RTL8221B",
-		.features       = PHY_GBIT_FEATURES,
-		.suspend        = genphy_suspend,
-		.resume         = genphy_resume,
-		.read_page      = rtl821x_read_page,
-		.write_page     = rtl821x_write_page,
-		.read_status    = rtl8226_read_status,
-		.config_aneg    = rtl8226_config_aneg,
-		.set_eee        = rtl8226_set_eee,
-		.get_eee        = rtl8226_get_eee,
-	},
-	{
-		PHY_ID_MATCH_MODEL(PHY_ID_RTL8226),
-		.name		= "REALTEK RTL8226",
-		.features	= PHY_GBIT_FEATURES,
-		.suspend	= genphy_suspend,
-		.resume		= genphy_resume,
-		.read_page	= rtl821x_read_page,
-		.write_page	= rtl821x_write_page,
-		.read_status	= rtl8226_read_status,
-		.config_aneg	= rtl8226_config_aneg,
-		.set_eee	= rtl8226_set_eee,
-		.get_eee	= rtl8226_get_eee,
-	},
 	{
 		PHY_ID_MATCH_MODEL(PHY_ID_RTL8218B_I),
 		.name		= "Realtek RTL8380 SERDES",
diff --git a/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.h b/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.h
index 2f55fb0d90..d054b9bd9a 100644
--- a/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.h
+++ b/target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.h
@@ -24,8 +24,6 @@ struct __attribute__ ((__packed__)) fw_header {
 #define PHY_ID_RTL8214_OR_8218			0x001cc981
 #define PHY_ID_RTL8218D				0x001cc983
 #define PHY_ID_RTL8218B_I			0x001cca40
-#define PHY_ID_RTL8221B				0x001cc849
-#define PHY_ID_RTL8226				0x001cc838
 #define PHY_ID_RTL8390_GENERIC			0x001ccab0
 #define PHY_ID_RTL8393_I			0x001c8393
 #define PHY_ID_RTL9300_I			0x338002a0




More information about the lede-commits mailing list