From: Russell King Date: Fri, 13 Jan 2017 11:17:30 +0000 Subject: [PATCH] net: phy: hook up clause 45 autonegotiation restart genphy_restart_aneg() can only restart autonegotiation on clause 22 PHYs. Add a phy_restart_aneg() function which selects between the clause 22 and clause 45 restart functionality depending on the PHY type. Signed-off-by: Russell King --- --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -134,6 +134,24 @@ static int phy_config_interrupt(struct p return 0; } +/** + * phy_restart_aneg - restart auto-negotiation + * @phydev: target phy_device struct + * + * Restart the autonegotiation on @phydev. Returns >= 0 on success or + * negative errno on error. + */ +static int phy_restart_aneg(struct phy_device *phydev) +{ + int ret; + + if (phydev->is_c45) + ret = genphy_c45_restart_aneg(phydev); + else + ret = genphy_restart_aneg(phydev); + + return ret; +} /** * phy_aneg_done - return auto-negotiation status @@ -1451,3 +1469,14 @@ int phy_ethtool_set_link_ksettings(struc return phy_ethtool_ksettings_set(phydev, cmd); } EXPORT_SYMBOL(phy_ethtool_set_link_ksettings); + +int phy_ethtool_nway_reset(struct net_device *ndev) +{ + struct phy_device *phydev = ndev->phydev; + + if (!phydev) + return -ENODEV; + + return phy_restart_aneg(phydev); +} +EXPORT_SYMBOL(phy_ethtool_nway_reset);