@ -12,18 +12,18 @@
# define PHY_AUTONEGOTIATE_TIMEOUT 5000
/* RTL8211B PHY Status Register */
# define MIIM_RTL8211B _PHY_STATUS 0x11
# define MIIM_RTL8211B _PHYSTAT_SPEED 0xc000
# define MIIM_RTL8211B _PHYSTAT_GBIT 0x8000
# define MIIM_RTL8211B _PHYSTAT_100 0x4000
# define MIIM_RTL8211B _PHYSTAT_DUPLEX 0x2000
# define MIIM_RTL8211B _PHYSTAT_SPDDONE 0x0800
# define MIIM_RTL8211B _PHYSTAT_LINK 0x0400
/* RealTek RTL8211B */
static int rtl8211b _config ( struct phy_device * phydev )
/* RTL8211x PHY Status Register */
# define MIIM_RTL8211x _PHY_STATUS 0x11
# define MIIM_RTL8211x _PHYSTAT_SPEED 0xc000
# define MIIM_RTL8211x _PHYSTAT_GBIT 0x8000
# define MIIM_RTL8211x _PHYSTAT_100 0x4000
# define MIIM_RTL8211x _PHYSTAT_DUPLEX 0x2000
# define MIIM_RTL8211x _PHYSTAT_SPDDONE 0x0800
# define MIIM_RTL8211x _PHYSTAT_LINK 0x0400
/* RealTek RTL8211x */
static int rtl8211x _config ( struct phy_device * phydev )
{
phy_write ( phydev , MDIO_DEVAD_NONE , MII_BMCR , BMCR_RESET ) ;
@ -32,20 +32,20 @@ static int rtl8211b_config(struct phy_device *phydev)
return 0 ;
}
static int rtl8211b _parse_status ( struct phy_device * phydev )
static int rtl8211x _parse_status ( struct phy_device * phydev )
{
unsigned int speed ;
unsigned int mii_reg ;
mii_reg = phy_read ( phydev , MDIO_DEVAD_NONE , MIIM_RTL8211B _PHY_STATUS ) ;
mii_reg = phy_read ( phydev , MDIO_DEVAD_NONE , MIIM_RTL8211x _PHY_STATUS ) ;
if ( ! ( mii_reg & MIIM_RTL8211B _PHYSTAT_SPDDONE ) ) {
if ( ! ( mii_reg & MIIM_RTL8211x _PHYSTAT_SPDDONE ) ) {
int i = 0 ;
/* in case of timeout ->link is cleared */
phydev - > link = 1 ;
puts ( " Waiting for PHY realtime link " ) ;
while ( ! ( mii_reg & MIIM_RTL8211B _PHYSTAT_SPDDONE ) ) {
while ( ! ( mii_reg & MIIM_RTL8211x _PHYSTAT_SPDDONE ) ) {
/* Timeout reached ? */
if ( i > PHY_AUTONEGOTIATE_TIMEOUT ) {
puts ( " TIMEOUT ! \n " ) ;
@ -57,29 +57,29 @@ static int rtl8211b_parse_status(struct phy_device *phydev)
putc ( ' . ' ) ;
udelay ( 1000 ) ; /* 1 ms */
mii_reg = phy_read ( phydev , MDIO_DEVAD_NONE ,
MIIM_RTL8211B _PHY_STATUS ) ;
MIIM_RTL8211x _PHY_STATUS ) ;
}
puts ( " done \n " ) ;
udelay ( 500000 ) ; /* another 500 ms (results in faster booting) */
} else {
if ( mii_reg & MIIM_RTL8211B _PHYSTAT_LINK )
if ( mii_reg & MIIM_RTL8211x _PHYSTAT_LINK )
phydev - > link = 1 ;
else
phydev - > link = 0 ;
}
if ( mii_reg & MIIM_RTL8211B _PHYSTAT_DUPLEX )
if ( mii_reg & MIIM_RTL8211x _PHYSTAT_DUPLEX )
phydev - > duplex = DUPLEX_FULL ;
else
phydev - > duplex = DUPLEX_HALF ;
speed = ( mii_reg & MIIM_RTL8211B _PHYSTAT_SPEED ) ;
speed = ( mii_reg & MIIM_RTL8211x _PHYSTAT_SPEED ) ;
switch ( speed ) {
case MIIM_RTL8211B _PHYSTAT_GBIT :
case MIIM_RTL8211x _PHYSTAT_GBIT :
phydev - > speed = SPEED_1000 ;
break ;
case MIIM_RTL8211B _PHYSTAT_100 :
case MIIM_RTL8211x _PHYSTAT_100 :
phydev - > speed = SPEED_100 ;
break ;
default :
@ -89,28 +89,53 @@ static int rtl8211b_parse_status(struct phy_device *phydev)
return 0 ;
}
static int rtl8211b _startup ( struct phy_device * phydev )
static int rtl8211x _startup ( struct phy_device * phydev )
{
/* Read the Status (2x to make sure link is right) */
genphy_update_link ( phydev ) ;
rtl8211b _parse_status ( phydev ) ;
rtl8211x _parse_status ( phydev ) ;
return 0 ;
}
/* Support for RTL8211B PHY */
static struct phy_driver RTL8211B_driver = {
. name = " RealTek RTL8211B " ,
. uid = 0x1cc910 ,
. mask = 0xfffff0 ,
. features = PHY_GBIT_FEATURES ,
. config = & rtl8211b_config ,
. startup = & rtl8211b_startup ,
. config = & rtl8211x_config ,
. startup = & rtl8211x_startup ,
. shutdown = & genphy_shutdown ,
} ;
/* Support for RTL8211E-VB-CG, RTL8211E-VL-CG and RTL8211EG-VB-CG PHYs */
static struct phy_driver RTL8211E_driver = {
. name = " RealTek RTL8211E " ,
. uid = 0x1cc915 ,
. mask = 0xfffff0 ,
. features = PHY_GBIT_FEATURES ,
. config = & rtl8211x_config ,
. startup = & rtl8211x_startup ,
. shutdown = & genphy_shutdown ,
} ;
/* Support for RTL8211DN PHY */
static struct phy_driver RTL8211DN_driver = {
. name = " RealTek RTL8211DN " ,
. uid = 0x1cc914 ,
. mask = 0xfffff0 ,
. features = PHY_GBIT_FEATURES ,
. config = & rtl8211x_config ,
. startup = & rtl8211x_startup ,
. shutdown = & genphy_shutdown ,
} ;
int phy_realtek_init ( void )
{
phy_register ( & RTL8211B_driver ) ;
phy_register ( & RTL8211E_driver ) ;
phy_register ( & RTL8211DN_driver ) ;
return 0 ;
}