X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=drivers%2Fnet%2Fxilinx_emaclite.c;h=0820daa2bb8284d0ac7a304813262d79801f5687;hb=8339ad737316cda3d6246ea6be52e9f78bb63cc4;hp=5d8eaa518239f97024df2abe50a57f0247019f74;hpb=9c73f4b81172bc9f1b8f132450e69bcfb5b960ca;p=u-boot diff --git a/drivers/net/xilinx_emaclite.c b/drivers/net/xilinx_emaclite.c index 5d8eaa5182..0820daa2bb 100644 --- a/drivers/net/xilinx_emaclite.c +++ b/drivers/net/xilinx_emaclite.c @@ -1,5 +1,6 @@ /* - * (C) Copyright 2007 Michal Simek + * (C) Copyright 2007-2009 Michal Simek + * (C) Copyright 2003 Xilinx Inc. * * Michal SIMEK * @@ -13,7 +14,7 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License @@ -27,8 +28,6 @@ #include #include -#ifdef XILINX_EMACLITE_BASEADDR - #undef DEBUG #define ENET_MAX_MTU PKTSIZE @@ -72,11 +71,13 @@ typedef struct { static xemaclite emaclite; -static char 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*/ -#ifdef CFG_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) @@ -135,21 +136,20 @@ void xemaclite_alignedwrite (void *srcptr, u32 destptr, unsigned bytecount) void eth_halt (void) { -#ifdef DEBUG - puts ("eth_halt\n"); -#endif + debug ("eth_halt\n"); } int eth_init (bd_t * bis) { -#ifdef DEBUG - puts ("EmacLite Initialization Started\n"); -#endif + uchar enetaddr[6]; + + debug ("EmacLite Initialization Started\n"); memset (&emaclite, 0, sizeof (xemaclite)); emaclite.baseaddress = XILINX_EMACLITE_BASEADDR; - if (!getenv("ethaddr")) { - memcpy(bis->bi_enetaddr, emacaddr, ENET_ADDR_LENGTH); + if (!eth_getenv_enetaddr("ethaddr", enetaddr)) { + memcpy(enetaddr, emacaddr, ENET_ADDR_LENGTH); + eth_setenv_enetaddr("ethaddr", enetaddr); } /* @@ -158,7 +158,7 @@ int eth_init (bd_t * bis) /* Restart PING TX */ out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET, 0); /* Copy MAC address */ - xemaclite_alignedwrite (bis->bi_enetaddr, + xemaclite_alignedwrite (enetaddr, emaclite.baseaddress, ENET_ADDR_LENGTH); /* Set the length */ out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH); @@ -168,16 +168,16 @@ int eth_init (bd_t * bis) while ((in_be32 (emaclite.baseaddress + XEL_TSR_OFFSET) & XEL_TSR_PROG_MAC_ADDR) != 0) ; -#ifdef XILINX_EMACLITE_TX_PING_PONG +#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 (bis->bi_enetaddr, emaclite.baseaddress + + xemaclite_alignedwrite (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, XEL_TSR_PROG_MAC_ADDR); while ((in_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + - XEL_BUFFER_OFFSET) & XEL_TSR_PROG_MAC_ADDR) != 0) ; + XEL_BUFFER_OFFSET) & XEL_TSR_PROG_MAC_ADDR) != 0) ; #endif /* @@ -185,14 +185,12 @@ int eth_init (bd_t * bis) */ /* Write out the value to flush the RX buffer */ out_be32 (emaclite.baseaddress + XEL_RSR_OFFSET, XEL_RSR_RECV_IE_MASK); -#ifdef XILINX_EMACLITE_RX_PING_PONG +#ifdef CONFIG_XILINX_EMACLITE_RX_PING_PONG out_be32 (emaclite.baseaddress + XEL_RSR_OFFSET + XEL_BUFFER_OFFSET, XEL_RSR_RECV_IE_MASK); #endif -#ifdef DEBUG - puts ("EmacLite Initialization complete\n"); -#endif + debug ("EmacLite Initialization complete\n"); return 0; } @@ -237,7 +235,7 @@ int eth_send (volatile void *ptr, int len) { printf ("Error: Timeout waiting for ethernet TX buffer\n"); /* Restart PING TX */ out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET, 0); -#ifdef XILINX_EMACLITE_TX_PING_PONG +#ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET, 0); #endif @@ -253,12 +251,10 @@ int eth_send (volatile void *ptr, int len) { && ((in_be32 ((baseaddress) + XEL_TSR_OFFSET) & XEL_TSR_XMIT_ACTIVE_MASK) == 0)) { -#ifdef XILINX_EMACLITE_TX_PING_PONG +#ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG emaclite.nexttxbuffertouse ^= XEL_BUFFER_OFFSET; #endif -#ifdef DEBUG - printf ("Send packet from 0x%x\n", baseaddress); -#endif + debug ("Send packet from 0x%x\n", baseaddress); /* Write the frame to the buffer */ xemaclite_alignedwrite ((void *) ptr, baseaddress, len); out_be32 (baseaddress + XEL_TPLR_OFFSET,(len & @@ -271,7 +267,7 @@ int eth_send (volatile void *ptr, int len) { out_be32 (baseaddress + XEL_TSR_OFFSET, reg); return 1; } -#ifdef XILINX_EMACLITE_TX_PING_PONG +#ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG /* Switch to second buffer */ baseaddress ^= XEL_BUFFER_OFFSET; /* Determine if the expected buffer address is empty */ @@ -279,9 +275,7 @@ int eth_send (volatile void *ptr, int len) { if (((reg & XEL_TSR_XMIT_BUSY_MASK) == 0) && ((in_be32 ((baseaddress) + XEL_TSR_OFFSET) & XEL_TSR_XMIT_ACTIVE_MASK) == 0)) { -#ifdef DEBUG - printf ("Send packet from 0x%x\n", baseaddress); -#endif + debug ("Send packet from 0x%x\n", baseaddress); /* Write the frame to the buffer */ xemaclite_alignedwrite ((void *) ptr, baseaddress, len); out_be32 (baseaddress + XEL_TPLR_OFFSET,(len & @@ -307,28 +301,22 @@ int eth_rx (void) baseaddress = emaclite.baseaddress + emaclite.nextrxbuffertouse; reg = in_be32 (baseaddress + XEL_RSR_OFFSET); -#ifdef DEBUG - printf ("Testing data at address 0x%x\n", baseaddress); -#endif + debug ("Testing data at address 0x%x\n", baseaddress); if ((reg & XEL_RSR_RECV_DONE_MASK) == XEL_RSR_RECV_DONE_MASK) { -#ifdef XILINX_EMACLITE_RX_PING_PONG +#ifdef CONFIG_XILINX_EMACLITE_RX_PING_PONG emaclite.nextrxbuffertouse ^= XEL_BUFFER_OFFSET; #endif } else { -#ifndef XILINX_EMACLITE_RX_PING_PONG -#ifdef DEBUG - printf ("No data was available - address 0x%x\n", baseaddress); -#endif +#ifndef CONFIG_XILINX_EMACLITE_RX_PING_PONG + debug ("No data was available - address 0x%x\n", baseaddress); return 0; #else baseaddress ^= XEL_BUFFER_OFFSET; reg = in_be32 (baseaddress + XEL_RSR_OFFSET); if ((reg & XEL_RSR_RECV_DONE_MASK) != XEL_RSR_RECV_DONE_MASK) { -#ifdef DEBUG - printf ("No data was available - address 0x%x\n", + debug ("No data was available - address 0x%x\n", baseaddress); -#endif return 0; } #endif @@ -338,22 +326,16 @@ int eth_rx (void) 0xFFFF0000 ) >> 16) { case 0x806: length = 42 + 20; /* FIXME size of ARP */ -#ifdef DEBUG - puts ("ARP Packet\n"); -#endif + debug ("ARP Packet\n"); break; case 0x800: length = 14 + 14 + (((in_be32 (baseaddress + XEL_RXBUFF_OFFSET + 0x10)) & 0xFFFF0000) >> 16); /* FIXME size of IP packet */ -#ifdef DEBUG - puts("IP Packet\n"); -#endif + debug ("IP Packet\n"); break; default: -#ifdef DEBUG - puts("Other Packet\n"); -#endif + debug ("Other Packet\n"); length = ENET_MAX_MTU; break; } @@ -366,11 +348,8 @@ int eth_rx (void) reg &= ~XEL_RSR_RECV_DONE_MASK; out_be32 (baseaddress + XEL_RSR_OFFSET, reg); -#ifdef DEBUG - printf ("Packet receive from 0x%x, length %dB\n", baseaddress, length); -#endif + debug ("Packet receive from 0x%x, length %dB\n", baseaddress, length); NetReceive ((uchar *) etherrxbuff, length); return 1; } -#endif