[U-Boot] [RFC PATCH 0/1] net: phy: Force master mode for RTL8211C

This patch is an RFC based on recent discussions. It's only lightly tested. I have yet to verify that the registers are being set correctly. I'm sending it out now because I have to leave for today.
Note that this patch requires Karsten Merkers '[PATCH] net: phy: Realtek RTL8211B/C PHY ID fix'.
Series-Version: 2 Series-changes: 2 - Removed accidental inclusion of Karsten's patch in my first submission of this series. - Fix a typo in the code: 6 -> &
Michael
Michael Haas (1): net: phy: Force master mode for RTL8211C
drivers/net/phy/realtek.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)

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 | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c index 259a87f..97d5712 100644 --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c @@ -54,6 +54,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 && 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);

Hi,
On 22-03-16 08:51, 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 | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c index 259a87f..97d5712 100644 --- a/drivers/net/phy/realtek.c +++ b/drivers/net/phy/realtek.c @@ -54,6 +54,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 && phydev->phy_id == 0x1cc912) {
/* RTL8211C and RTL8211C are distinguished only by
their revision number */
RTL8211C and RTL8211C -> RTL8211B and RTL8211C ?
Also I would put this comment above the:
int reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_PHYSID1);
Line, and put a comment like this above the if :
/* The RTL8211C is unreliable in slave mode, force master mode */
Code wise everything looks good :)
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);
Regards,
Hans
participants (2)
-
Hans de Goede
-
Michael Haas