aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/usb
diff options
context:
space:
mode:
authorSteve Glendinning <steve.glendinning@shawell.net>2012-09-27 20:57:51 -0400
committerDavid S. Miller <davem@davemloft.net>2012-09-28 18:35:47 -0400
commit8762cec8d9d06eddc9a80293a230d6e073568815 (patch)
treece3bc3c7ac52d0e59c54a6bdaeb8482b0ce7dfd5 /drivers/net/usb
parente0e474a83c18f134e42c4845e19d0ef0751f43f0 (diff)
smsc75xx: add explicit test that device is READY
This patch adds an explicit test that the READY bit is set on the device when attempting to initialize it. If this bit is clear then the device hasn't succesfully started all its clocks, and this patch helps make the resulting logged error more helpful. Signed-off-by: Steve Glendinning <steve.glendinning@shawell.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb')
-rw-r--r--drivers/net/usb/smsc75xx.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/drivers/net/usb/smsc75xx.c b/drivers/net/usb/smsc75xx.c
index 376143e8a1aa..1f45f7b2fe63 100644
--- a/drivers/net/usb/smsc75xx.c
+++ b/drivers/net/usb/smsc75xx.c
@@ -756,6 +756,26 @@ static int smsc75xx_set_features(struct net_device *netdev,
756 return 0; 756 return 0;
757} 757}
758 758
759static int smsc75xx_wait_ready(struct usbnet *dev)
760{
761 int timeout = 0;
762
763 do {
764 u32 buf;
765 int ret = smsc75xx_read_reg(dev, PMT_CTL, &buf);
766 check_warn_return(ret, "Failed to read PMT_CTL: %d", ret);
767
768 if (buf & PMT_CTL_DEV_RDY)
769 return 0;
770
771 msleep(10);
772 timeout++;
773 } while (timeout < 100);
774
775 netdev_warn(dev->net, "timeout waiting for device ready");
776 return -EIO;
777}
778
759static int smsc75xx_reset(struct usbnet *dev) 779static int smsc75xx_reset(struct usbnet *dev)
760{ 780{
761 struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]); 781 struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
@@ -764,6 +784,9 @@ static int smsc75xx_reset(struct usbnet *dev)
764 784
765 netif_dbg(dev, ifup, dev->net, "entering smsc75xx_reset"); 785 netif_dbg(dev, ifup, dev->net, "entering smsc75xx_reset");
766 786
787 ret = smsc75xx_wait_ready(dev);
788 check_warn_return(ret, "device not ready in smsc75xx_reset");
789
767 ret = smsc75xx_read_reg(dev, HW_CFG, &buf); 790 ret = smsc75xx_read_reg(dev, HW_CFG, &buf);
768 check_warn_return(ret, "Failed to read HW_CFG: %d", ret); 791 check_warn_return(ret, "Failed to read HW_CFG: %d", ret);
769 792