[U-Boot] [PATCH 1/1] net: phy/realtek: Add support for RTL8211DN and RTL8211E phy modules
Sharma Bhupesh-B45370
B45370 at freescale.com
Tue Jul 23 10:30:21 CEST 2013
Hi Andy, Joe,
> This patch adds support for Realtek PHY modules RTL8211DN and RTL8211E
> (variants: RTL8211E-VB-CG, RTL8211E-VL-CG, RTL8211EG-VB-CG), which can be
> found on Freescale's T1040RDB boards.
>
> To make the driver more generic across 8211 family, a generic name 8211x
> is added for macros and function names.
>
> Signed-off-by: Bhupesh Sharma <bhupesh.sharma at freescale.com>
Can you please review this patch and let me know if these changes seem suitable
to you.
Thanks for your help.
Regards,
Bhupesh
> ---
> drivers/net/phy/realtek.c | 77 +++++++++++++++++++++++++++++++----------
> ------
> 1 file changed, 51 insertions(+), 26 deletions(-)
>
> diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c index
> b7e2753..b971456 100644
> --- a/drivers/net/phy/realtek.c
> +++ b/drivers/net/phy/realtek.c
> @@ -26,18 +26,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);
>
> @@ -46,20 +46,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");
> @@ -71,29 +71,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:
> @@ -103,28 +103,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;
> }
> --
> 1.7.11.7
>
More information about the U-Boot
mailing list