[PATCH 037/111] GRETH: forcing autonegotiation during PHY initialization

Daniel Hellstrom daniel at gaisler.com
Thu Feb 26 16:38:39 UTC 2015


Looking at PHY Ctrl register without reseting it will give back
old register content, that is not stable. Instead the PHY is
reset and the autonogotiation capability is read out and
started if present.
---
 c/src/lib/libbsp/sparc/shared/net/greth.c |   17 +++++++++++------
 1 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/c/src/lib/libbsp/sparc/shared/net/greth.c b/c/src/lib/libbsp/sparc/shared/net/greth.c
index 733b2a4..769de59 100644
--- a/c/src/lib/libbsp/sparc/shared/net/greth.c
+++ b/c/src/lib/libbsp/sparc/shared/net/greth.c
@@ -328,14 +328,19 @@ greth_initialize_hardware (struct greth_softc *sc)
         phyaddr = sc->phyaddr;
     }
 
-    /* get phy control register default values */
+    /* reset PHY */
+    write_mii(sc, phyaddr, 0, 0x8000);
+
+    /* Wait for reset to complete and get default values */
     while ((phyctrl = read_mii(sc, phyaddr, 0)) & 0x8000) {}
-    
-    /* reset PHY and wait for completion */
-    write_mii(sc, phyaddr, 0, 0x8000 | phyctrl);
 
-    while ((read_mii(sc, phyaddr, 0)) & 0x8000) {}
-    
+    /* If autonegotiation implemented we start it */
+    phystatus = read_mii(sc, phyaddr, 1);
+    if (phystatus & 0x0008) {
+        write_mii(sc, phyaddr, 0, phyctrl | 0x1200);
+        phyctrl = read_mii(sc, phyaddr, 0);
+    }
+
     /* Check if PHY is autoneg capable and then determine operating mode, 
        otherwise force it to 10 Mbit halfduplex */
     sc->gb = 0;
-- 
1.7.0.4




More information about the devel mailing list