Commit 525d187a authored by Michael Haas's avatar Michael Haas Committed by Hans de Goede
Browse files

net: phy: Optionally force master mode for RTL PHY

This patch introduces CONFIG_RTL8211X_PHY_FORCE_MASTER. If this
define is set, RTL8211x PHYs (except for the RTL8211F) will have their
1000BASE-T master/slave autonegotiation disabled and forced to master

This is helpful for PHYs like the RTL8211C which produce unstable links
in slave mode. Such problems have been found on the A20-Olimex-SOM-EVB
and A20-OLinuXino-Lime2.

There is no proper way to identify affected PHYs in software as the
RTL8211C shares its UID with the RTL8211B. Thus, this fix requires
the introduction of an #ifdef.

Signed-off-by: default avatarMichael Haas <>
Tested-by: default avatarKarsten Merker <>
Acked-by: Joe Hershberger's avatarJoe Hershberger <>
Signed-off-by: default avatarHans de Goede <>
parent c74384c6
......@@ -13,6 +13,27 @@ config PHYLIB
Enable Ethernet PHY (physical media interface) support.
bool "Ethernet PHY RTL8211x: force 1000BASE-T master mode"
depends on PHYLIB
Force master mode for 1000BASE-T on RTl8211x PHYs (except for RTL8211F).
This can work around link stability and data corruption issues on gigabit
links which can occur in slave mode on certain PHYs, e.g. on the
Please note that two directly connected devices (i.e. via crossover cable)
will not be able to establish a link between each other if they both force
master mode. Multiple devices forcing master mode when connected by a
network switch do not pose a problem as the switch configures its affected
ports into slave mode.
This option only affects gigabit links. If you must establish a direct
connection between two devices which both force master mode, try forcing
the link speed to 100MBit/s.
If unsure, say N.
menuconfig NETDEVICES
bool "Network device support"
depends on NET
......@@ -12,6 +12,10 @@
/* RTL8211x 1000BASE-T Control Register */
#define MIIM_RTL8211x_CTRL1000T_MSCE (1 << 12);
#define MIIM_RTL8211X_CTRL1000T_MASTER (1 << 11);
/* RTL8211x PHY Status Register */
#define MIIM_RTL8211x_PHY_STATUS 0x11
#define MIIM_RTL8211x_PHYSTAT_SPEED 0xc000
......@@ -53,7 +57,14 @@ static int rtl8211x_config(struct phy_device *phydev)
phy_write(phydev, MDIO_DEVAD_NONE, MIIM_RTL8211x_PHY_INER,
unsigned int reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_CTRL1000);
/* force manual master/slave configuration */
reg |= MIIM_RTL8211x_CTRL1000T_MSCE;
/* force master mode */
reg |= MIIM_RTL8211X_CTRL1000T_MASTER;
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);
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