net: ti: cpsw: add support for standard eth "max-speed" dt property
authorGrygorii Strashko <grygorii.strashko@ti.com>
Thu, 19 Sep 2019 08:16:39 +0000 (11:16 +0300)
committerTom Rini <trini@konsulko.com>
Sun, 3 Nov 2019 14:36:06 +0000 (09:36 -0500)
This patch adds support for standard Ethernet "max-speed" DT property to
allow PHY link speed limitation.

Signed-off-by: Grygorii Strashko <grygorii.strashko@ti.com>
drivers/net/ti/cpsw.c
include/cpsw.h

index 533c1679950c694e458f861d9ccf2fbdc2363a09..24265360e643d4a428f3f7ebf9c84c33243c5266 100644 (file)
@@ -839,6 +839,7 @@ static int cpsw_phy_init(struct cpsw_priv *priv, struct cpsw_slave *slave)
 {
        struct phy_device *phydev;
        u32 supported = PHY_GBIT_FEATURES;
+       int ret;
 
        phydev = phy_connect(priv->bus,
                        slave->data->phy_addr,
@@ -849,6 +850,13 @@ static int cpsw_phy_init(struct cpsw_priv *priv, struct cpsw_slave *slave)
                return -1;
 
        phydev->supported &= supported;
+       if (slave->data->max_speed) {
+               ret = phy_set_supported(phydev, slave->data->max_speed);
+               if (ret)
+                       return ret;
+               dev_dbg(priv->dev, "Port %u speed forced to %uMbit\n",
+                       slave->slave_num + 1, slave->data->max_speed);
+       }
        phydev->advertising = phydev->supported;
 
 #ifdef CONFIG_DM_ETH
@@ -1185,6 +1193,7 @@ static void cpsw_eth_of_parse_slave(struct cpsw_platform_data *data,
        struct cpsw_slave_data  *slave_data;
        const void *fdt = gd->fdt_blob;
        const char *phy_mode;
+       int max_speed = -1;
        u32 phy_id[2];
 
        slave_data = &data->slave_data[slave_index];
@@ -1206,6 +1215,12 @@ static void cpsw_eth_of_parse_slave(struct cpsw_platform_data *data,
                                     phy_id, 2);
                slave_data->phy_addr = phy_id[1];
        }
+
+       slave_data->max_speed = 0;
+       max_speed = fdtdec_get_int(fdt, subnode,
+                                  "max-speed", max_speed);
+       if (max_speed > 0)
+               slave_data->max_speed = max_speed;
 }
 
 static int cpsw_eth_ofdata_to_platdata(struct udevice *dev)
index 96ff254f981254900123b9117471646da6931997..c7532fc866b8e1d9a160e563c539e6a4b0cb1ac9 100644 (file)
@@ -39,6 +39,7 @@ struct cpsw_slave_data {
        int             phy_addr;
        int             phy_if;
        int             phy_of_handle;
+       int             max_speed;
 };
 
 enum {