|
@@ -75,6 +75,10 @@ static int genphy_config_advert(struct phy_device *phydev)
|
|
adv |= ADVERTISE_PAUSE_CAP;
|
|
adv |= ADVERTISE_PAUSE_CAP;
|
|
if (advertise & ADVERTISED_Asym_Pause)
|
|
if (advertise & ADVERTISED_Asym_Pause)
|
|
adv |= ADVERTISE_PAUSE_ASYM;
|
|
adv |= ADVERTISE_PAUSE_ASYM;
|
|
|
|
+ if (advertise & ADVERTISED_1000baseX_Half)
|
|
|
|
+ adv |= ADVERTISE_1000XHALF;
|
|
|
|
+ if (advertise & ADVERTISED_1000baseX_Full)
|
|
|
|
+ adv |= ADVERTISE_1000XFULL;
|
|
|
|
|
|
if (adv != oldadv) {
|
|
if (adv != oldadv) {
|
|
err = phy_write(phydev, MDIO_DEVAD_NONE, MII_ADVERTISE, adv);
|
|
err = phy_write(phydev, MDIO_DEVAD_NONE, MII_ADVERTISE, adv);
|
|
@@ -288,6 +292,7 @@ int genphy_parse_link(struct phy_device *phydev)
|
|
if (mii_reg & BMSR_ANEGCAPABLE) {
|
|
if (mii_reg & BMSR_ANEGCAPABLE) {
|
|
u32 lpa = 0;
|
|
u32 lpa = 0;
|
|
u32 gblpa = 0;
|
|
u32 gblpa = 0;
|
|
|
|
+ u32 estatus = 0;
|
|
|
|
|
|
/* Check for gigabit capability */
|
|
/* Check for gigabit capability */
|
|
if (mii_reg & BMSR_ERCAP) {
|
|
if (mii_reg & BMSR_ERCAP) {
|
|
@@ -327,6 +332,18 @@ int genphy_parse_link(struct phy_device *phydev)
|
|
|
|
|
|
} else if (lpa & LPA_10FULL)
|
|
} else if (lpa & LPA_10FULL)
|
|
phydev->duplex = DUPLEX_FULL;
|
|
phydev->duplex = DUPLEX_FULL;
|
|
|
|
+
|
|
|
|
+ if (mii_reg & BMSR_ESTATEN)
|
|
|
|
+ estatus = phy_read(phydev, MDIO_DEVAD_NONE,
|
|
|
|
+ MII_ESTATUS);
|
|
|
|
+
|
|
|
|
+ if (estatus & (ESTATUS_1000_XFULL | ESTATUS_1000_XHALF |
|
|
|
|
+ ESTATUS_1000_TFULL | ESTATUS_1000_THALF)) {
|
|
|
|
+ phydev->speed = SPEED_1000;
|
|
|
|
+ if (estatus & (ESTATUS_1000_XFULL | ESTATUS_1000_TFULL))
|
|
|
|
+ phydev->duplex = DUPLEX_FULL;
|
|
|
|
+ }
|
|
|
|
+
|
|
} else {
|
|
} else {
|
|
u32 bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
|
|
u32 bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
|
|
|
|
|
|
@@ -384,6 +401,10 @@ int genphy_config(struct phy_device *phydev)
|
|
features |= SUPPORTED_1000baseT_Full;
|
|
features |= SUPPORTED_1000baseT_Full;
|
|
if (val & ESTATUS_1000_THALF)
|
|
if (val & ESTATUS_1000_THALF)
|
|
features |= SUPPORTED_1000baseT_Half;
|
|
features |= SUPPORTED_1000baseT_Half;
|
|
|
|
+ if (val & ESTATUS_1000_XFULL)
|
|
|
|
+ features |= SUPPORTED_1000baseX_Full;
|
|
|
|
+ if (val & ESTATUS_1000_XHALF)
|
|
|
|
+ features |= SUPPORTED_1000baseX_Full;
|
|
}
|
|
}
|
|
|
|
|
|
phydev->supported = features;
|
|
phydev->supported = features;
|