summaryrefslogtreecommitdiff
path: root/drivers/net/mpc512x_fec.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/mpc512x_fec.c')
-rw-r--r--drivers/net/mpc512x_fec.c65
1 files changed, 52 insertions, 13 deletions
diff --git a/drivers/net/mpc512x_fec.c b/drivers/net/mpc512x_fec.c
index 7078c4ef77..dd461307be 100644
--- a/drivers/net/mpc512x_fec.c
+++ b/drivers/net/mpc512x_fec.c
@@ -9,6 +9,7 @@
#include <common.h>
#include <mpc512x.h>
#include <malloc.h>
+#include <asm/io.h>
#include <net.h>
#include <netdev.h>
#include <miiphy.h>
@@ -17,6 +18,8 @@
DECLARE_GLOBAL_DATA_PTR;
#define DEBUG 0
+#define CURFEC_ADDR(devname) ((devname[3]=='2') ? \
+ (MPC512X_FEC + 0x2000) : MPC512X_FEC)
#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) && \
defined(CONFIG_MPC512x_FEC)
@@ -41,13 +44,18 @@ static int rx_buff_idx = 0;
static void mpc512x_fec_phydump (char *devname)
{
uint16 phyStatus, i;
+#ifdef CONFIG_ADS5125
+ uint8 phyAddr = ((devname[3]=='2') ? CONFIG_PHY2_ADDR : CONFIG_PHY_ADDR);
+#else
uint8 phyAddr = CONFIG_PHY_ADDR;
+#endif
uint8 reg_mask[] = {
/* regs to print: 0...8, 21,27,31 */
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1,
};
+ printf("Dump of %s at addr %2x\n", devname, phyAddr);
for (i = 0; i < 32; i++) {
if (reg_mask[i]) {
miiphy_read (devname, phyAddr, i, &phyStatus);
@@ -223,7 +231,7 @@ static int mpc512x_fec_init (struct eth_device *dev, bd_t * bis)
mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
#if (DEBUG & 0x1)
- printf ("mpc512x_fec_init... Begin\n");
+ printf ("mpc512x_fec_init... with eth_device %s Begin\n", dev->name);
#endif
/* Set interrupt mask register */
@@ -239,7 +247,12 @@ static int mpc512x_fec_init (struct eth_device *dev, bd_t * bis)
fec->eth->op_pause = 0x00010020;
/* Frame length=1522; MII mode */
+#ifdef CONFIG_ADS5125
+ /* RMII Mode */
+ fec->eth->r_cntrl = (FEC_MAX_FRAME_LEN << 16) | 0x124;
+#else
fec->eth->r_cntrl = (FEC_MAX_FRAME_LEN << 16) | 0x24;
+#endif
/* Half-duplex, heartbeat disabled */
fec->eth->x_cntrl = 0x00000000;
@@ -277,12 +290,16 @@ static int mpc512x_fec_init (struct eth_device *dev, bd_t * bis)
int mpc512x_fec_init_phy (struct eth_device *dev, bd_t * bis)
{
mpc512x_fec_priv *fec = (mpc512x_fec_priv *)dev->priv;
- const uint8 phyAddr = CONFIG_PHY_ADDR; /* Only one PHY */
+#ifdef CONFIG_ADS5125
+ const uint8 phyAddr = ((dev->name[3]=='2') ? CONFIG_PHY2_ADDR : CONFIG_PHY_ADDR);
+#else
+ const uint8 phyAddr = CONFIG_PHY_ADDR;
+#endif
int timeout = 1;
uint16 phyStatus;
#if (DEBUG & 0x1)
- printf ("mpc512x_fec_init_phy... Begin\n");
+ printf ("mpc512x_fec_init_phy... with dev %s Begin\n", dev->name);
#endif
/*
@@ -407,6 +424,7 @@ static void mpc512x_fec_halt (struct eth_device *dev)
int counter = 0xffff;
#if (DEBUG & 0x2)
+ printf("In FEC Halt with device %s\n", dev->name);
if (fec->xcv_type != SEVENWIRE)
mpc512x_fec_phydump (dev->name);
#endif
@@ -458,7 +476,7 @@ static int mpc512x_fec_send (struct eth_device *dev, volatile void *eth_data,
volatile FEC_TBD *pTbd;
#if (DEBUG & 0x20)
- printf("tbd status: 0x%04x\n", fec->tbdBase[fec->tbdIndex].status);
+ printf("%s tbd status: 0x%04x\n", dev->name, fec->bdBase->tbd[fec->tbdIndex].status);
#endif
/*
@@ -608,14 +626,23 @@ int mpc512x_fec_initialize (bd_t * bis)
mpc512x_fec_priv *fec;
struct eth_device *dev;
int i;
+ char *memaddr;
char *tmp, *end, env_enetaddr[6];
void * bd;
+#ifdef CONFIG_ADS5125 /* 2nd RMII ethernet */
+ char *act = getenv("ethact");
+ memaddr = (char *)MPC512X_FEC;
+ if (act[3] == '2')
+ memaddr += 0x2000;
+#else
+ memaddr = (char *)MPC512X_FEC;
+#endif
fec = (mpc512x_fec_priv *) malloc (sizeof(*fec));
dev = (struct eth_device *) malloc (sizeof(*dev));
memset (dev, 0, sizeof *dev);
- fec->eth = (ethernet_regs *) MPC512X_FEC;
+ fec->eth = (ethernet_regs *) memaddr;
# ifndef CONFIG_FEC_10MBIT
fec->xcv_type = MII100;
@@ -623,13 +650,17 @@ int mpc512x_fec_initialize (bd_t * bis)
fec->xcv_type = MII10;
# endif
dev->priv = (void *)fec;
- dev->iobase = MPC512X_FEC;
+ dev->iobase = (int)memaddr;
dev->init = mpc512x_fec_init;
dev->halt = mpc512x_fec_halt;
dev->send = mpc512x_fec_send;
dev->recv = mpc512x_fec_recv;
sprintf (dev->name, "FEC ETHERNET");
+#ifdef CONFIG_ADS5125
+ if (memaddr != (char *)MPC512X_FEC)
+ sprintf (dev->name, "FEC2 ETHERNET");
+#endif
eth_register (dev);
#if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
@@ -638,7 +669,7 @@ int mpc512x_fec_initialize (bd_t * bis)
#endif
/* Clean up space FEC's MIB and FIFO RAM ...*/
- memset ((void *) MPC512X_FEC + 0x200, 0x00, 0x400);
+ memset ((void *) memaddr + 0x200, 0x00, 0x400);
/*
* Malloc space for BDs (must be quad word-aligned)
@@ -658,18 +689,26 @@ int mpc512x_fec_initialize (bd_t * bis)
*/
fec->eth->ievent = 0xffffffff;
+ /* rmii mode */
+ fec->eth->r_cntrl = (FEC_MAX_FRAME_LEN << 16) | 0x124;
+
/*
* Try to set the mac address now. The fec mac address is
* a garbage after reset. When not using fec for booting
* the Linux fec driver will try to work with this garbage.
*/
tmp = getenv ("ethaddr");
+
+ if(!tmp)
+ tmp = "AA:BB:CC:DD:EE:FF"; // fixme
+
if (tmp) {
for (i=0; i<6; i++) {
env_enetaddr[i] = tmp ? simple_strtoul (tmp, &end, 16) : 0;
if (tmp)
tmp = (*end) ? end+1 : end;
}
+
mpc512x_fec_set_hwaddr (fec, env_enetaddr);
fec->eth->gaddr1 = 0x00000000;
fec->eth->gaddr2 = 0x00000000;
@@ -684,7 +723,7 @@ int mpc512x_fec_initialize (bd_t * bis)
/********************************************************************/
int fec512x_miiphy_read (char *devname, uint8 phyAddr, uint8 regAddr, uint16 * retVal)
{
- ethernet_regs *eth = (ethernet_regs *) MPC512X_FEC;
+ ethernet_regs *eth = (ethernet_regs *) CURFEC_ADDR(devname);
uint32 reg; /* convenient holder for the PHY register */
uint32 phy; /* convenient holder for the PHY */
int timeout = 0xffff;
@@ -705,7 +744,7 @@ int fec512x_miiphy_read (char *devname, uint8 phyAddr, uint8 regAddr, uint16 * r
if (timeout == 0) {
#if (DEBUG & 0x2)
- printf ("Read MDIO failed...\n");
+ printf ("Read MDIO addr %x failed (%s)...\n", phyAddr, devname);
#endif
return -1;
}
@@ -726,7 +765,7 @@ int fec512x_miiphy_read (char *devname, uint8 phyAddr, uint8 regAddr, uint16 * r
/********************************************************************/
int fec512x_miiphy_write (char *devname, uint8 phyAddr, uint8 regAddr, uint16 data)
{
- ethernet_regs *eth = (ethernet_regs *) MPC512X_FEC;
+ ethernet_regs *eth = (ethernet_regs *) CURFEC_ADDR(devname);
uint32 reg; /* convenient holder for the PHY register */
uint32 phy; /* convenient holder for the PHY */
int timeout = 0xffff;
@@ -744,7 +783,7 @@ int fec512x_miiphy_write (char *devname, uint8 phyAddr, uint8 regAddr, uint16 da
if (timeout == 0) {
#if (DEBUG & 0x2)
- printf ("Write MDIO failed...\n");
+ printf ("Write MDIO failed (%s)...\n", devname);
#endif
return -1;
}