Root/drivers/net/dl2k.h

1/* D-Link DL2000-based Gigabit Ethernet Adapter Linux driver */
2/*
3    Copyright (c) 2001, 2002 by D-Link Corporation
4    Written by Edward Peng.<edward_peng@dlink.com.tw>
5    Created 03-May-2001, base on Linux' sundance.c.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11*/
12
13#ifndef __DL2K_H__
14#define __DL2K_H__
15
16#include <linux/module.h>
17#include <linux/kernel.h>
18#include <linux/string.h>
19#include <linux/timer.h>
20#include <linux/errno.h>
21#include <linux/ioport.h>
22#include <linux/slab.h>
23#include <linux/interrupt.h>
24#include <linux/pci.h>
25#include <linux/netdevice.h>
26#include <linux/etherdevice.h>
27#include <linux/skbuff.h>
28#include <linux/init.h>
29#include <linux/crc32.h>
30#include <linux/ethtool.h>
31#include <linux/bitops.h>
32#include <asm/processor.h> /* Processor type for cache alignment. */
33#include <asm/io.h>
34#include <asm/uaccess.h>
35#include <linux/delay.h>
36#include <linux/spinlock.h>
37#include <linux/time.h>
38#define TX_RING_SIZE 256
39#define TX_QUEUE_LEN (TX_RING_SIZE - 1) /* Limit ring entries actually used.*/
40#define RX_RING_SIZE 256
41#define TX_TOTAL_SIZE TX_RING_SIZE*sizeof(struct netdev_desc)
42#define RX_TOTAL_SIZE RX_RING_SIZE*sizeof(struct netdev_desc)
43
44/* This driver was written to use PCI memory space, however x86-oriented
45   hardware often uses I/O space accesses. */
46#ifndef MEM_MAPPING
47#undef readb
48#undef readw
49#undef readl
50#undef writeb
51#undef writew
52#undef writel
53#define readb inb
54#define readw inw
55#define readl inl
56#define writeb outb
57#define writew outw
58#define writel outl
59#endif
60
61/* Offsets to the device registers.
62   Unlike software-only systems, device drivers interact with complex hardware.
63   It's not useful to define symbolic names for every register bit in the
64   device. The name can only partially document the semantics and make
65   the driver longer and more difficult to read.
66   In general, only the important configuration values or bits changed
67   multiple times should be defined symbolically.
68*/
69enum dl2x_offsets {
70    /* I/O register offsets */
71    DMACtrl = 0x00,
72    RxDMAStatus = 0x08,
73    TFDListPtr0 = 0x10,
74    TFDListPtr1 = 0x14,
75    TxDMABurstThresh = 0x18,
76    TxDMAUrgentThresh = 0x19,
77    TxDMAPollPeriod = 0x1a,
78    RFDListPtr0 = 0x1c,
79    RFDListPtr1 = 0x20,
80    RxDMABurstThresh = 0x24,
81    RxDMAUrgentThresh = 0x25,
82    RxDMAPollPeriod = 0x26,
83    RxDMAIntCtrl = 0x28,
84    DebugCtrl = 0x2c,
85    ASICCtrl = 0x30,
86    FifoCtrl = 0x38,
87    RxEarlyThresh = 0x3a,
88    FlowOffThresh = 0x3c,
89    FlowOnThresh = 0x3e,
90    TxStartThresh = 0x44,
91    EepromData = 0x48,
92    EepromCtrl = 0x4a,
93    ExpromAddr = 0x4c,
94    Exprodata = 0x50,
95    WakeEvent = 0x51,
96    CountDown = 0x54,
97    IntStatusAck = 0x5a,
98    IntEnable = 0x5c,
99    IntStatus = 0x5e,
100    TxStatus = 0x60,
101    MACCtrl = 0x6c,
102    VLANTag = 0x70,
103    PhyCtrl = 0x76,
104    StationAddr0 = 0x78,
105    StationAddr1 = 0x7a,
106    StationAddr2 = 0x7c,
107    VLANId = 0x80,
108    MaxFrameSize = 0x86,
109    ReceiveMode = 0x88,
110    HashTable0 = 0x8c,
111    HashTable1 = 0x90,
112    RmonStatMask = 0x98,
113    StatMask = 0x9c,
114    RxJumboFrames = 0xbc,
115    TCPCheckSumErrors = 0xc0,
116    IPCheckSumErrors = 0xc2,
117    UDPCheckSumErrors = 0xc4,
118    TxJumboFrames = 0xf4,
119    /* Ethernet MIB statistic register offsets */
120    OctetRcvOk = 0xa8,
121    McstOctetRcvOk = 0xac,
122    BcstOctetRcvOk = 0xb0,
123    FramesRcvOk = 0xb4,
124    McstFramesRcvdOk = 0xb8,
125    BcstFramesRcvdOk = 0xbe,
126    MacControlFramesRcvd = 0xc6,
127    FrameTooLongErrors = 0xc8,
128    InRangeLengthErrors = 0xca,
129    FramesCheckSeqErrors = 0xcc,
130    FramesLostRxErrors = 0xce,
131    OctetXmtOk = 0xd0,
132    McstOctetXmtOk = 0xd4,
133    BcstOctetXmtOk = 0xd8,
134    FramesXmtOk = 0xdc,
135    McstFramesXmtdOk = 0xe0,
136    FramesWDeferredXmt = 0xe4,
137    LateCollisions = 0xe8,
138    MultiColFrames = 0xec,
139    SingleColFrames = 0xf0,
140    BcstFramesXmtdOk = 0xf6,
141    CarrierSenseErrors = 0xf8,
142    MacControlFramesXmtd = 0xfa,
143    FramesAbortXSColls = 0xfc,
144    FramesWEXDeferal = 0xfe,
145    /* RMON statistic register offsets */
146    EtherStatsCollisions = 0x100,
147    EtherStatsOctetsTransmit = 0x104,
148    EtherStatsPktsTransmit = 0x108,
149    EtherStatsPkts64OctetTransmit = 0x10c,
150    EtherStats65to127OctetsTransmit = 0x110,
151    EtherStatsPkts128to255OctetsTransmit = 0x114,
152    EtherStatsPkts256to511OctetsTransmit = 0x118,
153    EtherStatsPkts512to1023OctetsTransmit = 0x11c,
154    EtherStatsPkts1024to1518OctetsTransmit = 0x120,
155    EtherStatsCRCAlignErrors = 0x124,
156    EtherStatsUndersizePkts = 0x128,
157    EtherStatsFragments = 0x12c,
158    EtherStatsJabbers = 0x130,
159    EtherStatsOctets = 0x134,
160    EtherStatsPkts = 0x138,
161    EtherStats64Octets = 0x13c,
162    EtherStatsPkts65to127Octets = 0x140,
163    EtherStatsPkts128to255Octets = 0x144,
164    EtherStatsPkts256to511Octets = 0x148,
165    EtherStatsPkts512to1023Octets = 0x14c,
166    EtherStatsPkts1024to1518Octets = 0x150,
167};
168
169/* Bits in the interrupt status/mask registers. */
170enum IntStatus_bits {
171    InterruptStatus = 0x0001,
172    HostError = 0x0002,
173    MACCtrlFrame = 0x0008,
174    TxComplete = 0x0004,
175    RxComplete = 0x0010,
176    RxEarly = 0x0020,
177    IntRequested = 0x0040,
178    UpdateStats = 0x0080,
179    LinkEvent = 0x0100,
180    TxDMAComplete = 0x0200,
181    RxDMAComplete = 0x0400,
182    RFDListEnd = 0x0800,
183    RxDMAPriority = 0x1000,
184};
185
186/* Bits in the ReceiveMode register. */
187enum ReceiveMode_bits {
188    ReceiveUnicast = 0x0001,
189    ReceiveMulticast = 0x0002,
190    ReceiveBroadcast = 0x0004,
191    ReceiveAllFrames = 0x0008,
192    ReceiveMulticastHash = 0x0010,
193    ReceiveIPMulticast = 0x0020,
194    ReceiveVLANMatch = 0x0100,
195    ReceiveVLANHash = 0x0200,
196};
197/* Bits in MACCtrl. */
198enum MACCtrl_bits {
199    DuplexSelect = 0x20,
200    TxFlowControlEnable = 0x80,
201    RxFlowControlEnable = 0x0100,
202    RcvFCS = 0x200,
203    AutoVLANtagging = 0x1000,
204    AutoVLANuntagging = 0x2000,
205    StatsEnable = 0x00200000,
206    StatsDisable = 0x00400000,
207    StatsEnabled = 0x00800000,
208    TxEnable = 0x01000000,
209    TxDisable = 0x02000000,
210    TxEnabled = 0x04000000,
211    RxEnable = 0x08000000,
212    RxDisable = 0x10000000,
213    RxEnabled = 0x20000000,
214};
215
216enum ASICCtrl_LoWord_bits {
217    PhyMedia = 0x0080,
218};
219
220enum ASICCtrl_HiWord_bits {
221    GlobalReset = 0x0001,
222    RxReset = 0x0002,
223    TxReset = 0x0004,
224    DMAReset = 0x0008,
225    FIFOReset = 0x0010,
226    NetworkReset = 0x0020,
227    HostReset = 0x0040,
228    ResetBusy = 0x0400,
229};
230
231/* Transmit Frame Control bits */
232enum TFC_bits {
233    DwordAlign = 0x00000000,
234    WordAlignDisable = 0x00030000,
235    WordAlign = 0x00020000,
236    TCPChecksumEnable = 0x00040000,
237    UDPChecksumEnable = 0x00080000,
238    IPChecksumEnable = 0x00100000,
239    FCSAppendDisable = 0x00200000,
240    TxIndicate = 0x00400000,
241    TxDMAIndicate = 0x00800000,
242    FragCountShift = 24,
243    VLANTagInsert = 0x0000000010000000,
244    TFDDone = 0x80000000,
245    VIDShift = 32,
246    UsePriorityShift = 48,
247};
248
249/* Receive Frames Status bits */
250enum RFS_bits {
251    RxFIFOOverrun = 0x00010000,
252    RxRuntFrame = 0x00020000,
253    RxAlignmentError = 0x00040000,
254    RxFCSError = 0x00080000,
255    RxOverSizedFrame = 0x00100000,
256    RxLengthError = 0x00200000,
257    VLANDetected = 0x00400000,
258    TCPDetected = 0x00800000,
259    TCPError = 0x01000000,
260    UDPDetected = 0x02000000,
261    UDPError = 0x04000000,
262    IPDetected = 0x08000000,
263    IPError = 0x10000000,
264    FrameStart = 0x20000000,
265    FrameEnd = 0x40000000,
266    RFDDone = 0x80000000,
267    TCIShift = 32,
268    RFS_Errors = 0x003f0000,
269};
270
271#define MII_RESET_TIME_OUT 10000
272/* MII register */
273enum _mii_reg {
274    MII_BMCR = 0,
275    MII_BMSR = 1,
276    MII_PHY_ID1 = 2,
277    MII_PHY_ID2 = 3,
278    MII_ANAR = 4,
279    MII_ANLPAR = 5,
280    MII_ANER = 6,
281    MII_ANNPT = 7,
282    MII_ANLPRNP = 8,
283    MII_MSCR = 9,
284    MII_MSSR = 10,
285    MII_ESR = 15,
286    MII_PHY_SCR = 16,
287};
288/* PCS register */
289enum _pcs_reg {
290    PCS_BMCR = 0,
291    PCS_BMSR = 1,
292    PCS_ANAR = 4,
293    PCS_ANLPAR = 5,
294    PCS_ANER = 6,
295    PCS_ANNPT = 7,
296    PCS_ANLPRNP = 8,
297    PCS_ESR = 15,
298};
299
300/* Basic Mode Control Register */
301enum _mii_bmcr {
302    MII_BMCR_RESET = 0x8000,
303    MII_BMCR_LOOP_BACK = 0x4000,
304    MII_BMCR_SPEED_LSB = 0x2000,
305    MII_BMCR_AN_ENABLE = 0x1000,
306    MII_BMCR_POWER_DOWN = 0x0800,
307    MII_BMCR_ISOLATE = 0x0400,
308    MII_BMCR_RESTART_AN = 0x0200,
309    MII_BMCR_DUPLEX_MODE = 0x0100,
310    MII_BMCR_COL_TEST = 0x0080,
311    MII_BMCR_SPEED_MSB = 0x0040,
312    MII_BMCR_SPEED_RESERVED = 0x003f,
313    MII_BMCR_SPEED_10 = 0,
314    MII_BMCR_SPEED_100 = MII_BMCR_SPEED_LSB,
315    MII_BMCR_SPEED_1000 = MII_BMCR_SPEED_MSB,
316};
317
318/* Basic Mode Status Register */
319enum _mii_bmsr {
320    MII_BMSR_100BT4 = 0x8000,
321    MII_BMSR_100BX_FD = 0x4000,
322    MII_BMSR_100BX_HD = 0x2000,
323    MII_BMSR_10BT_FD = 0x1000,
324    MII_BMSR_10BT_HD = 0x0800,
325    MII_BMSR_100BT2_FD = 0x0400,
326    MII_BMSR_100BT2_HD = 0x0200,
327    MII_BMSR_EXT_STATUS = 0x0100,
328    MII_BMSR_PREAMBLE_SUPP = 0x0040,
329    MII_BMSR_AN_COMPLETE = 0x0020,
330    MII_BMSR_REMOTE_FAULT = 0x0010,
331    MII_BMSR_AN_ABILITY = 0x0008,
332    MII_BMSR_LINK_STATUS = 0x0004,
333    MII_BMSR_JABBER_DETECT = 0x0002,
334    MII_BMSR_EXT_CAP = 0x0001,
335};
336
337/* ANAR */
338enum _mii_anar {
339    MII_ANAR_NEXT_PAGE = 0x8000,
340    MII_ANAR_REMOTE_FAULT = 0x4000,
341    MII_ANAR_ASYMMETRIC = 0x0800,
342    MII_ANAR_PAUSE = 0x0400,
343    MII_ANAR_100BT4 = 0x0200,
344    MII_ANAR_100BX_FD = 0x0100,
345    MII_ANAR_100BX_HD = 0x0080,
346    MII_ANAR_10BT_FD = 0x0020,
347    MII_ANAR_10BT_HD = 0x0010,
348    MII_ANAR_SELECTOR = 0x001f,
349    MII_IEEE8023_CSMACD = 0x0001,
350};
351
352/* ANLPAR */
353enum _mii_anlpar {
354    MII_ANLPAR_NEXT_PAGE = MII_ANAR_NEXT_PAGE,
355    MII_ANLPAR_REMOTE_FAULT = MII_ANAR_REMOTE_FAULT,
356    MII_ANLPAR_ASYMMETRIC = MII_ANAR_ASYMMETRIC,
357    MII_ANLPAR_PAUSE = MII_ANAR_PAUSE,
358    MII_ANLPAR_100BT4 = MII_ANAR_100BT4,
359    MII_ANLPAR_100BX_FD = MII_ANAR_100BX_FD,
360    MII_ANLPAR_100BX_HD = MII_ANAR_100BX_HD,
361    MII_ANLPAR_10BT_FD = MII_ANAR_10BT_FD,
362    MII_ANLPAR_10BT_HD = MII_ANAR_10BT_HD,
363    MII_ANLPAR_SELECTOR = MII_ANAR_SELECTOR,
364};
365
366/* Auto-Negotiation Expansion Register */
367enum _mii_aner {
368    MII_ANER_PAR_DETECT_FAULT = 0x0010,
369    MII_ANER_LP_NEXTPAGABLE = 0x0008,
370    MII_ANER_NETXTPAGABLE = 0x0004,
371    MII_ANER_PAGE_RECEIVED = 0x0002,
372    MII_ANER_LP_NEGOTIABLE = 0x0001,
373};
374
375/* MASTER-SLAVE Control Register */
376enum _mii_mscr {
377    MII_MSCR_TEST_MODE = 0xe000,
378    MII_MSCR_CFG_ENABLE = 0x1000,
379    MII_MSCR_CFG_VALUE = 0x0800,
380    MII_MSCR_PORT_VALUE = 0x0400,
381    MII_MSCR_1000BT_FD = 0x0200,
382    MII_MSCR_1000BT_HD = 0X0100,
383};
384
385/* MASTER-SLAVE Status Register */
386enum _mii_mssr {
387    MII_MSSR_CFG_FAULT = 0x8000,
388    MII_MSSR_CFG_RES = 0x4000,
389    MII_MSSR_LOCAL_RCV_STATUS = 0x2000,
390    MII_MSSR_REMOTE_RCVR = 0x1000,
391    MII_MSSR_LP_1000BT_FD = 0x0800,
392    MII_MSSR_LP_1000BT_HD = 0x0400,
393    MII_MSSR_IDLE_ERR_COUNT = 0x00ff,
394};
395
396/* IEEE Extened Status Register */
397enum _mii_esr {
398    MII_ESR_1000BX_FD = 0x8000,
399    MII_ESR_1000BX_HD = 0x4000,
400    MII_ESR_1000BT_FD = 0x2000,
401    MII_ESR_1000BT_HD = 0x1000,
402};
403/* PHY Specific Control Register */
404#if 0
405typedef union t_MII_PHY_SCR {
406    u16 image;
407    struct {
408        u16 disable_jabber:1; // bit 0
409        u16 polarity_reversal:1; // bit 1
410        u16 SEQ_test:1; // bit 2
411        u16 _bit_3:1; // bit 3
412        u16 disable_CLK125:1; // bit 4
413        u16 mdi_crossover_mode:2; // bit 6:5
414        u16 enable_ext_dist:1; // bit 7
415        u16 _bit_8_9:2; // bit 9:8
416        u16 force_link:1; // bit 10
417        u16 assert_CRS:1; // bit 11
418        u16 rcv_fifo_depth:2; // bit 13:12
419        u16 xmit_fifo_depth:2; // bit 15:14
420    } bits;
421} PHY_SCR_t, *PPHY_SCR_t;
422#endif
423
424typedef enum t_MII_ADMIN_STATUS {
425    adm_reset,
426    adm_operational,
427    adm_loopback,
428    adm_power_down,
429    adm_isolate
430} MII_ADMIN_t, *PMII_ADMIN_t;
431
432/* Physical Coding Sublayer Management (PCS) */
433/* PCS control and status registers bitmap as the same as MII */
434/* PCS Extended Status register bitmap as the same as MII */
435/* PCS ANAR */
436enum _pcs_anar {
437    PCS_ANAR_NEXT_PAGE = 0x8000,
438    PCS_ANAR_REMOTE_FAULT = 0x3000,
439    PCS_ANAR_ASYMMETRIC = 0x0100,
440    PCS_ANAR_PAUSE = 0x0080,
441    PCS_ANAR_HALF_DUPLEX = 0x0040,
442    PCS_ANAR_FULL_DUPLEX = 0x0020,
443};
444/* PCS ANLPAR */
445enum _pcs_anlpar {
446    PCS_ANLPAR_NEXT_PAGE = PCS_ANAR_NEXT_PAGE,
447    PCS_ANLPAR_REMOTE_FAULT = PCS_ANAR_REMOTE_FAULT,
448    PCS_ANLPAR_ASYMMETRIC = PCS_ANAR_ASYMMETRIC,
449    PCS_ANLPAR_PAUSE = PCS_ANAR_PAUSE,
450    PCS_ANLPAR_HALF_DUPLEX = PCS_ANAR_HALF_DUPLEX,
451    PCS_ANLPAR_FULL_DUPLEX = PCS_ANAR_FULL_DUPLEX,
452};
453
454typedef struct t_SROM {
455    u16 config_param; /* 0x00 */
456    u16 asic_ctrl; /* 0x02 */
457    u16 sub_vendor_id; /* 0x04 */
458    u16 sub_system_id; /* 0x06 */
459    u16 reserved1[12]; /* 0x08-0x1f */
460    u8 mac_addr[6]; /* 0x20-0x25 */
461    u8 reserved2[10]; /* 0x26-0x2f */
462    u8 sib[204]; /* 0x30-0xfb */
463    u32 crc; /* 0xfc-0xff */
464} SROM_t, *PSROM_t;
465
466/* Ioctl custom data */
467struct ioctl_data {
468    char signature[10];
469    int cmd;
470    int len;
471    char *data;
472};
473
474struct mii_data {
475    __u16 reserved;
476    __u16 reg_num;
477    __u16 in_value;
478    __u16 out_value;
479};
480
481/* The Rx and Tx buffer descriptors. */
482struct netdev_desc {
483    __le64 next_desc;
484    __le64 status;
485    __le64 fraginfo;
486};
487
488#define PRIV_ALIGN 15 /* Required alignment mask */
489/* Use __attribute__((aligned (L1_CACHE_BYTES))) to maintain alignment
490   within the structure. */
491struct netdev_private {
492    /* Descriptor rings first for alignment. */
493    struct netdev_desc *rx_ring;
494    struct netdev_desc *tx_ring;
495    struct sk_buff *rx_skbuff[RX_RING_SIZE];
496    struct sk_buff *tx_skbuff[TX_RING_SIZE];
497    dma_addr_t tx_ring_dma;
498    dma_addr_t rx_ring_dma;
499    struct pci_dev *pdev;
500    spinlock_t tx_lock;
501    spinlock_t rx_lock;
502    struct net_device_stats stats;
503    unsigned int rx_buf_sz; /* Based on MTU+slack. */
504    unsigned int speed; /* Operating speed */
505    unsigned int vlan; /* VLAN Id */
506    unsigned int chip_id; /* PCI table chip id */
507    unsigned int rx_coalesce; /* Maximum frames each RxDMAComplete intr */
508    unsigned int rx_timeout; /* Wait time between RxDMAComplete intr */
509    unsigned int tx_coalesce; /* Maximum frames each tx interrupt */
510    unsigned int full_duplex:1; /* Full-duplex operation requested. */
511    unsigned int an_enable:2; /* Auto-Negotiated Enable */
512    unsigned int jumbo:1; /* Jumbo frame enable */
513    unsigned int coalesce:1; /* Rx coalescing enable */
514    unsigned int tx_flow:1; /* Tx flow control enable */
515    unsigned int rx_flow:1; /* Rx flow control enable */
516    unsigned int phy_media:1; /* 1: fiber, 0: copper */
517    unsigned int link_status:1; /* Current link status */
518    struct netdev_desc *last_tx; /* Last Tx descriptor used. */
519    unsigned long cur_rx, old_rx; /* Producer/consumer ring indices */
520    unsigned long cur_tx, old_tx;
521    struct timer_list timer;
522    int wake_polarity;
523    char name[256]; /* net device description */
524    u8 duplex_polarity;
525    u16 mcast_filter[4];
526    u16 advertising; /* NWay media advertisement */
527    u16 negotiate; /* Negotiated media */
528    int phy_addr; /* PHY addresses. */
529};
530
531/* The station address location in the EEPROM. */
532/* The struct pci_device_id consist of:
533        vendor, device Vendor and device ID to match (or PCI_ANY_ID)
534        subvendor, subdevice Subsystem vendor and device ID to match (or PCI_ANY_ID)
535        class Device class to match. The class_mask tells which bits
536        class_mask of the class are honored during the comparison.
537        driver_data Data private to the driver.
538*/
539
540static const struct pci_device_id rio_pci_tbl[] = {
541    {0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, },
542    {0x13f0, 0x1021, PCI_ANY_ID, PCI_ANY_ID, },
543    { }
544};
545MODULE_DEVICE_TABLE (pci, rio_pci_tbl);
546#define TX_TIMEOUT (4*HZ)
547#define PACKET_SIZE 1536
548#define MAX_JUMBO 8000
549#define RIO_IO_SIZE 340
550#define DEFAULT_RXC 5
551#define DEFAULT_RXT 750
552#define DEFAULT_TXC 1
553#define MAX_TXC 8
554#endif /* __DL2K_H__ */
555

Archive Download this file



interactive