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