+++ /dev/null
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -386,9 +386,18 @@ struct phy_driver {
- */
- int (*config_aneg)(struct phy_device *phydev);
-
-+ /* Determine if autonegotiation is done */
-+ int (*aneg_done)(struct phy_device *phydev);
-+
- /* Determines the negotiated speed and duplex */
- int (*read_status)(struct phy_device *phydev);
-
-+ /*
-+ * Update the value in phydev->link to reflect the
-+ * current link value
-+ */
-+ int (*update_link)(struct phy_device *phydev);
-+
- /* Clears any pending interrupts */
- int (*ack_interrupt)(struct phy_device *phydev);
-
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -715,6 +715,9 @@ int genphy_update_link(struct phy_device
- {
- int status;
-
-+ if (phydev->drv->update_link)
-+ return phydev->drv->update_link(phydev);
-+
- /* Do a fake read */
- status = phy_read(phydev, MII_BMSR);
-
---- a/drivers/net/phy/phy.c
-+++ b/drivers/net/phy/phy.c
-@@ -106,6 +106,9 @@ static inline int phy_aneg_done(struct p
- {
- int retval;
-
-+ if (phydev->drv->aneg_done)
-+ return phydev->drv->aneg_done(phydev);
-+
- retval = phy_read(phydev, MII_BMSR);
-
- return (retval < 0) ? retval : (retval & BMSR_ANEGCOMPLETE);