⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tsi108_eth.c

📁 U-boot源码 ARM7启动代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*********************************************************************** * * Copyright (c) 2005 Freescale Semiconductor, Inc. * * See file CREDITS for list of people who contributed to this * project. * * 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. * * 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 * GNU General Public License for more details. * * 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., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * Description: *   Ethernet interface for Tundra TSI108 bridge chip * ***********************************************************************/#include <config.h>#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI) \	&& defined(CONFIG_TSI108_ETH)#if !defined(CONFIG_TSI108_ETH_NUM_PORTS) || (CONFIG_TSI108_ETH_NUM_PORTS > 2)#error "CONFIG_TSI108_ETH_NUM_PORTS must be defined as 1 or 2"#endif#include <common.h>#include <malloc.h>#include <net.h>#include <asm/cache.h>#ifdef DEBUG#define TSI108_ETH_DEBUG 7#else#define TSI108_ETH_DEBUG 0#endif#if TSI108_ETH_DEBUG > 0#define debug_lev(lev, fmt, args...) \if (lev <= TSI108_ETH_DEBUG) \printf ("%s %d: " fmt, __FUNCTION__, __LINE__, ##args)#else#define debug_lev(lev, fmt, args...) do{}while(0)#endif#define RX_PRINT_ERRORS#define TX_PRINT_ERRORS#define ETH_BASE	(CFG_TSI108_CSR_BASE + 0x6000)#define ETH_PORT_OFFSET	0x400#define __REG32(base, offset) (*((volatile u32 *)((char *)(base) + (offset))))#define reg_MAC_CONFIG_1(base)		__REG32(base, 0x00000000)#define MAC_CONFIG_1_TX_ENABLE		(0x00000001)#define MAC_CONFIG_1_SYNC_TX_ENABLE	(0x00000002)#define MAC_CONFIG_1_RX_ENABLE		(0x00000004)#define MAC_CONFIG_1_SYNC_RX_ENABLE	(0x00000008)#define MAC_CONFIG_1_TX_FLOW_CONTROL	(0x00000010)#define MAC_CONFIG_1_RX_FLOW_CONTROL	(0x00000020)#define MAC_CONFIG_1_LOOP_BACK		(0x00000100)#define MAC_CONFIG_1_RESET_TX_FUNCTION	(0x00010000)#define MAC_CONFIG_1_RESET_RX_FUNCTION	(0x00020000)#define MAC_CONFIG_1_RESET_TX_MAC	(0x00040000)#define MAC_CONFIG_1_RESET_RX_MAC	(0x00080000)#define MAC_CONFIG_1_SIM_RESET		(0x40000000)#define MAC_CONFIG_1_SOFT_RESET		(0x80000000)#define reg_MAC_CONFIG_2(base)		__REG32(base, 0x00000004)#define MAC_CONFIG_2_FULL_DUPLEX	(0x00000001)#define MAC_CONFIG_2_CRC_ENABLE		(0x00000002)#define MAC_CONFIG_2_PAD_CRC		(0x00000004)#define MAC_CONFIG_2_LENGTH_CHECK	(0x00000010)#define MAC_CONFIG_2_HUGE_FRAME		(0x00000020)#define MAC_CONFIG_2_INTERFACE_MODE(val)	(((val) & 0x3) << 8)#define MAC_CONFIG_2_PREAMBLE_LENGTH(val)	(((val) & 0xf) << 12)#define INTERFACE_MODE_NIBBLE		1	/* 10/100 Mb/s MII) */#define INTERFACE_MODE_BYTE		2	/* 1000 Mb/s GMII/TBI */#define reg_MAXIMUM_FRAME_LENGTH(base)		__REG32(base, 0x00000010)#define reg_MII_MGMT_CONFIG(base)		__REG32(base, 0x00000020)#define MII_MGMT_CONFIG_MGMT_CLOCK_SELECT(val)	((val) & 0x7)#define MII_MGMT_CONFIG_NO_PREAMBLE		(0x00000010)#define MII_MGMT_CONFIG_SCAN_INCREMENT		(0x00000020)#define MII_MGMT_CONFIG_RESET_MGMT		(0x80000000)#define reg_MII_MGMT_COMMAND(base)		__REG32(base, 0x00000024)#define MII_MGMT_COMMAND_READ_CYCLE		(0x00000001)#define MII_MGMT_COMMAND_SCAN_CYCLE		(0x00000002)#define reg_MII_MGMT_ADDRESS(base)		__REG32(base, 0x00000028)#define reg_MII_MGMT_CONTROL(base)		__REG32(base, 0x0000002c)#define reg_MII_MGMT_STATUS(base)		__REG32(base, 0x00000030)#define reg_MII_MGMT_INDICATORS(base)		__REG32(base, 0x00000034)#define MII_MGMT_INDICATORS_BUSY		(0x00000001)#define MII_MGMT_INDICATORS_SCAN		(0x00000002)#define MII_MGMT_INDICATORS_NOT_VALID		(0x00000004)#define reg_INTERFACE_STATUS(base)		__REG32(base, 0x0000003c)#define INTERFACE_STATUS_LINK_FAIL		(0x00000008)#define INTERFACE_STATUS_EXCESS_DEFER		(0x00000200)#define reg_STATION_ADDRESS_1(base)		__REG32(base, 0x00000040)#define reg_STATION_ADDRESS_2(base)		__REG32(base, 0x00000044)#define reg_PORT_CONTROL(base)			__REG32(base, 0x00000200)#define PORT_CONTROL_PRI		(0x00000001)#define PORT_CONTROL_BPT		(0x00010000)#define PORT_CONTROL_SPD		(0x00040000)#define PORT_CONTROL_RBC		(0x00080000)#define PORT_CONTROL_PRB		(0x00200000)#define PORT_CONTROL_DIS		(0x00400000)#define PORT_CONTROL_TBI		(0x00800000)#define PORT_CONTROL_STE		(0x10000000)#define PORT_CONTROL_ZOR		(0x20000000)#define PORT_CONTROL_CLR		(0x40000000)#define PORT_CONTROL_SRT		(0x80000000)#define reg_TX_CONFIG(base)		__REG32(base, 0x00000220)#define TX_CONFIG_START_Q		(0x00000003)#define TX_CONFIG_EHP			(0x00400000)#define TX_CONFIG_CHP			(0x00800000)#define TX_CONFIG_RST			(0x80000000)#define reg_TX_CONTROL(base)		__REG32(base, 0x00000224)#define TX_CONTROL_GO			(0x00008000)#define TX_CONTROL_MP			(0x01000000)#define TX_CONTROL_EAI			(0x20000000)#define TX_CONTROL_ABT			(0x40000000)#define TX_CONTROL_EII			(0x80000000)#define reg_TX_STATUS(base)		__REG32(base, 0x00000228)#define TX_STATUS_QUEUE_USABLE		(0x0000000f)#define TX_STATUS_CURR_Q		(0x00000300)#define TX_STATUS_ACT			(0x00008000)#define TX_STATUS_QUEUE_IDLE		(0x000f0000)#define TX_STATUS_EOQ_PENDING		(0x0f000000)#define reg_TX_EXTENDED_STATUS(base)		__REG32(base, 0x0000022c)#define TX_EXTENDED_STATUS_END_OF_QUEUE_CONDITION		(0x0000000f)#define TX_EXTENDED_STATUS_END_OF_FRAME_CONDITION		(0x00000f00)#define TX_EXTENDED_STATUS_DESCRIPTOR_INTERRUPT_CONDITION	(0x000f0000)#define TX_EXTENDED_STATUS_ERROR_FLAG				(0x0f000000)#define reg_TX_THRESHOLDS(base)			__REG32(base, 0x00000230)#define reg_TX_DIAGNOSTIC_ADDR(base)           __REG32(base, 0x00000270)#define TX_DIAGNOSTIC_ADDR_INDEX		(0x0000007f)#define TX_DIAGNOSTIC_ADDR_DFR			(0x40000000)#define TX_DIAGNOSTIC_ADDR_AI			(0x80000000)#define reg_TX_DIAGNOSTIC_DATA(base)		__REG32(base, 0x00000274)#define reg_TX_ERROR_STATUS(base)		__REG32(base, 0x00000278)#define TX_ERROR_STATUS				(0x00000278)#define TX_ERROR_STATUS_QUEUE_0_ERROR_RESPONSE	(0x0000000f)#define TX_ERROR_STATUS_TEA_ON_QUEUE_0		(0x00000010)#define TX_ERROR_STATUS_RER_ON_QUEUE_0		(0x00000020)#define TX_ERROR_STATUS_TER_ON_QUEUE_0		(0x00000040)#define TX_ERROR_STATUS_DER_ON_QUEUE_0		(0x00000080)#define TX_ERROR_STATUS_QUEUE_1_ERROR_RESPONSE	(0x00000f00)#define TX_ERROR_STATUS_TEA_ON_QUEUE_1		(0x00001000)#define TX_ERROR_STATUS_RER_ON_QUEUE_1		(0x00002000)#define TX_ERROR_STATUS_TER_ON_QUEUE_1		(0x00004000)#define TX_ERROR_STATUS_DER_ON_QUEUE_1		(0x00008000)#define TX_ERROR_STATUS_QUEUE_2_ERROR_RESPONSE	(0x000f0000)#define TX_ERROR_STATUS_TEA_ON_QUEUE_2		(0x00100000)#define TX_ERROR_STATUS_RER_ON_QUEUE_2		(0x00200000)#define TX_ERROR_STATUS_TER_ON_QUEUE_2		(0x00400000)#define TX_ERROR_STATUS_DER_ON_QUEUE_2		(0x00800000)#define TX_ERROR_STATUS_QUEUE_3_ERROR_RESPONSE	(0x0f000000)#define TX_ERROR_STATUS_TEA_ON_QUEUE_3		(0x10000000)#define TX_ERROR_STATUS_RER_ON_QUEUE_3		(0x20000000)#define TX_ERROR_STATUS_TER_ON_QUEUE_3		(0x40000000)#define TX_ERROR_STATUS_DER_ON_QUEUE_3		(0x80000000)#define reg_TX_QUEUE_0_CONFIG(base)		__REG32(base, 0x00000280)#define TX_QUEUE_0_CONFIG_OCN_PORT		(0x0000003f)#define TX_QUEUE_0_CONFIG_BSWP			(0x00000400)#define TX_QUEUE_0_CONFIG_WSWP			(0x00000800)#define TX_QUEUE_0_CONFIG_AM			(0x00004000)#define TX_QUEUE_0_CONFIG_GVI			(0x00008000)#define TX_QUEUE_0_CONFIG_EEI			(0x00010000)#define TX_QUEUE_0_CONFIG_ELI			(0x00020000)#define TX_QUEUE_0_CONFIG_ENI			(0x00040000)#define TX_QUEUE_0_CONFIG_ESI			(0x00080000)#define TX_QUEUE_0_CONFIG_EDI			(0x00100000)#define reg_TX_QUEUE_0_BUF_CONFIG(base)		__REG32(base, 0x00000284)#define TX_QUEUE_0_BUF_CONFIG_OCN_PORT		(0x0000003f)#define TX_QUEUE_0_BUF_CONFIG_BURST		(0x00000300)#define TX_QUEUE_0_BUF_CONFIG_BSWP		(0x00000400)#define TX_QUEUE_0_BUF_CONFIG_WSWP		(0x00000800)#define OCN_PORT_HLP			0	/* HLP Interface */#define OCN_PORT_PCI_X			1	/* PCI-X Interface */#define OCN_PORT_PROCESSOR_MASTER	2	/* Processor Interface (master) */#define OCN_PORT_PROCESSOR_SLAVE	3	/* Processor Interface (slave) */#define OCN_PORT_MEMORY			4	/* Memory Controller */#define OCN_PORT_DMA			5	/* DMA Controller */#define OCN_PORT_ETHERNET		6	/* Ethernet Controller */#define OCN_PORT_PRINT			7	/* Print Engine Interface */#define reg_TX_QUEUE_0_PTR_LOW(base)		__REG32(base, 0x00000288)#define reg_TX_QUEUE_0_PTR_HIGH(base)		__REG32(base, 0x0000028c)#define TX_QUEUE_0_PTR_HIGH_VALID		(0x80000000)#define reg_RX_CONFIG(base)			__REG32(base, 0x00000320)#define RX_CONFIG_DEF_Q				(0x00000003)#define RX_CONFIG_EMF				(0x00000100)#define RX_CONFIG_EUF				(0x00000200)#define RX_CONFIG_BFE				(0x00000400)#define RX_CONFIG_MFE				(0x00000800)#define RX_CONFIG_UFE				(0x00001000)#define RX_CONFIG_SE				(0x00002000)#define RX_CONFIG_ABF				(0x00200000)#define RX_CONFIG_APE				(0x00400000)#define RX_CONFIG_CHP				(0x00800000)#define RX_CONFIG_RST				(0x80000000)#define reg_RX_CONTROL(base)			__REG32(base, 0x00000324)#define GE_E0_RX_CONTROL_QUEUE_ENABLES		(0x0000000f)#define GE_E0_RX_CONTROL_GO			(0x00008000)#define GE_E0_RX_CONTROL_EAI			(0x20000000)#define GE_E0_RX_CONTROL_ABT			(0x40000000)#define GE_E0_RX_CONTROL_EII			(0x80000000)#define reg_RX_EXTENDED_STATUS(base)		__REG32(base, 0x0000032c)#define RX_EXTENDED_STATUS			(0x0000032c)#define RX_EXTENDED_STATUS_EOQ			(0x0000000f)#define RX_EXTENDED_STATUS_EOQ_0		(0x00000001)#define RX_EXTENDED_STATUS_EOF			(0x00000f00)#define RX_EXTENDED_STATUS_DESCRIPTOR_INTERRUPT_CONDITION	(0x000f0000)#define RX_EXTENDED_STATUS_ERROR_FLAG				(0x0f000000)#define reg_RX_THRESHOLDS(base)			__REG32(base, 0x00000330)#define reg_RX_DIAGNOSTIC_ADDR(base)		__REG32(base, 0x00000370)#define RX_DIAGNOSTIC_ADDR_INDEX		(0x0000007f)#define RX_DIAGNOSTIC_ADDR_DFR			(0x40000000)#define RX_DIAGNOSTIC_ADDR_AI			(0x80000000)#define reg_RX_DIAGNOSTIC_DATA(base)		__REG32(base, 0x00000374)#define reg_RX_QUEUE_0_CONFIG(base)		__REG32(base, 0x00000380)#define RX_QUEUE_0_CONFIG_OCN_PORT		(0x0000003f)#define RX_QUEUE_0_CONFIG_BSWP			(0x00000400)#define RX_QUEUE_0_CONFIG_WSWP			(0x00000800)#define RX_QUEUE_0_CONFIG_AM			(0x00004000)#define RX_QUEUE_0_CONFIG_EEI			(0x00010000)#define RX_QUEUE_0_CONFIG_ELI			(0x00020000)#define RX_QUEUE_0_CONFIG_ENI			(0x00040000)#define RX_QUEUE_0_CONFIG_ESI			(0x00080000)#define RX_QUEUE_0_CONFIG_EDI			(0x00100000)#define reg_RX_QUEUE_0_BUF_CONFIG(base)		__REG32(base, 0x00000384)#define RX_QUEUE_0_BUF_CONFIG_OCN_PORT		(0x0000003f)#define RX_QUEUE_0_BUF_CONFIG_BURST		(0x00000300)#define RX_QUEUE_0_BUF_CONFIG_BSWP		(0x00000400)#define RX_QUEUE_0_BUF_CONFIG_WSWP		(0x00000800)#define reg_RX_QUEUE_0_PTR_LOW(base)		__REG32(base, 0x00000388)#define reg_RX_QUEUE_0_PTR_HIGH(base)		__REG32(base, 0x0000038c)#define RX_QUEUE_0_PTR_HIGH_VALID		(0x80000000)/* *  PHY register definitions *//* the first 15 PHY registers are standard. */#define PHY_CTRL_REG		0	/* Control Register */#define PHY_STATUS_REG		1	/* Status Regiser */#define PHY_ID1_REG		2	/* Phy Id Reg (word 1) */#define PHY_ID2_REG		3	/* Phy Id Reg (word 2) */#define PHY_AN_ADV_REG		4	/* Autoneg Advertisement */#define PHY_LP_ABILITY_REG	5	/* Link Partner Ability (Base Page) */#define PHY_AUTONEG_EXP_REG	6	/* Autoneg Expansion Reg */#define PHY_NEXT_PAGE_TX_REG	7	/* Next Page TX */#define PHY_LP_NEXT_PAGE_REG	8	/* Link Partner Next Page */#define PHY_1000T_CTRL_REG	9	/* 1000Base-T Control Reg */#define PHY_1000T_STATUS_REG	10	/* 1000Base-T Status Reg */#define PHY_EXT_STATUS_REG	11	/* Extended Status Reg *//* * PHY Register bit masks. */#define PHY_CTRL_RESET		(1 << 15)#define PHY_CTRL_LOOPBACK	(1 << 14)#define PHY_CTRL_SPEED0		(1 << 13)#define PHY_CTRL_AN_EN		(1 << 12)#define PHY_CTRL_PWR_DN		(1 << 11)#define PHY_CTRL_ISOLATE	(1 << 10)#define PHY_CTRL_RESTART_AN	(1 << 9)#define PHY_CTRL_FULL_DUPLEX	(1 << 8)#define PHY_CTRL_CT_EN		(1 << 7)#define PHY_CTRL_SPEED1		(1 << 6)#define PHY_STAT_100BASE_T4	(1 << 15)#define PHY_STAT_100BASE_X_FD	(1 << 14)#define PHY_STAT_100BASE_X_HD	(1 << 13)#define PHY_STAT_10BASE_T_FD	(1 << 12)#define PHY_STAT_10BASE_T_HD	(1 << 11)#define PHY_STAT_100BASE_T2_FD	(1 << 10)#define PHY_STAT_100BASE_T2_HD	(1 << 9)#define PHY_STAT_EXT_STAT	(1 << 8)#define PHY_STAT_RESERVED	(1 << 7)#define PHY_STAT_MFPS		(1 << 6)	/* Management Frames Preamble Suppression */#define PHY_STAT_AN_COMPLETE	(1 << 5)#define PHY_STAT_REM_FAULT	(1 << 4)#define PHY_STAT_AN_CAP		(1 << 3)#define PHY_STAT_LINK_UP	(1 << 2)#define PHY_STAT_JABBER		(1 << 1)#define PHY_STAT_EXT_CAP	(1 << 0)#define TBI_CONTROL_2					0x11#define TBI_CONTROL_2_ENABLE_COMMA_DETECT		0x0001#define TBI_CONTROL_2_ENABLE_WRAP			0x0002#define TBI_CONTROL_2_G_MII_MODE			0x0010#define TBI_CONTROL_2_RECEIVE_CLOCK_SELECT		0x0020#define TBI_CONTROL_2_AUTO_NEGOTIATION_SENSE		0x0100#define TBI_CONTROL_2_DISABLE_TRANSMIT_RUNNING_DISPARITY	0x1000#define TBI_CONTROL_2_DISABLE_RECEIVE_RUNNING_DISPARITY		0x2000#define TBI_CONTROL_2_SHORTCUT_LINK_TIMER			0x4000#define TBI_CONTROL_2_SOFT_RESET				0x8000/* marvel specific */#define MV1111_EXT_CTRL1_REG	16	/* PHY Specific Control Reg */#define MV1111_SPEC_STAT_REG	17	/* PHY Specific Status Reg */#define MV1111_EXT_CTRL2_REG	20	/* Extended PHY Specific Control Reg *//* * MARVELL 88E1111 PHY register bit masks

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -