diff options
Diffstat (limited to 'drivers/net')
| -rw-r--r-- | drivers/net/xilinx_emaclite.c | 84 | 
1 files changed, 47 insertions, 37 deletions
| diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index 74a201259..76af939e9 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -26,6 +26,7 @@  #include <common.h>  #include <net.h>  #include <config.h> +#include <malloc.h>  #include <asm/io.h>  #undef DEBUG @@ -63,26 +64,19 @@  #define XEL_RSR_RECV_IE_MASK		0x00000008UL  typedef struct { -	unsigned int baseaddress;	/* Base address for device (IPIF) */ -	unsigned int nexttxbuffertouse;	/* Next TX buffer to write to */ -	unsigned int nextrxbuffertouse;	/* Next RX buffer to read from */ -	unsigned char deviceid;		/* Unique ID of device - for future */ +	u32 baseaddress;	/* Base address for device (IPIF) */ +	u32 nexttxbuffertouse;	/* Next TX buffer to write to */ +	u32 nextrxbuffertouse;	/* Next RX buffer to read from */ +	uchar deviceid;		/* Unique ID of device - for future */  } xemaclite;  static xemaclite emaclite;  static u32 etherrxbuff[PKTSIZE_ALIGN/4]; /* Receive buffer */ -/* hardcoded MAC address for the Xilinx EMAC Core when env is nowhere*/ -#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) +static void xemaclite_alignedread (u32 *srcptr, void *destptr, u32 bytecount)  { -	unsigned int i; +	u32 i;  	u32 alignbuffer;  	u32 *to32ptr;  	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 *to32ptr = (u32 *) destptr;  	u32 *from32ptr; @@ -134,23 +128,16 @@ void xemaclite_alignedwrite (void *srcptr, u32 destptr, unsigned bytecount)  	*to32ptr++ = alignbuffer;  } -void eth_halt (void) +static void emaclite_halt(struct eth_device *dev)  {  	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");  	memset (&emaclite, 0, sizeof (xemaclite)); -	emaclite.baseaddress = XILINX_EMACLITE_BASEADDR; - -	if (!eth_getenv_enetaddr("ethaddr", enetaddr)) { -		memcpy(enetaddr, emacaddr, ENET_ADDR_LENGTH); -		eth_setenv_enetaddr("ethaddr", enetaddr); -	} +	emaclite.baseaddress = dev->iobase;  /*   * TX - TX_PING & TX_PONG initialization @@ -158,7 +145,7 @@ int eth_init (bd_t * bis)  	/* Restart PING TX */  	out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET, 0);  	/* Copy MAC address */ -	xemaclite_alignedwrite (enetaddr, +	xemaclite_alignedwrite (dev->enetaddr,  		emaclite.baseaddress, ENET_ADDR_LENGTH);  	/* Set the 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  	/* The same operation with PONG TX */  	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);  	out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH);  	out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET, @@ -194,7 +181,7 @@ int eth_init (bd_t * bis)  	return 0;  } -int xemaclite_txbufferavailable (xemaclite * instanceptr) +static int xemaclite_txbufferavailable (xemaclite *instanceptr)  {  	u32 reg;  	u32 txpingbusy; @@ -216,12 +203,12 @@ int xemaclite_txbufferavailable (xemaclite * instanceptr)  	return (!(txpingbusy && txpongbusy));  } -int eth_send (volatile void *ptr, int len) { - -	unsigned int reg; -	unsigned int baseaddress; +static int emaclite_send (struct eth_device *dev, volatile void *ptr, int len) +{ +	u32 reg; +	u32 baseaddress; -	unsigned maxtry = 1000; +	u32 maxtry = 1000;  	if (len > ENET_MAX_MTU)  		len = ENET_MAX_MTU; @@ -293,11 +280,11 @@ int eth_send (volatile void *ptr, int len) {  	return 0;  } -int eth_rx (void) +static int emaclite_recv(struct eth_device *dev)  { -	unsigned int length; -	unsigned int reg; -	unsigned int baseaddress; +	u32 length; +	u32 reg; +	u32 baseaddress;  	baseaddress = emaclite.baseaddress + emaclite.nextrxbuffertouse;  	reg = in_be32 (baseaddress + XEL_RSR_OFFSET); @@ -353,3 +340,26 @@ int eth_rx (void)  	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; +} |