189c53891SMichal Simek /****************************************************************************** 289c53891SMichal Simek * 389c53891SMichal Simek * XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" 489c53891SMichal Simek * AS A COURTESY TO YOU, SOLELY FOR USE IN DEVELOPING PROGRAMS AND 589c53891SMichal Simek * SOLUTIONS FOR XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, 689c53891SMichal Simek * OR INFORMATION AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, 789c53891SMichal Simek * APPLICATION OR STANDARD, XILINX IS MAKING NO REPRESENTATION 889c53891SMichal Simek * THAT THIS IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, 989c53891SMichal Simek * AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE 1089c53891SMichal Simek * FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY 1189c53891SMichal Simek * WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE 1289c53891SMichal Simek * IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR 1389c53891SMichal Simek * REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF 1489c53891SMichal Simek * INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 1589c53891SMichal Simek * FOR A PARTICULAR PURPOSE. 1689c53891SMichal Simek * 1789c53891SMichal Simek * (C) Copyright 2007-2008 Michal Simek 1889c53891SMichal Simek * Michal SIMEK <monstr@monstr.eu> 1989c53891SMichal Simek * 2089c53891SMichal Simek * (c) Copyright 2003 Xilinx Inc. 2189c53891SMichal Simek * All rights reserved. 2289c53891SMichal Simek * 2389c53891SMichal Simek ******************************************************************************/ 2489c53891SMichal Simek 2589c53891SMichal Simek #include <common.h> 2689c53891SMichal Simek #include <net.h> 2789c53891SMichal Simek #include <config.h> 2889c53891SMichal Simek #include <asm/io.h> 2989c53891SMichal Simek 3089c53891SMichal Simek #undef DEBUG 3189c53891SMichal Simek 3289c53891SMichal Simek #define ENET_MAX_MTU PKTSIZE 3389c53891SMichal Simek #define ENET_MAX_MTU_ALIGNED PKTSIZE_ALIGN 3489c53891SMichal Simek #define ENET_ADDR_LENGTH 6 3589c53891SMichal Simek 3689c53891SMichal Simek /* EmacLite constants */ 3789c53891SMichal Simek #define XEL_BUFFER_OFFSET 0x0800 /* Next buffer's offset */ 3889c53891SMichal Simek #define XEL_TPLR_OFFSET 0x07F4 /* Tx packet length */ 3989c53891SMichal Simek #define XEL_TSR_OFFSET 0x07FC /* Tx status */ 4089c53891SMichal Simek #define XEL_RSR_OFFSET 0x17FC /* Rx status */ 4189c53891SMichal Simek #define XEL_RXBUFF_OFFSET 0x1000 /* Receive Buffer */ 4289c53891SMichal Simek 4389c53891SMichal Simek /* Xmit complete */ 4489c53891SMichal Simek #define XEL_TSR_XMIT_BUSY_MASK 0x00000001UL 4589c53891SMichal Simek /* Xmit interrupt enable bit */ 4689c53891SMichal Simek #define XEL_TSR_XMIT_IE_MASK 0x00000008UL 4789c53891SMichal Simek /* Buffer is active, SW bit only */ 4889c53891SMichal Simek #define XEL_TSR_XMIT_ACTIVE_MASK 0x80000000UL 4989c53891SMichal Simek /* Program the MAC address */ 5089c53891SMichal Simek #define XEL_TSR_PROGRAM_MASK 0x00000002UL 5189c53891SMichal Simek /* define for programming the MAC address into the EMAC Lite */ 5289c53891SMichal Simek #define XEL_TSR_PROG_MAC_ADDR (XEL_TSR_XMIT_BUSY_MASK | XEL_TSR_PROGRAM_MASK) 5389c53891SMichal Simek 5489c53891SMichal Simek /* Transmit packet length upper byte */ 5589c53891SMichal Simek #define XEL_TPLR_LENGTH_MASK_HI 0x0000FF00UL 5689c53891SMichal Simek /* Transmit packet length lower byte */ 5789c53891SMichal Simek #define XEL_TPLR_LENGTH_MASK_LO 0x000000FFUL 5889c53891SMichal Simek 5989c53891SMichal Simek /* Recv complete */ 6089c53891SMichal Simek #define XEL_RSR_RECV_DONE_MASK 0x00000001UL 6189c53891SMichal Simek /* Recv interrupt enable bit */ 6289c53891SMichal Simek #define XEL_RSR_RECV_IE_MASK 0x00000008UL 6389c53891SMichal Simek 6489c53891SMichal Simek typedef struct { 6589c53891SMichal Simek unsigned int baseaddress; /* Base address for device (IPIF) */ 6689c53891SMichal Simek unsigned int nexttxbuffertouse; /* Next TX buffer to write to */ 6789c53891SMichal Simek unsigned int nextrxbuffertouse; /* Next RX buffer to read from */ 6889c53891SMichal Simek unsigned char deviceid; /* Unique ID of device - for future */ 6989c53891SMichal Simek } xemaclite; 7089c53891SMichal Simek 7189c53891SMichal Simek static xemaclite emaclite; 7289c53891SMichal Simek 73f2a7806fSClive Stubbings static u32 etherrxbuff[PKTSIZE_ALIGN/4]; /* Receive buffer */ 7489c53891SMichal Simek 7589c53891SMichal Simek /* hardcoded MAC address for the Xilinx EMAC Core when env is nowhere*/ 7693f6d725SJean-Christophe PLAGNIOL-VILLARD #ifdef CONFIG_ENV_IS_NOWHERE 7789c53891SMichal Simek static u8 emacaddr[ENET_ADDR_LENGTH] = { 0x00, 0x0a, 0x35, 0x00, 0x22, 0x01 }; 7889c53891SMichal Simek #else 7989c53891SMichal Simek static u8 emacaddr[ENET_ADDR_LENGTH]; 8089c53891SMichal Simek #endif 8189c53891SMichal Simek 8289c53891SMichal Simek void xemaclite_alignedread (u32 * srcptr, void *destptr, unsigned bytecount) 8389c53891SMichal Simek { 8489c53891SMichal Simek unsigned int i; 8589c53891SMichal Simek u32 alignbuffer; 8689c53891SMichal Simek u32 *to32ptr; 8789c53891SMichal Simek u32 *from32ptr; 8889c53891SMichal Simek u8 *to8ptr; 8989c53891SMichal Simek u8 *from8ptr; 9089c53891SMichal Simek 9189c53891SMichal Simek from32ptr = (u32 *) srcptr; 9289c53891SMichal Simek 9389c53891SMichal Simek /* Word aligned buffer, no correction needed. */ 9489c53891SMichal Simek to32ptr = (u32 *) destptr; 9589c53891SMichal Simek while (bytecount > 3) { 9689c53891SMichal Simek *to32ptr++ = *from32ptr++; 9789c53891SMichal Simek bytecount -= 4; 9889c53891SMichal Simek } 9989c53891SMichal Simek to8ptr = (u8 *) to32ptr; 10089c53891SMichal Simek 10189c53891SMichal Simek alignbuffer = *from32ptr++; 10289c53891SMichal Simek from8ptr = (u8 *) & alignbuffer; 10389c53891SMichal Simek 10489c53891SMichal Simek for (i = 0; i < bytecount; i++) { 10589c53891SMichal Simek *to8ptr++ = *from8ptr++; 10689c53891SMichal Simek } 10789c53891SMichal Simek } 10889c53891SMichal Simek 10989c53891SMichal Simek void xemaclite_alignedwrite (void *srcptr, u32 destptr, unsigned bytecount) 11089c53891SMichal Simek { 11189c53891SMichal Simek unsigned i; 11289c53891SMichal Simek u32 alignbuffer; 11389c53891SMichal Simek u32 *to32ptr = (u32 *) destptr; 11489c53891SMichal Simek u32 *from32ptr; 11589c53891SMichal Simek u8 *to8ptr; 11689c53891SMichal Simek u8 *from8ptr; 11789c53891SMichal Simek 11889c53891SMichal Simek from32ptr = (u32 *) srcptr; 11989c53891SMichal Simek while (bytecount > 3) { 12089c53891SMichal Simek 12189c53891SMichal Simek *to32ptr++ = *from32ptr++; 12289c53891SMichal Simek bytecount -= 4; 12389c53891SMichal Simek } 12489c53891SMichal Simek 12589c53891SMichal Simek alignbuffer = 0; 12689c53891SMichal Simek to8ptr = (u8 *) & alignbuffer; 12789c53891SMichal Simek from8ptr = (u8 *) from32ptr; 12889c53891SMichal Simek 12989c53891SMichal Simek for (i = 0; i < bytecount; i++) { 13089c53891SMichal Simek *to8ptr++ = *from8ptr++; 13189c53891SMichal Simek } 13289c53891SMichal Simek 13389c53891SMichal Simek *to32ptr++ = alignbuffer; 13489c53891SMichal Simek } 13589c53891SMichal Simek 13689c53891SMichal Simek void eth_halt (void) 13789c53891SMichal Simek { 13889c53891SMichal Simek debug ("eth_halt\n"); 13989c53891SMichal Simek } 14089c53891SMichal Simek 14189c53891SMichal Simek int eth_init (bd_t * bis) 14289c53891SMichal Simek { 143*d3f87148SMike Frysinger uchar enetaddr[6]; 144*d3f87148SMike Frysinger 14589c53891SMichal Simek debug ("EmacLite Initialization Started\n"); 14689c53891SMichal Simek memset (&emaclite, 0, sizeof (xemaclite)); 14789c53891SMichal Simek emaclite.baseaddress = XILINX_EMACLITE_BASEADDR; 14889c53891SMichal Simek 149*d3f87148SMike Frysinger if (!eth_getenv_enetaddr("ethaddr", enetaddr)) { 150*d3f87148SMike Frysinger memcpy(enetaddr, emacaddr, ENET_ADDR_LENGTH); 151*d3f87148SMike Frysinger eth_setenv_enetaddr("ethaddr", enetaddr); 15289c53891SMichal Simek } 15389c53891SMichal Simek 15489c53891SMichal Simek /* 15589c53891SMichal Simek * TX - TX_PING & TX_PONG initialization 15689c53891SMichal Simek */ 15789c53891SMichal Simek /* Restart PING TX */ 15889c53891SMichal Simek out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET, 0); 15989c53891SMichal Simek /* Copy MAC address */ 160*d3f87148SMike Frysinger xemaclite_alignedwrite (enetaddr, 16189c53891SMichal Simek emaclite.baseaddress, ENET_ADDR_LENGTH); 16289c53891SMichal Simek /* Set the length */ 16389c53891SMichal Simek out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH); 16489c53891SMichal Simek /* Update the MAC address in the EMAC Lite */ 16589c53891SMichal Simek out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET, XEL_TSR_PROG_MAC_ADDR); 16689c53891SMichal Simek /* Wait for EMAC Lite to finish with the MAC address update */ 16789c53891SMichal Simek while ((in_be32 (emaclite.baseaddress + XEL_TSR_OFFSET) & 16889c53891SMichal Simek XEL_TSR_PROG_MAC_ADDR) != 0) ; 16989c53891SMichal Simek 17089c53891SMichal Simek #ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG 17189c53891SMichal Simek /* The same operation with PONG TX */ 17289c53891SMichal Simek out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET, 0); 173*d3f87148SMike Frysinger xemaclite_alignedwrite (enetaddr, emaclite.baseaddress + 17489c53891SMichal Simek XEL_BUFFER_OFFSET, ENET_ADDR_LENGTH); 17589c53891SMichal Simek out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH); 17689c53891SMichal Simek out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET, 17789c53891SMichal Simek XEL_TSR_PROG_MAC_ADDR); 17889c53891SMichal Simek while ((in_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + 17989c53891SMichal Simek XEL_BUFFER_OFFSET) & XEL_TSR_PROG_MAC_ADDR) != 0) ; 18089c53891SMichal Simek #endif 18189c53891SMichal Simek 18289c53891SMichal Simek /* 18389c53891SMichal Simek * RX - RX_PING & RX_PONG initialization 18489c53891SMichal Simek */ 18589c53891SMichal Simek /* Write out the value to flush the RX buffer */ 18689c53891SMichal Simek out_be32 (emaclite.baseaddress + XEL_RSR_OFFSET, XEL_RSR_RECV_IE_MASK); 18789c53891SMichal Simek #ifdef CONFIG_XILINX_EMACLITE_RX_PING_PONG 18889c53891SMichal Simek out_be32 (emaclite.baseaddress + XEL_RSR_OFFSET + XEL_BUFFER_OFFSET, 18989c53891SMichal Simek XEL_RSR_RECV_IE_MASK); 19089c53891SMichal Simek #endif 19189c53891SMichal Simek 19289c53891SMichal Simek debug ("EmacLite Initialization complete\n"); 19389c53891SMichal Simek return 0; 19489c53891SMichal Simek } 19589c53891SMichal Simek 19689c53891SMichal Simek int xemaclite_txbufferavailable (xemaclite * instanceptr) 19789c53891SMichal Simek { 19889c53891SMichal Simek u32 reg; 19989c53891SMichal Simek u32 txpingbusy; 20089c53891SMichal Simek u32 txpongbusy; 20189c53891SMichal Simek /* 20289c53891SMichal Simek * Read the other buffer register 20389c53891SMichal Simek * and determine if the other buffer is available 20489c53891SMichal Simek */ 20589c53891SMichal Simek reg = in_be32 (instanceptr->baseaddress + 20689c53891SMichal Simek instanceptr->nexttxbuffertouse + 0); 20789c53891SMichal Simek txpingbusy = ((reg & XEL_TSR_XMIT_BUSY_MASK) == 20889c53891SMichal Simek XEL_TSR_XMIT_BUSY_MASK); 20989c53891SMichal Simek 21089c53891SMichal Simek reg = in_be32 (instanceptr->baseaddress + 21189c53891SMichal Simek (instanceptr->nexttxbuffertouse ^ XEL_TSR_OFFSET) + 0); 21289c53891SMichal Simek txpongbusy = ((reg & XEL_TSR_XMIT_BUSY_MASK) == 21389c53891SMichal Simek XEL_TSR_XMIT_BUSY_MASK); 21489c53891SMichal Simek 21589c53891SMichal Simek return (!(txpingbusy && txpongbusy)); 21689c53891SMichal Simek } 21789c53891SMichal Simek 21889c53891SMichal Simek int eth_send (volatile void *ptr, int len) { 21989c53891SMichal Simek 22089c53891SMichal Simek unsigned int reg; 22189c53891SMichal Simek unsigned int baseaddress; 22289c53891SMichal Simek 22389c53891SMichal Simek unsigned maxtry = 1000; 22489c53891SMichal Simek 22589c53891SMichal Simek if (len > ENET_MAX_MTU) 22689c53891SMichal Simek len = ENET_MAX_MTU; 22789c53891SMichal Simek 22889c53891SMichal Simek while (!xemaclite_txbufferavailable (&emaclite) && maxtry) { 22989c53891SMichal Simek udelay (10); 23089c53891SMichal Simek maxtry--; 23189c53891SMichal Simek } 23289c53891SMichal Simek 23389c53891SMichal Simek if (!maxtry) { 23489c53891SMichal Simek printf ("Error: Timeout waiting for ethernet TX buffer\n"); 23589c53891SMichal Simek /* Restart PING TX */ 23689c53891SMichal Simek out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET, 0); 23789c53891SMichal Simek #ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG 23889c53891SMichal Simek out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + 23989c53891SMichal Simek XEL_BUFFER_OFFSET, 0); 24089c53891SMichal Simek #endif 24189c53891SMichal Simek return 0; 24289c53891SMichal Simek } 24389c53891SMichal Simek 24489c53891SMichal Simek /* Determine the expected TX buffer address */ 24589c53891SMichal Simek baseaddress = (emaclite.baseaddress + emaclite.nexttxbuffertouse); 24689c53891SMichal Simek 24789c53891SMichal Simek /* Determine if the expected buffer address is empty */ 24889c53891SMichal Simek reg = in_be32 (baseaddress + XEL_TSR_OFFSET); 24989c53891SMichal Simek if (((reg & XEL_TSR_XMIT_BUSY_MASK) == 0) 25089c53891SMichal Simek && ((in_be32 ((baseaddress) + XEL_TSR_OFFSET) 25189c53891SMichal Simek & XEL_TSR_XMIT_ACTIVE_MASK) == 0)) { 25289c53891SMichal Simek 25389c53891SMichal Simek #ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG 25489c53891SMichal Simek emaclite.nexttxbuffertouse ^= XEL_BUFFER_OFFSET; 25589c53891SMichal Simek #endif 25689c53891SMichal Simek debug ("Send packet from 0x%x\n", baseaddress); 25789c53891SMichal Simek /* Write the frame to the buffer */ 25889c53891SMichal Simek xemaclite_alignedwrite ((void *) ptr, baseaddress, len); 25989c53891SMichal Simek out_be32 (baseaddress + XEL_TPLR_OFFSET,(len & 26089c53891SMichal Simek (XEL_TPLR_LENGTH_MASK_HI | XEL_TPLR_LENGTH_MASK_LO))); 26189c53891SMichal Simek reg = in_be32 (baseaddress + XEL_TSR_OFFSET); 26289c53891SMichal Simek reg |= XEL_TSR_XMIT_BUSY_MASK; 26389c53891SMichal Simek if ((reg & XEL_TSR_XMIT_IE_MASK) != 0) { 26489c53891SMichal Simek reg |= XEL_TSR_XMIT_ACTIVE_MASK; 26589c53891SMichal Simek } 26689c53891SMichal Simek out_be32 (baseaddress + XEL_TSR_OFFSET, reg); 26789c53891SMichal Simek return 1; 26889c53891SMichal Simek } 26989c53891SMichal Simek #ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG 27089c53891SMichal Simek /* Switch to second buffer */ 27189c53891SMichal Simek baseaddress ^= XEL_BUFFER_OFFSET; 27289c53891SMichal Simek /* Determine if the expected buffer address is empty */ 27389c53891SMichal Simek reg = in_be32 (baseaddress + XEL_TSR_OFFSET); 27489c53891SMichal Simek if (((reg & XEL_TSR_XMIT_BUSY_MASK) == 0) 27589c53891SMichal Simek && ((in_be32 ((baseaddress) + XEL_TSR_OFFSET) 27689c53891SMichal Simek & XEL_TSR_XMIT_ACTIVE_MASK) == 0)) { 27789c53891SMichal Simek debug ("Send packet from 0x%x\n", baseaddress); 27889c53891SMichal Simek /* Write the frame to the buffer */ 27989c53891SMichal Simek xemaclite_alignedwrite ((void *) ptr, baseaddress, len); 28089c53891SMichal Simek out_be32 (baseaddress + XEL_TPLR_OFFSET,(len & 28189c53891SMichal Simek (XEL_TPLR_LENGTH_MASK_HI | XEL_TPLR_LENGTH_MASK_LO))); 28289c53891SMichal Simek reg = in_be32 (baseaddress + XEL_TSR_OFFSET); 28389c53891SMichal Simek reg |= XEL_TSR_XMIT_BUSY_MASK; 28489c53891SMichal Simek if ((reg & XEL_TSR_XMIT_IE_MASK) != 0) { 28589c53891SMichal Simek reg |= XEL_TSR_XMIT_ACTIVE_MASK; 28689c53891SMichal Simek } 28789c53891SMichal Simek out_be32 (baseaddress + XEL_TSR_OFFSET, reg); 28889c53891SMichal Simek return 1; 28989c53891SMichal Simek } 29089c53891SMichal Simek #endif 29189c53891SMichal Simek puts ("Error while sending frame\n"); 29289c53891SMichal Simek return 0; 29389c53891SMichal Simek } 29489c53891SMichal Simek 29589c53891SMichal Simek int eth_rx (void) 29689c53891SMichal Simek { 29789c53891SMichal Simek unsigned int length; 29889c53891SMichal Simek unsigned int reg; 29989c53891SMichal Simek unsigned int baseaddress; 30089c53891SMichal Simek 30189c53891SMichal Simek baseaddress = emaclite.baseaddress + emaclite.nextrxbuffertouse; 30289c53891SMichal Simek reg = in_be32 (baseaddress + XEL_RSR_OFFSET); 30389c53891SMichal Simek debug ("Testing data at address 0x%x\n", baseaddress); 30489c53891SMichal Simek if ((reg & XEL_RSR_RECV_DONE_MASK) == XEL_RSR_RECV_DONE_MASK) { 30589c53891SMichal Simek #ifdef CONFIG_XILINX_EMACLITE_RX_PING_PONG 30689c53891SMichal Simek emaclite.nextrxbuffertouse ^= XEL_BUFFER_OFFSET; 30789c53891SMichal Simek #endif 30889c53891SMichal Simek } else { 30989c53891SMichal Simek #ifndef CONFIG_XILINX_EMACLITE_RX_PING_PONG 31089c53891SMichal Simek debug ("No data was available - address 0x%x\n", baseaddress); 31189c53891SMichal Simek return 0; 31289c53891SMichal Simek #else 31389c53891SMichal Simek baseaddress ^= XEL_BUFFER_OFFSET; 31489c53891SMichal Simek reg = in_be32 (baseaddress + XEL_RSR_OFFSET); 31589c53891SMichal Simek if ((reg & XEL_RSR_RECV_DONE_MASK) != 31689c53891SMichal Simek XEL_RSR_RECV_DONE_MASK) { 31789c53891SMichal Simek debug ("No data was available - address 0x%x\n", 31889c53891SMichal Simek baseaddress); 31989c53891SMichal Simek return 0; 32089c53891SMichal Simek } 32189c53891SMichal Simek #endif 32289c53891SMichal Simek } 32389c53891SMichal Simek /* Get the length of the frame that arrived */ 32489c53891SMichal Simek switch(((in_be32 (baseaddress + XEL_RXBUFF_OFFSET + 0xC)) & 32589c53891SMichal Simek 0xFFFF0000 ) >> 16) { 32689c53891SMichal Simek case 0x806: 32789c53891SMichal Simek length = 42 + 20; /* FIXME size of ARP */ 32889c53891SMichal Simek debug ("ARP Packet\n"); 32989c53891SMichal Simek break; 33089c53891SMichal Simek case 0x800: 33189c53891SMichal Simek length = 14 + 14 + 33289c53891SMichal Simek (((in_be32 (baseaddress + XEL_RXBUFF_OFFSET + 0x10)) & 33389c53891SMichal Simek 0xFFFF0000) >> 16); /* FIXME size of IP packet */ 33489c53891SMichal Simek debug ("IP Packet\n"); 33589c53891SMichal Simek break; 33689c53891SMichal Simek default: 33789c53891SMichal Simek debug ("Other Packet\n"); 33889c53891SMichal Simek length = ENET_MAX_MTU; 33989c53891SMichal Simek break; 34089c53891SMichal Simek } 34189c53891SMichal Simek 34289c53891SMichal Simek xemaclite_alignedread ((u32 *) (baseaddress + XEL_RXBUFF_OFFSET), 34389c53891SMichal Simek etherrxbuff, length); 34489c53891SMichal Simek 34589c53891SMichal Simek /* Acknowledge the frame */ 34689c53891SMichal Simek reg = in_be32 (baseaddress + XEL_RSR_OFFSET); 34789c53891SMichal Simek reg &= ~XEL_RSR_RECV_DONE_MASK; 34889c53891SMichal Simek out_be32 (baseaddress + XEL_RSR_OFFSET, reg); 34989c53891SMichal Simek 35089c53891SMichal Simek debug ("Packet receive from 0x%x, length %dB\n", baseaddress, length); 35189c53891SMichal Simek NetReceive ((uchar *) etherrxbuff, length); 35289c53891SMichal Simek return 1; 35389c53891SMichal Simek 35489c53891SMichal Simek } 355