]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
realtek: remove DSA internal PCS functions 20129/head
authorMarkus Stockhausen <markus.stockhausen@gmx.de>
Mon, 22 Sep 2025 15:04:05 +0000 (11:04 -0400)
committerHauke Mehrtens <hauke@hauke-m.de>
Tue, 23 Sep 2025 19:21:43 +0000 (21:21 +0200)
Now that there is a dedicated PCS driver remove the old functions
from the DSA driver and make use of the new ones.

Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
Link: https://github.com/openwrt/openwrt/pull/20129
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c
target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c
target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c

index 9858b76c77e3bf4a7cd4584e57bd573c1ddf7628..db9c392d16bb14f1709f515abd18e7e126474328 100644 (file)
@@ -26,8 +26,7 @@ extern const struct rtl838x_reg rtl931x_reg;
 extern const struct dsa_switch_ops rtl83xx_switch_ops;
 extern const struct dsa_switch_ops rtl930x_switch_ops;
 
-extern const struct phylink_pcs_ops rtl83xx_pcs_ops;
-extern const struct phylink_pcs_ops rtl93xx_pcs_ops;
+extern struct phylink_pcs *rtpcs_create(struct device *dev, struct device_node *np, int port);
 
 int rtl83xx_port_get_stp_state(struct rtl838x_switch_priv *priv, int port)
 {
@@ -268,7 +267,7 @@ static int rtldsa_bus_c45_write(struct mii_bus *bus, int addr, int devad, int re
 
 static int __init rtl83xx_mdio_probe(struct rtl838x_switch_priv *priv)
 {
-       struct device_node *dn, *phy_node, *led_node, *np, *mii_np;
+       struct device_node *dn, *phy_node, *pcs_node, *led_node, *np, *mii_np;
        struct device *dev = priv->dev;
        struct mii_bus *bus;
        int ret;
@@ -342,10 +341,21 @@ static int __init rtl83xx_mdio_probe(struct rtl838x_switch_priv *priv)
                        continue;
                }
 
+               /*
+                * TODO: phylink_pcs was completely converted to the standalone PCS driver - see
+                * rtpcs_create() below. Nevertheless we still make use of the old SerDes <sds>
+                * attribute of the phy node for the scatterd SerDes configuration functions. As
+                * soon as the PCS driver can completely configure the SerDes this is no longer
+                * needed.
+                */
+
                if (of_property_read_u32(phy_node, "sds", &priv->ports[pn].sds_num))
                        priv->ports[pn].sds_num = -1;
                pr_debug("%s port %d has SDS %d\n", __func__, pn, priv->ports[pn].sds_num);
 
+               pcs_node = of_parse_phandle(dn, "pcs-handle", 0);
+               priv->pcs[pn] = rtpcs_create(priv->dev, pcs_node, pn);
+
                if (of_get_phy_mode(dn, &interface))
                        interface = PHY_INTERFACE_MODE_NA;
                if (interface == PHY_INTERFACE_MODE_USXGMII)
@@ -1501,10 +1511,10 @@ static int rtldsa_ethernet_loaded(struct platform_device *pdev)
 
 static int __init rtl83xx_sw_probe(struct platform_device *pdev)
 {
-       int i, err = 0;
        struct rtl838x_switch_priv *priv;
        struct device *dev = &pdev->dev;
        u64 bpdu_mask;
+       int err = 0;
 
        pr_debug("Probing RTL838X switch device\n");
        if (!pdev->dev.of_node) {
@@ -1616,22 +1626,6 @@ static int __init rtl83xx_sw_probe(struct platform_device *pdev)
        }
        pr_debug("Chip version %c\n", priv->version);
 
-       for (i = 0; i <= priv->cpu_port; i++) {
-               switch (soc_info.family) {
-               case RTL8380_FAMILY_ID:
-               case RTL8390_FAMILY_ID:
-                       priv->pcs[i].pcs.ops = &rtl83xx_pcs_ops;
-                       break;
-               case RTL9300_FAMILY_ID:
-               case RTL9310_FAMILY_ID:
-                       priv->pcs[i].pcs.ops = &rtl93xx_pcs_ops;
-                       break;
-               }
-               priv->pcs[i].pcs.neg_mode = true;
-               priv->pcs[i].priv = priv;
-               priv->pcs[i].port = i;
-       }
-
        err = rtl83xx_mdio_probe(priv);
        if (err) {
                /* Probing fails the 1st time because of missing ethernet driver
index 57be6ffa549244ba65f4f1052897a99b9c081b09..eee3479aea961dca7ce9686d9e6c70eea24c329a 100644 (file)
@@ -567,158 +567,13 @@ static int rtl93xx_get_sds(struct phy_device *phydev)
        return sds_num;
 }
 
-static void rtldsa_83xx_pcs_get_state(struct phylink_pcs *pcs, struct phylink_link_state *state)
-{
-       struct rtl838x_pcs *rtpcs = container_of(pcs, struct rtl838x_pcs, pcs);
-       struct rtl838x_switch_priv *priv = rtpcs->priv;
-       int port = rtpcs->port;
-       u64 speed;
-
-       state->link = 0;
-       state->speed = SPEED_UNKNOWN;
-       state->duplex = DUPLEX_UNKNOWN;
-       state->pause &= ~(MLO_PAUSE_RX | MLO_PAUSE_TX);
-
-       if (port < 0 || port > priv->cpu_port)
-               return;
-
-       if (!(priv->r->get_port_reg_le(priv->r->mac_link_sts) & BIT_ULL(port)))
-               return;
-
-       state->link = 1;
-
-       if (priv->r->get_port_reg_le(priv->r->mac_link_dup_sts) & BIT_ULL(port))
-               state->duplex = DUPLEX_FULL;
-       else
-               state->duplex = DUPLEX_HALF;
-
-       speed = priv->r->get_port_reg_le(priv->r->mac_link_spd_sts(port));
-       speed = (speed >> ((port % 16) << 1)) & 0x3;
-
-       switch (speed) {
-       case RTL_SPEED_10:
-               state->speed = SPEED_10;
-               break;
-       case RTL_SPEED_100:
-               state->speed = SPEED_100;
-               break;
-       case RTL_SPEED_1000:
-               state->speed = SPEED_1000;
-               break;
-       case 3:
-               /*
-                * This is ok so far but with minor inconsistencies. On RTL838x this setting is
-                * for either 500M or 2G. It might be that MAC_GLITE_STS register tells more. On
-                * RTL839x these vendor specifics are derived from MAC_LINK_500M_STS and mode 3
-                * is 10G. This is of interest so resolve to it. Sadly it is off by one for the
-                * current RTL_SPEED_10000 (=4) definition for RTL93xx.
-                */
-               state->speed = SPEED_10000;
-               break;
-       }
-
-       if (priv->r->get_port_reg_le(priv->r->mac_rx_pause_sts) & BIT_ULL(port))
-               state->pause |= MLO_PAUSE_RX;
-       if (priv->r->get_port_reg_le(priv->r->mac_tx_pause_sts) & BIT_ULL(port))
-               state->pause |= MLO_PAUSE_TX;
-}
-
-static void rtldsa_93xx_pcs_get_state(struct phylink_pcs *pcs,
-                                     struct phylink_link_state *state)
-{
-       struct rtl838x_pcs *rtpcs = container_of(pcs, struct rtl838x_pcs, pcs);
-       struct rtl838x_switch_priv *priv = rtpcs->priv;
-       int port = rtpcs->port;
-       u64 speed;
-       u64 link;
-       u64 media;
-
-       state->link = 0;
-       state->speed = SPEED_UNKNOWN;
-       state->duplex = DUPLEX_UNKNOWN;
-       state->pause &= ~(MLO_PAUSE_RX | MLO_PAUSE_TX);
-
-       if (port < 0 || port > priv->cpu_port)
-               return;
-
-       /* On the RTL9300 for at least the RTL8226B PHY, the MAC-side link
-        * state needs to be read twice in order to read a correct result.
-        * This would not be necessary for ports connected e.g. to RTL8218D
-        * PHYs.
-        */
-       link = priv->r->get_port_reg_le(priv->r->mac_link_sts);
-       link = priv->r->get_port_reg_le(priv->r->mac_link_sts);
-       if (!(link & BIT_ULL(port)))
-               return;
-
-       state->link = 1;
-
-       if (priv->family_id == RTL9310_FAMILY_ID)
-               media = priv->r->get_port_reg_le(RTL931X_MAC_LINK_MEDIA_STS);
-
-       if (priv->family_id == RTL9300_FAMILY_ID)
-               media = sw_r32(RTL930X_MAC_LINK_MEDIA_STS);
-
-       pr_debug("%s: link state port %d: %llx, media %llx\n", __func__, port,
-                link & BIT_ULL(port), media);
-
-       if (priv->r->get_port_reg_le(priv->r->mac_link_dup_sts) & BIT_ULL(port))
-               state->duplex = DUPLEX_FULL;
-       else
-               state->duplex = DUPLEX_HALF;
-
-       speed = priv->r->get_port_reg_le(priv->r->mac_link_spd_sts(port));
-       speed = (speed >> ((port % 8) << 2)) & 0xf;
-       switch (speed) {
-       case RTL_SPEED_10:
-               state->speed = SPEED_10;
-               break;
-       case RTL_SPEED_100:
-               state->speed = SPEED_100;
-               break;
-       case RTL_SPEED_1000:
-               state->speed = SPEED_1000;
-               break;
-       case RTL_SPEED_10000:
-               state->speed = SPEED_10000;
-               break;
-       case RTL_SPEED_2500:
-               state->speed = SPEED_2500;
-               break;
-       case RTL_SPEED_5000:
-               state->speed = SPEED_5000;
-               break;
-       default:
-               pr_err("%s: unknown speed: %d\n", __func__, (u32)speed & 0xf);
-       }
-
-       pr_debug("%s: speed is: %d %d\n", __func__, (u32)speed & 0xf, state->speed);
-       if (priv->r->get_port_reg_le(priv->r->mac_rx_pause_sts) & BIT_ULL(port))
-               state->pause |= MLO_PAUSE_RX;
-       if (priv->r->get_port_reg_le(priv->r->mac_tx_pause_sts) & BIT_ULL(port))
-               state->pause |= MLO_PAUSE_TX;
-}
-
-static int rtl83xx_pcs_config(struct phylink_pcs *pcs, unsigned int neg_mode,
-                             phy_interface_t interface,
-                             const unsigned long *advertising,
-                             bool permit_pause_to_mac)
-{
-       return 0;
-}
-
-static void rtl83xx_pcs_an_restart(struct phylink_pcs *pcs)
-{
-/* No restart functionality existed before we migrated to pcs */
-}
-
-static struct phylink_pcs *rtl83xx_phylink_mac_select_pcs(struct dsa_switch *ds,
-                                                         int port,
-                                                         phy_interface_t interface)
+static struct phylink_pcs *rtldsa_phylink_mac_select_pcs(struct dsa_switch *ds,
+                                                        int port,
+                                                        phy_interface_t interface)
 {
        struct rtl838x_switch_priv *priv = ds->priv;
 
-       return &priv->pcs[port].pcs;
+       return priv->pcs[port];
 }
 
 static void rtl83xx_config_interface(int port, phy_interface_t interface)
@@ -2678,12 +2533,6 @@ static int rtldsa_phy_write(struct dsa_switch *ds, int addr, int regnum, u16 val
        return mdiobus_write_nested(priv->parent_bus, addr, regnum, val);
 }
 
-const struct phylink_pcs_ops rtl83xx_pcs_ops = {
-       .pcs_an_restart         = rtl83xx_pcs_an_restart,
-       .pcs_get_state          = rtldsa_83xx_pcs_get_state,
-       .pcs_config             = rtl83xx_pcs_config,
-};
-
 const struct dsa_switch_ops rtl83xx_switch_ops = {
        .get_tag_protocol       = rtl83xx_get_tag_protocol,
        .setup                  = rtl83xx_setup,
@@ -2695,7 +2544,7 @@ const struct dsa_switch_ops rtl83xx_switch_ops = {
        .phylink_mac_config     = rtl83xx_phylink_mac_config,
        .phylink_mac_link_down  = rtl83xx_phylink_mac_link_down,
        .phylink_mac_link_up    = rtl83xx_phylink_mac_link_up,
-       .phylink_mac_select_pcs = rtl83xx_phylink_mac_select_pcs,
+       .phylink_mac_select_pcs = rtldsa_phylink_mac_select_pcs,
 
        .get_strings            = rtldsa_get_strings,
        .get_ethtool_stats      = rtldsa_get_ethtool_stats,
@@ -2741,12 +2590,6 @@ const struct dsa_switch_ops rtl83xx_switch_ops = {
        .port_bridge_flags      = rtl83xx_port_bridge_flags,
 };
 
-const struct phylink_pcs_ops rtl93xx_pcs_ops = {
-       .pcs_an_restart         = rtl83xx_pcs_an_restart,
-       .pcs_get_state          = rtldsa_93xx_pcs_get_state,
-       .pcs_config             = rtl83xx_pcs_config,
-};
-
 const struct dsa_switch_ops rtl930x_switch_ops = {
        .get_tag_protocol       = rtl83xx_get_tag_protocol,
        .setup                  = rtl93xx_setup,
@@ -2758,7 +2601,7 @@ const struct dsa_switch_ops rtl930x_switch_ops = {
        .phylink_mac_config     = rtl93xx_phylink_mac_config,
        .phylink_mac_link_down  = rtl93xx_phylink_mac_link_down,
        .phylink_mac_link_up    = rtl93xx_phylink_mac_link_up,
-       .phylink_mac_select_pcs = rtl83xx_phylink_mac_select_pcs,
+       .phylink_mac_select_pcs = rtldsa_phylink_mac_select_pcs,
 
        .get_strings            = rtldsa_get_strings,
        .get_ethtool_stats      = rtldsa_get_ethtool_stats,
index 2fed65adabc0ca21ccc856c84edb3637cfaa08b5..92bb3e951220be16d4e6e16bbfbef585be8627e6 100644 (file)
@@ -261,11 +261,6 @@ static inline int rtl838x_l2_port_new_sa_fwd(int p)
        return RTL838X_L2_PORT_NEW_SA_FWD(p);
 }
 
-static inline int rtl838x_mac_link_spd_sts(int p)
-{
-       return RTL838X_MAC_LINK_SPD_STS(p);
-}
-
 inline static int rtl838x_trk_mbr_ctr(int group)
 {
        return RTL838X_TRK_MBR_CTR + (group << 2);
@@ -1706,11 +1701,6 @@ const struct rtl838x_reg rtl838x_reg = {
        .mir_ctrl = RTL838X_MIR_CTRL,
        .mir_dpm = RTL838X_MIR_DPM_CTRL,
        .mir_spm = RTL838X_MIR_SPM_CTRL,
-       .mac_link_sts = RTL838X_MAC_LINK_STS,
-       .mac_link_dup_sts = RTL838X_MAC_LINK_DUP_STS,
-       .mac_link_spd_sts = rtl838x_mac_link_spd_sts,
-       .mac_rx_pause_sts = RTL838X_MAC_RX_PAUSE_STS,
-       .mac_tx_pause_sts = RTL838X_MAC_TX_PAUSE_STS,
        .read_l2_entry_using_hash = rtl838x_read_l2_entry_using_hash,
        .write_l2_entry_using_hash = rtl838x_write_l2_entry_using_hash,
        .read_cam = rtl838x_read_cam,
index 5ec3905a80c26428a770b31f6e1ef5df46022b67..a9f20789ff7a2bf584f03c3ff75562f275c3d642 100644 (file)
 #define RTL839X_MAC_LINK_STS                   (0x0390)
 #define RTL930X_MAC_LINK_STS                   (0xCB10)
 #define RTL931X_MAC_LINK_STS                   (0x0EC0)
-#define RTL838X_MAC_LINK_SPD_STS(p)            (0xa190 + (((p >> 4) << 2)))
-#define RTL839X_MAC_LINK_SPD_STS(p)            (0x03a0 + (((p >> 4) << 2)))
-#define RTL930X_MAC_LINK_SPD_STS(p)            (0xCB18 + (((p >> 3) << 2)))
-#define RTL931X_MAC_LINK_SPD_STS               (0x0ED0)
-#define RTL838X_MAC_LINK_DUP_STS               (0xa19c)
-#define RTL839X_MAC_LINK_DUP_STS               (0x03b0)
-#define RTL930X_MAC_LINK_DUP_STS               (0xCB28)
-#define RTL931X_MAC_LINK_DUP_STS               (0x0EF0)
-#define RTL838X_MAC_TX_PAUSE_STS               (0xa1a0)
-#define RTL839X_MAC_TX_PAUSE_STS               (0x03b8)
-#define RTL930X_MAC_TX_PAUSE_STS               (0xCB2C)
-#define RTL931X_MAC_TX_PAUSE_STS               (0x0EF8)
-#define RTL838X_MAC_RX_PAUSE_STS               (0xa1a4)
-#define RTL839X_MAC_RX_PAUSE_STS               (0x03c0)
-#define RTL930X_MAC_RX_PAUSE_STS               (0xCB30)
-#define RTL931X_MAC_RX_PAUSE_STS               (0x0F00)
-#define RTL930X_MAC_LINK_MEDIA_STS             (0xCB14)
-#define RTL931X_MAC_LINK_MEDIA_STS             (0x0EC8)
 
 /* MAC link state bits */
 #define RTL_SPEED_10                           0
@@ -702,12 +684,6 @@ struct rtl838x_port {
        const struct dsa_port *dp;
 };
 
-struct rtl838x_pcs {
-       struct phylink_pcs pcs;
-       struct rtl838x_switch_priv *priv;
-       int port;
-};
-
 struct rtl838x_vlan_info {
        u64 untagged_ports;
        u64 member_ports;
@@ -1073,11 +1049,6 @@ struct rtl838x_reg {
        int mir_ctrl;
        int mir_dpm;
        int mir_spm;
-       int mac_link_sts;
-       int mac_link_dup_sts;
-       int  (*mac_link_spd_sts)(int port);
-       int mac_rx_pause_sts;
-       int mac_tx_pause_sts;
        u64 (*read_l2_entry_using_hash)(u32 hash, u32 position, struct rtl838x_l2_entry *e);
        void (*write_l2_entry_using_hash)(u32 hash, u32 pos, struct rtl838x_l2_entry *e);
        u64 (*read_cam)(int idx, struct rtl838x_l2_entry *e);
@@ -1126,7 +1097,7 @@ struct rtl838x_switch_priv {
        u16 family_id;
        char version;
        struct rtl838x_port ports[57];
-       struct rtl838x_pcs pcs[57];
+       struct phylink_pcs *pcs[57];
        struct mutex reg_mutex;         /* Mutex for individual register manipulations */
        struct mutex pie_mutex;         /* Mutex for Packet Inspection Engine */
        int link_state_irq;
index 0d433c0b56bdc6a19003b78db10f7b419ae166b1..9a325b396be8fcd98187a55f09333bc9272a594d 100644 (file)
@@ -293,11 +293,6 @@ static inline int rtl839x_l2_port_new_sa_fwd(int p)
        return RTL839X_L2_PORT_NEW_SA_FWD(p);
 }
 
-static inline int rtl839x_mac_link_spd_sts(int p)
-{
-       return RTL839X_MAC_LINK_SPD_STS(p);
-}
-
 static inline int rtl839x_trk_mbr_ctr(int group)
 {
        return RTL839X_TRK_MBR_CTR + (group << 3);
@@ -1686,11 +1681,6 @@ const struct rtl838x_reg rtl839x_reg = {
        .mir_ctrl = RTL839X_MIR_CTRL,
        .mir_dpm = RTL839X_MIR_DPM_CTRL,
        .mir_spm = RTL839X_MIR_SPM_CTRL,
-       .mac_link_sts = RTL839X_MAC_LINK_STS,
-       .mac_link_dup_sts = RTL839X_MAC_LINK_DUP_STS,
-       .mac_link_spd_sts = rtl839x_mac_link_spd_sts,
-       .mac_rx_pause_sts = RTL839X_MAC_RX_PAUSE_STS,
-       .mac_tx_pause_sts = RTL839X_MAC_TX_PAUSE_STS,
        .read_l2_entry_using_hash = rtl839x_read_l2_entry_using_hash,
        .write_l2_entry_using_hash = rtl839x_write_l2_entry_using_hash,
        .read_cam = rtl839x_read_cam,
index a421db4d0dfa802100788bcabc1bc0afff3dddfa..0ac77092480d366ed046d414afc08b26b493dd85 100644 (file)
@@ -350,11 +350,6 @@ static inline int rtl930x_mac_port_ctrl(int p)
        return RTL930X_MAC_L2_PORT_CTRL(p);
 }
 
-static inline int rtl930x_mac_link_spd_sts(int p)
-{
-       return RTL930X_MAC_LINK_SPD_STS(p);
-}
-
 static u64 rtl930x_l2_hash_seed(u64 mac, u32 vid)
 {
        u64 v = vid;
@@ -2454,11 +2449,6 @@ const struct rtl838x_reg rtl930x_reg = {
        .mir_ctrl = RTL930X_MIR_CTRL,
        .mir_dpm = RTL930X_MIR_DPM_CTRL,
        .mir_spm = RTL930X_MIR_SPM_CTRL,
-       .mac_link_sts = RTL930X_MAC_LINK_STS,
-       .mac_link_dup_sts = RTL930X_MAC_LINK_DUP_STS,
-       .mac_link_spd_sts = rtl930x_mac_link_spd_sts,
-       .mac_rx_pause_sts = RTL930X_MAC_RX_PAUSE_STS,
-       .mac_tx_pause_sts = RTL930X_MAC_TX_PAUSE_STS,
        .read_l2_entry_using_hash = rtl930x_read_l2_entry_using_hash,
        .write_l2_entry_using_hash = rtl930x_write_l2_entry_using_hash,
        .read_cam = rtl930x_read_cam,
index cac09081ef29e87707ae26cc919cef9d1319e1b8..27dd999840eb5677b1d049685d309297c9f2ab86 100644 (file)
@@ -265,11 +265,6 @@ static inline int rtl931x_mac_force_mode_ctrl(int p)
        return RTL931X_MAC_FORCE_MODE_CTRL + (p << 2);
 }
 
-static inline int rtl931x_mac_link_spd_sts(int p)
-{
-       return RTL931X_MAC_LINK_SPD_STS + (((p >> 3) << 2));
-}
-
 static inline int rtl931x_mac_port_ctrl(int p)
 {
        return RTL931X_MAC_L2_PORT_CTRL + (p << 7);
@@ -1557,11 +1552,6 @@ const struct rtl838x_reg rtl931x_reg = {
        .mir_ctrl = RTL931X_MIR_CTRL,
        .mir_dpm = RTL931X_MIR_DPM_CTRL,
        .mir_spm = RTL931X_MIR_SPM_CTRL,
-       .mac_link_sts = RTL931X_MAC_LINK_STS,
-       .mac_link_dup_sts = RTL931X_MAC_LINK_DUP_STS,
-       .mac_link_spd_sts = rtl931x_mac_link_spd_sts,
-       .mac_rx_pause_sts = RTL931X_MAC_RX_PAUSE_STS,
-       .mac_tx_pause_sts = RTL931X_MAC_TX_PAUSE_STS,
        .read_l2_entry_using_hash = rtl931x_read_l2_entry_using_hash,
        .write_l2_entry_using_hash = rtl931x_write_l2_entry_using_hash,
        .read_cam = rtl931x_read_cam,
index ceedf209f51ee784da0b655d4f7e615381ba484c..b23e177f86819cff6c5ba460a88fac3ff0e8bf86 100644 (file)
@@ -272,6 +272,7 @@ struct phylink_pcs *rtpcs_create(struct device *dev, struct device_node *np, int
        link->port = port;
        link->sds = sds;
        link->pcs.ops = ctrl->cfg->pcs_ops;
+       link->pcs.neg_mode = true;
 
        ctrl->link[port] = link;