]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
net/designware: Try configuring phy on each dw_eth_init
authorVipin Kumar <vipin.kumar@st.com>
Mon, 26 Mar 2012 00:09:56 +0000 (00:09 +0000)
committerJoe Hershberger <joe.hershberger@ni.com>
Wed, 4 Apr 2012 15:47:21 +0000 (10:47 -0500)
Phy autonegotiation works only when the ethernet cable is plugged in.
Since the phy was configured only at the init time, a plugged in cable
was necessary to initialize the phy properly.

This patch keeps a flag to check if the phy initialization has
succeeded, and calls configure_phy routine at every init if this flag
reports otherwise.

Signed-off-by: Vipin Kumar <vipin.kumar@st.com>
Signed-off-by: Amit Virdi <amit.virdi@st.com>
drivers/net/designware.c
drivers/net/designware.h

index 933032cfdef56b08300b4c88141e4e1a7a745d45..ebb1fff805ebed7b4c8c3d976ee395c3b4a938a5 100644 (file)
@@ -32,6 +32,8 @@
 #include <asm/io.h>
 #include "designware.h"
 
+static int configure_phy(struct eth_device *dev);
+
 static void tx_descs_init(struct eth_device *dev)
 {
        struct dw_eth_dev *priv = dev->priv;
@@ -144,6 +146,9 @@ static int dw_eth_init(struct eth_device *dev, bd_t *bis)
        struct eth_dma_regs *dma_p = priv->dma_regs_p;
        u32 conf;
 
+       if (priv->phy_configured != 1)
+               configure_phy(dev);
+
        /* Reset ethernet hardware */
        if (mac_reset(dev) < 0)
                return -1;
@@ -422,23 +427,26 @@ static int configure_phy(struct eth_device *dev)
        eth_mdio_read(dev, phy_addr, MII_LPA, &anlpar);
        eth_mdio_read(dev, phy_addr, MII_STAT1000, &btsr);
 
-       if (btsr & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD)) {
-               priv->speed = SPEED_1000M;
-               if (btsr & PHY_1000BTSR_1000FD)
-                       priv->duplex = FULL_DUPLEX;
-               else
-                       priv->duplex = HALF_DUPLEX;
-       } else {
-               if (anlpar & LPA_100)
-                       priv->speed = SPEED_100M;
-               else
-                       priv->speed = SPEED_10M;
-
-               if (anlpar & (LPA_10FULL | LPA_100FULL))
-                       priv->duplex = FULL_DUPLEX;
-               else
-                       priv->duplex = HALF_DUPLEX;
-       }
+       if (bmsr & BMSR_ANEGCOMPLETE) {
+               if (btsr & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD)) {
+                       priv->speed = SPEED_1000M;
+                       if (btsr & PHY_1000BTSR_1000FD)
+                               priv->duplex = FULL_DUPLEX;
+                       else
+                               priv->duplex = HALF_DUPLEX;
+               } else {
+                       if (anlpar & LPA_100)
+                               priv->speed = SPEED_100M;
+                       else
+                               priv->speed = SPEED_10M;
+
+                       if (anlpar & (LPA_10FULL | LPA_100FULL))
+                               priv->duplex = FULL_DUPLEX;
+                       else
+                               priv->duplex = HALF_DUPLEX;
+               }
+       } else
+               return -1;
 #else
        if (eth_mdio_read(dev, phy_addr, MII_BMCR, &ctrl) < 0)
                return -1;
@@ -455,6 +463,8 @@ static int configure_phy(struct eth_device *dev)
        else
                priv->speed = SPEED_10M;
 #endif
+       priv->phy_configured = 1;
+
        return 0;
 }
 
@@ -515,14 +525,12 @@ int designware_initialize(u32 id, ulong base_addr, u32 phy_addr)
        priv->dma_regs_p = (struct eth_dma_regs *)(base_addr +
                        DW_DMA_BASE_OFFSET);
        priv->address = phy_addr;
+       priv->phy_configured = 0;
 
        if (mac_reset(dev) < 0)
                return -1;
 
-       if (configure_phy(dev) < 0) {
-               printf("Phy could not be configured\n");
-               return -1;
-       }
+       configure_phy(dev);
 
        dev->init = dw_eth_init;
        dev->send = dw_eth_send;
index 42133b3310d8d9a953c2dd9f598c454e75e94dfe..abf729d57dd42e227649cef39c79840ab854506f 100644 (file)
@@ -238,6 +238,7 @@ struct dw_eth_dev {
        u32 duplex;
        u32 tx_currdescnum;
        u32 rx_currdescnum;
+       u32 phy_configured;
        u32 padding;
 
        struct dmamacdescr tx_mac_descrtable[CONFIG_TX_DESCR_NUM];