* [PATCH RFC 1/3] net: phy: avoid setting unsupported EEE advertisments
2017-03-24 11:14 [PATCH RFC] phylib EEE updates Russell King - ARM Linux
@ 2017-03-24 11:14 ` Russell King
2017-03-24 11:14 ` [PATCH RFC 2/3] net: phy: restart phy autonegotiation after EEE advertisment change Russell King
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: Russell King @ 2017-03-24 11:14 UTC (permalink / raw)
To: Florian Fainelli; +Cc: David S. Miller, netdev
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.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
---
drivers/net/phy/phy.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index ba4676ee9018..7b1c93b0233a 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -1332,17 +1332,22 @@ EXPORT_SYMBOL(phy_ethtool_get_eee);
*/
int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data)
{
- int val = ethtool_adv_to_mmd_eee_adv_t(data->advertised);
+ int cap, adv;
if (!phydev->drv)
return -EIO;
- /* Mask prohibited EEE modes */
- val &= ~phydev->eee_broken_modes;
+ /* Get Supported EEE */
+ cap = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE);
+ if (cap < 0)
+ return cap;
- phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, val);
+ adv = ethtool_adv_to_mmd_eee_adv_t(data->advertised) & cap;
- return 0;
+ /* Mask prohibited EEE modes */
+ adv &= ~phydev->eee_broken_modes;
+
+ return phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv);
}
EXPORT_SYMBOL(phy_ethtool_set_eee);
--
2.7.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH RFC 2/3] net: phy: restart phy autonegotiation after EEE advertisment change
2017-03-24 11:14 [PATCH RFC] phylib EEE updates Russell King - ARM Linux
2017-03-24 11:14 ` [PATCH RFC 1/3] net: phy: avoid setting unsupported EEE advertisments Russell King
@ 2017-03-24 11:14 ` Russell King
2017-03-24 11:14 ` [PATCH RFC 3/3] net: phy: allow EEE with SGMII interface modes Russell King
2017-03-26 23:07 ` [PATCH RFC] phylib EEE updates Russell King - ARM Linux
3 siblings, 0 replies; 5+ messages in thread
From: Russell King @ 2017-03-24 11:14 UTC (permalink / raw)
To: Florian Fainelli; +Cc: David S. Miller, netdev
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.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
---
drivers/net/phy/phy.c | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 7b1c93b0233a..e1d41fa5caf5 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -1332,7 +1332,7 @@ EXPORT_SYMBOL(phy_ethtool_get_eee);
*/
int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data)
{
- int cap, adv;
+ int cap, old_adv, adv, ret;
if (!phydev->drv)
return -EIO;
@@ -1342,12 +1342,29 @@ int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data)
if (cap < 0)
return cap;
+ old_adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV);
+ if (old_adv < 0)
+ return old_adv;
+
adv = ethtool_adv_to_mmd_eee_adv_t(data->advertised) & cap;
/* Mask prohibited EEE modes */
adv &= ~phydev->eee_broken_modes;
- return phy_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)
+ return ret;
+
+ /* Restart autonegotiation so the new modes get sent to the
+ * link partner.
+ */
+ ret = phy_restart_aneg(phydev);
+ if (ret < 0)
+ return ret;
+ }
+
+ return 0;
}
EXPORT_SYMBOL(phy_ethtool_set_eee);
--
2.7.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH RFC 3/3] net: phy: allow EEE with SGMII interface modes
2017-03-24 11:14 [PATCH RFC] phylib EEE updates Russell King - ARM Linux
2017-03-24 11:14 ` [PATCH RFC 1/3] net: phy: avoid setting unsupported EEE advertisments Russell King
2017-03-24 11:14 ` [PATCH RFC 2/3] net: phy: restart phy autonegotiation after EEE advertisment change Russell King
@ 2017-03-24 11:14 ` Russell King
2017-03-26 23:07 ` [PATCH RFC] phylib EEE updates Russell King - ARM Linux
3 siblings, 0 replies; 5+ messages in thread
From: Russell King @ 2017-03-24 11:14 UTC (permalink / raw)
To: Florian Fainelli; +Cc: David S. Miller, netdev
As EEE is able to work in SGMII mode as well, add it to the list of
permissable EEE modes that phy_init_eee() will accept. This is
necessary so that EEE can work with an 88E1512 connected in SGMII mode.
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
---
drivers/net/phy/phy.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index e1d41fa5caf5..f86cbd5e6f3f 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -1215,6 +1215,7 @@ int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable)
if ((phydev->duplex == DUPLEX_FULL) &&
((phydev->interface == PHY_INTERFACE_MODE_MII) ||
(phydev->interface == PHY_INTERFACE_MODE_GMII) ||
+ phydev->interface == PHY_INTERFACE_MODE_SGMII ||
phy_interface_is_rgmii(phydev) ||
phy_is_internal(phydev))) {
int eee_lp, eee_cap, eee_adv;
--
2.7.4
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH RFC] phylib EEE updates
2017-03-24 11:14 [PATCH RFC] phylib EEE updates Russell King - ARM Linux
` (2 preceding siblings ...)
2017-03-24 11:14 ` [PATCH RFC 3/3] net: phy: allow EEE with SGMII interface modes Russell King
@ 2017-03-26 23:07 ` Russell King - ARM Linux
3 siblings, 0 replies; 5+ messages in thread
From: Russell King - ARM Linux @ 2017-03-26 23:07 UTC (permalink / raw)
To: Florian Fainelli; +Cc: David S. Miller, netdev
The 0-day builder identified some issues with the four RFC patches I
sent out before the weekend, I'll be sending v2 tomorrow. Sorry for
the noise.
--
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.
^ permalink raw reply [flat|nested] 5+ messages in thread