* avoid using link variable uninitialized
  * avoid using phy_addr variable with invalid value
  * reorganize phy control: first looking for phy than link
  * return with error (result value 0) if no phy/link was found
  * fix boolean mistake in wait for link: wait as long as we got
    phy register 1 has no link indication (BMSR != 0x24)
  * expand the 'first run' flag handling in ll_temac_init() in
    respect to possible error detection in xps_ll_temac_phy_ctrl()

Signed-off-by: Stephan Linz <l...@li-pro.net>
---
 drivers/net/xilinx_ll_temac.c |   52 ++++++++++++++++++++++++++++++-----------
 1 files changed, 38 insertions(+), 14 deletions(-)

diff --git a/drivers/net/xilinx_ll_temac.c b/drivers/net/xilinx_ll_temac.c
index 72a1632..ff93c1f 100644
--- a/drivers/net/xilinx_ll_temac.c
+++ b/drivers/net/xilinx_ll_temac.c
@@ -225,24 +225,21 @@ static void read_phy_reg (struct eth_device *dev, int 
phy_addr)
 #endif
 
 static int phy_addr = -1;
-static int link;
+static int link = 0;
 
 /* setting ll_temac and phy to proper setting */
 static int xps_ll_temac_phy_ctrl(struct eth_device *dev)
 {
-       int i;
+       int i, retries;
        unsigned int result;
-       unsigned retries = 10;
 
+        /* link is setup */
        if (link == 1)
-               return 1; /* link is setup */
-
-       /* wait for link up */
-       while (retries-- &&
-               ((xps_ll_temac_hostif_get(dev, 0, phy_addr, 1) & 0x24) == 0x24))
-               ;
+               return 1;
 
+       /* try out if have ever found the right phy? */
        if (phy_addr == -1) {
+               puts("Looking for phy ... ");
                for (i = 31; i >= 0; i--) {
                        result = xps_ll_temac_hostif_get(dev, 0, i, 1);
                        if ((result & 0x0ffff) != 0x0ffff) {
@@ -251,7 +248,27 @@ static int xps_ll_temac_phy_ctrl(struct eth_device *dev)
                                break;
                        }
                }
+
+               /* no success? -- wery bad */
+               if (phy_addr == -1) {
+                       puts("ERROR\n");
+                       return 0;
+               }
+               puts("OK\n");
+       }
+
+       /* wait for link up */
+       puts("Waiting for link ... ");
+       retries = 10;
+       while (retries-- &&
+               ((xps_ll_temac_hostif_get(dev, 0, phy_addr, 1) & 0x24) != 0x24))
+               ;
+
+       if (retries < 0) {
+               puts("ERROR\n");
+               return 0;
        }
+       puts("OK\n");
 
        /* get PHY id */
        i = (xps_ll_temac_hostif_get(dev, 0, phy_addr, 2) << 16) | \
@@ -275,19 +292,21 @@ static int xps_ll_temac_phy_ctrl(struct eth_device *dev)
                result = xps_ll_temac_hostif_get(dev, 0, phy_addr, 5);
                if ((result & 0x8000) == 0x8000) {
                        xps_ll_temac_indirect_set(dev, 0, EMMC, 0x80000000);
-                       printf("1000BASE-T/FD\n");
+                       puts("1000BASE-T/FD\n");
                        link = 1;
                } else if ((result & 0x4000) == 0x4000) {
                        xps_ll_temac_indirect_set(dev, 0, EMMC, 0x40000000);
-                       printf("100BASE-T/FD\n");
+                       puts("100BASE-T/FD\n");
                        link = 1;
                } else {
-                       printf("Unsupported mode\n");
+                       puts("Unsupported mode\n");
                        link = 0;
                        return 0;
                }
                return 1;
        }
+
+       puts("Unsupported PHY\n");
        return 0;
 }
 
@@ -491,7 +510,6 @@ static int ll_temac_init(struct eth_device *dev, bd_t *bis)
 #endif
        if (!first)
                return 0;
-       first = 0;
 
        xps_ll_temac_init(dev, bis);
 
@@ -502,7 +520,13 @@ static int ll_temac_init(struct eth_device *dev, bd_t *bis)
        for (i = 0; i < 32; i++)
                read_phy_reg(dev, i);
 #endif
-       xps_ll_temac_phy_ctrl(dev);
+
+       if (xps_ll_temac_phy_ctrl(dev) == 0) {
+               xps_ll_temac_halt(dev);
+               return -1;
+       }
+
+       first = 0;
        return 1;
 }
 
-- 
1.6.0.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to