Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  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 DEFINE_PCI_DEVICE_TABLE(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__ */