b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | From fa3bc9db82e8a0f90986c94f5c69ba8dae265ecf Mon Sep 17 00:00:00 2001 |
| 2 | From: Phil Elwell <phil@raspberrypi.org> |
| 3 | Date: Thu, 5 Apr 2018 14:46:11 +0100 |
| 4 | Subject: [PATCH] lan78xx: Move enabling of EEE into PHY init code |
| 5 | |
| 6 | Enable EEE mode as soon as possible after connecting to the PHY, and |
| 7 | before phy_start. This avoids a second link negotiation, which speeds |
| 8 | up booting and stops the interface failing to become ready. |
| 9 | |
| 10 | See: https://github.com/raspberrypi/linux/issues/2437 |
| 11 | |
| 12 | Signed-off-by: Phil Elwell <phil@raspberrypi.org> |
| 13 | --- |
| 14 | drivers/net/usb/lan78xx.c | 32 ++++++++++++++++---------------- |
| 15 | 1 file changed, 16 insertions(+), 16 deletions(-) |
| 16 | |
| 17 | --- a/drivers/net/usb/lan78xx.c |
| 18 | +++ b/drivers/net/usb/lan78xx.c |
| 19 | @@ -2153,6 +2153,22 @@ static int lan78xx_phy_init(struct lan78 |
| 20 | mii_adv_to_linkmode_adv_t(fc, mii_adv); |
| 21 | linkmode_or(phydev->advertising, fc, phydev->advertising); |
| 22 | |
| 23 | + if (of_property_read_bool(dev->udev->dev.of_node, |
| 24 | + "microchip,eee-enabled")) { |
| 25 | + struct ethtool_eee edata; |
| 26 | + memset(&edata, 0, sizeof(edata)); |
| 27 | + edata.cmd = ETHTOOL_SEEE; |
| 28 | + edata.advertised = ADVERTISED_1000baseT_Full | |
| 29 | + ADVERTISED_100baseT_Full; |
| 30 | + edata.eee_enabled = true; |
| 31 | + edata.tx_lpi_enabled = true; |
| 32 | + if (of_property_read_u32(dev->udev->dev.of_node, |
| 33 | + "microchip,tx-lpi-timer", |
| 34 | + &edata.tx_lpi_timer)) |
| 35 | + edata.tx_lpi_timer = 600; /* non-aggressive */ |
| 36 | + (void)lan78xx_set_eee(dev->net, &edata); |
| 37 | + } |
| 38 | + |
| 39 | if (phydev->mdio.dev.of_node) { |
| 40 | u32 reg; |
| 41 | int len; |
| 42 | @@ -2626,22 +2642,6 @@ static int lan78xx_open(struct net_devic |
| 43 | |
| 44 | netif_dbg(dev, ifup, dev->net, "phy initialised successfully"); |
| 45 | |
| 46 | - if (of_property_read_bool(dev->udev->dev.of_node, |
| 47 | - "microchip,eee-enabled")) { |
| 48 | - struct ethtool_eee edata; |
| 49 | - memset(&edata, 0, sizeof(edata)); |
| 50 | - edata.cmd = ETHTOOL_SEEE; |
| 51 | - edata.advertised = ADVERTISED_1000baseT_Full | |
| 52 | - ADVERTISED_100baseT_Full; |
| 53 | - edata.eee_enabled = true; |
| 54 | - edata.tx_lpi_enabled = true; |
| 55 | - if (of_property_read_u32(dev->udev->dev.of_node, |
| 56 | - "microchip,tx-lpi-timer", |
| 57 | - &edata.tx_lpi_timer)) |
| 58 | - edata.tx_lpi_timer = 600; /* non-aggressive */ |
| 59 | - (void)lan78xx_set_eee(net, &edata); |
| 60 | - } |
| 61 | - |
| 62 | /* for Link Check */ |
| 63 | if (dev->urb_intr) { |
| 64 | ret = usb_submit_urb(dev->urb_intr, GFP_KERNEL); |