realtek: Use SerDes Information from .dts for phylink config
authorBirger Koblitz <git@birger-koblitz.de>
Thu, 13 Jan 2022 17:48:06 +0000 (18:48 +0100)
committerDaniel Golle <daniel@makrotopia.org>
Thu, 17 Feb 2022 15:21:47 +0000 (15:21 +0000)
When a port is brought up, read the SDS-id via the phy_device
for a given port and use this to configure the SDS when it
is brought up.

Signed-off-by: Birger Koblitz <git@birger-koblitz.de>
target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/dsa.c
target/linux/realtek/files-5.10/drivers/net/dsa/rtl83xx/rtl838x.h

index 8ad713163e7d177e2c6ca3dfb2434b59f94f5da7..12334dff9f351f70b5773a98d6238ff5d620a5cc 100644 (file)
@@ -239,6 +239,26 @@ static int rtl930x_setup(struct dsa_switch *ds)
        return 0;
 }
 
+static int rtl93xx_get_sds(struct phy_device *phydev)
+{
+       struct device *dev = &phydev->mdio.dev;
+       struct device_node *dn;
+       u32 sds_num;
+
+       if (!dev)
+               return -1;
+       if (dev->of_node) {
+               dn = dev->of_node;
+               if (of_property_read_u32(dn, "sds", &sds_num))
+                       sds_num = -1;
+       } else {
+               dev_err(dev, "No DT node.\n");
+               return -1;
+       }
+
+       return sds_num;
+}
+
 static void rtl83xx_phylink_validate(struct dsa_switch *ds, int port,
                                     unsigned long *supported,
                                     struct phylink_link_state *state)
@@ -594,7 +614,7 @@ static void rtl93xx_phylink_mac_config(struct dsa_switch *ds, int port,
        int sds_num, sds_mode;
        u32 reg;
 
-       pr_debug("%s port %d, mode %x, phy-mode: %s, speed %d, link %d\n", __func__,
+       pr_info("%s port %d, mode %x, phy-mode: %s, speed %d, link %d\n", __func__,
                port, mode, phy_modes(state->interface), state->speed, state->link);
 
        // Nothing to be done for the CPU-port
@@ -604,9 +624,9 @@ static void rtl93xx_phylink_mac_config(struct dsa_switch *ds, int port,
        reg = sw_r32(priv->r->mac_force_mode_ctrl(port));
        reg &= ~(0xf << 3);
 
-       // On the RTL930X, ports 24 to 27 are using an internal SerDes
-       if (port >=24 && port <= 27) {
-               sds_num = port - 18; // Port 24 mapped to SerDes 6, 25 to 7 ...
+       sds_num = priv->ports[port].sds_num;
+       pr_info("%s SDS is %d\n", __func__, sds_num);
+       if (sds_num >= 0) {
                switch (state->interface) {
                case PHY_INTERFACE_MODE_HSGMII:
                        sds_mode = 0x12;
@@ -781,6 +801,8 @@ static int rtl83xx_port_enable(struct dsa_switch *ds, int port,
                sw_w32_mask(0, BIT(port), RTL930X_L2_PORT_DABLK_CTRL);
        }
 
+       priv->ports[port].sds_num = rtl93xx_get_sds(phydev);
+
        return 0;
 }
 
index c9307458f866963b9dfc7be7a79030849f5c17bd..1c55ff6fc99a7fbc3cf35f37e7d074cae2eb20d9 100644 (file)
@@ -443,7 +443,7 @@ struct rtl838x_port {
        enum phy_type phy;
        bool is10G;
        bool is2G5;
-       u8 sds_num;
+       int sds_num;
        const struct dsa_port *dp;
 };