Commit 9cbadf09 authored by Srinivas Kandagatla's avatar Srinivas Kandagatla Committed by David S. Miller

net: stmmac: support max-speed device tree property

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: default avatarSrinivas Kandagatla <srinivas.kandagatla@st.com>
Acked-by: default avatarGiuseppe Cavallaro <peppe.cavallaro@st.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 82a342d1
...@@ -776,6 +776,7 @@ static int stmmac_init_phy(struct net_device *dev) ...@@ -776,6 +776,7 @@ static int stmmac_init_phy(struct net_device *dev)
char phy_id_fmt[MII_BUS_ID_SIZE + 3]; char phy_id_fmt[MII_BUS_ID_SIZE + 3];
char bus_id[MII_BUS_ID_SIZE]; char bus_id[MII_BUS_ID_SIZE];
int interface = priv->plat->interface; int interface = priv->plat->interface;
int max_speed = priv->plat->max_speed;
priv->oldlink = 0; priv->oldlink = 0;
priv->speed = 0; priv->speed = 0;
priv->oldduplex = -1; priv->oldduplex = -1;
...@@ -800,7 +801,8 @@ static int stmmac_init_phy(struct net_device *dev) ...@@ -800,7 +801,8 @@ static int stmmac_init_phy(struct net_device *dev)
/* Stop Advertising 1000BASE Capability if interface is not GMII */ /* Stop Advertising 1000BASE Capability if interface is not GMII */
if ((interface == PHY_INTERFACE_MODE_MII) || 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 | phydev->advertising &= ~(SUPPORTED_1000baseT_Half |
SUPPORTED_1000baseT_Full); SUPPORTED_1000baseT_Full);
......
...@@ -42,6 +42,10 @@ static int stmmac_probe_config_dt(struct platform_device *pdev, ...@@ -42,6 +42,10 @@ static int stmmac_probe_config_dt(struct platform_device *pdev,
*mac = of_get_mac_address(np); *mac = of_get_mac_address(np);
plat->interface = of_get_phy_mode(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"); plat->bus_id = of_alias_get_id(np, "ethernet");
if (plat->bus_id < 0) if (plat->bus_id < 0)
plat->bus_id = 0; plat->bus_id = 0;
......
...@@ -110,6 +110,7 @@ struct plat_stmmacenet_data { ...@@ -110,6 +110,7 @@ struct plat_stmmacenet_data {
int force_sf_dma_mode; int force_sf_dma_mode;
int force_thresh_dma_mode; int force_thresh_dma_mode;
int riwt_off; int riwt_off;
int max_speed;
void (*fix_mac_speed)(void *priv, unsigned int speed); void (*fix_mac_speed)(void *priv, unsigned int speed);
void (*bus_setup)(void __iomem *ioaddr); void (*bus_setup)(void __iomem *ioaddr);
int (*init)(struct platform_device *pdev); int (*init)(struct platform_device *pdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment