net: stmmac: support max-speed device tree property
authorSrinivas Kandagatla <srinivas.kandagatla@st.com>
Thu, 16 Jan 2014 10:51:43 +0000 (10:51 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 16 Jan 2014 23:23:43 +0000 (15:23 -0800)
This patch adds support to "max-speed" property which is a standard
Ethernet device tree property. max-speed specifies maximum speed
(specified in megabits per second) supported the device.

Depending on the clocking schemes some of the boards can only support
few link speeds, so having a way to limit the link speed in the mac
driver would allow such setups to work reliably.

Without this patch there is no way to tell the driver to limit the
link speed.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@st.com>
Acked-by: Giuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
include/linux/stmmac.h

index ecdc8ab50425d60214cae1829efdb6b09ca9bfe1..15192c05750f706ac460f198d722c44a5522bb24 100644 (file)
@@ -776,6 +776,7 @@ static int stmmac_init_phy(struct net_device *dev)
        char phy_id_fmt[MII_BUS_ID_SIZE + 3];
        char bus_id[MII_BUS_ID_SIZE];
        int interface = priv->plat->interface;
+       int max_speed = priv->plat->max_speed;
        priv->oldlink = 0;
        priv->speed = 0;
        priv->oldduplex = -1;
@@ -800,7 +801,8 @@ static int stmmac_init_phy(struct net_device *dev)
 
        /* Stop Advertising 1000BASE Capability if interface is not GMII */
        if ((interface == PHY_INTERFACE_MODE_MII) ||
-           (interface == PHY_INTERFACE_MODE_RMII))
+           (interface == PHY_INTERFACE_MODE_RMII) ||
+               (max_speed < 1000 &&  max_speed > 0))
                phydev->advertising &= ~(SUPPORTED_1000baseT_Half |
                                         SUPPORTED_1000baseT_Full);
 
index 38bd1f4fbe33bae915e878c4e4c333e993b66de8..9377ee623fa5de1322560d6a759fe8d99c0f99c5 100644 (file)
@@ -42,6 +42,10 @@ static int stmmac_probe_config_dt(struct platform_device *pdev,
        *mac = of_get_mac_address(np);
        plat->interface = of_get_phy_mode(np);
 
+       /* Get max speed of operation from device tree */
+       if (of_property_read_u32(np, "max-speed", &plat->max_speed))
+               plat->max_speed = -1;
+
        plat->bus_id = of_alias_get_id(np, "ethernet");
        if (plat->bus_id < 0)
                plat->bus_id = 0;
index bb5deb0feb6bc2190212d53ea290947287a4007a..33ace712e7e818e7409732d77d9ea4583b7a78ad 100644 (file)
@@ -110,6 +110,7 @@ struct plat_stmmacenet_data {
        int force_sf_dma_mode;
        int force_thresh_dma_mode;
        int riwt_off;
+       int max_speed;
        void (*fix_mac_speed)(void *priv, unsigned int speed);
        void (*bus_setup)(void __iomem *ioaddr);
        int (*init)(struct platform_device *pdev);