Save sram context after changing MPU, DSP or core clocks
[linux-ginger.git] / drivers / net / dl2k.h
blob266ec8777ca81797f0dfd92b22875229644e5584
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.
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.
13 #ifndef __DL2K_H__
14 #define __DL2K_H__
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)
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
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.
69 enum 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,
169 /* Bits in the interrupt status/mask registers. */
170 enum 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,
186 /* Bits in the ReceiveMode register. */
187 enum 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,
197 /* Bits in MACCtrl. */
198 enum 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,
216 enum ASICCtrl_LoWord_bits {
217 PhyMedia = 0x0080,
220 enum 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,
231 /* Transmit Frame Control bits */
232 enum 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,
249 /* Receive Frames Status bits */
250 enum 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,
271 #define MII_RESET_TIME_OUT 10000
272 /* MII register */
273 enum _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,
288 /* PCS register */
289 enum _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,
300 /* Basic Mode Control Register */
301 enum _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,
318 /* Basic Mode Status Register */
319 enum _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,
337 /* ANAR */
338 enum _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,
352 /* ANLPAR */
353 enum _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,
366 /* Auto-Negotiation Expansion Register */
367 enum _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,
375 /* MASTER-SLAVE Control Register */
376 enum _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,
385 /* MASTER-SLAVE Status Register */
386 enum _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,
396 /* IEEE Extened Status Register */
397 enum _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,
403 /* PHY Specific Control Register */
404 #if 0
405 typedef 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
424 typedef 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;
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 */
436 enum _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,
444 /* PCS ANLPAR */
445 enum _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,
454 typedef 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;
466 /* Ioctl custom data */
467 struct ioctl_data {
468 char signature[10];
469 int cmd;
470 int len;
471 char *data;
474 struct mii_data {
475 __u16 reserved;
476 __u16 reg_num;
477 __u16 in_value;
478 __u16 out_value;
481 /* The Rx and Tx buffer descriptors. */
482 struct netdev_desc {
483 __le64 next_desc;
484 __le64 status;
485 __le64 fraginfo;
488 #define PRIV_ALIGN 15 /* Required alignment mask */
489 /* Use __attribute__((aligned (L1_CACHE_BYTES))) to maintain alignment
490 within the structure. */
491 struct 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. */
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.
540 static 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, },
545 MODULE_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__ */