diff options
Diffstat (limited to 'drivers/net/usb/asix_common.c')
| -rw-r--r-- | drivers/net/usb/asix_common.c | 70 | 
1 files changed, 30 insertions, 40 deletions
| diff --git a/drivers/net/usb/asix_common.c b/drivers/net/usb/asix_common.c index ac92bc52a85e..38cda590895c 100644 --- a/drivers/net/usb/asix_common.c +++ b/drivers/net/usb/asix_common.c @@ -63,6 +63,29 @@ void asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index,  			       value, index, data, size);  } +static int asix_check_host_enable(struct usbnet *dev, int in_pm) +{ +	int i, ret; +	u8 smsr; + +	for (i = 0; i < 30; ++i) { +		ret = asix_set_sw_mii(dev, in_pm); +		if (ret == -ENODEV || ret == -ETIMEDOUT) +			break; +		usleep_range(1000, 1100); +		ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG, +				    0, 0, 1, &smsr, in_pm); +		if (ret == -ENODEV) +			break; +		else if (ret < 0) +			continue; +		else if (smsr & AX_HOST_EN) +			break; +	} + +	return ret; +} +  static void reset_asix_rx_fixup_info(struct asix_rx_fixup_info *rx)  {  	/* Reset the variables that have a lifetime outside of @@ -467,19 +490,11 @@ int asix_mdio_read(struct net_device *netdev, int phy_id, int loc)  {  	struct usbnet *dev = netdev_priv(netdev);  	__le16 res; -	u8 smsr; -	int i = 0;  	int ret;  	mutex_lock(&dev->phy_mutex); -	do { -		ret = asix_set_sw_mii(dev, 0); -		if (ret == -ENODEV || ret == -ETIMEDOUT) -			break; -		usleep_range(1000, 1100); -		ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG, -				    0, 0, 1, &smsr, 0); -	} while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV)); + +	ret = asix_check_host_enable(dev, 0);  	if (ret == -ENODEV || ret == -ETIMEDOUT) {  		mutex_unlock(&dev->phy_mutex);  		return ret; @@ -505,23 +520,14 @@ static int __asix_mdio_write(struct net_device *netdev, int phy_id, int loc,  {  	struct usbnet *dev = netdev_priv(netdev);  	__le16 res = cpu_to_le16(val); -	u8 smsr; -	int i = 0;  	int ret;  	netdev_dbg(dev->net, "asix_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x\n",  			phy_id, loc, val);  	mutex_lock(&dev->phy_mutex); -	do { -		ret = asix_set_sw_mii(dev, 0); -		if (ret == -ENODEV) -			break; -		usleep_range(1000, 1100); -		ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG, -				    0, 0, 1, &smsr, 0); -	} while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV)); +	ret = asix_check_host_enable(dev, 0);  	if (ret == -ENODEV)  		goto out; @@ -561,19 +567,11 @@ int asix_mdio_read_nopm(struct net_device *netdev, int phy_id, int loc)  {  	struct usbnet *dev = netdev_priv(netdev);  	__le16 res; -	u8 smsr; -	int i = 0;  	int ret;  	mutex_lock(&dev->phy_mutex); -	do { -		ret = asix_set_sw_mii(dev, 1); -		if (ret == -ENODEV || ret == -ETIMEDOUT) -			break; -		usleep_range(1000, 1100); -		ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG, -				    0, 0, 1, &smsr, 1); -	} while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV)); + +	ret = asix_check_host_enable(dev, 1);  	if (ret == -ENODEV || ret == -ETIMEDOUT) {  		mutex_unlock(&dev->phy_mutex);  		return ret; @@ -595,22 +593,14 @@ asix_mdio_write_nopm(struct net_device *netdev, int phy_id, int loc, int val)  {  	struct usbnet *dev = netdev_priv(netdev);  	__le16 res = cpu_to_le16(val); -	u8 smsr; -	int i = 0;  	int ret;  	netdev_dbg(dev->net, "asix_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x\n",  			phy_id, loc, val);  	mutex_lock(&dev->phy_mutex); -	do { -		ret = asix_set_sw_mii(dev, 1); -		if (ret == -ENODEV) -			break; -		usleep_range(1000, 1100); -		ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG, -				    0, 0, 1, &smsr, 1); -	} while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV)); + +	ret = asix_check_host_enable(dev, 1);  	if (ret == -ENODEV) {  		mutex_unlock(&dev->phy_mutex);  		return; |