net: phy: micrel: Disable B_CAST on config
authorAlexandre Messier <amessier@tycoint.com>
Fri, 22 Jan 2016 19:06:33 +0000 (14:06 -0500)
committerJoe Hershberger <joe.hershberger@ni.com>
Thu, 28 Jan 2016 19:20:21 +0000 (13:20 -0600)
Micrel PHYs KSZ8021/31 and KSZ8081 have a feature where MDIO address 0
is considered as a broadcast address; the PHY will respond even if it
is not its configured (pinstrapped) address. This feature is enabled
by default.

The Linux kernel disables that feature at initialisation, but not
before it probes the MDIO bus. This causes an issue, because a PHY
at address 3 will be discovered at addresses 0 and 3, but will then
only respond at address 3. Because Linux attaches the first PHY it
discovers on 'eth0', it will attach the PHY from address 0, which
will never answer again.

Fix the issue by disabling the broadcast feature in U-Boot, before
Linux is started.

Signed-off-by: Alexandre Messier <amessier@tycoint.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/phy/micrel.c

index 19b6bc74727b0d07f0ce769189ca556f38d60ed7..446d05ac5bfc53917516bb25b5ca229bac422ff8 100644 (file)
@@ -27,12 +27,31 @@ static struct phy_driver KSZ804_driver = {
        .shutdown = &genphy_shutdown,
 };
 
+#define MII_KSZPHY_OMSO                0x16
+#define KSZPHY_OMSO_B_CAST_OFF (1 << 9)
+
+static int ksz_genconfig_bcastoff(struct phy_device *phydev)
+{
+       int ret;
+
+       ret = phy_read(phydev, MDIO_DEVAD_NONE, MII_KSZPHY_OMSO);
+       if (ret < 0)
+               return ret;
+
+       ret = phy_write(phydev, MDIO_DEVAD_NONE, MII_KSZPHY_OMSO,
+                       ret | KSZPHY_OMSO_B_CAST_OFF);
+       if (ret < 0)
+               return ret;
+
+       return genphy_config(phydev);
+}
+
 static struct phy_driver KSZ8031_driver = {
        .name = "Micrel KSZ8021/KSZ8031",
        .uid = 0x221550,
        .mask = 0xfffff0,
        .features = PHY_BASIC_FEATURES,
-       .config = &genphy_config,
+       .config = &ksz_genconfig_bcastoff,
        .startup = &genphy_startup,
        .shutdown = &genphy_shutdown,
 };
@@ -70,7 +89,7 @@ static struct phy_driver KSZ8081_driver = {
        .uid = 0x221560,
        .mask = 0xfffff0,
        .features = PHY_BASIC_FEATURES,
-       .config = &genphy_config,
+       .config = &ksz_genconfig_bcastoff,
        .startup = &genphy_startup,
        .shutdown = &genphy_shutdown,
 };