From: Markus Niebel <[email protected]>

Disable the support due to chip errata and call genphy_config_aneg
instead of genphy_config. For a complete describtion look at the
errata sheets: DS80000691D or DS80000692D.

Signed-off-by: Markus Niebel <[email protected]>
Signed-off-by: Max Merchel <[email protected]>
---
 drivers/net/phy/micrel_ksz90x1.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/drivers/net/phy/micrel_ksz90x1.c b/drivers/net/phy/micrel_ksz90x1.c
index a02dbe900b8..bc42506c65e 100644
--- a/drivers/net/phy/micrel_ksz90x1.c
+++ b/drivers/net/phy/micrel_ksz90x1.c
@@ -336,6 +336,7 @@ static int ksz9031_phy_extwrite(struct phy_device *phydev, 
int addr,
 
 static int ksz9031_config(struct phy_device *phydev)
 {
+       unsigned int features = phydev->drv->features;
        int ret;
 
        ret = ksz9031_of_config(phydev);
@@ -371,7 +372,22 @@ static int ksz9031_config(struct phy_device *phydev)
                return 0;
        }
 
-       return genphy_config(phydev);
+       /* Silicon Errata Sheet (DS80000691D or DS80000692D):
+        * Whenever the device's Asymmetric Pause capability is set to 1,
+        * link-up may fail after a link-up to link-down transition.
+        *
+        * Workaround:
+        * Do not enable the Asymmetric Pause capability bit.
+        */
+       features &= ~ADVERTISE_PAUSE_ASYM;
+       /* update feature support and forward to advertised features */
+       phydev->supported = features;
+       phydev->advertising = phydev->supported;
+
+       /* genphy_restart_aneg called from genphy_config_aneg */
+       return genphy_config_aneg(phydev);
+
+       return 0;
 }
 
 U_BOOT_PHY_DRIVER(ksz9031) = {
-- 
2.43.0

Reply via email to