@ -75,6 +75,10 @@ static int genphy_config_advert(struct phy_device *phydev)
adv | = ADVERTISE_PAUSE_CAP ;
if ( advertise & ADVERTISED_Asym_Pause )
adv | = ADVERTISE_PAUSE_ASYM ;
if ( advertise & ADVERTISED_1000baseX_Half )
adv | = ADVERTISE_1000XHALF ;
if ( advertise & ADVERTISED_1000baseX_Full )
adv | = ADVERTISE_1000XFULL ;
if ( adv ! = oldadv ) {
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 ) {
u32 lpa = 0 ;
u32 gblpa = 0 ;
u32 estatus = 0 ;
/* Check for gigabit capability */
if ( mii_reg & BMSR_ERCAP ) {
@ -327,6 +332,18 @@ int genphy_parse_link(struct phy_device *phydev)
} else if ( lpa & LPA_10FULL )
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 {
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 ;
if ( val & ESTATUS_1000_THALF )
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 ;