|
|
@@ -719,7 +719,7 @@ int phy_resume(struct phy_device *phydev)
|
|
|
static int genphy_config_advert(struct phy_device *phydev)
|
|
|
{
|
|
|
u32 advertise;
|
|
|
- int oldadv, adv;
|
|
|
+ int oldadv, adv, bmsr;
|
|
|
int err, changed = 0;
|
|
|
|
|
|
/* Only allow advertising what this PHY supports */
|
|
|
@@ -744,26 +744,36 @@ static int genphy_config_advert(struct phy_device *phydev)
|
|
|
changed = 1;
|
|
|
}
|
|
|
|
|
|
+ bmsr = phy_read(phydev, MII_BMSR);
|
|
|
+ if (bmsr < 0)
|
|
|
+ return bmsr;
|
|
|
+
|
|
|
+ /* Per 802.3-2008, Section 22.2.4.2.16 Extended status all
|
|
|
+ * 1000Mbits/sec capable PHYs shall have the BMSR_ESTATEN bit set to a
|
|
|
+ * logical 1.
|
|
|
+ */
|
|
|
+ if (!(bmsr & BMSR_ESTATEN))
|
|
|
+ return changed;
|
|
|
+
|
|
|
/* Configure gigabit if it's supported */
|
|
|
+ adv = phy_read(phydev, MII_CTRL1000);
|
|
|
+ if (adv < 0)
|
|
|
+ return adv;
|
|
|
+
|
|
|
+ oldadv = adv;
|
|
|
+ adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
|
|
|
+
|
|
|
if (phydev->supported & (SUPPORTED_1000baseT_Half |
|
|
|
SUPPORTED_1000baseT_Full)) {
|
|
|
- adv = phy_read(phydev, MII_CTRL1000);
|
|
|
- if (adv < 0)
|
|
|
- return adv;
|
|
|
-
|
|
|
- oldadv = adv;
|
|
|
- adv &= ~(ADVERTISE_1000FULL | ADVERTISE_1000HALF);
|
|
|
adv |= ethtool_adv_to_mii_ctrl1000_t(advertise);
|
|
|
-
|
|
|
- if (adv != oldadv) {
|
|
|
- err = phy_write(phydev, MII_CTRL1000, adv);
|
|
|
-
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
+ if (adv != oldadv)
|
|
|
changed = 1;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
+ err = phy_write(phydev, MII_CTRL1000, adv);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
return changed;
|
|
|
}
|
|
|
|