]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
phy: fix 10/100Mbps operation on 1Gbps-capable links
authorSascha Silbe <t-uboot@infra-silbe.de>
Fri, 19 Jul 2013 10:25:10 +0000 (12:25 +0200)
committerTom Rini <trini@ti.com>
Fri, 19 Jul 2013 21:12:16 +0000 (17:12 -0400)
de1d786 [add support for Xilinx 1000BASE-X phy (GTX)] introduced a
check for the extended status register in order to support
1Gbps-capable PHYs that don't have the 1000BASE-T registers. Since
Extended Status only indicates what the PHY (i.e. the local side) is
capable of, this broke communication with non-1Gbps peers.

Only check the extended status if the 1000BASE-T registers are
actually missing so we don't end up setting speed to 1Gbps even though
the previous test (for the combination of local and peer support for
1Gbps) already indicated we can't do 1Gbps with the current peer.

Signed-off-by: Sascha Silbe <t-uboot@infra-silbe.de>
Tested-by: Fabio Estevam <fabio.estevam@freescale.com>
Reviewed-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/phy/phy.c

index 7c0eaec5137f8def0cfbf92b67793f74f0dc7e60..4ea74811c7ee5696ac456014a92d78124e392efd 100644 (file)
@@ -333,7 +333,15 @@ int genphy_parse_link(struct phy_device *phydev)
                } else if (lpa & LPA_10FULL)
                        phydev->duplex = DUPLEX_FULL;
 
-               if (mii_reg & BMSR_ESTATEN)
+               /*
+                * Extended status may indicate that the PHY supports
+                * 1000BASE-T/X even though the 1000BASE-T registers
+                * are missing. In this case we can't tell whether the
+                * peer also supports it, so we only check extended
+                * status if the 1000BASE-T registers are actually
+                * missing.
+                */
+               if ((mii_reg & BMSR_ESTATEN) && !(mii_reg & BMSR_ERCAP))
                        estatus = phy_read(phydev, MDIO_DEVAD_NONE,
                                           MII_ESTATUS);