aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/usb/smsc75xx.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/usb/smsc75xx.c')
-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