Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
dl2k.h
Go to the documentation of this file.
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.<[email protected]>
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/mii.h>
32 #include <linux/bitops.h>
33 #include <asm/processor.h> /* Processor type for cache alignment. */
34 #include <asm/io.h>
35 #include <asm/uaccess.h>
36 #include <linux/delay.h>
37 #include <linux/spinlock.h>
38 #include <linux/time.h>
39 #define TX_RING_SIZE 256
40 #define TX_QUEUE_LEN (TX_RING_SIZE - 1) /* Limit ring entries actually used.*/
41 #define RX_RING_SIZE 256
42 #define TX_TOTAL_SIZE TX_RING_SIZE*sizeof(struct netdev_desc)
43 #define RX_TOTAL_SIZE RX_RING_SIZE*sizeof(struct netdev_desc)
44 
45 /* Offsets to the device registers.
46  Unlike software-only systems, device drivers interact with complex hardware.
47  It's not useful to define symbolic names for every register bit in the
48  device. The name can only partially document the semantics and make
49  the driver longer and more difficult to read.
50  In general, only the important configuration values or bits changed
51  multiple times should be defined symbolically.
52 */
54  /* I/O register offsets */
55  DMACtrl = 0x00,
56  RxDMAStatus = 0x08,
57  TFDListPtr0 = 0x10,
58  TFDListPtr1 = 0x14,
62  RFDListPtr0 = 0x1c,
63  RFDListPtr1 = 0x20,
67  RxDMAIntCtrl = 0x28,
68  DebugCtrl = 0x2c,
69  ASICCtrl = 0x30,
70  FifoCtrl = 0x38,
71  RxEarlyThresh = 0x3a,
72  FlowOffThresh = 0x3c,
73  FlowOnThresh = 0x3e,
74  TxStartThresh = 0x44,
75  EepromData = 0x48,
76  EepromCtrl = 0x4a,
77  ExpromAddr = 0x4c,
78  Exprodata = 0x50,
79  WakeEvent = 0x51,
80  CountDown = 0x54,
81  IntStatusAck = 0x5a,
82  IntEnable = 0x5c,
83  IntStatus = 0x5e,
84  TxStatus = 0x60,
85  MACCtrl = 0x6c,
86  VLANTag = 0x70,
87  PhyCtrl = 0x76,
88  StationAddr0 = 0x78,
89  StationAddr1 = 0x7a,
90  StationAddr2 = 0x7c,
91  VLANId = 0x80,
92  MaxFrameSize = 0x86,
93  ReceiveMode = 0x88,
94  HashTable0 = 0x8c,
95  HashTable1 = 0x90,
96  RmonStatMask = 0x98,
97  StatMask = 0x9c,
98  RxJumboFrames = 0xbc,
103  /* Ethernet MIB statistic register offsets */
104  OctetRcvOk = 0xa8,
107  FramesRcvOk = 0xb4,
115  OctetXmtOk = 0xd0,
118  FramesXmtOk = 0xdc,
129  /* RMON statistic register offsets */
144  EtherStatsPkts = 0x138,
151 };
152 
153 /* Bits in the interrupt status/mask registers. */
155  InterruptStatus = 0x0001,
156  HostError = 0x0002,
157  MACCtrlFrame = 0x0008,
158  TxComplete = 0x0004,
159  RxComplete = 0x0010,
160  RxEarly = 0x0020,
161  IntRequested = 0x0040,
162  UpdateStats = 0x0080,
163  LinkEvent = 0x0100,
164  TxDMAComplete = 0x0200,
165  RxDMAComplete = 0x0400,
166  RFDListEnd = 0x0800,
167  RxDMAPriority = 0x1000,
168 };
169 
170 /* Bits in the ReceiveMode register. */
172  ReceiveUnicast = 0x0001,
179  ReceiveVLANHash = 0x0200,
180 };
181 /* Bits in MACCtrl. */
183  DuplexSelect = 0x20,
186  RcvFCS = 0x200,
187  AutoVLANtagging = 0x1000,
189  StatsEnable = 0x00200000,
190  StatsDisable = 0x00400000,
191  StatsEnabled = 0x00800000,
192  TxEnable = 0x01000000,
193  TxDisable = 0x02000000,
194  TxEnabled = 0x04000000,
195  RxEnable = 0x08000000,
196  RxDisable = 0x10000000,
197  RxEnabled = 0x20000000,
198 };
199 
201  PhyMedia = 0x0080,
202 };
203 
205  GlobalReset = 0x0001,
206  RxReset = 0x0002,
207  TxReset = 0x0004,
208  DMAReset = 0x0008,
209  FIFOReset = 0x0010,
210  NetworkReset = 0x0020,
211  HostReset = 0x0040,
212  ResetBusy = 0x0400,
213 };
214 
215 /* Transmit Frame Control bits */
216 enum TFC_bits {
217  DwordAlign = 0x00000000,
218  WordAlignDisable = 0x00030000,
219  WordAlign = 0x00020000,
220  TCPChecksumEnable = 0x00040000,
221  UDPChecksumEnable = 0x00080000,
222  IPChecksumEnable = 0x00100000,
223  FCSAppendDisable = 0x00200000,
224  TxIndicate = 0x00400000,
225  TxDMAIndicate = 0x00800000,
227  VLANTagInsert = 0x0000000010000000,
228  TFDDone = 0x80000000,
229  VIDShift = 32,
231 };
232 
233 /* Receive Frames Status bits */
234 enum RFS_bits {
235  RxFIFOOverrun = 0x00010000,
236  RxRuntFrame = 0x00020000,
237  RxAlignmentError = 0x00040000,
238  RxFCSError = 0x00080000,
239  RxOverSizedFrame = 0x00100000,
240  RxLengthError = 0x00200000,
241  VLANDetected = 0x00400000,
242  TCPDetected = 0x00800000,
243  TCPError = 0x01000000,
244  UDPDetected = 0x02000000,
245  UDPError = 0x04000000,
246  IPDetected = 0x08000000,
247  IPError = 0x10000000,
248  FrameStart = 0x20000000,
249  FrameEnd = 0x40000000,
250  RFDDone = 0x80000000,
251  TCIShift = 32,
252  RFS_Errors = 0x003f0000,
253 };
254 
255 #define MII_RESET_TIME_OUT 10000
256 /* MII register */
257 enum _mii_reg {
259 };
260 
261 /* PCS register */
262 enum _pcs_reg {
263  PCS_BMCR = 0,
264  PCS_BMSR = 1,
265  PCS_ANAR = 4,
267  PCS_ANER = 6,
270  PCS_ESR = 15,
271 };
272 
273 /* IEEE Extened Status Register */
274 enum _mii_esr {
279 };
280 /* PHY Specific Control Register */
281 #if 0
282 typedef union t_MII_PHY_SCR {
283  u16 image;
284  struct {
285  u16 disable_jabber:1; // bit 0
286  u16 polarity_reversal:1; // bit 1
287  u16 SEQ_test:1; // bit 2
288  u16 _bit_3:1; // bit 3
289  u16 disable_CLK125:1; // bit 4
290  u16 mdi_crossover_mode:2; // bit 6:5
291  u16 enable_ext_dist:1; // bit 7
292  u16 _bit_8_9:2; // bit 9:8
293  u16 force_link:1; // bit 10
294  u16 assert_CRS:1; // bit 11
295  u16 rcv_fifo_depth:2; // bit 13:12
296  u16 xmit_fifo_depth:2; // bit 15:14
297  } bits;
298 } PHY_SCR_t, *PPHY_SCR_t;
299 #endif
300 
301 typedef enum t_MII_ADMIN_STATUS {
308 
309 /* Physical Coding Sublayer Management (PCS) */
310 /* PCS control and status registers bitmap as the same as MII */
311 /* PCS Extended Status register bitmap as the same as MII */
312 /* PCS ANAR */
313 enum _pcs_anar {
317  PCS_ANAR_PAUSE = 0x0080,
320 };
321 /* PCS ANLPAR */
329 };
330 
331 typedef struct t_SROM {
332  u16 config_param; /* 0x00 */
333  u16 asic_ctrl; /* 0x02 */
334  u16 sub_vendor_id; /* 0x04 */
335  u16 sub_system_id; /* 0x06 */
336  u16 reserved1[12]; /* 0x08-0x1f */
337  u8 mac_addr[6]; /* 0x20-0x25 */
338  u8 reserved2[10]; /* 0x26-0x2f */
339  u8 sib[204]; /* 0x30-0xfb */
340  u32 crc; /* 0xfc-0xff */
341 } SROM_t, *PSROM_t;
342 
343 /* Ioctl custom data */
344 struct ioctl_data {
345  char signature[10];
346  int cmd;
347  int len;
348  char *data;
349 };
350 
351 /* The Rx and Tx buffer descriptors. */
352 struct netdev_desc {
356 };
357 
358 #define PRIV_ALIGN 15 /* Required alignment mask */
359 /* Use __attribute__((aligned (L1_CACHE_BYTES))) to maintain alignment
360  within the structure. */
361 struct netdev_private {
362  /* Descriptor rings first for alignment. */
365  struct sk_buff *rx_skbuff[RX_RING_SIZE];
366  struct sk_buff *tx_skbuff[TX_RING_SIZE];
369  struct pci_dev *pdev;
374  struct net_device_stats stats;
375  unsigned int rx_buf_sz; /* Based on MTU+slack. */
376  unsigned int speed; /* Operating speed */
377  unsigned int vlan; /* VLAN Id */
378  unsigned int chip_id; /* PCI table chip id */
379  unsigned int rx_coalesce; /* Maximum frames each RxDMAComplete intr */
380  unsigned int rx_timeout; /* Wait time between RxDMAComplete intr */
381  unsigned int tx_coalesce; /* Maximum frames each tx interrupt */
382  unsigned int full_duplex:1; /* Full-duplex operation requested. */
383  unsigned int an_enable:2; /* Auto-Negotiated Enable */
384  unsigned int jumbo:1; /* Jumbo frame enable */
385  unsigned int coalesce:1; /* Rx coalescing enable */
386  unsigned int tx_flow:1; /* Tx flow control enable */
387  unsigned int rx_flow:1; /* Rx flow control enable */
388  unsigned int phy_media:1; /* 1: fiber, 0: copper */
389  unsigned int link_status:1; /* Current link status */
390  struct netdev_desc *last_tx; /* Last Tx descriptor used. */
391  unsigned long cur_rx, old_rx; /* Producer/consumer ring indices */
392  unsigned long cur_tx, old_tx;
393  struct timer_list timer;
395  char name[256]; /* net device description */
398  u16 advertising; /* NWay media advertisement */
399  u16 negotiate; /* Negotiated media */
400  int phy_addr; /* PHY addresses. */
401 };
402 
403 /* The station address location in the EEPROM. */
404 /* The struct pci_device_id consist of:
405  vendor, device Vendor and device ID to match (or PCI_ANY_ID)
406  subvendor, subdevice Subsystem vendor and device ID to match (or PCI_ANY_ID)
407  class Device class to match. The class_mask tells which bits
408  class_mask of the class are honored during the comparison.
409  driver_data Data private to the driver.
410 */
411 
412 static DEFINE_PCI_DEVICE_TABLE(rio_pci_tbl) = {
413  {0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, },
414  {0x13f0, 0x1021, PCI_ANY_ID, PCI_ANY_ID, },
415  { }
416 };
417 MODULE_DEVICE_TABLE (pci, rio_pci_tbl);
418 #define TX_TIMEOUT (4*HZ)
419 #define PACKET_SIZE 1536
420 #define MAX_JUMBO 8000
421 #define RIO_IO_SIZE 340
422 #define DEFAULT_RXC 5
423 #define DEFAULT_RXT 750
424 #define DEFAULT_TXC 1
425 #define MAX_TXC 8
426 #endif /* __DL2K_H__ */