diff options
| -rw-r--r-- | drivers/net/phy/realtek.c | 73 | 
1 files changed, 49 insertions, 24 deletions
| diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c index 606a103ce..ddbbc35e2 100644 --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c @@ -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 +/* 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 RTL8211B */ -static int rtl8211b_config(struct phy_device *phydev) +/* 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;  } |