]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: drop RTL8226/RTL8221B downstream PHY driver
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Sat, 30 Aug 2025 16:12:34 +0000 (12:12 -0400)
committerHauke Mehrtens <hauke@hauke-m.de>
Fri, 5 Sep 2025 11:35:39 +0000 (13:35 +0200)
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@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/19906
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.c
target/linux/realtek/files-6.12/drivers/net/phy/rtl83xx-phy.h

index 7d38070091b3910078c5d70f9db1b92a2dcbc441..8e1abef20e30357353d55aa6a901e4eda4ad2e17 100644 (file)
@@ -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",
index 2f55fb0d90569d9fc19f0b2b5b6a7115b8bc84d4..d054b9bd9a7c8e904e0728488280e1f1bbfbb0bc 100644 (file)
@@ -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