From 1f70fc1acf08d373d9ef16f40989cd492637687f Mon Sep 17 00:00:00 2001 From: Steve Glendinning Date: Fri, 28 Sep 2012 00:57:51 +0000 Subject: [PATCH] --- yaml --- r: 328130 b: refs/heads/master c: 8762cec8d9d06eddc9a80293a230d6e073568815 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/net/usb/smsc75xx.c | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 6b461b9c9cbc..639e42b62706 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: e0e474a83c18f134e42c4845e19d0ef0751f43f0 +refs/heads/master: 8762cec8d9d06eddc9a80293a230d6e073568815 diff --git a/trunk/drivers/net/usb/smsc75xx.c b/trunk/drivers/net/usb/smsc75xx.c index 376143e8a1aa..1f45f7b2fe63 100644 --- a/trunk/drivers/net/usb/smsc75xx.c +++ b/trunk/drivers/net/usb/smsc75xx.c @@ -756,6 +756,26 @@ static int smsc75xx_set_features(struct net_device *netdev, return 0; } +static int smsc75xx_wait_ready(struct usbnet *dev) +{ + int timeout = 0; + + do { + u32 buf; + int ret = smsc75xx_read_reg(dev, PMT_CTL, &buf); + check_warn_return(ret, "Failed to read PMT_CTL: %d", ret); + + if (buf & PMT_CTL_DEV_RDY) + return 0; + + msleep(10); + timeout++; + } while (timeout < 100); + + netdev_warn(dev->net, "timeout waiting for device ready"); + return -EIO; +} + static int smsc75xx_reset(struct usbnet *dev) { struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); @@ -764,6 +784,9 @@ static int smsc75xx_reset(struct usbnet *dev) netif_dbg(dev, ifup, dev->net, "entering smsc75xx_reset"); + ret = smsc75xx_wait_ready(dev); + check_warn_return(ret, "device not ready in smsc75xx_reset"); + ret = smsc75xx_read_reg(dev, HW_CFG, &buf); check_warn_return(ret, "Failed to read HW_CFG: %d", ret);