@ -77,11 +77,10 @@ void uec_write_phy_reg (struct eth_device *dev, int mii_id, int regnum, int valu
/* Setting up the MII Mangement Control Register with the value */
out_be32 ( & ug_regs - > miimcon , ( u32 ) value ) ;
sync ( ) ;
/* Wait till MII management write is complete */
while ( ( in_be32 ( & ug_regs - > miimind ) ) & MIIMIND_BUSY ) ;
udelay ( 100000 ) ;
}
/* Reads from register regnum in the PHY for device dev, */
@ -101,16 +100,17 @@ int uec_read_phy_reg (struct eth_device *dev, int mii_id, int regnum)
tmp_reg = ( ( u32 ) mii_id < < MIIMADD_PHY_ADDRESS_SHIFT ) | mii_reg ;
out_be32 ( & ug_regs - > miimadd , tmp_reg ) ;
/* Perform an MII management rea d cycle */
/* clear MII management comman d cycle */
out_be32 ( & ug_regs - > miimcom , 0 ) ;
sync ( ) ;
/* Perform an MII management read cycle */
out_be32 ( & ug_regs - > miimcom , MIIMCOM_READ_CYCLE ) ;
/* Wait till MII management write is complete */
while ( ( in_be32 ( & ug_regs - > miimind ) ) &
( MIIMIND_NOT_VALID | MIIMIND_BUSY ) ) ;
udelay ( 100000 ) ;
/* Read MII management status */
value = ( u16 ) in_be32 ( & ug_regs - > miimstat ) ;
if ( value = = 0xffff )
@ -270,20 +270,38 @@ static int genmii_update_link (struct uec_mii_info *mii_info)
{
u16 status ;
/* Do a fake read */
/* Status is read once to clear old link state */
phy_read ( mii_info , PHY_BMSR ) ;
/* Read link and autonegotiation status */
status = phy_read ( mii_info , PHY_BMSR ) ;
if ( ( status & PHY_BMSR_LS ) = = 0 )
mii_info - > link = 0 ;
else
/*
* Wait if the link is up , and autonegotiation is in progress
* ( ie - we ' re capable and it ' s not done )
*/
status = phy_read ( mii_info , PHY_BMSR ) ;
if ( ( status & PHY_BMSR_LS ) & & ( status & PHY_BMSR_AUTN_ABLE )
& & ! ( status & PHY_BMSR_AUTN_COMP ) ) {
int i = 0 ;
while ( ! ( status & PHY_BMSR_AUTN_COMP ) ) {
/*
* Timeout reached ?
*/
if ( i > UGETH_AN_TIMEOUT ) {
mii_info - > link = 0 ;
return 0 ;
}
udelay ( 1000 ) ; /* 1 ms */
status = phy_read ( mii_info , PHY_BMSR ) ;
}
mii_info - > link = 1 ;
/* If we are autonegotiating, and not done,
* return an error */
if ( mii_info - > autoneg & & ! ( status & PHY_BMSR_AUTN_COMP ) )
return - EAGAIN ;
udelay ( 500000 ) ; /* another 500 ms (results in faster booting) */
} else {
if ( status & PHY_BMSR_LS )
mii_info - > link = 1 ;
else
mii_info - > link = 0 ;
}
return 0 ;
}
@ -389,16 +407,12 @@ static int dm9161_init (struct uec_mii_info *mii_info)
/* PHY and MAC connect */
phy_write ( mii_info , PHY_BMCR , phy_read ( mii_info , PHY_BMCR ) &
~ PHY_BMCR_ISO ) ;
# ifdef CONFIG_RMII_MODE
phy_write ( mii_info , MII_DM9161_SCR , MII_DM9161_SCR_RMII_INIT ) ;
# else
phy_write ( mii_info , MII_DM9161_SCR , MII_DM9161_SCR_INIT ) ;
# endif
config_genmii_advert ( mii_info ) ;
/* Start/restart aneg */
genmii_config_aneg ( mii_info ) ;
/* Delay to wait the aneg compeleted */
udelay ( 3000000 ) ;
return 0 ;
}