mv643xx_eth.c

来自「linux 内核源代码」· C语言 代码 · 共 2,216 行 · 第 1/5 页

C
2,216
字号
/* * Driver for Marvell Discovery (MV643XX) and Marvell Orion ethernet ports * Copyright (C) 2002 Matthew Dharm <mdharm@momenco.com> * * Based on the 64360 driver from: * Copyright (C) 2002 rabeeh@galileo.co.il * * Copyright (C) 2003 PMC-Sierra, Inc., *	written by Manish Lachwani * * Copyright (C) 2003 Ralf Baechle <ralf@linux-mips.org> * * Copyright (C) 2004-2006 MontaVista Software, Inc. *			   Dale Farnsworth <dale@farnsworth.org> * * Copyright (C) 2004 Steven J. Hill <sjhill1@rockwellcollins.com> *				     <sjhill@realitydiluted.com> * * 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. */#include <linux/init.h>#include <linux/dma-mapping.h>#include <linux/in.h>#include <linux/ip.h>#include <linux/tcp.h>#include <linux/udp.h>#include <linux/etherdevice.h>#include <linux/bitops.h>#include <linux/delay.h>#include <linux/ethtool.h>#include <linux/platform_device.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/spinlock.h>#include <linux/workqueue.h>#include <linux/mii.h>#include <linux/mv643xx_eth.h>#include <asm/io.h>#include <asm/types.h>#include <asm/pgtable.h>#include <asm/system.h>#include <asm/delay.h>#include <asm/dma-mapping.h>#define MV643XX_CHECKSUM_OFFLOAD_TX#define MV643XX_NAPI#define MV643XX_TX_FAST_REFILL#undef	MV643XX_COAL/* * Number of RX / TX descriptors on RX / TX rings. * Note that allocating RX descriptors is done by allocating the RX * ring AND a preallocated RX buffers (skb's) for each descriptor. * The TX descriptors only allocates the TX descriptors ring, * with no pre allocated TX buffers (skb's are allocated by higher layers. *//* Default TX ring size is 1000 descriptors */#define MV643XX_DEFAULT_TX_QUEUE_SIZE 1000/* Default RX ring size is 400 descriptors */#define MV643XX_DEFAULT_RX_QUEUE_SIZE 400#define MV643XX_TX_COAL 100#ifdef MV643XX_COAL#define MV643XX_RX_COAL 100#endif#ifdef MV643XX_CHECKSUM_OFFLOAD_TX#define MAX_DESCS_PER_SKB	(MAX_SKB_FRAGS + 1)#else#define MAX_DESCS_PER_SKB	1#endif#define ETH_VLAN_HLEN		4#define ETH_FCS_LEN		4#define ETH_HW_IP_ALIGN		2		/* hw aligns IP header */#define ETH_WRAPPER_LEN		(ETH_HW_IP_ALIGN + ETH_HLEN + \					ETH_VLAN_HLEN + ETH_FCS_LEN)#define ETH_RX_SKB_SIZE		(dev->mtu + ETH_WRAPPER_LEN + \					dma_get_cache_alignment())/* * Registers shared between all ports. */#define PHY_ADDR_REG				0x0000#define SMI_REG					0x0004/* * Per-port registers. */#define PORT_CONFIG_REG(p)				(0x0400 + ((p) << 10))#define PORT_CONFIG_EXTEND_REG(p)			(0x0404 + ((p) << 10))#define MAC_ADDR_LOW(p)					(0x0414 + ((p) << 10))#define MAC_ADDR_HIGH(p)				(0x0418 + ((p) << 10))#define SDMA_CONFIG_REG(p)				(0x041c + ((p) << 10))#define PORT_SERIAL_CONTROL_REG(p)			(0x043c + ((p) << 10))#define PORT_STATUS_REG(p)				(0x0444 + ((p) << 10))#define TRANSMIT_QUEUE_COMMAND_REG(p)			(0x0448 + ((p) << 10))#define MAXIMUM_TRANSMIT_UNIT(p)			(0x0458 + ((p) << 10))#define INTERRUPT_CAUSE_REG(p)				(0x0460 + ((p) << 10))#define INTERRUPT_CAUSE_EXTEND_REG(p)			(0x0464 + ((p) << 10))#define INTERRUPT_MASK_REG(p)				(0x0468 + ((p) << 10))#define INTERRUPT_EXTEND_MASK_REG(p)			(0x046c + ((p) << 10))#define TX_FIFO_URGENT_THRESHOLD_REG(p)			(0x0474 + ((p) << 10))#define RX_CURRENT_QUEUE_DESC_PTR_0(p)			(0x060c + ((p) << 10))#define RECEIVE_QUEUE_COMMAND_REG(p)			(0x0680 + ((p) << 10))#define TX_CURRENT_QUEUE_DESC_PTR_0(p)			(0x06c0 + ((p) << 10))#define MIB_COUNTERS_BASE(p)				(0x1000 + ((p) << 7))#define DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(p)	(0x1400 + ((p) << 10))#define DA_FILTER_OTHER_MULTICAST_TABLE_BASE(p)		(0x1500 + ((p) << 10))#define DA_FILTER_UNICAST_TABLE_BASE(p)			(0x1600 + ((p) << 10))/* These macros describe Ethernet Port configuration reg (Px_cR) bits */#define UNICAST_NORMAL_MODE		(0 << 0)#define UNICAST_PROMISCUOUS_MODE	(1 << 0)#define DEFAULT_RX_QUEUE(queue)		((queue) << 1)#define DEFAULT_RX_ARP_QUEUE(queue)	((queue) << 4)#define RECEIVE_BC_IF_NOT_IP_OR_ARP	(0 << 7)#define REJECT_BC_IF_NOT_IP_OR_ARP	(1 << 7)#define RECEIVE_BC_IF_IP		(0 << 8)#define REJECT_BC_IF_IP			(1 << 8)#define RECEIVE_BC_IF_ARP		(0 << 9)#define REJECT_BC_IF_ARP		(1 << 9)#define TX_AM_NO_UPDATE_ERROR_SUMMARY	(1 << 12)#define CAPTURE_TCP_FRAMES_DIS		(0 << 14)#define CAPTURE_TCP_FRAMES_EN		(1 << 14)#define CAPTURE_UDP_FRAMES_DIS		(0 << 15)#define CAPTURE_UDP_FRAMES_EN		(1 << 15)#define DEFAULT_RX_TCP_QUEUE(queue)	((queue) << 16)#define DEFAULT_RX_UDP_QUEUE(queue)	((queue) << 19)#define DEFAULT_RX_BPDU_QUEUE(queue)	((queue) << 22)#define PORT_CONFIG_DEFAULT_VALUE			\		UNICAST_NORMAL_MODE		|	\		DEFAULT_RX_QUEUE(0)		|	\		DEFAULT_RX_ARP_QUEUE(0)		|	\		RECEIVE_BC_IF_NOT_IP_OR_ARP	|	\		RECEIVE_BC_IF_IP		|	\		RECEIVE_BC_IF_ARP		|	\		CAPTURE_TCP_FRAMES_DIS		|	\		CAPTURE_UDP_FRAMES_DIS		|	\		DEFAULT_RX_TCP_QUEUE(0)		|	\		DEFAULT_RX_UDP_QUEUE(0)		|	\		DEFAULT_RX_BPDU_QUEUE(0)/* These macros describe Ethernet Port configuration extend reg (Px_cXR) bits*/#define CLASSIFY_EN				(1 << 0)#define SPAN_BPDU_PACKETS_AS_NORMAL		(0 << 1)#define SPAN_BPDU_PACKETS_TO_RX_QUEUE_7		(1 << 1)#define PARTITION_DISABLE			(0 << 2)#define PARTITION_ENABLE			(1 << 2)#define PORT_CONFIG_EXTEND_DEFAULT_VALUE		\		SPAN_BPDU_PACKETS_AS_NORMAL	|	\		PARTITION_DISABLE/* These macros describe Ethernet Port Sdma configuration reg (SDCR) bits */#define RIFB				(1 << 0)#define RX_BURST_SIZE_1_64BIT		(0 << 1)#define RX_BURST_SIZE_2_64BIT		(1 << 1)#define RX_BURST_SIZE_4_64BIT		(2 << 1)#define RX_BURST_SIZE_8_64BIT		(3 << 1)#define RX_BURST_SIZE_16_64BIT		(4 << 1)#define BLM_RX_NO_SWAP			(1 << 4)#define BLM_RX_BYTE_SWAP		(0 << 4)#define BLM_TX_NO_SWAP			(1 << 5)#define BLM_TX_BYTE_SWAP		(0 << 5)#define DESCRIPTORS_BYTE_SWAP		(1 << 6)#define DESCRIPTORS_NO_SWAP		(0 << 6)#define IPG_INT_RX(value)		(((value) & 0x3fff) << 8)#define TX_BURST_SIZE_1_64BIT		(0 << 22)#define TX_BURST_SIZE_2_64BIT		(1 << 22)#define TX_BURST_SIZE_4_64BIT		(2 << 22)#define TX_BURST_SIZE_8_64BIT		(3 << 22)#define TX_BURST_SIZE_16_64BIT		(4 << 22)#if defined(__BIG_ENDIAN)#define PORT_SDMA_CONFIG_DEFAULT_VALUE		\		RX_BURST_SIZE_4_64BIT	|	\		IPG_INT_RX(0)		|	\		TX_BURST_SIZE_4_64BIT#elif defined(__LITTLE_ENDIAN)#define PORT_SDMA_CONFIG_DEFAULT_VALUE		\		RX_BURST_SIZE_4_64BIT	|	\		BLM_RX_NO_SWAP		|	\		BLM_TX_NO_SWAP		|	\		IPG_INT_RX(0)		|	\		TX_BURST_SIZE_4_64BIT#else#error One of __BIG_ENDIAN or __LITTLE_ENDIAN must be defined#endif/* These macros describe Ethernet Port serial control reg (PSCR) bits */#define SERIAL_PORT_DISABLE			(0 << 0)#define SERIAL_PORT_ENABLE			(1 << 0)#define DO_NOT_FORCE_LINK_PASS			(0 << 1)#define FORCE_LINK_PASS				(1 << 1)#define ENABLE_AUTO_NEG_FOR_DUPLX		(0 << 2)#define DISABLE_AUTO_NEG_FOR_DUPLX		(1 << 2)#define ENABLE_AUTO_NEG_FOR_FLOW_CTRL		(0 << 3)#define DISABLE_AUTO_NEG_FOR_FLOW_CTRL		(1 << 3)#define ADV_NO_FLOW_CTRL			(0 << 4)#define ADV_SYMMETRIC_FLOW_CTRL			(1 << 4)#define FORCE_FC_MODE_NO_PAUSE_DIS_TX		(0 << 5)#define FORCE_FC_MODE_TX_PAUSE_DIS		(1 << 5)#define FORCE_BP_MODE_NO_JAM			(0 << 7)#define FORCE_BP_MODE_JAM_TX			(1 << 7)#define FORCE_BP_MODE_JAM_TX_ON_RX_ERR		(2 << 7)#define SERIAL_PORT_CONTROL_RESERVED		(1 << 9)#define FORCE_LINK_FAIL				(0 << 10)#define DO_NOT_FORCE_LINK_FAIL			(1 << 10)#define RETRANSMIT_16_ATTEMPTS			(0 << 11)#define RETRANSMIT_FOREVER			(1 << 11)#define ENABLE_AUTO_NEG_SPEED_GMII		(0 << 13)#define DISABLE_AUTO_NEG_SPEED_GMII		(1 << 13)#define DTE_ADV_0				(0 << 14)#define DTE_ADV_1				(1 << 14)#define DISABLE_AUTO_NEG_BYPASS			(0 << 15)#define ENABLE_AUTO_NEG_BYPASS			(1 << 15)#define AUTO_NEG_NO_CHANGE			(0 << 16)#define RESTART_AUTO_NEG			(1 << 16)#define MAX_RX_PACKET_1518BYTE			(0 << 17)#define MAX_RX_PACKET_1522BYTE			(1 << 17)#define MAX_RX_PACKET_1552BYTE			(2 << 17)#define MAX_RX_PACKET_9022BYTE			(3 << 17)#define MAX_RX_PACKET_9192BYTE			(4 << 17)#define MAX_RX_PACKET_9700BYTE			(5 << 17)#define MAX_RX_PACKET_MASK			(7 << 17)#define CLR_EXT_LOOPBACK			(0 << 20)#define SET_EXT_LOOPBACK			(1 << 20)#define SET_HALF_DUPLEX_MODE			(0 << 21)#define SET_FULL_DUPLEX_MODE			(1 << 21)#define DISABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX	(0 << 22)#define ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX	(1 << 22)#define SET_GMII_SPEED_TO_10_100		(0 << 23)#define SET_GMII_SPEED_TO_1000			(1 << 23)#define SET_MII_SPEED_TO_10			(0 << 24)#define SET_MII_SPEED_TO_100			(1 << 24)#define PORT_SERIAL_CONTROL_DEFAULT_VALUE		\		DO_NOT_FORCE_LINK_PASS		|	\		ENABLE_AUTO_NEG_FOR_DUPLX	|	\		DISABLE_AUTO_NEG_FOR_FLOW_CTRL	|	\		ADV_SYMMETRIC_FLOW_CTRL		|	\		FORCE_FC_MODE_NO_PAUSE_DIS_TX	|	\		FORCE_BP_MODE_NO_JAM		|	\		(1 << 9) /* reserved */		|	\		DO_NOT_FORCE_LINK_FAIL		|	\		RETRANSMIT_16_ATTEMPTS		|	\		ENABLE_AUTO_NEG_SPEED_GMII	|	\		DTE_ADV_0			|	\		DISABLE_AUTO_NEG_BYPASS		|	\		AUTO_NEG_NO_CHANGE		|	\		MAX_RX_PACKET_9700BYTE		|	\		CLR_EXT_LOOPBACK		|	\		SET_FULL_DUPLEX_MODE		|	\		ENABLE_FLOW_CTRL_TX_RX_IN_FULL_DUPLEX/* These macros describe Ethernet Serial Status reg (PSR) bits */#define PORT_STATUS_MODE_10_BIT		(1 << 0)#define PORT_STATUS_LINK_UP		(1 << 1)#define PORT_STATUS_FULL_DUPLEX		(1 << 2)#define PORT_STATUS_FLOW_CONTROL	(1 << 3)#define PORT_STATUS_GMII_1000		(1 << 4)#define PORT_STATUS_MII_100		(1 << 5)/* PSR bit 6 is undocumented */#define PORT_STATUS_TX_IN_PROGRESS	(1 << 7)#define PORT_STATUS_AUTONEG_BYPASSED	(1 << 8)#define PORT_STATUS_PARTITION		(1 << 9)#define PORT_STATUS_TX_FIFO_EMPTY	(1 << 10)/* PSR bits 11-31 are reserved */#define PORT_DEFAULT_TRANSMIT_QUEUE_SIZE	800#define PORT_DEFAULT_RECEIVE_QUEUE_SIZE		400#define DESC_SIZE				64#define ETH_RX_QUEUES_ENABLED	(1 << 0)	/* use only Q0 for receive */#define ETH_TX_QUEUES_ENABLED	(1 << 0)	/* use only Q0 for transmit */#define ETH_INT_CAUSE_RX_DONE	(ETH_RX_QUEUES_ENABLED << 2)#define ETH_INT_CAUSE_RX_ERROR	(ETH_RX_QUEUES_ENABLED << 9)#define ETH_INT_CAUSE_RX	(ETH_INT_CAUSE_RX_DONE | ETH_INT_CAUSE_RX_ERROR)#define ETH_INT_CAUSE_EXT	0x00000002#define ETH_INT_UNMASK_ALL	(ETH_INT_CAUSE_RX | ETH_INT_CAUSE_EXT)#define ETH_INT_CAUSE_TX_DONE	(ETH_TX_QUEUES_ENABLED << 0)#define ETH_INT_CAUSE_TX_ERROR	(ETH_TX_QUEUES_ENABLED << 8)#define ETH_INT_CAUSE_TX	(ETH_INT_CAUSE_TX_DONE | ETH_INT_CAUSE_TX_ERROR)#define ETH_INT_CAUSE_PHY	0x00010000#define ETH_INT_CAUSE_STATE	0x00100000#define ETH_INT_UNMASK_ALL_EXT	(ETH_INT_CAUSE_TX | ETH_INT_CAUSE_PHY | \					ETH_INT_CAUSE_STATE)#define ETH_INT_MASK_ALL	0x00000000#define ETH_INT_MASK_ALL_EXT	0x00000000#define PHY_WAIT_ITERATIONS	1000	/* 1000 iterations * 10uS = 10mS max */#define PHY_WAIT_MICRO_SECONDS	10/* Buffer offset from buffer pointer */#define RX_BUF_OFFSET				0x2/* Gigabit Ethernet Unit Global Registers *//* MIB Counters register definitions */#define ETH_MIB_GOOD_OCTETS_RECEIVED_LOW	0x0#define ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH	0x4#define ETH_MIB_BAD_OCTETS_RECEIVED		0x8#define ETH_MIB_INTERNAL_MAC_TRANSMIT_ERR	0xc#define ETH_MIB_GOOD_FRAMES_RECEIVED		0x10#define ETH_MIB_BAD_FRAMES_RECEIVED		0x14#define ETH_MIB_BROADCAST_FRAMES_RECEIVED	0x18#define ETH_MIB_MULTICAST_FRAMES_RECEIVED	0x1c#define ETH_MIB_FRAMES_64_OCTETS		0x20#define ETH_MIB_FRAMES_65_TO_127_OCTETS		0x24#define ETH_MIB_FRAMES_128_TO_255_OCTETS	0x28#define ETH_MIB_FRAMES_256_TO_511_OCTETS	0x2c#define ETH_MIB_FRAMES_512_TO_1023_OCTETS	0x30#define ETH_MIB_FRAMES_1024_TO_MAX_OCTETS	0x34#define ETH_MIB_GOOD_OCTETS_SENT_LOW		0x38#define ETH_MIB_GOOD_OCTETS_SENT_HIGH		0x3c#define ETH_MIB_GOOD_FRAMES_SENT		0x40#define ETH_MIB_EXCESSIVE_COLLISION		0x44#define ETH_MIB_MULTICAST_FRAMES_SENT		0x48#define ETH_MIB_BROADCAST_FRAMES_SENT		0x4c#define ETH_MIB_UNREC_MAC_CONTROL_RECEIVED	0x50#define ETH_MIB_FC_SENT				0x54#define ETH_MIB_GOOD_FC_RECEIVED		0x58#define ETH_MIB_BAD_FC_RECEIVED			0x5c#define ETH_MIB_UNDERSIZE_RECEIVED		0x60#define ETH_MIB_FRAGMENTS_RECEIVED		0x64#define ETH_MIB_OVERSIZE_RECEIVED		0x68#define ETH_MIB_JABBER_RECEIVED			0x6c#define ETH_MIB_MAC_RECEIVE_ERROR		0x70#define ETH_MIB_BAD_CRC_EVENT			0x74#define ETH_MIB_COLLISION			0x78#define ETH_MIB_LATE_COLLISION			0x7c/* Port serial status reg (PSR) */#define ETH_INTERFACE_PCM			0x00000001#define ETH_LINK_IS_UP				0x00000002#define ETH_PORT_AT_FULL_DUPLEX			0x00000004#define ETH_RX_FLOW_CTRL_ENABLED		0x00000008#define ETH_GMII_SPEED_1000			0x00000010#define ETH_MII_SPEED_100			0x00000020#define ETH_TX_IN_PROGRESS			0x00000080#define ETH_BYPASS_ACTIVE			0x00000100#define ETH_PORT_AT_PARTITION_STATE		0x00000200#define ETH_PORT_TX_FIFO_EMPTY			0x00000400/* SMI reg */#define ETH_SMI_BUSY		0x10000000	/* 0 - Write, 1 - Read	*/#define ETH_SMI_READ_VALID	0x08000000	/* 0 - Write, 1 - Read	*/#define ETH_SMI_OPCODE_WRITE	0		/* Completion of Read	*/#define ETH_SMI_OPCODE_READ	0x04000000	/* Operation is in progress *//* Interrupt Cause Register Bit Definitions *//* SDMA command status fields macros *//* Tx & Rx descriptors status */#define ETH_ERROR_SUMMARY			0x00000001/* Tx & Rx descriptors command */#define ETH_BUFFER_OWNED_BY_DMA			0x80000000/* Tx descriptors status */#define ETH_LC_ERROR				0#define ETH_UR_ERROR				0x00000002#define ETH_RL_ERROR				0x00000004#define ETH_LLC_SNAP_FORMAT			0x00000200/* Rx descriptors status */#define ETH_OVERRUN_ERROR			0x00000002#define ETH_MAX_FRAME_LENGTH_ERROR		0x00000004#define ETH_RESOURCE_ERROR			0x00000006#define ETH_VLAN_TAGGED				0x00080000#define ETH_BPDU_FRAME				0x00100000#define ETH_UDP_FRAME_OVER_IP_V_4		0x00200000#define ETH_OTHER_FRAME_TYPE			0x00400000#define ETH_LAYER_2_IS_ETH_V_2			0x00800000#define ETH_FRAME_TYPE_IP_V_4			0x01000000#define ETH_FRAME_HEADER_OK			0x02000000#define ETH_RX_LAST_DESC			0x04000000#define ETH_RX_FIRST_DESC			0x08000000#define ETH_UNKNOWN_DESTINATION_ADDR		0x10000000#define ETH_RX_ENABLE_INTERRUPT			0x20000000#define ETH_LAYER_4_CHECKSUM_OK			0x40000000/* Rx descriptors byte count */#define ETH_FRAME_FRAGMENTED			0x00000004/* Tx descriptors command */#define ETH_LAYER_4_CHECKSUM_FIRST_DESC		0x00000400#define ETH_FRAME_SET_TO_VLAN			0x00008000#define ETH_UDP_FRAME				0x00010000#define ETH_GEN_TCP_UDP_CHECKSUM		0x00020000#define ETH_GEN_IP_V_4_CHECKSUM			0x00040000#define ETH_ZERO_PADDING			0x00080000#define ETH_TX_LAST_DESC			0x00100000#define ETH_TX_FIRST_DESC			0x00200000#define ETH_GEN_CRC				0x00400000#define ETH_TX_ENABLE_INTERRUPT			0x00800000#define ETH_AUTO_MODE				0x40000000#define ETH_TX_IHL_SHIFT			11/* typedefs */typedef enum _eth_func_ret_status {	ETH_OK,			/* Returned as expected.		*/	ETH_ERROR,		/* Fundamental error.			*/	ETH_RETRY,		/* Could not process request. Try later.*/	ETH_END_OF_JOB,		/* Ring has nothing to process.		*/	ETH_QUEUE_FULL,		/* Ring resource error.			*/	ETH_QUEUE_LAST_RESOURCE	/* Ring resources about to exhaust.	*/} ETH_FUNC_RET_STATUS;typedef enum _eth_target {	ETH_TARGET_DRAM,	ETH_TARGET_DEVICE,	ETH_TARGET_CBS,	ETH_TARGET_PCI0,	ETH_TARGET_PCI1} ETH_TARGET;

⌨️ 快捷键说明

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