diff options
author | Steve Glendinning <steve.glendinning@smsc.com> | 2010-03-16 05:03:06 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-03-16 17:15:44 -0400 |
commit | db443c441e204cecc1bcec490d40997db988ce3a (patch) | |
tree | 74197ec00dbcddf4882ef014ff5d1074b283ee30 /drivers/net/usb | |
parent | 3feec9095d12e311b7d4eb7fe7e5dfa75d4a72a5 (diff) |
smsc95xx: wait for PHY to complete reset during init
This patch ensures the PHY correctly completes its reset before
setting register values.
Signed-off-by: Steve Glendinning <steve.glendinning@smsc.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb')
-rw-r--r-- | drivers/net/usb/smsc95xx.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c index df9179a1c93b..d222d7e25273 100644 --- a/drivers/net/usb/smsc95xx.c +++ b/drivers/net/usb/smsc95xx.c | |||
@@ -709,6 +709,8 @@ static void smsc95xx_start_rx_path(struct usbnet *dev) | |||
709 | 709 | ||
710 | static int smsc95xx_phy_initialize(struct usbnet *dev) | 710 | static int smsc95xx_phy_initialize(struct usbnet *dev) |
711 | { | 711 | { |
712 | int bmcr, timeout = 0; | ||
713 | |||
712 | /* Initialize MII structure */ | 714 | /* Initialize MII structure */ |
713 | dev->mii.dev = dev->net; | 715 | dev->mii.dev = dev->net; |
714 | dev->mii.mdio_read = smsc95xx_mdio_read; | 716 | dev->mii.mdio_read = smsc95xx_mdio_read; |
@@ -717,7 +719,20 @@ static int smsc95xx_phy_initialize(struct usbnet *dev) | |||
717 | dev->mii.reg_num_mask = 0x1f; | 719 | dev->mii.reg_num_mask = 0x1f; |
718 | dev->mii.phy_id = SMSC95XX_INTERNAL_PHY_ID; | 720 | dev->mii.phy_id = SMSC95XX_INTERNAL_PHY_ID; |
719 | 721 | ||
722 | /* reset phy and wait for reset to complete */ | ||
720 | smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); | 723 | smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_BMCR, BMCR_RESET); |
724 | |||
725 | do { | ||
726 | msleep(10); | ||
727 | bmcr = smsc95xx_mdio_read(dev->net, dev->mii.phy_id, MII_BMCR); | ||
728 | timeout++; | ||
729 | } while ((bmcr & MII_BMCR) && (timeout < 100)); | ||
730 | |||
731 | if (timeout >= 100) { | ||
732 | netdev_warn(dev->net, "timeout on PHY Reset"); | ||
733 | return -EIO; | ||
734 | } | ||
735 | |||
721 | smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, | 736 | smsc95xx_mdio_write(dev->net, dev->mii.phy_id, MII_ADVERTISE, |
722 | ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP | | 737 | ADVERTISE_ALL | ADVERTISE_CSMA | ADVERTISE_PAUSE_CAP | |
723 | ADVERTISE_PAUSE_ASYM); | 738 | ADVERTISE_PAUSE_ASYM); |