diff mbox

[U-Boot,RFC] net: phy: Force master mode for RTL8211C

Message ID 1458631187-8278-2-git-send-email-haas@computerlinguist.org
State RFC
Headers show

Commit Message

Michael Haas March 22, 2016, 7:19 a.m. UTC
The RTL8211C found on the A20-OlinuXino-Lime2 does not word in slave
mode. This patch disables master/slave mode autonegotiation and forces
master mode.

The RTL8211C identifies itself as RTL8211B via its UID. This patch uses
the revision number taken from the PHYID2 register to distinguish the
two. The NetBSD driver uses the same approach.

CC: fradav@gmail.com
CC: merker@debian.org
CC: hdegoede@redhat.com
CC: ijc@hellion.org.uk
CC: joe.hershberger@ni.com
Signed-off-by: Michael Haas <haas@computerlinguist.org>
---

 drivers/net/phy/realtek.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

Comments

Michael Haas March 22, 2016, 7:40 a.m. UTC | #1
On 03/22/2016 08:19 AM, Michael Haas wrote:
> The RTL8211C found on the A20-OlinuXino-Lime2 does not word in slave
> mode. This patch disables master/slave mode autonegotiation and forces
> master mode.
>
> The RTL8211C identifies itself as RTL8211B via its UID. This patch uses
> the revision number taken from the PHYID2 register to distinguish the
> two. The NetBSD driver uses the same approach.
>
> CC: fradav@gmail.com
> CC: merker@debian.org
> CC: hdegoede@redhat.com
> CC: ijc@hellion.org.uk
> CC: joe.hershberger@ni.com
> Signed-off-by: Michael Haas <haas@computerlinguist.org>
> ---
>
>  drivers/net/phy/realtek.c | 16 +++++++++++++++-
>  1 file changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
> index 259a87f..cdb3376 100644
> --- a/drivers/net/phy/realtek.c
> +++ b/drivers/net/phy/realtek.c
> @@ -5,6 +5,7 @@
>   *
>   * Copyright 2010-2011, 2015 Freescale Semiconductor, Inc.
>   * author Andy Fleming
> + * Copyright 2016 Karsten Merker <merker@debian.org>
>   */
>  #include <config.h>
>  #include <common.h>
> @@ -54,6 +55,19 @@ static int rtl8211x_config(struct phy_device *phydev)
>  	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER,
>  		  MIIM_RTL8211x_PHY_INTR_DIS);
>  
> +	int reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_PHYSID1);
> +	int rev = reg & 0xf;
> +	if (rev == 3 & 6 phydev->phy_id == 0x1cc912) {
> +		/* RTL8211C and RTL8211C are distinguished only by
> +		   their revision number */
> +		reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_CTRL1000);
> +		/* force manual master/slave configuration */
> +		reg |= (1 << 12);
> +		/* force master mode */
> +		reg | = (1 << 11);
> +		phy_write(phydev, MDIO_DEVAD_NONE, MII_CTRL1000, reg);
> +	}
> +
>  	/* read interrupt status just to clear it */
>  	phy_read(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER);
>  
> @@ -223,7 +237,7 @@ static int rtl8211f_startup(struct phy_device *phydev)
>  /* Support for RTL8211B PHY */
>  static struct phy_driver RTL8211B_driver = {
>  	.name = "RealTek RTL8211B",
> -	.uid = 0x1cc910,
> +	.uid = 0x1cc912,
>  	.mask = 0xffffff,
>  	.features = PHY_GBIT_FEATURES,
>  	.config = &rtl8211x_config,

I have accidentally included Karsten Merkers '[PATCH] net: phy: Realtek
RTL8211B/C PHY ID fix' due to a botched call to git am earlier. I'll be
re-sending a clean version, but note that Karsten's patch is required.

Michael
diff mbox

Patch

diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
index 259a87f..cdb3376 100644
--- a/drivers/net/phy/realtek.c
+++ b/drivers/net/phy/realtek.c
@@ -5,6 +5,7 @@ 
  *
  * Copyright 2010-2011, 2015 Freescale Semiconductor, Inc.
  * author Andy Fleming
+ * Copyright 2016 Karsten Merker <merker@debian.org>
  */
 #include <config.h>
 #include <common.h>
@@ -54,6 +55,19 @@  static int rtl8211x_config(struct phy_device *phydev)
 	phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER,
 		  MIIM_RTL8211x_PHY_INTR_DIS);
 
+	int reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_PHYSID1);
+	int rev = reg & 0xf;
+	if (rev == 3 & 6 phydev->phy_id == 0x1cc912) {
+		/* RTL8211C and RTL8211C are distinguished only by
+		   their revision number */
+		reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_CTRL1000);
+		/* force manual master/slave configuration */
+		reg |= (1 << 12);
+		/* force master mode */
+		reg | = (1 << 11);
+		phy_write(phydev, MDIO_DEVAD_NONE, MII_CTRL1000, reg);
+	}
+
 	/* read interrupt status just to clear it */
 	phy_read(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER);
 
@@ -223,7 +237,7 @@  static int rtl8211f_startup(struct phy_device *phydev)
 /* Support for RTL8211B PHY */
 static struct phy_driver RTL8211B_driver = {
 	.name = "RealTek RTL8211B",
-	.uid = 0x1cc910,
+	.uid = 0x1cc912,
 	.mask = 0xffffff,
 	.features = PHY_GBIT_FEATURES,
 	.config = &rtl8211x_config,