diff options
author | wdenk <wdenk> | 2004-02-23 23:54:43 +0000 |
---|---|---|
committer | wdenk <wdenk> | 2004-02-23 23:54:43 +0000 |
commit | 028ab6b598b628326116acd88e0f35aa9f526d12 (patch) | |
tree | 0d54315bd92d713a405004b6e36fca8d2b7c53e3 /board/xilinx/xilinx_enet/emac_adapter.c | |
parent | 63e73c9a8ed5b32d9c4067ffaad953e9a8fe8f0a (diff) | |
download | u-boot-imx-028ab6b598b628326116acd88e0f35aa9f526d12.zip u-boot-imx-028ab6b598b628326116acd88e0f35aa9f526d12.tar.gz u-boot-imx-028ab6b598b628326116acd88e0f35aa9f526d12.tar.bz2 |
* Patch by Peter Ryser, 20 Feb 2004:
Add support for the Xilinx ML300 platform
* Patch by Stephan Linz, 17 Feb 2004:
Fix watchdog support for NIOS
* Patch by Josh Fryman, 16 Feb 2004:
Fix byte-swapping for cfi_flash.c for different bus widths
* Patch by Jon Diekema, 14 Jeb 2004:
Remove duplicate "FPGA Support" notes from the README file
Diffstat (limited to 'board/xilinx/xilinx_enet/emac_adapter.c')
-rw-r--r-- | board/xilinx/xilinx_enet/emac_adapter.c | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/board/xilinx/xilinx_enet/emac_adapter.c b/board/xilinx/xilinx_enet/emac_adapter.c new file mode 100644 index 0000000..a3c37ba --- /dev/null +++ b/board/xilinx/xilinx_enet/emac_adapter.c @@ -0,0 +1,153 @@ +/****************************************************************************** +* +* Author: Xilinx, Inc. +* +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at your +* option) any later version. +* +* +* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" AS A +* COURTESY TO YOU. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS +* ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION OR STANDARD, +* XILINX IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION IS FREE +* FROM ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE FOR OBTAINING +* ANY THIRD PARTY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. +* XILINX EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO +* THE ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY +* WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM +* CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND +* FITNESS FOR A PARTICULAR PURPOSE. +* +* +* Xilinx hardware products are not intended for use in life support +* appliances, devices, or systems. Use in such applications is +* expressly prohibited. +* +* +* (c) Copyright 2002-2004 Xilinx Inc. +* All rights reserved. +* +* +* You should have received a copy of the GNU General Public License along +* with this program; if not, write to the Free Software Foundation, Inc., +* 675 Mass Ave, Cambridge, MA 02139, USA. +* +******************************************************************************/ + +#include <common.h> +#include <net.h> +#include <configs/ml300.h> +#include "xparameters.h" +#include "xemac.h" + +#if defined(XPAR_EMAC_0_DEVICE_ID) +/* + * ENET_MAX_MTU and ENET_MAX_MTU_ALIGNED are set from + * PKTSIZE and PKTSIZE_ALIGN (include/net.h) + */ + +#define ENET_MAX_MTU PKTSIZE +#define ENET_MAX_MTU_ALIGNED PKTSIZE_ALIGN +#define ENET_ADDR_LENGTH 6 + +static XEmac Emac; +static char etherrxbuff[PKTSIZE_ALIGN]; /* Receive buffer */ + +/* hardcoded MAC address for the Xilinx EMAC Core */ +static u8 EMACAddr[ENET_ADDR_LENGTH] = { 0x00, 0x0a, 0x35, 0x00, 0x22, 0x01 }; + +static int initialized = 0; + +void +eth_halt(void) +{ + if (initialized) + (void) XEmac_Stop(&Emac); +} + +int +eth_init(bd_t * bis) +{ + u32 Options; + XStatus Result; + +#ifdef DEBUG + printf("EMAC Initialization Started\n\r"); +#endif + + Result = XEmac_Initialize(&Emac, XPAR_EMAC_0_DEVICE_ID); + if (Result != XST_SUCCESS) { + return 0; + } + + /* make sure the Emac is stopped before it is started */ + (void) XEmac_Stop(&Emac); + + memcpy(bis->bi_enetaddr, EMACAddr, 6); + Result = XEmac_SetMacAddress(&Emac, EMACAddr); + if (Result != XST_SUCCESS) { + return 0; + } + + Options = + (XEM_POLLED_OPTION | XEM_UNICAST_OPTION | XEM_BROADCAST_OPTION | + XEM_FDUPLEX_OPTION | XEM_INSERT_FCS_OPTION | + XEM_INSERT_PAD_OPTION); + Result = XEmac_SetOptions(&Emac, Options); + if (Result != XST_SUCCESS) { + return 0; + } + + Result = XEmac_Start(&Emac); + if (Result != XST_SUCCESS) { + return 0; + } +#ifdef DEBUG + printf("EMAC Initialization complete\n\r"); +#endif + + initialized = 1; + + return (0); +} + +/*-----------------------------------------------------------------------------+ ++-----------------------------------------------------------------------------*/ +int +eth_send(volatile void *ptr, int len) +{ + XStatus Result; + + if (len > ENET_MAX_MTU) + len = ENET_MAX_MTU; + + Result = XEmac_PollSend(&Emac, (u8 *) ptr, len); + if (Result == XST_SUCCESS) { + return (1); + } else { + printf("Error while sending frame\n\r"); + return (0); + } + +} + +int +eth_rx(void) +{ + u32 RecvFrameLength; + XStatus Result; + + RecvFrameLength = PKTSIZE; + Result = XEmac_PollRecv(&Emac, (u8 *) etherrxbuff, &RecvFrameLength); + if (Result == XST_SUCCESS) { + NetReceive(etherrxbuff, RecvFrameLength); + return (1); + } else { + return (0); + } +} + +#endif |