From: Markus Stockhausen Date: Mon, 22 Sep 2025 15:04:05 +0000 (-0400) Subject: realtek: remove DSA internal PCS functions X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=347d546386572bcf7f7d1451ad3b6f1c6f4baa4d;p=openwrt%2Fstaging%2Fthess.git realtek: remove DSA internal PCS functions 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 Link: https://github.com/openwrt/openwrt/pull/20129 Signed-off-by: Hauke Mehrtens --- diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c index 9858b76c77..db9c392d16 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/common.c @@ -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 + * 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 diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c index 57be6ffa54..eee3479aea 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/dsa.c @@ -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, diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c index 2fed65adab..92bb3e9512 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.c @@ -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, diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h index 5ec3905a80..a9f20789ff 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h @@ -123,24 +123,6 @@ #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; diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c index 0d433c0b56..9a325b396b 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl839x.c @@ -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, diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c index a421db4d0d..0ac7709248 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c @@ -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, diff --git a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c index cac09081ef..27dd999840 100644 --- a/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c +++ b/target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl931x.c @@ -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, diff --git a/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c b/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c index ceedf209f5..b23e177f86 100644 --- a/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c +++ b/target/linux/realtek/files-6.12/drivers/net/pcs/pcs-rtl-otto.c @@ -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;