Skip to content

Commit

Permalink
net: usb: lan78xx: Fixup EEE
Browse files Browse the repository at this point in the history
The enabling/disabling of EEE in the MAC should happen as a result of
auto negotiation. So move the enable/disable into
lan783xx_phy_link_status_change() which gets called by phylib when
there is a change in link status.

lan78xx_set_eee() now just programs the hardware with the LTI
timer value, and passed everything else to phylib, so it can correctly
setup the PHY.

lan743x_get_eee() relies on phylib doing most of the work, the
MAC driver just adds the LTI timer value.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
  • Loading branch information
lunn authored and intel-lab-lkp committed Mar 27, 2023
1 parent 9a9e690 commit 1c73847
Showing 1 changed file with 14 additions and 22 deletions.
36 changes: 14 additions & 22 deletions drivers/net/usb/lan78xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -1690,17 +1690,10 @@ static int lan78xx_get_eee(struct net_device *net, struct ethtool_eee *edata)

ret = lan78xx_read_reg(dev, MAC_CR, &buf);
if (buf & MAC_CR_EEE_EN_) {
edata->eee_enabled = true;
edata->eee_active = !!(edata->advertised &
edata->lp_advertised);
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;
}

Expand All @@ -1721,24 +1714,16 @@ static int lan78xx_set_eee(struct net_device *net, struct ethtool_eee *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)
Expand Down Expand Up @@ -2114,8 +2099,15 @@ 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;

if (phydev->eee_active)
data |= MAC_CR_EEE_EN_;
else
data &= ~MAC_CR_EEE_EN_;
lan78xx_write_reg(dev, MAC_CR, data);

phy_print_status(phydev);
}

Expand Down

0 comments on commit 1c73847

Please sign in to comment.