11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*  D-Link DL2000-based Gigabit Ethernet Adapter Linux driver */
26aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzik/*
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Copyright (c) 2001, 2002 by D-Link Corporation
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Written by Edward Peng.<edward_peng@dlink.com.tw>
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    Created 03-May-2001, base on Linux' sundance.c.
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    This program is free software; you can redistribute it and/or modify
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    it under the terms of the GNU General Public License as published by
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    the Free Software Foundation; either version 2 of the License, or
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds    (at your option) any later version.
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __DL2K_H__
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __DL2K_H__
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/string.h>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/timer.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/slab.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/netdevice.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/etherdevice.h>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/skbuff.h>
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/crc32.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ethtool.h>
3178f6a6bd89e9a33e4be1bc61e6990a1172aa396eFrancois Romieu#include <linux/mii.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/bitops.h>
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/processor.h>	/* Processor type for cache alignment. */
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/io.h>
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/uaccess.h>
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/spinlock.h>
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/time.h>
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_RING_SIZE	256
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_QUEUE_LEN	(TX_RING_SIZE - 1) /* Limit ring entries actually used.*/
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_RING_SIZE 	256
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_TOTAL_SIZE	TX_RING_SIZE*sizeof(struct netdev_desc)
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RX_TOTAL_SIZE	RX_RING_SIZE*sizeof(struct netdev_desc)
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* This driver was written to use PCI memory space, however x86-oriented
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   hardware often uses I/O space accesses. */
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef MEM_MAPPING
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef readb
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef readw
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef readl
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef writeb
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef writew
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#undef writel
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define readb inb
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define readw inw
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define readl inl
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define writeb outb
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define writew outw
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define writel outl
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Offsets to the device registers.
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   Unlike software-only systems, device drivers interact with complex hardware.
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   It's not useful to define symbolic names for every register bit in the
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   device.  The name can only partially document the semantics and make
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   the driver longer and more difficult to read.
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   In general, only the important configuration values or bits changed
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   multiple times should be defined symbolically.
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum dl2x_offsets {
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* I/O register offsets */
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DMACtrl = 0x00,
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxDMAStatus = 0x08,
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TFDListPtr0 = 0x10,
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TFDListPtr1 = 0x14,
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxDMABurstThresh = 0x18,
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxDMAUrgentThresh = 0x19,
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxDMAPollPeriod = 0x1a,
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RFDListPtr0 = 0x1c,
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RFDListPtr1 = 0x20,
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxDMABurstThresh = 0x24,
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxDMAUrgentThresh = 0x25,
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxDMAPollPeriod = 0x26,
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxDMAIntCtrl = 0x28,
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DebugCtrl = 0x2c,
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ASICCtrl = 0x30,
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FifoCtrl = 0x38,
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxEarlyThresh = 0x3a,
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FlowOffThresh = 0x3c,
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FlowOnThresh = 0x3e,
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxStartThresh = 0x44,
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EepromData = 0x48,
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EepromCtrl = 0x4a,
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ExpromAddr = 0x4c,
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	Exprodata = 0x50,
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	WakeEvent = 0x51,
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	CountDown = 0x54,
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IntStatusAck = 0x5a,
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IntEnable = 0x5c,
1001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IntStatus = 0x5e,
1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxStatus = 0x60,
1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MACCtrl = 0x6c,
1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	VLANTag = 0x70,
1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PhyCtrl = 0x76,
1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	StationAddr0 = 0x78,
1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	StationAddr1 = 0x7a,
1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	StationAddr2 = 0x7c,
1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	VLANId = 0x80,
1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MaxFrameSize = 0x86,
1101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ReceiveMode = 0x88,
1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	HashTable0 = 0x8c,
1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	HashTable1 = 0x90,
1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RmonStatMask = 0x98,
1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	StatMask = 0x9c,
1151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxJumboFrames = 0xbc,
1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TCPCheckSumErrors = 0xc0,
1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IPCheckSumErrors = 0xc2,
1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	UDPCheckSumErrors = 0xc4,
1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxJumboFrames = 0xf4,
1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Ethernet MIB statistic register offsets */
1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	OctetRcvOk = 0xa8,
1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	McstOctetRcvOk = 0xac,
1231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BcstOctetRcvOk = 0xb0,
1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FramesRcvOk = 0xb4,
1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	McstFramesRcvdOk = 0xb8,
1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BcstFramesRcvdOk = 0xbe,
1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MacControlFramesRcvd = 0xc6,
1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FrameTooLongErrors = 0xc8,
1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	InRangeLengthErrors = 0xca,
1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FramesCheckSeqErrors = 0xcc,
1311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FramesLostRxErrors = 0xce,
1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	OctetXmtOk = 0xd0,
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	McstOctetXmtOk = 0xd4,
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BcstOctetXmtOk = 0xd8,
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FramesXmtOk = 0xdc,
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	McstFramesXmtdOk = 0xe0,
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FramesWDeferredXmt = 0xe4,
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	LateCollisions = 0xe8,
1391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MultiColFrames = 0xec,
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	SingleColFrames = 0xf0,
1411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	BcstFramesXmtdOk = 0xf6,
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	CarrierSenseErrors = 0xf8,
1431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MacControlFramesXmtd = 0xfa,
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FramesAbortXSColls = 0xfc,
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FramesWEXDeferal = 0xfe,
1461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* RMON statistic register offsets */
1471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsCollisions = 0x100,
1481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsOctetsTransmit = 0x104,
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPktsTransmit = 0x108,
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts64OctetTransmit = 0x10c,
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStats65to127OctetsTransmit = 0x110,
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts128to255OctetsTransmit = 0x114,
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts256to511OctetsTransmit = 0x118,
1541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts512to1023OctetsTransmit = 0x11c,
1551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts1024to1518OctetsTransmit = 0x120,
1561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsCRCAlignErrors = 0x124,
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsUndersizePkts = 0x128,
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsFragments = 0x12c,
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsJabbers = 0x130,
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsOctets = 0x134,
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts = 0x138,
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStats64Octets = 0x13c,
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts65to127Octets = 0x140,
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts128to255Octets = 0x144,
1651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts256to511Octets = 0x148,
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts512to1023Octets = 0x14c,
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	EtherStatsPkts1024to1518Octets = 0x150,
1681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bits in the interrupt status/mask registers. */
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum IntStatus_bits {
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	InterruptStatus = 0x0001,
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	HostError = 0x0002,
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MACCtrlFrame = 0x0008,
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxComplete = 0x0004,
1761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxComplete = 0x0010,
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxEarly = 0x0020,
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IntRequested = 0x0040,
1791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	UpdateStats = 0x0080,
1801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	LinkEvent = 0x0100,
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxDMAComplete = 0x0200,
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxDMAComplete = 0x0400,
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RFDListEnd = 0x0800,
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxDMAPriority = 0x1000,
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bits in the ReceiveMode register. */
1881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum ReceiveMode_bits {
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ReceiveUnicast = 0x0001,
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ReceiveMulticast = 0x0002,
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ReceiveBroadcast = 0x0004,
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ReceiveAllFrames = 0x0008,
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ReceiveMulticastHash = 0x0010,
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ReceiveIPMulticast = 0x0020,
1951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ReceiveVLANMatch = 0x0100,
1961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ReceiveVLANHash = 0x0200,
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
1981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Bits in MACCtrl. */
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum MACCtrl_bits {
2001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DuplexSelect = 0x20,
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxFlowControlEnable = 0x80,
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxFlowControlEnable = 0x0100,
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RcvFCS = 0x200,
2041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AutoVLANtagging = 0x1000,
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	AutoVLANuntagging = 0x2000,
2061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	StatsEnable = 0x00200000,
2071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	StatsDisable = 0x00400000,
2081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	StatsEnabled = 0x00800000,
2091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxEnable = 0x01000000,
2101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxDisable = 0x02000000,
2111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxEnabled = 0x04000000,
2121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxEnable = 0x08000000,
2131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxDisable = 0x10000000,
2141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxEnabled = 0x20000000,
2151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum ASICCtrl_LoWord_bits {
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PhyMedia = 0x0080,
2191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2206aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzik
2211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum ASICCtrl_HiWord_bits {
2221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	GlobalReset = 0x0001,
2231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxReset = 0x0002,
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxReset = 0x0004,
2251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DMAReset = 0x0008,
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FIFOReset = 0x0010,
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	NetworkReset = 0x0020,
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	HostReset = 0x0040,
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ResetBusy = 0x0400,
2301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Transmit Frame Control bits */
2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum TFC_bits {
2341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	DwordAlign = 0x00000000,
2351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	WordAlignDisable = 0x00030000,
2361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	WordAlign = 0x00020000,
2371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TCPChecksumEnable = 0x00040000,
2381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	UDPChecksumEnable = 0x00080000,
2391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IPChecksumEnable = 0x00100000,
2401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FCSAppendDisable = 0x00200000,
2411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxIndicate = 0x00400000,
2421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TxDMAIndicate = 0x00800000,
2431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FragCountShift = 24,
2441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	VLANTagInsert = 0x0000000010000000,
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TFDDone = 0x80000000,
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	VIDShift = 32,
2471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	UsePriorityShift = 48,
2481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Receive Frames Status bits */
2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum RFS_bits {
2521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxFIFOOverrun = 0x00010000,
2531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxRuntFrame = 0x00020000,
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxAlignmentError = 0x00040000,
2551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxFCSError = 0x00080000,
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxOverSizedFrame = 0x00100000,
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RxLengthError = 0x00200000,
2581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	VLANDetected = 0x00400000,
2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TCPDetected = 0x00800000,
2601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TCPError = 0x01000000,
2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	UDPDetected = 0x02000000,
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	UDPError = 0x04000000,
2631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IPDetected = 0x08000000,
2641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	IPError = 0x10000000,
2651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FrameStart = 0x20000000,
2661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	FrameEnd = 0x40000000,
2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RFDDone = 0x80000000,
2681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	TCIShift = 32,
2691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	RFS_Errors = 0x003f0000,
2701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MII_RESET_TIME_OUT		10000
2731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* MII register */
2741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum _mii_reg {
2751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MII_PHY_SCR = 16,
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
27778f6a6bd89e9a33e4be1bc61e6990a1172aa396eFrancois Romieu
2781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* PCS register */
2791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum _pcs_reg {
2801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_BMCR = 0,
2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_BMSR = 1,
2821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANAR = 4,
2831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANLPAR = 5,
2841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANER = 6,
2851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANNPT = 7,
2861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANLPRNP = 8,
2871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ESR = 15,
2881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* IEEE Extened Status Register */
2911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum _mii_esr {
2921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MII_ESR_1000BX_FD = 0x8000,
2931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MII_ESR_1000BX_HD = 0x4000,
2941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MII_ESR_1000BT_FD = 0x2000,
2951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	MII_ESR_1000BT_HD = 0x1000,
2961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* PHY Specific Control Register */
2985b5119167b724f4c4d54e69f91f22a83b01207afAl Viro#if 0
2991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef union t_MII_PHY_SCR {
3001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 image;
3011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct {
3021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 disable_jabber:1;	// bit 0
3031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 polarity_reversal:1;	// bit 1
3041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 SEQ_test:1;	// bit 2
3051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 _bit_3:1;	// bit 3
3061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 disable_CLK125:1;	// bit 4
3071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 mdi_crossover_mode:2;	// bit 6:5
3081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 enable_ext_dist:1;	// bit 7
3091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 _bit_8_9:2;	// bit 9:8
3101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 force_link:1;	// bit 10
3111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 assert_CRS:1;	// bit 11
3121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 rcv_fifo_depth:2;	// bit 13:12
3131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		u16 xmit_fifo_depth:2;	// bit 15:14
3141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	} bits;
3151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} PHY_SCR_t, *PPHY_SCR_t;
3165b5119167b724f4c4d54e69f91f22a83b01207afAl Viro#endif
3171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef enum t_MII_ADMIN_STATUS {
3191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	adm_reset,
3201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	adm_operational,
3211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	adm_loopback,
3221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	adm_power_down,
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	adm_isolate
3241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} MII_ADMIN_t, *PMII_ADMIN_t;
3251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Physical Coding Sublayer Management (PCS) */
3271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* PCS control and status registers bitmap as the same as MII */
3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* PCS Extended Status register bitmap as the same as MII */
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* PCS ANAR */
3301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum _pcs_anar {
3311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANAR_NEXT_PAGE = 0x8000,
3321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANAR_REMOTE_FAULT = 0x3000,
3331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANAR_ASYMMETRIC = 0x0100,
3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANAR_PAUSE = 0x0080,
3351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANAR_HALF_DUPLEX = 0x0040,
3361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANAR_FULL_DUPLEX = 0x0020,
3371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* PCS ANLPAR */
3391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsenum _pcs_anlpar {
3406aa20a2235535605db6d6d2bd850298b2fe7f31eJeff Garzik	PCS_ANLPAR_NEXT_PAGE = PCS_ANAR_NEXT_PAGE,
3411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANLPAR_REMOTE_FAULT = PCS_ANAR_REMOTE_FAULT,
3421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANLPAR_ASYMMETRIC = PCS_ANAR_ASYMMETRIC,
3431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANLPAR_PAUSE = PCS_ANAR_PAUSE,
3441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANLPAR_HALF_DUPLEX = PCS_ANAR_HALF_DUPLEX,
3451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	PCS_ANLPAR_FULL_DUPLEX = PCS_ANAR_FULL_DUPLEX,
3461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldstypedef struct t_SROM {
3491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 config_param;	/* 0x00 */
3501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 asic_ctrl;		/* 0x02 */
3511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 sub_vendor_id;	/* 0x04 */
3521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 sub_system_id;	/* 0x06 */
3531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 reserved1[12];	/* 0x08-0x1f */
3541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 mac_addr[6];		/* 0x20-0x25 */
3551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 reserved2[10];	/* 0x26-0x2f */
3561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 sib[204];		/* 0x30-0xfb */
3571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 crc;		/* 0xfc-0xff */
3581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} SROM_t, *PSROM_t;
3591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Ioctl custom data */
3611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct ioctl_data {
3621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char signature[10];
3631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int cmd;
3641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int len;
3651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char *data;
3661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* The Rx and Tx buffer descriptors. */
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct netdev_desc {
37078ce8d3d1c75c22ae593ad4ccaffa19ee0e2576dAl Viro	__le64 next_desc;
37178ce8d3d1c75c22ae593ad4ccaffa19ee0e2576dAl Viro	__le64 status;
37278ce8d3d1c75c22ae593ad4ccaffa19ee0e2576dAl Viro	__le64 fraginfo;
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PRIV_ALIGN	15	/* Required alignment mask */
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Use  __attribute__((aligned (L1_CACHE_BYTES)))  to maintain alignment
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds   within the structure. */
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct netdev_private {
3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	/* Descriptor rings first for alignment. */
3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct netdev_desc *rx_ring;
3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct netdev_desc *tx_ring;
3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sk_buff *rx_skbuff[RX_RING_SIZE];
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct sk_buff *tx_skbuff[TX_RING_SIZE];
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dma_addr_t tx_ring_dma;
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dma_addr_t rx_ring_dma;
3861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pci_dev *pdev;
3871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spinlock_t tx_lock;
3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	spinlock_t rx_lock;
3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct net_device_stats stats;
3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int rx_buf_sz;		/* Based on MTU+slack. */
3911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int speed;		/* Operating speed */
3921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int vlan;		/* VLAN Id */
3931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int chip_id;		/* PCI table chip id */
3941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int rx_coalesce; 	/* Maximum frames each RxDMAComplete intr */
3951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int rx_timeout; 	/* Wait time between RxDMAComplete intr */
3961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int tx_coalesce;	/* Maximum frames each tx interrupt */
3971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int full_duplex:1;	/* Full-duplex operation requested. */
3981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int an_enable:2;	/* Auto-Negotiated Enable */
3991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int jumbo:1;		/* Jumbo frame enable */
4001da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int coalesce:1;	/* Rx coalescing enable */
4011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int tx_flow:1;		/* Tx flow control enable */
4021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int rx_flow:1;		/* Rx flow control enable */
4031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int phy_media:1;	/* 1: fiber, 0: copper */
4041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned int link_status:1;	/* Current link status */
4051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct netdev_desc *last_tx;	/* Last Tx descriptor used. */
4061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long cur_rx, old_rx;	/* Producer/consumer ring indices */
4071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long cur_tx, old_tx;
4081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct timer_list timer;
4091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int wake_polarity;
4101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	char name[256];		/* net device description */
4111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u8 duplex_polarity;
4121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 mcast_filter[4];
4131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 advertising;	/* NWay media advertisement */
4141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u16 negotiate;		/* Negotiated media */
4151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int phy_addr;		/* PHY addresses. */
4161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
4171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
4181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* The station address location in the EEPROM. */
4191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* The struct pci_device_id consist of:
4201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        vendor, device          Vendor and device ID to match (or PCI_ANY_ID)
4211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        subvendor, subdevice    Subsystem vendor and device ID to match (or PCI_ANY_ID)
4221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        class                   Device class to match. The class_mask tells which bits
4231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        class_mask              of the class are honored during the comparison.
4241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds        driver_data             Data private to the driver.
4251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds*/
4261f1bd5fc326a46d8c49132260f661b7cc954846fJeff Garzik
427a3aa18842a5303fc28fcc4d57dbd16618bd830a0Alexey Dobriyanstatic DEFINE_PCI_DEVICE_TABLE(rio_pci_tbl) = {
4281f1bd5fc326a46d8c49132260f661b7cc954846fJeff Garzik	{0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, },
429df950828b0ee51ff63c49c67d561bfd3d6096788Komuro	{0x13f0, 0x1021, PCI_ANY_ID, PCI_ANY_ID, },
4301f1bd5fc326a46d8c49132260f661b7cc954846fJeff Garzik	{ }
4311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
4321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsMODULE_DEVICE_TABLE (pci, rio_pci_tbl);
4331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define TX_TIMEOUT  (4*HZ)
4341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define PACKET_SIZE		1536
4351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_JUMBO		8000
4361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define RIO_IO_SIZE             340
4371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_RXC		5
4381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_RXT		750
4391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DEFAULT_TXC		1
4401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define MAX_TXC			8
4411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif				/* __DL2K_H__ */
442