linux/drivers/net/phy
Rajasingh Thavamani 262e473715 net: phy: Micrel KSZ8061: link failure after cable connect
commit 232ba3a51c upstream.

With Micrel KSZ8061 PHY, the link may occasionally not come up after
Ethernet cable connect. The vendor's (Microchip, former Micrel) errata
sheet 80000688A.pdf descripes the problem and possible workarounds in
detail, see below.
The batch implements workaround 1, which permanently fixes the issue.

DESCRIPTION
Link-up may not occur properly when the Ethernet cable is initially
connected. This issue occurs more commonly when the cable is connected
slowly, but it may occur any time a cable is connected. This issue occurs
in the auto-negotiation circuit, and will not occur if auto-negotiation
is disabled (which requires that the two link partners be set to the
same speed and duplex).

END USER IMPLICATIONS
When this issue occurs, link is not established. Subsequent cable
plug/unplaug cycle will not correct the issue.

WORk AROUND
There are four approaches to work around this issue:
1. This issue can be prevented by setting bit 15 in MMD device address 1,
   register 2, prior to connecting the cable or prior to setting the
   Restart Auto-negotiation bit in register 0h. The MMD registers are
   accessed via the indirect access registers Dh and Eh, or via the Micrel
   EthUtil utility as shown here:
   . if using the EthUtil utility (usually with a Micrel KSZ8061
     Evaluation Board), type the following commands:
     > address 1
     > mmd 1
     > iw 2 b61a
   . Alternatively, write the following registers to write to the
     indirect MMD register:
     Write register Dh, data 0001h
     Write register Eh, data 0002h
     Write register Dh, data 4001h
     Write register Eh, data B61Ah
2. The issue can be avoided by disabling auto-negotiation in the KSZ8061,
   either by the strapping option, or by clearing bit 12 in register 0h.
   Care must be taken to ensure that the KSZ8061 and the link partner
   will link with the same speed and duplex. Note that the KSZ8061
   defaults to full-duplex when auto-negotiation is off, but other
   devices may default to half-duplex in the event of failed
   auto-negotiation.
3. The issue can be avoided by connecting the cable prior to powering-up
   or resetting the KSZ8061, and leaving it plugged in thereafter.
4. If the above measures are not taken and the problem occurs, link can
   be recovered by setting the Restart Auto-Negotiation bit in
   register 0h, or by resetting or power cycling the device. Reset may
   be either hardware reset or software reset (register 0h, bit 15).

PLAN
This errata will not be corrected in the future revision.

Fixes: 7ab59dc15e ("drivers/net/phy/micrel_phy: Add support for new PHYs")
Signed-off-by: Alexander Onnasch <alexander.onnasch@landisgyr.com>
Signed-off-by: Rajasingh Thavamani <T.Rajasingh@landisgyr.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
[bwh: Backported to 3.16:
 - Include <linux/mdio.h> for register definition
 - Adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
History 2019-05-02 21:42:00 +01:00
..
amd-xgbe-phy.c amd-xgbe: fix unused variable compilation warning in phylib driver 2014-06-11 00:13:16 -07:00
amd.c phylib: Support registering a bunch of drivers 2012-07-09 00:10:56 -07:00
at803x.c net: phy: at803x: fix coccinelle warnings 2014-06-22 17:16:02 -07:00
bcm7xxx.c net: phy: bcm7xxx: Fix shadow mode 2 disabling 2016-03-08 12:15:39 +00:00
bcm63xx.c phy: bcm63xx: report Broadcom BCM63xx PHYs as internal 2013-05-27 22:42:50 -07:00
bcm87xx.c net/phy/bcm87xx: Add MODULE_LICENSE("GPL") to GPL driver 2012-09-22 15:33:46 -04:00
broadcom.c broadcom: fix PHY_ID_BCM5481 entry in the id table 2015-12-18 16:06:23 +00:00
cicada.c net: phy: cicada: fix checkpath errors 2013-12-18 00:49:01 -05:00
davicom.c net: phy: davicom: fix checkpath errors 2013-12-18 00:49:01 -05:00
dp83640.c net: dp83640: Avoid NULL pointer dereference. 2017-09-15 18:30:15 +01:00
dp83640_reg.h ptp: Added a clock driver for the National Semiconductor PHYTER. 2011-05-23 13:10:23 -07:00
et1011c.c net/phy: fix many "defined but unused" warnings 2010-10-05 00:34:29 -07:00
fixed.c net: phy: Manage fixed PHY address space using IDA 2016-08-22 22:38:24 +01:00
icplus.c net: phy: icplus: fix checkpath error 2013-12-18 00:49:02 -05:00
Kconfig amd-xgbe: Configuration and build support 2014-06-05 15:26:51 -07:00
lxt.c net: phy: lxt: fix checkpath errors 2013-12-18 00:49:02 -05:00
Makefile amd-xgbe: Configuration and build support 2014-06-05 15:26:51 -07:00
marvell.c net: phy: marvell: Limit 88m1101 autoneg errata to 88E1145 as well. 2018-03-03 15:52:01 +00:00
mdio-bitbang.c Revert "drivers/net/phy/mdio-bitbang.c: Call mdiobus_unregister before mdiobus_free" 2012-11-14 22:32:15 -05:00
mdio-gpio.c net: mdio-gpio: warn about missing bus alias id 2014-05-09 15:51:19 -04:00
mdio-moxart.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
mdio-mux-gpio.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
mdio-mux-mmioreg.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
mdio-mux.c net: phy: mdio-mux: Check return value of mdiobus_alloc() 2016-01-25 10:43:49 +00:00
mdio-octeon.c drivers/net: delete non-required instances of include <linux/init.h> 2014-01-16 11:53:26 -08:00
mdio-sun4i.c mdio-sun4i: Fix a memory leak 2018-03-03 15:52:16 +00:00
mdio_bus.c mdio_bus: Fix use-after-free on device_register fails 2019-05-02 21:41:58 +01:00
micrel.c net: phy: Micrel KSZ8061: link failure after cable connect 2019-05-02 21:42:00 +01:00
national.c phy: Use pr_<level> 2012-06-11 16:58:24 -07:00
phy.c net: phy: handle state correctly in phy_stop_machine 2017-07-18 18:40:23 +01:00
phy_device.c net: phy: Stop with excessive soft reset 2019-02-11 17:53:22 +00:00
qsemi.c net/phy: fix many "defined but unused" warnings 2010-10-05 00:34:29 -07:00
realtek.c net: phy: realtek: register/unregister multiple drivers properly 2014-06-11 15:17:27 -07:00
smsc.c net: phy: smsc: move smsc_phy_config_init reset part in a soft_reset function 2014-10-15 12:05:27 +02:00
spi_ks8995.c net: Micrel KSZ8864RMN 4-port managed switch support 2014-04-03 16:15:29 -04:00
ste10Xp.c phylib: Support registering a bunch of drivers 2012-07-09 00:10:56 -07:00
vitesse.c net/phy: Remove return value for void function 2014-04-23 15:28:05 -04:00