Skip to content
Snippets Groups Projects
Commit e25c90b4 authored by Vikas Manocha's avatar Vikas Manocha Committed by Joe Hershberger
Browse files

net/designware: Program phy registers when auto-negotiation is ON


If AN(auto-negotiation) is ON, speed bit of control register are not
applicable.  Also phy registers were not getting programmed as per the
result of AN. This patch sets only AN bit & restart AN bit for AN ON
selection & programs PHY registers as per AN result.

Signed-off-by: default avatarVikas Manocha <vikas.manocha@st.com>
Signed-off-by: default avatarAmit Virdi <amit.virdi@st.com>
parent 13edd170
Branches set_env_vars
Tags
No related merge requests found
...@@ -399,8 +399,7 @@ static int configure_phy(struct eth_device *dev) ...@@ -399,8 +399,7 @@ static int configure_phy(struct eth_device *dev)
return -1; return -1;
#if defined(CONFIG_DW_AUTONEG) #if defined(CONFIG_DW_AUTONEG)
bmcr = BMCR_ANENABLE | BMCR_ANRESTART | BMCR_SPEED100 | \ bmcr = BMCR_ANENABLE | BMCR_ANRESTART;
BMCR_FULLDPLX | BMCR_SPEED1000;
#else #else
bmcr = BMCR_SPEED100 | BMCR_FULLDPLX; bmcr = BMCR_SPEED100 | BMCR_FULLDPLX;
...@@ -428,23 +427,39 @@ static int configure_phy(struct eth_device *dev) ...@@ -428,23 +427,39 @@ static int configure_phy(struct eth_device *dev)
eth_mdio_read(dev, phy_addr, MII_STAT1000, &btsr); eth_mdio_read(dev, phy_addr, MII_STAT1000, &btsr);
if (bmsr & BMSR_ANEGCOMPLETE) { if (bmsr & BMSR_ANEGCOMPLETE) {
if (btsr & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD)) { if (btsr & PHY_1000BTSR_1000FD) {
priv->speed = SPEED_1000M; priv->speed = SPEED_1000M;
if (btsr & PHY_1000BTSR_1000FD) bmcr |= BMCR_SPEED1000;
priv->duplex = FULL_DUPLEX; priv->duplex = FULL_DUPLEX;
else bmcr |= BMCR_FULLDPLX;
} else if (btsr & PHY_1000BTSR_1000HD) {
priv->speed = SPEED_1000M;
bmcr |= BMCR_SPEED1000;
priv->duplex = HALF_DUPLEX; priv->duplex = HALF_DUPLEX;
} else { bmcr &= ~BMCR_FULLDPLX;
if (anlpar & LPA_100) } else if (anlpar & LPA_100FULL) {
priv->speed = SPEED_100M; priv->speed = SPEED_100M;
else bmcr |= BMCR_SPEED100;
priv->duplex = FULL_DUPLEX;
bmcr |= BMCR_FULLDPLX;
} else if (anlpar & LPA_100HALF) {
priv->speed = SPEED_100M;
bmcr |= BMCR_SPEED100;
priv->duplex = HALF_DUPLEX;
bmcr &= ~BMCR_FULLDPLX;
} else if (anlpar & LPA_10FULL) {
priv->speed = SPEED_10M; priv->speed = SPEED_10M;
bmcr &= ~BMCR_SPEED100;
if (anlpar & (LPA_10FULL | LPA_100FULL))
priv->duplex = FULL_DUPLEX; priv->duplex = FULL_DUPLEX;
else bmcr |= BMCR_FULLDPLX;
} else {
priv->speed = SPEED_10M;
bmcr &= ~BMCR_SPEED100;
priv->duplex = HALF_DUPLEX; priv->duplex = HALF_DUPLEX;
bmcr &= ~BMCR_FULLDPLX;
} }
if (eth_mdio_write(dev, phy_addr, MII_BMCR, bmcr) < 0)
return -1;
} else } else
return -1; return -1;
#else #else
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment