net: Move Emaclite to NET_MULTI

Emaclite was using old net api that's why
this patch move emaclite to NET_MULTI api.

Signed-off-by: Michal Simek <monstr@monstr.eu>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
This commit is contained in:
Michal Simek 2010-10-11 11:41:47 +10:00 committed by Ben Warren
parent bf6cb247a5
commit 042272a6f2
2 changed files with 48 additions and 37 deletions

View file

@ -26,6 +26,7 @@
#include <common.h> #include <common.h>
#include <net.h> #include <net.h>
#include <config.h> #include <config.h>
#include <malloc.h>
#include <asm/io.h> #include <asm/io.h>
#undef DEBUG #undef DEBUG
@ -63,26 +64,19 @@
#define XEL_RSR_RECV_IE_MASK 0x00000008UL #define XEL_RSR_RECV_IE_MASK 0x00000008UL
typedef struct { typedef struct {
unsigned int baseaddress; /* Base address for device (IPIF) */ u32 baseaddress; /* Base address for device (IPIF) */
unsigned int nexttxbuffertouse; /* Next TX buffer to write to */ u32 nexttxbuffertouse; /* Next TX buffer to write to */
unsigned int nextrxbuffertouse; /* Next RX buffer to read from */ u32 nextrxbuffertouse; /* Next RX buffer to read from */
unsigned char deviceid; /* Unique ID of device - for future */ uchar deviceid; /* Unique ID of device - for future */
} xemaclite; } xemaclite;
static xemaclite emaclite; static xemaclite emaclite;
static u32 etherrxbuff[PKTSIZE_ALIGN/4]; /* Receive buffer */ static u32 etherrxbuff[PKTSIZE_ALIGN/4]; /* Receive buffer */
/* hardcoded MAC address for the Xilinx EMAC Core when env is nowhere*/ static void xemaclite_alignedread (u32 *srcptr, void *destptr, u32 bytecount)
#ifdef CONFIG_ENV_IS_NOWHERE
static u8 emacaddr[ENET_ADDR_LENGTH] = { 0x00, 0x0a, 0x35, 0x00, 0x22, 0x01 };
#else
static u8 emacaddr[ENET_ADDR_LENGTH];
#endif
void xemaclite_alignedread (u32 * srcptr, void *destptr, unsigned bytecount)
{ {
unsigned int i; u32 i;
u32 alignbuffer; u32 alignbuffer;
u32 *to32ptr; u32 *to32ptr;
u32 *from32ptr; u32 *from32ptr;
@ -107,9 +101,9 @@ void xemaclite_alignedread (u32 * srcptr, void *destptr, unsigned bytecount)
} }
} }
void xemaclite_alignedwrite (void *srcptr, u32 destptr, unsigned bytecount) static void xemaclite_alignedwrite (void *srcptr, u32 destptr, u32 bytecount)
{ {
unsigned i; u32 i;
u32 alignbuffer; u32 alignbuffer;
u32 *to32ptr = (u32 *) destptr; u32 *to32ptr = (u32 *) destptr;
u32 *from32ptr; u32 *from32ptr;
@ -134,23 +128,16 @@ void xemaclite_alignedwrite (void *srcptr, u32 destptr, unsigned bytecount)
*to32ptr++ = alignbuffer; *to32ptr++ = alignbuffer;
} }
void eth_halt (void) static void emaclite_halt(struct eth_device *dev)
{ {
debug ("eth_halt\n"); debug ("eth_halt\n");
} }
int eth_init (bd_t * bis) static int emaclite_init(struct eth_device *dev, bd_t *bis)
{ {
uchar enetaddr[6];
debug ("EmacLite Initialization Started\n"); debug ("EmacLite Initialization Started\n");
memset (&emaclite, 0, sizeof (xemaclite)); memset (&emaclite, 0, sizeof (xemaclite));
emaclite.baseaddress = XILINX_EMACLITE_BASEADDR; emaclite.baseaddress = dev->iobase;
if (!eth_getenv_enetaddr("ethaddr", enetaddr)) {
memcpy(enetaddr, emacaddr, ENET_ADDR_LENGTH);
eth_setenv_enetaddr("ethaddr", enetaddr);
}
/* /*
* TX - TX_PING & TX_PONG initialization * TX - TX_PING & TX_PONG initialization
@ -158,7 +145,7 @@ int eth_init (bd_t * bis)
/* Restart PING TX */ /* Restart PING TX */
out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET, 0); out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET, 0);
/* Copy MAC address */ /* Copy MAC address */
xemaclite_alignedwrite (enetaddr, xemaclite_alignedwrite (dev->enetaddr,
emaclite.baseaddress, ENET_ADDR_LENGTH); emaclite.baseaddress, ENET_ADDR_LENGTH);
/* Set the length */ /* Set the length */
out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH); out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH);
@ -171,7 +158,7 @@ int eth_init (bd_t * bis)
#ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG #ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG
/* The same operation with PONG TX */ /* The same operation with PONG TX */
out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET, 0); out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET, 0);
xemaclite_alignedwrite (enetaddr, emaclite.baseaddress + xemaclite_alignedwrite (dev->enetaddr, emaclite.baseaddress +
XEL_BUFFER_OFFSET, ENET_ADDR_LENGTH); XEL_BUFFER_OFFSET, ENET_ADDR_LENGTH);
out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH); out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH);
out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET, out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET,
@ -194,7 +181,7 @@ int eth_init (bd_t * bis)
return 0; return 0;
} }
int xemaclite_txbufferavailable (xemaclite * instanceptr) static int xemaclite_txbufferavailable (xemaclite *instanceptr)
{ {
u32 reg; u32 reg;
u32 txpingbusy; u32 txpingbusy;
@ -216,12 +203,12 @@ int xemaclite_txbufferavailable (xemaclite * instanceptr)
return (!(txpingbusy && txpongbusy)); return (!(txpingbusy && txpongbusy));
} }
int eth_send (volatile void *ptr, int len) { static int emaclite_send (struct eth_device *dev, volatile void *ptr, int len)
{
u32 reg;
u32 baseaddress;
unsigned int reg; u32 maxtry = 1000;
unsigned int baseaddress;
unsigned maxtry = 1000;
if (len > ENET_MAX_MTU) if (len > ENET_MAX_MTU)
len = ENET_MAX_MTU; len = ENET_MAX_MTU;
@ -293,11 +280,11 @@ int eth_send (volatile void *ptr, int len) {
return 0; return 0;
} }
int eth_rx (void) static int emaclite_recv(struct eth_device *dev)
{ {
unsigned int length; u32 length;
unsigned int reg; u32 reg;
unsigned int baseaddress; u32 baseaddress;
baseaddress = emaclite.baseaddress + emaclite.nextrxbuffertouse; baseaddress = emaclite.baseaddress + emaclite.nextrxbuffertouse;
reg = in_be32 (baseaddress + XEL_RSR_OFFSET); reg = in_be32 (baseaddress + XEL_RSR_OFFSET);
@ -353,3 +340,26 @@ int eth_rx (void)
return 1; return 1;
} }
int xilinx_emaclite_initialize (bd_t *bis, int base_addr)
{
struct eth_device *dev;
dev = malloc(sizeof(*dev));
if (dev == NULL)
hang();
memset(dev, 0, sizeof(*dev));
sprintf(dev->name, "Xilinx_Emaclite");
dev->iobase = base_addr;
dev->priv = 0;
dev->init = emaclite_init;
dev->halt = emaclite_halt;
dev->send = emaclite_send;
dev->recv = emaclite_recv;
eth_register(dev);
return 0;
}

View file

@ -89,6 +89,7 @@ int smc91111_initialize(u8 dev_num, int base_addr);
int tsi108_eth_initialize(bd_t *bis); int tsi108_eth_initialize(bd_t *bis);
int uec_standard_init(bd_t *bis); int uec_standard_init(bd_t *bis);
int uli526x_initialize(bd_t *bis); int uli526x_initialize(bd_t *bis);
int xilinx_emaclite_initialize (bd_t *bis, int base_addr);
int sh_eth_initialize(bd_t *bis); int sh_eth_initialize(bd_t *bis);
int dm9000_initialize(bd_t *bis); int dm9000_initialize(bd_t *bis);