diff options
author | Wolfgang Denk <wd@denx.de> | 2009-02-07 23:51:52 +0100 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2009-02-07 23:51:52 +0100 |
commit | f8306cb94f59ae2ace5bfede189944d329e5abb3 (patch) | |
tree | c26c402b9d1c3d28f5a54ffd4fcd2f3a393772de /drivers/net | |
parent | 657f2062d8e17ebf4a55f52c9e71c07c0c94c779 (diff) | |
parent | 2d43e873a29ca4959ba6a30fc7fb396d3fd0dccf (diff) | |
download | u-boot-imx-f8306cb94f59ae2ace5bfede189944d329e5abb3.zip u-boot-imx-f8306cb94f59ae2ace5bfede189944d329e5abb3.tar.gz u-boot-imx-f8306cb94f59ae2ace5bfede189944d329e5abb3.tar.bz2 |
Merge branch 'master' of ssh://gemini/home/wd/git/u-boot/master
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/mcfmii.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/net/mcfmii.c b/drivers/net/mcfmii.c index 2b733c6..4f1c0a0 100644 --- a/drivers/net/mcfmii.c +++ b/drivers/net/mcfmii.c @@ -226,7 +226,8 @@ void __mii_init(void) volatile FEC_T *fecp; struct eth_device *dev; int miispd = 0, i = 0; - u16 autoneg = 0; + u16 status = 0; + u16 linkgood = 0; /* retrieve from register structure */ dev = eth_get_dev(); @@ -250,22 +251,32 @@ void __mii_init(void) info->phy_addr = mii_discover_phy(dev); -#define AUTONEGLINK (PHY_BMSR_AUTN_COMP | PHY_BMSR_LS) while (i < MCFFEC_TOUT_LOOP) { - autoneg = 0; - miiphy_read(dev->name, info->phy_addr, PHY_BMSR, &autoneg); + status = 0; i++; - - if ((autoneg & AUTONEGLINK) == AUTONEGLINK) + /* Read PHY control register */ + miiphy_read(dev->name, info->phy_addr, PHY_BMCR, &status); + + /* If phy set to autonegotiate, wait for autonegotiation done, + * if phy is not autonegotiating, just wait for link up. + */ + if ((status & PHY_BMCR_AUTON) == PHY_BMCR_AUTON) { + linkgood = (PHY_BMSR_AUTN_COMP | PHY_BMSR_LS); + } else { + linkgood = PHY_BMSR_LS; + } + /* Read PHY status register */ + miiphy_read(dev->name, info->phy_addr, PHY_BMSR, &status); + if ((status & linkgood) == linkgood) break; udelay(500); } if (i >= MCFFEC_TOUT_LOOP) { - printf("Auto Negotiation not complete\n"); + printf("Link UP timeout\n"); } - /* adapt to the half/full speed settings */ + /* adapt to the duplex and speed settings of the phy */ info->dup_spd = miiphy_duplex(dev->name, info->phy_addr) << 16; info->dup_spd |= miiphy_speed(dev->name, info->phy_addr); } |