diff options
Diffstat (limited to 'drivers/net/usb/smsc75xx.c')
-rw-r--r-- | drivers/net/usb/smsc75xx.c | 23 |
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 | ||
759 | static 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 | |||
759 | static int smsc75xx_reset(struct usbnet *dev) | 779 | static 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 | ||