|
@@ -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;
|