]> git.sur5r.net Git - u-boot/blobdiff - common/miiphyutil.c
esd WUH405 and DU405 board updated
[u-boot] / common / miiphyutil.c
index f6436cf2452583555f0a96be0969dbd8727a6a89..2b0dcf4f2ce1af67d7f02f7100757dad921c85d4 100644 (file)
@@ -135,6 +135,7 @@ int miiphy_speed (unsigned char addr)
 {
        unsigned short reg;
 
+#if defined(CONFIG_PHY_GIGE)
        if (miiphy_read (addr, PHY_1000BTSR, &reg)) {
                printf ("PHY 1000BT Status read failed\n");
        } else {
@@ -144,16 +145,33 @@ int miiphy_speed (unsigned char addr)
                        }
                }
        }
+#endif /* CONFIG_PHY_GIGE */
 
-       if (miiphy_read (addr, PHY_ANLPAR, &reg)) {
-               puts ("PHY speed1 read failed, assuming 10bT\n");
+       /* Check Basic Management Control Register first. */
+       if (miiphy_read (addr, PHY_BMCR, &reg)) {
+               puts ("PHY speed read failed, assuming 10bT\n");
                return (_10BASET);
        }
-       if ((reg & PHY_ANLPAR_100) != 0) {
+       /* Check if auto-negotiation is on. */
+       if ((reg & PHY_BMCR_AUTON) != 0) {
+               /* Get auto-negotiation results. */
+               if (miiphy_read (addr, PHY_ANLPAR, &reg)) {
+                       puts ("PHY AN speed read failed, assuming 10bT\n");
+                       return (_10BASET);
+               }
+               if ((reg & PHY_ANLPAR_100) != 0) {
+                       return (_100BASET);
+               } else {
+                       return (_10BASET);
+               }
+       }
+       /* Get speed from basic control settings. */
+       else if (reg & PHY_BMCR_100MB) {
                return (_100BASET);
        } else {
                return (_10BASET);
        }
+
 }
 
 
@@ -165,7 +183,7 @@ int miiphy_duplex (unsigned char addr)
 {
        unsigned short reg;
 
-
+#if defined(CONFIG_PHY_GIGE)
        if (miiphy_read (addr, PHY_1000BTSR, &reg)) {
                printf ("PHY 1000BT Status read failed\n");
        } else {
@@ -178,17 +196,34 @@ int miiphy_duplex (unsigned char addr)
                        }
                }
        }
+#endif /* CONFIG_PHY_GIGE */
 
-       if (miiphy_read (addr, PHY_ANLPAR, &reg)) {
+       /* Check Basic Management Control Register first. */
+       if (miiphy_read (addr, PHY_BMCR, &reg)) {
                puts ("PHY duplex read failed, assuming half duplex\n");
                return (HALF);
        }
+       /* Check if auto-negotiation is on. */
+       if ((reg & PHY_BMCR_AUTON) != 0) {
+               /* Get auto-negotiation results. */
+               if (miiphy_read (addr, PHY_ANLPAR, &reg)) {
+                       puts ("PHY AN duplex read failed, assuming half duplex\n");
+                       return (HALF);
+               }
 
-       if ((reg & (PHY_ANLPAR_10FD | PHY_ANLPAR_TXFD)) != 0) {
+               if ((reg & (PHY_ANLPAR_10FD | PHY_ANLPAR_TXFD)) != 0) {
+                       return (FULL);
+               } else {
+                       return (HALF);
+               }
+       }
+       /* Get speed from basic control settings. */
+       else if (reg & PHY_BMCR_DPLX) {
                return (FULL);
        } else {
                return (HALF);
        }
+
 }
 
 #ifdef CFG_FAULT_ECHO_LINK_DOWN
@@ -200,6 +235,8 @@ int miiphy_link (unsigned char addr)
 {
        unsigned short reg;
 
+       /* dummy read; needed to latch some phys */
+       (void)miiphy_read(addr, PHY_BMSR, &reg);
        if (miiphy_read (addr, PHY_BMSR, &reg)) {
                puts ("PHY_BMSR read failed, assuming no link\n");
                return (0);