From: Russell King - ARM Linux <linux@armlinux.org.uk> Date: 2017-03-31 09:36:57
David,
This series of patches depends on the previous set of changes, and is
therefore net-next material.
While testing the EEE code, I discovered a number of issues:
1. It is possible to enable advertisment of EEE modes which are not
supported by the hardware. We omit to check the supported modes
and mask off those modes that are not supported before writing the
EEE advertisment register.
2. We need to restart autonegotiation after a change of the EEE
advertisment, otherwise the link partner does not see the updated
EEE modes.
3. SGMII connected PHYs are also capable of supporting EEE.
Through discussion with Florian, it has been decided to remove the check
for the PHY interface mode in patch (3).
drivers/net/phy/phy.c | 37 ++++++++++++++++++++++++++-----------
1 file changed, 26 insertions(+), 11 deletions(-)
v2: fix "phy_restart_aneg" build error identified by 0-day
v3: drop RFC tag, replace 3rd patch
--
RMK's Patch system: http://www.armlinux.org.uk/developer/patches/
FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up
according to speedtest.net.
From: Russell King <hidden> Date: 2017-03-31 09:37:14
We currently allow userspace to set any EEE advertisments it desires,
whether or not the PHY supports them. For example:
# ethtool --set-eee eth1 advertise 0xffffffff
# ethtool --show-eee eth1
EEE Settings for eth1:
EEE status: disabled
Tx LPI: disabled
Supported EEE link modes: 100baseT/Full
1000baseT/Full
10000baseT/Full
Advertised EEE link modes: 100baseT/Full
1000baseT/Full
1000baseKX/Full
10000baseT/Full
10000baseKX4/Full
10000baseKR/Full
Clearly, this is not sane, we should only allow link modes that are
supported to be advertised (as we do elsewhere.) Ensure that we mask
the MDIO_AN_EEE_ADV value with the capabilities retrieved from the
MDIO_PCS_EEE_ABLE register.
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Russell King <redacted>
---
drivers/net/phy/phy.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
From: Russell King <hidden> Date: 2017-03-31 09:37:25
When the EEE advertisment is changed, we should restart autonegotiation
to update the link partner with the new EEE settings. Add this trigger
but only if the advertisment has changed.
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Russell King <redacted>
---
drivers/net/phy/phy.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
@@ -1342,12 +1342,29 @@ int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data)if(cap<0)returncap;+old_adv=phy_read_mmd(phydev,MDIO_MMD_AN,MDIO_AN_EEE_ADV);+if(old_adv<0)+returnold_adv;+adv=ethtool_adv_to_mmd_eee_adv_t(data->advertised)∩/* Mask prohibited EEE modes */adv&=~phydev->eee_broken_modes;-returnphy_write_mmd(phydev,MDIO_MMD_AN,MDIO_AN_EEE_ADV,adv);+if(old_adv!=adv){+ret=phy_write_mmd(phydev,MDIO_MMD_AN,MDIO_AN_EEE_ADV,adv);+if(ret<0)+returnret;++/* Restart autonegotiation so the new modes get sent to the+*linkpartner.+*/+ret=genphy_restart_aneg(phydev);+if(ret<0)+returnret;+}++return0;}EXPORT_SYMBOL(phy_ethtool_set_eee);
From: Russell King <hidden> Date: 2017-03-31 09:37:26
EEE is able to work in any PHY interface mode, there is nothing which
fundamentally restricts it to only a few modes. For example, EEE works
in SGMII mode with the Marvell 88E1512.
Rather than just adding SGMII mode to the list, Florian suggests
removing the list of interface modes entirely:
It actually sounds like we should just kill the check entirely,
it does not appear that any of the interface mode would not
fundamentally be able to support EEE, because the "lowest" mode
we support is MII, and even there it's quite possible to support
EEE.
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Russell King <redacted>
---
drivers/net/phy/phy.c | 9 +--------
1 file changed, 1 insertion(+), 8 deletions(-)
@@ -1208,15 +1208,8 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)return-EIO;/* According to 802.3az,the EEE is supported only in full duplex-mode.-*AlsoEEEfeatureisactivewhencoreisoperatingwithMII,GMII-*orRGMII(allkinds).InternalPHYsarealsoallowedtoproceedand-*shouldreturnanerroriftheydonotsupportEEE.*/-if((phydev->duplex==DUPLEX_FULL)&&-((phydev->interface==PHY_INTERFACE_MODE_MII)||-(phydev->interface==PHY_INTERFACE_MODE_GMII)||-phy_interface_is_rgmii(phydev)||-phy_is_internal(phydev))){+if(phydev->duplex==DUPLEX_FULL){inteee_lp,eee_cap,eee_adv;u32lp,cap,adv;intstatus;