1
2
3
4
5
6
7
8
9
10
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/crc32.h>
29#include <linux/ethtool.h>
30#include <linux/mii.h>
31#include <linux/bitops.h>
32#include <asm/processor.h>
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)
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
45
46
47
48
49
50
51
52enum dl2x_offsets {
53
54 DMACtrl = 0x00,
55 RxDMAStatus = 0x08,
56 TFDListPtr0 = 0x10,
57 TFDListPtr1 = 0x14,
58 TxDMABurstThresh = 0x18,
59 TxDMAUrgentThresh = 0x19,
60 TxDMAPollPeriod = 0x1a,
61 RFDListPtr0 = 0x1c,
62 RFDListPtr1 = 0x20,
63 RxDMABurstThresh = 0x24,
64 RxDMAUrgentThresh = 0x25,
65 RxDMAPollPeriod = 0x26,
66 RxDMAIntCtrl = 0x28,
67 DebugCtrl = 0x2c,
68 ASICCtrl = 0x30,
69 FifoCtrl = 0x38,
70 RxEarlyThresh = 0x3a,
71 FlowOffThresh = 0x3c,
72 FlowOnThresh = 0x3e,
73 TxStartThresh = 0x44,
74 EepromData = 0x48,
75 EepromCtrl = 0x4a,
76 ExpromAddr = 0x4c,
77 Exprodata = 0x50,
78 WakeEvent = 0x51,
79 CountDown = 0x54,
80 IntStatusAck = 0x5a,
81 IntEnable = 0x5c,
82 IntStatus = 0x5e,
83 TxStatus = 0x60,
84 MACCtrl = 0x6c,
85 VLANTag = 0x70,
86 PhyCtrl = 0x76,
87 StationAddr0 = 0x78,
88 StationAddr1 = 0x7a,
89 StationAddr2 = 0x7c,
90 VLANId = 0x80,
91 MaxFrameSize = 0x86,
92 ReceiveMode = 0x88,
93 HashTable0 = 0x8c,
94 HashTable1 = 0x90,
95 RmonStatMask = 0x98,
96 StatMask = 0x9c,
97 RxJumboFrames = 0xbc,
98 TCPCheckSumErrors = 0xc0,
99 IPCheckSumErrors = 0xc2,
100 UDPCheckSumErrors = 0xc4,
101 TxJumboFrames = 0xf4,
102
103 OctetRcvOk = 0xa8,
104 McstOctetRcvOk = 0xac,
105 BcstOctetRcvOk = 0xb0,
106 FramesRcvOk = 0xb4,
107 McstFramesRcvdOk = 0xb8,
108 BcstFramesRcvdOk = 0xbe,
109 MacControlFramesRcvd = 0xc6,
110 FrameTooLongErrors = 0xc8,
111 InRangeLengthErrors = 0xca,
112 FramesCheckSeqErrors = 0xcc,
113 FramesLostRxErrors = 0xce,
114 OctetXmtOk = 0xd0,
115 McstOctetXmtOk = 0xd4,
116 BcstOctetXmtOk = 0xd8,
117 FramesXmtOk = 0xdc,
118 McstFramesXmtdOk = 0xe0,
119 FramesWDeferredXmt = 0xe4,
120 LateCollisions = 0xe8,
121 MultiColFrames = 0xec,
122 SingleColFrames = 0xf0,
123 BcstFramesXmtdOk = 0xf6,
124 CarrierSenseErrors = 0xf8,
125 MacControlFramesXmtd = 0xfa,
126 FramesAbortXSColls = 0xfc,
127 FramesWEXDeferal = 0xfe,
128
129 EtherStatsCollisions = 0x100,
130 EtherStatsOctetsTransmit = 0x104,
131 EtherStatsPktsTransmit = 0x108,
132 EtherStatsPkts64OctetTransmit = 0x10c,
133 EtherStats65to127OctetsTransmit = 0x110,
134 EtherStatsPkts128to255OctetsTransmit = 0x114,
135 EtherStatsPkts256to511OctetsTransmit = 0x118,
136 EtherStatsPkts512to1023OctetsTransmit = 0x11c,
137 EtherStatsPkts1024to1518OctetsTransmit = 0x120,
138 EtherStatsCRCAlignErrors = 0x124,
139 EtherStatsUndersizePkts = 0x128,
140 EtherStatsFragments = 0x12c,
141 EtherStatsJabbers = 0x130,
142 EtherStatsOctets = 0x134,
143 EtherStatsPkts = 0x138,
144 EtherStats64Octets = 0x13c,
145 EtherStatsPkts65to127Octets = 0x140,
146 EtherStatsPkts128to255Octets = 0x144,
147 EtherStatsPkts256to511Octets = 0x148,
148 EtherStatsPkts512to1023Octets = 0x14c,
149 EtherStatsPkts1024to1518Octets = 0x150,
150};
151
152
153enum IntStatus_bits {
154 InterruptStatus = 0x0001,
155 HostError = 0x0002,
156 MACCtrlFrame = 0x0008,
157 TxComplete = 0x0004,
158 RxComplete = 0x0010,
159 RxEarly = 0x0020,
160 IntRequested = 0x0040,
161 UpdateStats = 0x0080,
162 LinkEvent = 0x0100,
163 TxDMAComplete = 0x0200,
164 RxDMAComplete = 0x0400,
165 RFDListEnd = 0x0800,
166 RxDMAPriority = 0x1000,
167};
168
169
170enum ReceiveMode_bits {
171 ReceiveUnicast = 0x0001,
172 ReceiveMulticast = 0x0002,
173 ReceiveBroadcast = 0x0004,
174 ReceiveAllFrames = 0x0008,
175 ReceiveMulticastHash = 0x0010,
176 ReceiveIPMulticast = 0x0020,
177 ReceiveVLANMatch = 0x0100,
178 ReceiveVLANHash = 0x0200,
179};
180
181enum MACCtrl_bits {
182 DuplexSelect = 0x20,
183 TxFlowControlEnable = 0x80,
184 RxFlowControlEnable = 0x0100,
185 RcvFCS = 0x200,
186 AutoVLANtagging = 0x1000,
187 AutoVLANuntagging = 0x2000,
188 StatsEnable = 0x00200000,
189 StatsDisable = 0x00400000,
190 StatsEnabled = 0x00800000,
191 TxEnable = 0x01000000,
192 TxDisable = 0x02000000,
193 TxEnabled = 0x04000000,
194 RxEnable = 0x08000000,
195 RxDisable = 0x10000000,
196 RxEnabled = 0x20000000,
197};
198
199enum ASICCtrl_LoWord_bits {
200 PhyMedia = 0x0080,
201};
202
203enum ASICCtrl_HiWord_bits {
204 GlobalReset = 0x0001,
205 RxReset = 0x0002,
206 TxReset = 0x0004,
207 DMAReset = 0x0008,
208 FIFOReset = 0x0010,
209 NetworkReset = 0x0020,
210 HostReset = 0x0040,
211 ResetBusy = 0x0400,
212};
213
214#define IPG_AC_LED_MODE BIT(14)
215#define IPG_AC_LED_SPEED BIT(27)
216#define IPG_AC_LED_MODE_BIT_1 BIT(29)
217
218
219enum TFC_bits {
220 DwordAlign = 0x00000000,
221 WordAlignDisable = 0x00030000,
222 WordAlign = 0x00020000,
223 TCPChecksumEnable = 0x00040000,
224 UDPChecksumEnable = 0x00080000,
225 IPChecksumEnable = 0x00100000,
226 FCSAppendDisable = 0x00200000,
227 TxIndicate = 0x00400000,
228 TxDMAIndicate = 0x00800000,
229 FragCountShift = 24,
230 VLANTagInsert = 0x0000000010000000,
231 TFDDone = 0x80000000,
232 VIDShift = 32,
233 UsePriorityShift = 48,
234};
235
236
237enum RFS_bits {
238 RxFIFOOverrun = 0x00010000,
239 RxRuntFrame = 0x00020000,
240 RxAlignmentError = 0x00040000,
241 RxFCSError = 0x00080000,
242 RxOverSizedFrame = 0x00100000,
243 RxLengthError = 0x00200000,
244 VLANDetected = 0x00400000,
245 TCPDetected = 0x00800000,
246 TCPError = 0x01000000,
247 UDPDetected = 0x02000000,
248 UDPError = 0x04000000,
249 IPDetected = 0x08000000,
250 IPError = 0x10000000,
251 FrameStart = 0x20000000,
252 FrameEnd = 0x40000000,
253 RFDDone = 0x80000000,
254 TCIShift = 32,
255 RFS_Errors = 0x003f0000,
256};
257
258#define MII_RESET_TIME_OUT 10000
259
260enum _mii_reg {
261 MII_PHY_SCR = 16,
262};
263
264
265enum _pcs_reg {
266 PCS_BMCR = 0,
267 PCS_BMSR = 1,
268 PCS_ANAR = 4,
269 PCS_ANLPAR = 5,
270 PCS_ANER = 6,
271 PCS_ANNPT = 7,
272 PCS_ANLPRNP = 8,
273 PCS_ESR = 15,
274};
275
276
277enum _mii_esr {
278 MII_ESR_1000BX_FD = 0x8000,
279 MII_ESR_1000BX_HD = 0x4000,
280 MII_ESR_1000BT_FD = 0x2000,
281 MII_ESR_1000BT_HD = 0x1000,
282};
283
284#if 0
285typedef union t_MII_PHY_SCR {
286 u16 image;
287 struct {
288 u16 disable_jabber:1;
289 u16 polarity_reversal:1;
290 u16 SEQ_test:1;
291 u16 _bit_3:1;
292 u16 disable_CLK125:1;
293 u16 mdi_crossover_mode:2;
294 u16 enable_ext_dist:1;
295 u16 _bit_8_9:2;
296 u16 force_link:1;
297 u16 assert_CRS:1;
298 u16 rcv_fifo_depth:2;
299 u16 xmit_fifo_depth:2;
300 } bits;
301} PHY_SCR_t, *PPHY_SCR_t;
302#endif
303
304typedef enum t_MII_ADMIN_STATUS {
305 adm_reset,
306 adm_operational,
307 adm_loopback,
308 adm_power_down,
309 adm_isolate
310} MII_ADMIN_t, *PMII_ADMIN_t;
311
312
313
314
315
316enum _pcs_anar {
317 PCS_ANAR_NEXT_PAGE = 0x8000,
318 PCS_ANAR_REMOTE_FAULT = 0x3000,
319 PCS_ANAR_ASYMMETRIC = 0x0100,
320 PCS_ANAR_PAUSE = 0x0080,
321 PCS_ANAR_HALF_DUPLEX = 0x0040,
322 PCS_ANAR_FULL_DUPLEX = 0x0020,
323};
324
325enum _pcs_anlpar {
326 PCS_ANLPAR_NEXT_PAGE = PCS_ANAR_NEXT_PAGE,
327 PCS_ANLPAR_REMOTE_FAULT = PCS_ANAR_REMOTE_FAULT,
328 PCS_ANLPAR_ASYMMETRIC = PCS_ANAR_ASYMMETRIC,
329 PCS_ANLPAR_PAUSE = PCS_ANAR_PAUSE,
330 PCS_ANLPAR_HALF_DUPLEX = PCS_ANAR_HALF_DUPLEX,
331 PCS_ANLPAR_FULL_DUPLEX = PCS_ANAR_FULL_DUPLEX,
332};
333
334typedef struct t_SROM {
335 u16 config_param;
336 u16 asic_ctrl;
337 u16 sub_vendor_id;
338 u16 sub_system_id;
339 u16 pci_base_1;
340 u16 pci_base_2;
341 u16 led_mode;
342 u16 reserved1[9];
343 u8 mac_addr[6];
344 u8 reserved2[10];
345 u8 sib[204];
346 u32 crc;
347} SROM_t, *PSROM_t;
348
349
350struct ioctl_data {
351 char signature[10];
352 int cmd;
353 int len;
354 char *data;
355};
356
357
358struct netdev_desc {
359 __le64 next_desc;
360 __le64 status;
361 __le64 fraginfo;
362};
363
364#define PRIV_ALIGN 15
365
366
367struct netdev_private {
368
369 struct netdev_desc *rx_ring;
370 struct netdev_desc *tx_ring;
371 struct sk_buff *rx_skbuff[RX_RING_SIZE];
372 struct sk_buff *tx_skbuff[TX_RING_SIZE];
373 dma_addr_t tx_ring_dma;
374 dma_addr_t rx_ring_dma;
375 struct pci_dev *pdev;
376 void __iomem *ioaddr;
377 void __iomem *eeprom_addr;
378 spinlock_t tx_lock;
379 spinlock_t rx_lock;
380 struct net_device_stats stats;
381 unsigned int rx_buf_sz;
382 unsigned int speed;
383 unsigned int vlan;
384 unsigned int chip_id;
385 unsigned int rx_coalesce;
386 unsigned int rx_timeout;
387 unsigned int tx_coalesce;
388 unsigned int full_duplex:1;
389 unsigned int an_enable:2;
390 unsigned int jumbo:1;
391 unsigned int coalesce:1;
392 unsigned int tx_flow:1;
393 unsigned int rx_flow:1;
394 unsigned int phy_media:1;
395 unsigned int link_status:1;
396 struct netdev_desc *last_tx;
397 unsigned long cur_rx, old_rx;
398 unsigned long cur_tx, old_tx;
399 struct timer_list timer;
400 int wake_polarity;
401 char name[256];
402 u8 duplex_polarity;
403 u16 mcast_filter[4];
404 u16 advertising;
405 u16 negotiate;
406 int phy_addr;
407 u16 led_mode;
408};
409
410
411
412
413
414
415
416
417
418#define CHIP_IP1000A 1
419
420static const struct pci_device_id rio_pci_tbl[] = {
421 {0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, },
422 {0x13f0, 0x1021, PCI_ANY_ID, PCI_ANY_ID, },
423 { PCI_VDEVICE(SUNDANCE, 0x1023), CHIP_IP1000A },
424 { PCI_VDEVICE(SUNDANCE, 0x2021), CHIP_IP1000A },
425 { PCI_VDEVICE(DLINK, 0x9021), CHIP_IP1000A },
426 { PCI_VDEVICE(DLINK, 0x4020), CHIP_IP1000A },
427 { }
428};
429MODULE_DEVICE_TABLE (pci, rio_pci_tbl);
430#define TX_TIMEOUT (4*HZ)
431#define PACKET_SIZE 1536
432#define MAX_JUMBO 8000
433#define RIO_IO_SIZE 340
434#define DEFAULT_RXC 5
435#define DEFAULT_RXT 750
436#define DEFAULT_TXC 1
437#define MAX_TXC 8
438#endif
439