Commit cebf3f55 authored by oliver@schinagl.nl's avatar oliver@schinagl.nl Committed by Joe Hershberger
Browse files

net: phy: realtek: Only force master mode on rtl8211b/c

Commit 525d187a

 ("net: phy: Optionally force master mode for RTL PHY")
added the define to force the PHY into master mode. Unfortunatly this is
an all or nothing switch. So it applies to either all PHY's or no PHY's.

The bug that define tried to solve was a buggy PLL in the RTL8211C only.

The Olimex OLinuXino Lime2 has gotten an upgrade where the PHY was
replaced with an RTL8211E. With this define however, both lime2 boards
are either forced to master mode or not. We could of course have a
binary for each board, but the following patch fixes this by adding a
'quirk' to the flags to the rtl8211b and rtl8211c only. It is now
possible to force master mode, but only have it apply to the rtl8211b
and rtl8211c.
Signed-off-by: default avatarOlliver Schinagl <oliver@schinagl.nl>
Acked-by: Joe Hershberger's avatarJoe Hershberger <joe.hershberger@ni.com>
parent cbe40e11
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include <phy.h> #include <phy.h>
#define PHY_RTL8211x_FORCE_MASTER BIT(1)
#define PHY_AUTONEGOTIATE_TIMEOUT 5000 #define PHY_AUTONEGOTIATE_TIMEOUT 5000
/* RTL8211x 1000BASE-T Control Register */ /* RTL8211x 1000BASE-T Control Register */
...@@ -49,6 +51,15 @@ ...@@ -49,6 +51,15 @@
#define MIIM_RTL8211F_TX_DELAY 0x100 #define MIIM_RTL8211F_TX_DELAY 0x100
#define MIIM_RTL8211F_LCR 0x10 #define MIIM_RTL8211F_LCR 0x10
static int rtl8211b_probe(struct phy_device *phydev)
{
#ifdef CONFIG_RTL8211X_PHY_FORCE_MASTER
phydev->flags |= PHY_RTL8211x_FORCE_MASTER;
#endif
return 0;
}
/* RealTek RTL8211x */ /* RealTek RTL8211x */
static int rtl8211x_config(struct phy_device *phydev) static int rtl8211x_config(struct phy_device *phydev)
{ {
...@@ -59,14 +70,17 @@ static int rtl8211x_config(struct phy_device *phydev) ...@@ -59,14 +70,17 @@ static int rtl8211x_config(struct phy_device *phydev)
*/ */
phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER, phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER,
MIIM_RTL8211x_PHY_INTR_DIS); MIIM_RTL8211x_PHY_INTR_DIS);
#ifdef CONFIG_RTL8211X_PHY_FORCE_MASTER
unsigned int reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_CTRL1000); if (phydev->flags & PHY_RTL8211x_FORCE_MASTER) {
/* force manual master/slave configuration */ unsigned int reg;
reg |= MIIM_RTL8211x_CTRL1000T_MSCE;
/* force master mode */ reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_CTRL1000);
reg |= MIIM_RTL8211x_CTRL1000T_MASTER; /* force manual master/slave configuration */
phy_write(phydev, MDIO_DEVAD_NONE, MII_CTRL1000, reg); reg |= MIIM_RTL8211x_CTRL1000T_MSCE;
#endif /* force master mode */
reg |= MIIM_RTL8211x_CTRL1000T_MASTER;
phy_write(phydev, MDIO_DEVAD_NONE, MII_CTRL1000, reg);
}
/* read interrupt status just to clear it */ /* read interrupt status just to clear it */
phy_read(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER); phy_read(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER);
...@@ -249,6 +263,7 @@ static struct phy_driver RTL8211B_driver = { ...@@ -249,6 +263,7 @@ static struct phy_driver RTL8211B_driver = {
.uid = 0x1cc912, .uid = 0x1cc912,
.mask = 0xffffff, .mask = 0xffffff,
.features = PHY_GBIT_FEATURES, .features = PHY_GBIT_FEATURES,
.probe = &rtl8211b_probe,
.config = &rtl8211x_config, .config = &rtl8211x_config,
.startup = &rtl8211x_startup, .startup = &rtl8211x_startup,
.shutdown = &genphy_shutdown, .shutdown = &genphy_shutdown,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment