diff options
Diffstat (limited to 'drivers/net/usb/lan78xx.c')
| -rw-r--r-- | drivers/net/usb/lan78xx.c | 44 | 
1 files changed, 23 insertions, 21 deletions
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c index 80ee4fcdfb36..5a2c38b63012 100644 --- a/drivers/net/usb/lan78xx.c +++ b/drivers/net/usb/lan78xx.c @@ -1692,15 +1692,10 @@ static int lan78xx_get_eee(struct net_device *net, struct ethtool_keee *edata)  	ret = lan78xx_read_reg(dev, MAC_CR, &buf);  	if (buf & MAC_CR_EEE_EN_) { -		edata->eee_enabled = true; -		edata->tx_lpi_enabled = true;  		/* EEE_TX_LPI_REQ_DLY & tx_lpi_timer are same uSec unit */  		ret = lan78xx_read_reg(dev, EEE_TX_LPI_REQ_DLY, &buf);  		edata->tx_lpi_timer = buf;  	} else { -		edata->eee_enabled = false; -		edata->eee_active = false; -		edata->tx_lpi_enabled = false;  		edata->tx_lpi_timer = 0;  	} @@ -1721,24 +1716,16 @@ static int lan78xx_set_eee(struct net_device *net, struct ethtool_keee *edata)  	if (ret < 0)  		return ret; -	if (edata->eee_enabled) { -		ret = lan78xx_read_reg(dev, MAC_CR, &buf); -		buf |= MAC_CR_EEE_EN_; -		ret = lan78xx_write_reg(dev, MAC_CR, buf); - -		phy_ethtool_set_eee(net->phydev, edata); - -		buf = (u32)edata->tx_lpi_timer; -		ret = lan78xx_write_reg(dev, EEE_TX_LPI_REQ_DLY, buf); -	} else { -		ret = lan78xx_read_reg(dev, MAC_CR, &buf); -		buf &= ~MAC_CR_EEE_EN_; -		ret = lan78xx_write_reg(dev, MAC_CR, buf); -	} +	ret = phy_ethtool_set_eee(net->phydev, edata); +	if (ret < 0) +		goto out; +	buf = (u32)edata->tx_lpi_timer; +	ret = lan78xx_write_reg(dev, EEE_TX_LPI_REQ_DLY, buf); +out:  	usb_autopm_put_interface(dev->intf); -	return 0; +	return ret;  }  static u32 lan78xx_get_link(struct net_device *net) @@ -2114,7 +2101,20 @@ static void lan78xx_remove_mdio(struct lan78xx_net *dev)  static void lan78xx_link_status_change(struct net_device *net)  { +	struct lan78xx_net *dev = netdev_priv(net);  	struct phy_device *phydev = net->phydev; +	u32 data; +	int ret; + +	ret = lan78xx_read_reg(dev, MAC_CR, &data); +	if (ret < 0) +		return; + +	if (phydev->enable_tx_lpi) +		data |=  MAC_CR_EEE_EN_; +	else +		data &= ~MAC_CR_EEE_EN_; +	lan78xx_write_reg(dev, MAC_CR, data);  	phy_print_status(phydev);  } @@ -2408,6 +2408,8 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)  	mii_adv_to_linkmode_adv_t(fc, mii_adv);  	linkmode_or(phydev->advertising, fc, phydev->advertising); +	phy_support_eee(phydev); +  	if (phydev->mdio.dev.of_node) {  		u32 reg;  		int len; @@ -2526,7 +2528,7 @@ static int lan78xx_change_mtu(struct net_device *netdev, int new_mtu)  	ret = lan78xx_set_rx_max_frame_length(dev, max_frame_len);  	if (!ret) -		netdev->mtu = new_mtu; +		WRITE_ONCE(netdev->mtu, new_mtu);  	usb_autopm_put_interface(dev->intf);  |