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
215enum TFC_bits {
216 DwordAlign = 0x00000000,
217 WordAlignDisable = 0x00030000,
218 WordAlign = 0x00020000,
219 TCPChecksumEnable = 0x00040000,
220 UDPChecksumEnable = 0x00080000,
221 IPChecksumEnable = 0x00100000,
222 FCSAppendDisable = 0x00200000,
223 TxIndicate = 0x00400000,
224 TxDMAIndicate = 0x00800000,
225 FragCountShift = 24,
226 VLANTagInsert = 0x0000000010000000,
227 TFDDone = 0x80000000,
228 VIDShift = 32,
229 UsePriorityShift = 48,
230};
231
232
233enum RFS_bits {
234 RxFIFOOverrun = 0x00010000,
235 RxRuntFrame = 0x00020000,
236 RxAlignmentError = 0x00040000,
237 RxFCSError = 0x00080000,
238 RxOverSizedFrame = 0x00100000,
239 RxLengthError = 0x00200000,
240 VLANDetected = 0x00400000,
241 TCPDetected = 0x00800000,
242 TCPError = 0x01000000,
243 UDPDetected = 0x02000000,
244 UDPError = 0x04000000,
245 IPDetected = 0x08000000,
246 IPError = 0x10000000,
247 FrameStart = 0x20000000,
248 FrameEnd = 0x40000000,
249 RFDDone = 0x80000000,
250 TCIShift = 32,
251 RFS_Errors = 0x003f0000,
252};
253
254#define MII_RESET_TIME_OUT 10000
255
256enum _mii_reg {
257 MII_PHY_SCR = 16,
258};
259
260
261enum _pcs_reg {
262 PCS_BMCR = 0,
263 PCS_BMSR = 1,
264 PCS_ANAR = 4,
265 PCS_ANLPAR = 5,
266 PCS_ANER = 6,
267 PCS_ANNPT = 7,
268 PCS_ANLPRNP = 8,
269 PCS_ESR = 15,
270};
271
272
273enum _mii_esr {
274 MII_ESR_1000BX_FD = 0x8000,
275 MII_ESR_1000BX_HD = 0x4000,
276 MII_ESR_1000BT_FD = 0x2000,
277 MII_ESR_1000BT_HD = 0x1000,
278};
279
280#if 0
281typedef union t_MII_PHY_SCR {
282 u16 image;
283 struct {
284 u16 disable_jabber:1;
285 u16 polarity_reversal:1;
286 u16 SEQ_test:1;
287 u16 _bit_3:1;
288 u16 disable_CLK125:1;
289 u16 mdi_crossover_mode:2;
290 u16 enable_ext_dist:1;
291 u16 _bit_8_9:2;
292 u16 force_link:1;
293 u16 assert_CRS:1;
294 u16 rcv_fifo_depth:2;
295 u16 xmit_fifo_depth:2;
296 } bits;
297} PHY_SCR_t, *PPHY_SCR_t;
298#endif
299
300typedef enum t_MII_ADMIN_STATUS {
301 adm_reset,
302 adm_operational,
303 adm_loopback,
304 adm_power_down,
305 adm_isolate
306} MII_ADMIN_t, *PMII_ADMIN_t;
307
308
309
310
311
312enum _pcs_anar {
313 PCS_ANAR_NEXT_PAGE = 0x8000,
314 PCS_ANAR_REMOTE_FAULT = 0x3000,
315 PCS_ANAR_ASYMMETRIC = 0x0100,
316 PCS_ANAR_PAUSE = 0x0080,
317 PCS_ANAR_HALF_DUPLEX = 0x0040,
318 PCS_ANAR_FULL_DUPLEX = 0x0020,
319};
320
321enum _pcs_anlpar {
322 PCS_ANLPAR_NEXT_PAGE = PCS_ANAR_NEXT_PAGE,
323 PCS_ANLPAR_REMOTE_FAULT = PCS_ANAR_REMOTE_FAULT,
324 PCS_ANLPAR_ASYMMETRIC = PCS_ANAR_ASYMMETRIC,
325 PCS_ANLPAR_PAUSE = PCS_ANAR_PAUSE,
326 PCS_ANLPAR_HALF_DUPLEX = PCS_ANAR_HALF_DUPLEX,
327 PCS_ANLPAR_FULL_DUPLEX = PCS_ANAR_FULL_DUPLEX,
328};
329
330typedef struct t_SROM {
331 u16 config_param;
332 u16 asic_ctrl;
333 u16 sub_vendor_id;
334 u16 sub_system_id;
335 u16 reserved1[12];
336 u8 mac_addr[6];
337 u8 reserved2[10];
338 u8 sib[204];
339 u32 crc;
340} SROM_t, *PSROM_t;
341
342
343struct ioctl_data {
344 char signature[10];
345 int cmd;
346 int len;
347 char *data;
348};
349
350
351struct netdev_desc {
352 __le64 next_desc;
353 __le64 status;
354 __le64 fraginfo;
355};
356
357#define PRIV_ALIGN 15
358
359
360struct netdev_private {
361
362 struct netdev_desc *rx_ring;
363 struct netdev_desc *tx_ring;
364 struct sk_buff *rx_skbuff[RX_RING_SIZE];
365 struct sk_buff *tx_skbuff[TX_RING_SIZE];
366 dma_addr_t tx_ring_dma;
367 dma_addr_t rx_ring_dma;
368 struct pci_dev *pdev;
369 void __iomem *ioaddr;
370 void __iomem *eeprom_addr;
371 spinlock_t tx_lock;
372 spinlock_t rx_lock;
373 struct net_device_stats stats;
374 unsigned int rx_buf_sz;
375 unsigned int speed;
376 unsigned int vlan;
377 unsigned int chip_id;
378 unsigned int rx_coalesce;
379 unsigned int rx_timeout;
380 unsigned int tx_coalesce;
381 unsigned int full_duplex:1;
382 unsigned int an_enable:2;
383 unsigned int jumbo:1;
384 unsigned int coalesce:1;
385 unsigned int tx_flow:1;
386 unsigned int rx_flow:1;
387 unsigned int phy_media:1;
388 unsigned int link_status:1;
389 struct netdev_desc *last_tx;
390 unsigned long cur_rx, old_rx;
391 unsigned long cur_tx, old_tx;
392 struct timer_list timer;
393 int wake_polarity;
394 char name[256];
395 u8 duplex_polarity;
396 u16 mcast_filter[4];
397 u16 advertising;
398 u16 negotiate;
399 int phy_addr;
400};
401
402
403
404
405
406
407
408
409
410
411static DEFINE_PCI_DEVICE_TABLE(rio_pci_tbl) = {
412 {0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, },
413 {0x13f0, 0x1021, PCI_ANY_ID, PCI_ANY_ID, },
414 { }
415};
416MODULE_DEVICE_TABLE (pci, rio_pci_tbl);
417#define TX_TIMEOUT (4*HZ)
418#define PACKET_SIZE 1536
419#define MAX_JUMBO 8000
420#define RIO_IO_SIZE 340
421#define DEFAULT_RXC 5
422#define DEFAULT_RXT 750
423#define DEFAULT_TXC 1
424#define MAX_TXC 8
425#endif
426