55 lines
1.4 KiB
Diff
55 lines
1.4 KiB
Diff
|
From: Russell King <rmk+kernel@armlinux.org.uk>
|
||
|
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 <rmk+kernel@armlinux.org.uk>
|
||
|
---
|
||
|
|
||
|
--- 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
|
||
|
@@ -1403,3 +1421,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);
|