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

📄 3c59x.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
static struct vortex_chip_info {	const char *name;	int flags;	int drv_flags;	int io_size;} vortex_info_tbl[] __devinitdata = {#define EISA_TBL_OFFSET	0		/* Offset of this entry for vortex_eisa_init */	{"3c590 Vortex 10Mbps",	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },	{"3c592 EISA 10mbps Demon/Vortex",					/* AKPM: from Don's 3c59x_cb.c 0.49H */	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },	{"3c597 EISA Fast Demon/Vortex",					/* AKPM: from Don's 3c59x_cb.c 0.49H */	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },	{"3c595 Vortex 100baseTx",	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },	{"3c595 Vortex 100baseT4",	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },	{"3c595 Vortex 100base-MII",	 PCI_USES_IO|PCI_USES_MASTER, IS_VORTEX, 32, },	{"3c900 Boomerang 10baseT",	 PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, },	{"3c900 Boomerang 10Mbps Combo",	 PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG, 64, },	{"3c900 Cyclone 10Mbps TPO",						/* AKPM: from Don's 0.99M */	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY, 128, },	{"3c900 Cyclone 10Mbps Combo",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, },	{"3c900 Cyclone 10Mbps TPC",						/* AKPM: from Don's 0.99M */	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, },	{"3c900B-FL Cyclone 10base-FL",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, },	{"3c905 Boomerang 100baseTx",	 PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, },	{"3c905 Boomerang 100baseT4",	 PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII, 64, },	{"3c905B Cyclone 100baseTx",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY, 128, },	{"3c905B Cyclone 10/100/BNC",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY, 128, },	{"3c905B-FX Cyclone 100baseFx",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, },	{"3c905C Tornado",	 PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY, 128, },	{"3c980 Cyclone",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, },	{"3c980 10/100 Base-TX NIC(Python-T)",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, },	{"3cSOHO100-TX Hurricane",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE, 128, },	{"3c555 Laptop Hurricane",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|EEPROM_8BIT, 128, },	{"3c556 Laptop Tornado",	 PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_8BIT|HAS_CB_FNS|INVERT_MII_PWR, 128, },	{"3c556B Laptop Hurricane",	 PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|EEPROM_OFFSET|HAS_CB_FNS|INVERT_MII_PWR, 128, },	{"3c575 [Megahertz] 10/100 LAN 	CardBus",	 PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, },	{"3c575 Boomerang CardBus",	 PCI_USES_IO|PCI_USES_MASTER, IS_BOOMERANG|HAS_MII|EEPROM_8BIT, 128, },	{"3CCFE575BT Cyclone CardBus",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_LED_PWR, 128, },	{"3CCFE575CT Tornado CardBus",	 PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR|MAX_COLLISION_RESET, 128, },	{"3CCFE656 Cyclone CardBus",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR|INVERT_LED_PWR, 128, },	{"3CCFEM656B Cyclone+Winmodem CardBus",	 PCI_USES_IO|PCI_USES_MASTER, IS_CYCLONE|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR|INVERT_LED_PWR, 128, },	{"3CXFEM656C Tornado+Winmodem CardBus",			/* From pcmcia-cs-3.1.5 */	 PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY|HAS_CB_FNS|EEPROM_8BIT|INVERT_MII_PWR|MAX_COLLISION_RESET, 128, },	{"3c450 HomePNA Tornado",						/* AKPM: from Don's 0.99Q */	 PCI_USES_IO|PCI_USES_MASTER, IS_TORNADO|HAS_NWAY, 128, },	{0,}, /* 0 terminated list. */};static struct pci_device_id vortex_pci_tbl[] __devinitdata = {	{ 0x10B7, 0x5900, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C590 },	{ 0x10B7, 0x5920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C592 },	{ 0x10B7, 0x5970, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C597 },	{ 0x10B7, 0x5950, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C595_1 },	{ 0x10B7, 0x5951, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C595_2 },	{ 0x10B7, 0x5952, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C595_3 },	{ 0x10B7, 0x9000, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900_1 },	{ 0x10B7, 0x9001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900_2 },	{ 0x10B7, 0x9004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900_3 },	{ 0x10B7, 0x9005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900_4 },	{ 0x10B7, 0x9006, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900_5 },	{ 0x10B7, 0x900A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C900B_FL },	{ 0x10B7, 0x9050, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905_1 },	{ 0x10B7, 0x9051, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905_2 },	{ 0x10B7, 0x9055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_1 },	{ 0x10B7, 0x9058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_2 },	{ 0x10B7, 0x905A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905B_FX },	{ 0x10B7, 0x9200, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C905C },	{ 0x10B7, 0x9800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C980 },	{ 0x10B7, 0x9805, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C9805 },	{ 0x10B7, 0x7646, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CSOHO100_TX },	{ 0x10B7, 0x5055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C555 },	{ 0x10B7, 0x6055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C556 },	{ 0x10B7, 0x6056, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C556B },	{ 0x10B7, 0x5b57, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C575 },	{ 0x10B7, 0x5057, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C575_1 },	{ 0x10B7, 0x5157, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CCFE575 },	{ 0x10B7, 0x5257, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CCFE575CT },	{ 0x10B7, 0x6560, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CCFE656 },	{ 0x10B7, 0x6562, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CCFEM656 },	{ 0x10B7, 0x6564, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3CCFEM656_1 },	{ 0x10B7, 0x4500, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CH_3C450 },	{0,}						/* 0 terminated list. */};MODULE_DEVICE_TABLE(pci, vortex_pci_tbl);/* Operational definitions.   These are not used by other compilation units and thus are not   exported in a ".h" file.   First the windows.  There are eight register windows, with the command   and status registers available in each.   */#define EL3WINDOW(win_num) outw(SelectWindow + (win_num), ioaddr + EL3_CMD)#define EL3_CMD 0x0e#define EL3_STATUS 0x0e/* The top five bits written to EL3_CMD are a command, the lower   11 bits are the parameter, if applicable.   Note that 11 parameters bits was fine for ethernet, but the new chip   can handle FDDI length frames (~4500 octets) and now parameters count   32-bit 'Dwords' rather than octets. */enum vortex_cmd {	TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11,	RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11,	UpStall = 6<<11, UpUnstall = (6<<11)+1,	DownStall = (6<<11)+2, DownUnstall = (6<<11)+3,	RxDiscard = 8<<11, TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11,	FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11,	SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11,	SetTxThreshold = 18<<11, SetTxStart = 19<<11,	StartDMAUp = 20<<11, StartDMADown = (20<<11)+1, StatsEnable = 21<<11,	StatsDisable = 22<<11, StopCoax = 23<<11, SetFilterBit = 25<<11,};/* The SetRxFilter command accepts the following classes: */enum RxFilter {	RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8 };/* Bits in the general status register. */enum vortex_status {	IntLatch = 0x0001, HostError = 0x0002, TxComplete = 0x0004,	TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020,	IntReq = 0x0040, StatsFull = 0x0080,	DMADone = 1<<8, DownComplete = 1<<9, UpComplete = 1<<10,	DMAInProgress = 1<<11,			/* DMA controller is still busy.*/	CmdInProgress = 1<<12,			/* EL3_CMD is still busy.*/};/* Register window 1 offsets, the window used in normal operation.   On the Vortex this window is always mapped at offsets 0x10-0x1f. */enum Window1 {	TX_FIFO = 0x10,  RX_FIFO = 0x10,  RxErrors = 0x14,	RxStatus = 0x18,  Timer=0x1A, TxStatus = 0x1B,	TxFree = 0x1C, /* Remaining free bytes in Tx buffer. */};enum Window0 {	Wn0EepromCmd = 10,		/* Window 0: EEPROM command register. */	Wn0EepromData = 12,		/* Window 0: EEPROM results register. */	IntrStatus=0x0E,		/* Valid in all windows. */};enum Win0_EEPROM_bits {	EEPROM_Read = 0x80, EEPROM_WRITE = 0x40, EEPROM_ERASE = 0xC0,	EEPROM_EWENB = 0x30,		/* Enable erasing/writing for 10 msec. */	EEPROM_EWDIS = 0x00,		/* Disable EWENB before 10 msec timeout. */};/* EEPROM locations. */enum eeprom_offset {	PhysAddr01=0, PhysAddr23=1, PhysAddr45=2, ModelID=3,	EtherLink3ID=7, IFXcvrIO=8, IRQLine=9,	NodeAddr01=10, NodeAddr23=11, NodeAddr45=12,	DriverTune=13, Checksum=15};enum Window2 {			/* Window 2. */	Wn2_ResetOptions=12,};enum Window3 {			/* Window 3: MAC/config bits. */	Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8,};#define BFEXT(value, offset, bitcount)  \    ((((unsigned long)(value)) >> (offset)) & ((1 << (bitcount)) - 1))#define BFINS(lhs, rhs, offset, bitcount)					\	(((lhs) & ~((((1 << (bitcount)) - 1)) << (offset))) |	\	(((rhs) & ((1 << (bitcount)) - 1)) << (offset)))#define RAM_SIZE(v)		BFEXT(v, 0, 3)#define RAM_WIDTH(v)	BFEXT(v, 3, 1)#define RAM_SPEED(v)	BFEXT(v, 4, 2)#define ROM_SIZE(v)		BFEXT(v, 6, 2)#define RAM_SPLIT(v)	BFEXT(v, 16, 2)#define XCVR(v)			BFEXT(v, 20, 4)#define AUTOSELECT(v)	BFEXT(v, 24, 1)enum Window4 {		/* Window 4: Xcvr/media bits. */	Wn4_FIFODiag = 4, Wn4_NetDiag = 6, Wn4_PhysicalMgmt=8, Wn4_Media = 10,};enum Win4_Media_bits {	Media_SQE = 0x0008,		/* Enable SQE error counting for AUI. */	Media_10TP = 0x00C0,	/* Enable link beat and jabber for 10baseT. */	Media_Lnk = 0x0080,		/* Enable just link beat for 100TX/100FX. */	Media_LnkBeat = 0x0800,};enum Window7 {					/* Window 7: Bus Master control. */	Wn7_MasterAddr = 0, Wn7_MasterLen = 6, Wn7_MasterStatus = 12,};/* Boomerang bus master control registers. */enum MasterCtrl {	PktStatus = 0x20, DownListPtr = 0x24, FragAddr = 0x28, FragLen = 0x2c,	TxFreeThreshold = 0x2f, UpPktStatus = 0x30, UpListPtr = 0x38,};/* The Rx and Tx descriptor lists.   Caution Alpha hackers: these types are 32 bits!  Note also the 8 byte   alignment contraint on tx_ring[] and rx_ring[]. */#define LAST_FRAG 	0x80000000			/* Last Addr/Len pair in descriptor. */#define DN_COMPLETE	0x00010000			/* This packet has been downloaded */struct boom_rx_desc {	u32 next;					/* Last entry points to 0.   */	s32 status;	u32 addr;					/* Up to 63 addr/len pairs possible. */	s32 length;					/* Set LAST_FRAG to indicate last pair. */};/* Values for the Rx status entry. */enum rx_desc_status {	RxDComplete=0x00008000, RxDError=0x4000,	/* See boomerang_rx() for actual error bits */	IPChksumErr=1<<25, TCPChksumErr=1<<26, UDPChksumErr=1<<27,	IPChksumValid=1<<29, TCPChksumValid=1<<30, UDPChksumValid=1<<31,};struct boom_tx_desc {	u32 next;					/* Last entry points to 0.   */	s32 status;					/* bits 0:12 length, others see below.  */	u32 addr;	s32 length;};/* Values for the Tx status entry. */enum tx_desc_status {	CRCDisable=0x2000, TxDComplete=0x8000,	AddIPChksum=0x02000000, AddTCPChksum=0x04000000, AddUDPChksum=0x08000000,	TxIntrUploaded=0x80000000,		/* IRQ when in FIFO, but maybe not sent. */};/* Chip features we care about in vp->capabilities, read from the EEPROM. */enum ChipCaps { CapBusMaster=0x20, CapPwrMgmt=0x2000 };struct vortex_private {	/* The Rx and Tx rings should be quad-word-aligned. */	struct boom_rx_desc* rx_ring;	struct boom_tx_desc* tx_ring;	dma_addr_t rx_ring_dma;	dma_addr_t tx_ring_dma;	/* The addresses of transmit- and receive-in-place skbuffs. */	struct sk_buff* rx_skbuff[RX_RING_SIZE];	struct sk_buff* tx_skbuff[TX_RING_SIZE];	struct net_device *next_module;		/* NULL if PCI device */	unsigned int cur_rx, cur_tx;		/* The next free ring entry */	unsigned int dirty_rx, dirty_tx;	/* The ring entries to be free()ed. */	struct net_device_stats stats;	struct sk_buff *tx_skb;				/* Packet being eaten by bus master ctrl.  */	dma_addr_t tx_skb_dma;				/* Allocated DMA address for bus master ctrl DMA.   */	/* PCI configuration space information. */	struct pci_dev *pdev;	char *cb_fn_base;					/* CardBus function status addr space. */	/* The remainder are related to chip state, mostly media selection. */	struct timer_list timer;			/* Media selection timer. */	struct timer_list rx_oom_timer;		/* Rx skb allocation retry timer */	int options;						/* User-settable misc. driver options. */	unsigned int media_override:4, 		/* Passed-in media type. */		default_media:4,				/* Read from the EEPROM/Wn3_Config. */		full_duplex:1, force_fd:1, autoselect:1,		bus_master:1,					/* Vortex can only do a fragment bus-m. */		full_bus_master_tx:1, full_bus_master_rx:2, /* Boomerang  */		flow_ctrl:1,					/* Use 802.3x flow control (PAUSE only) */		partner_flow_ctrl:1,			/* Partner supports flow control */		tx_full:1,		has_nway:1,		open:1,		must_free_region:1;				/* Flag: if zero, Cardbus owns the I/O region */	int drv_flags;	u16 status_enable;	u16 intr_enable;	u16 available_media;				/* From Wn3_Options. */	u16 capabilities, info1, info2;		/* Various, from EEPROM. */	u16 advertising;					/* NWay media advertisement */	unsigned char phys[2];				/* MII device addresses. */	u16 deferred;						/* Resend these interrupts when we										 * bale from the ISR */	u16 io_size;						/* Size of PCI region (for release_region) */	spinlock_t lock;					/* Serialise access to device & its vortex_private */	spinlock_t mdio_lock;				/* Serialise access to mdio hardware */};/* The action to take with a media selection timer tick.   Note that we deviate from the 3Com order by checking 10base2 before AUI. */enum xcvr_types {	XCVR_10baseT=0, XCVR_AUI, XCVR_10baseTOnly, XCVR_10base2, XCVR_100baseTx,	XCVR_100baseFx, XCVR_MII=6, XCVR_NWAY=8, XCVR_ExtMII=9, XCVR_Default=10,};static struct media_table {	char *name;	unsigned int media_bits:16,		/* Bits to set in Wn4_Media register. */		mask:8,						/* The transceiver-present bit in Wn3_Config.*/		next:8;						/* The media type to try next. */	int wait;						/* Time before we check media status. */} media_tbl[] = {  {	"10baseT",   Media_10TP,0x08, XCVR_10base2, (14*HZ)/10},  { "10Mbs AUI", Media_SQE, 0x20, XCVR_Default, (1*HZ)/10},  { "undefined", 0,			0x80, XCVR_10baseT, 10000},  { "10base2",   0,			0x10, XCVR_AUI,		(1*HZ)/10},  { "100baseTX", Media_Lnk, 0x02, XCVR_100baseFx, (14*HZ)/10},  { "100baseFX", Media_Lnk, 0x04, XCVR_MII,		(14*HZ)/10},  { "MII",		 0,			0x41, XCVR_10baseT, 3*HZ },  { "undefined", 0,			0x01, XCVR_10baseT, 10000},  { "Autonegotiate", 0,		0x41, XCVR_10baseT, 3*HZ},  { "MII-External",	 0,		0x41, XCVR_10baseT, 3*HZ },  { "Default",	 0,			0xFF, XCVR_10baseT, 10000},};static int vortex_probe1(struct pci_dev *pdev, long ioaddr, int irq,				   int chip_idx, int card_idx);static void vortex_up(struct net_device *dev);static void vortex_down(struct net_device *dev);static int vortex_open(struct net_device *dev);static void mdio_sync(long ioaddr, int bits);static int mdio_read(struct net_device *dev, int phy_id, int location);static void mdio_write(struct net_device *vp, int phy_id, int location, int value);static void vortex_timer(unsigned long arg);static void rx_oom_timer(unsigned long arg);static int vortex_start_xmit(struct sk_buff *skb, struct net_device *dev);static int boomerang_start_xmit(struct sk_buff *skb, struct net_device *dev);static int vortex_rx(struct net_device *dev);static int boomerang_rx(struct net_device *dev);static void vortex_interrupt(int irq, void *dev_id, struct pt_regs *regs);static void boomerang_interrupt(int irq, void *dev_id, struct pt_regs *regs);static int vortex_close(struct net_device *dev);static void dump_tx_ring(struct net_device *dev);static void update_stats(long ioaddr, struct net_device *dev);static struct net_device_stats *vortex_get_stats(struct net_device *dev);static void set_rx_mode(struct net_device *dev);static int vortex_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);static void vortex_tx_timeout(struct net_device *dev);static void acpi_set_WOL(struct net_device *dev);/* This driver uses 'options' to pass the media type, full-duplex flag, etc. *//* Option count limit only -- unlimited interfaces are supported. */#define MAX_UNITS 8static int options[MAX_UNITS] = { -1, -1, -1, -1, -1, -1, -1, -1,};

⌨️ 快捷键说明

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