Skip to content

Commit

Permalink
lan78xx: Move enabling of EEE into PHY init code
Browse files Browse the repository at this point in the history
Enable EEE mode as soon as possible after connecting to the PHY, and
before phy_start. This avoids a second link negotiation, which speeds
up booting and stops the interface failing to become ready.

See: #2437

Signed-off-by: Phil Elwell <phil@raspberrypi.org>
  • Loading branch information
Phil Elwell authored and popcornmix committed Jun 28, 2024
1 parent b01ef1e commit b7e6b1e
Showing 1 changed file with 19 additions and 16 deletions.
35 changes: 19 additions & 16 deletions drivers/net/usb/lan78xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -2417,6 +2417,25 @@ 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);

if (of_property_read_bool(dev->udev->dev.of_node,
"microchip,eee-enabled")) {
struct ethtool_keee edata;
memset(&edata, 0, sizeof(edata));

linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
edata.advertised);
linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
edata.advertised);

edata.eee_enabled = true;
edata.tx_lpi_enabled = true;
if (of_property_read_u32(dev->udev->dev.of_node,
"microchip,tx-lpi-timer",
&edata.tx_lpi_timer))
edata.tx_lpi_timer = 600; /* non-aggressive */
(void)lan78xx_set_eee(dev->net, &edata);
}

if (phydev->mdio.dev.of_node) {
u32 reg;
int len;
Expand Down Expand Up @@ -3118,22 +3137,6 @@ static int lan78xx_open(struct net_device *net)

netif_dbg(dev, ifup, dev->net, "phy initialised successfully");

if (of_property_read_bool(dev->udev->dev.of_node,
"microchip,eee-enabled")) {
struct ethtool_eee edata;
memset(&edata, 0, sizeof(edata));
edata.cmd = ETHTOOL_SEEE;
edata.advertised = ADVERTISED_1000baseT_Full |
ADVERTISED_100baseT_Full;
edata.eee_enabled = true;
edata.tx_lpi_enabled = true;
if (of_property_read_u32(dev->udev->dev.of_node,
"microchip,tx-lpi-timer",
&edata.tx_lpi_timer))
edata.tx_lpi_timer = 600; /* non-aggressive */
(void)lan78xx_set_eee(net, &edata);
}

/* for Link Check */
if (dev->urb_intr) {
ret = usb_submit_urb(dev->urb_intr, GFP_KERNEL);
Expand Down

0 comments on commit b7e6b1e

Please sign in to comment.