xref: /OK3568_Linux_fs/kernel/drivers/net/ethernet/dlink/dl2k.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*  D-Link DL2000-based Gigabit Ethernet Adapter Linux driver */
3*4882a593Smuzhiyun /*
4*4882a593Smuzhiyun     Copyright (c) 2001, 2002 by D-Link Corporation
5*4882a593Smuzhiyun     Written by Edward Peng.<edward_peng@dlink.com.tw>
6*4882a593Smuzhiyun     Created 03-May-2001, base on Linux' sundance.c.
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef __DL2K_H__
11*4882a593Smuzhiyun #define __DL2K_H__
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/module.h>
14*4882a593Smuzhiyun #include <linux/kernel.h>
15*4882a593Smuzhiyun #include <linux/string.h>
16*4882a593Smuzhiyun #include <linux/timer.h>
17*4882a593Smuzhiyun #include <linux/errno.h>
18*4882a593Smuzhiyun #include <linux/ioport.h>
19*4882a593Smuzhiyun #include <linux/slab.h>
20*4882a593Smuzhiyun #include <linux/interrupt.h>
21*4882a593Smuzhiyun #include <linux/pci.h>
22*4882a593Smuzhiyun #include <linux/netdevice.h>
23*4882a593Smuzhiyun #include <linux/etherdevice.h>
24*4882a593Smuzhiyun #include <linux/skbuff.h>
25*4882a593Smuzhiyun #include <linux/crc32.h>
26*4882a593Smuzhiyun #include <linux/ethtool.h>
27*4882a593Smuzhiyun #include <linux/mii.h>
28*4882a593Smuzhiyun #include <linux/bitops.h>
29*4882a593Smuzhiyun #include <asm/processor.h>	/* Processor type for cache alignment. */
30*4882a593Smuzhiyun #include <asm/io.h>
31*4882a593Smuzhiyun #include <linux/uaccess.h>
32*4882a593Smuzhiyun #include <linux/delay.h>
33*4882a593Smuzhiyun #include <linux/spinlock.h>
34*4882a593Smuzhiyun #include <linux/time.h>
35*4882a593Smuzhiyun #define TX_RING_SIZE	256
36*4882a593Smuzhiyun #define TX_QUEUE_LEN	(TX_RING_SIZE - 1) /* Limit ring entries actually used.*/
37*4882a593Smuzhiyun #define RX_RING_SIZE 	256
38*4882a593Smuzhiyun #define TX_TOTAL_SIZE	TX_RING_SIZE*sizeof(struct netdev_desc)
39*4882a593Smuzhiyun #define RX_TOTAL_SIZE	RX_RING_SIZE*sizeof(struct netdev_desc)
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /* Offsets to the device registers.
42*4882a593Smuzhiyun    Unlike software-only systems, device drivers interact with complex hardware.
43*4882a593Smuzhiyun    It's not useful to define symbolic names for every register bit in the
44*4882a593Smuzhiyun    device.  The name can only partially document the semantics and make
45*4882a593Smuzhiyun    the driver longer and more difficult to read.
46*4882a593Smuzhiyun    In general, only the important configuration values or bits changed
47*4882a593Smuzhiyun    multiple times should be defined symbolically.
48*4882a593Smuzhiyun */
49*4882a593Smuzhiyun enum dl2x_offsets {
50*4882a593Smuzhiyun 	/* I/O register offsets */
51*4882a593Smuzhiyun 	DMACtrl = 0x00,
52*4882a593Smuzhiyun 	RxDMAStatus = 0x08,
53*4882a593Smuzhiyun 	TFDListPtr0 = 0x10,
54*4882a593Smuzhiyun 	TFDListPtr1 = 0x14,
55*4882a593Smuzhiyun 	TxDMABurstThresh = 0x18,
56*4882a593Smuzhiyun 	TxDMAUrgentThresh = 0x19,
57*4882a593Smuzhiyun 	TxDMAPollPeriod = 0x1a,
58*4882a593Smuzhiyun 	RFDListPtr0 = 0x1c,
59*4882a593Smuzhiyun 	RFDListPtr1 = 0x20,
60*4882a593Smuzhiyun 	RxDMABurstThresh = 0x24,
61*4882a593Smuzhiyun 	RxDMAUrgentThresh = 0x25,
62*4882a593Smuzhiyun 	RxDMAPollPeriod = 0x26,
63*4882a593Smuzhiyun 	RxDMAIntCtrl = 0x28,
64*4882a593Smuzhiyun 	DebugCtrl = 0x2c,
65*4882a593Smuzhiyun 	ASICCtrl = 0x30,
66*4882a593Smuzhiyun 	FifoCtrl = 0x38,
67*4882a593Smuzhiyun 	RxEarlyThresh = 0x3a,
68*4882a593Smuzhiyun 	FlowOffThresh = 0x3c,
69*4882a593Smuzhiyun 	FlowOnThresh = 0x3e,
70*4882a593Smuzhiyun 	TxStartThresh = 0x44,
71*4882a593Smuzhiyun 	EepromData = 0x48,
72*4882a593Smuzhiyun 	EepromCtrl = 0x4a,
73*4882a593Smuzhiyun 	ExpromAddr = 0x4c,
74*4882a593Smuzhiyun 	Exprodata = 0x50,
75*4882a593Smuzhiyun 	WakeEvent = 0x51,
76*4882a593Smuzhiyun 	CountDown = 0x54,
77*4882a593Smuzhiyun 	IntStatusAck = 0x5a,
78*4882a593Smuzhiyun 	IntEnable = 0x5c,
79*4882a593Smuzhiyun 	IntStatus = 0x5e,
80*4882a593Smuzhiyun 	TxStatus = 0x60,
81*4882a593Smuzhiyun 	MACCtrl = 0x6c,
82*4882a593Smuzhiyun 	VLANTag = 0x70,
83*4882a593Smuzhiyun 	PhyCtrl = 0x76,
84*4882a593Smuzhiyun 	StationAddr0 = 0x78,
85*4882a593Smuzhiyun 	StationAddr1 = 0x7a,
86*4882a593Smuzhiyun 	StationAddr2 = 0x7c,
87*4882a593Smuzhiyun 	VLANId = 0x80,
88*4882a593Smuzhiyun 	MaxFrameSize = 0x86,
89*4882a593Smuzhiyun 	ReceiveMode = 0x88,
90*4882a593Smuzhiyun 	HashTable0 = 0x8c,
91*4882a593Smuzhiyun 	HashTable1 = 0x90,
92*4882a593Smuzhiyun 	RmonStatMask = 0x98,
93*4882a593Smuzhiyun 	StatMask = 0x9c,
94*4882a593Smuzhiyun 	RxJumboFrames = 0xbc,
95*4882a593Smuzhiyun 	TCPCheckSumErrors = 0xc0,
96*4882a593Smuzhiyun 	IPCheckSumErrors = 0xc2,
97*4882a593Smuzhiyun 	UDPCheckSumErrors = 0xc4,
98*4882a593Smuzhiyun 	TxJumboFrames = 0xf4,
99*4882a593Smuzhiyun 	/* Ethernet MIB statistic register offsets */
100*4882a593Smuzhiyun 	OctetRcvOk = 0xa8,
101*4882a593Smuzhiyun 	McstOctetRcvOk = 0xac,
102*4882a593Smuzhiyun 	BcstOctetRcvOk = 0xb0,
103*4882a593Smuzhiyun 	FramesRcvOk = 0xb4,
104*4882a593Smuzhiyun 	McstFramesRcvdOk = 0xb8,
105*4882a593Smuzhiyun 	BcstFramesRcvdOk = 0xbe,
106*4882a593Smuzhiyun 	MacControlFramesRcvd = 0xc6,
107*4882a593Smuzhiyun 	FrameTooLongErrors = 0xc8,
108*4882a593Smuzhiyun 	InRangeLengthErrors = 0xca,
109*4882a593Smuzhiyun 	FramesCheckSeqErrors = 0xcc,
110*4882a593Smuzhiyun 	FramesLostRxErrors = 0xce,
111*4882a593Smuzhiyun 	OctetXmtOk = 0xd0,
112*4882a593Smuzhiyun 	McstOctetXmtOk = 0xd4,
113*4882a593Smuzhiyun 	BcstOctetXmtOk = 0xd8,
114*4882a593Smuzhiyun 	FramesXmtOk = 0xdc,
115*4882a593Smuzhiyun 	McstFramesXmtdOk = 0xe0,
116*4882a593Smuzhiyun 	FramesWDeferredXmt = 0xe4,
117*4882a593Smuzhiyun 	LateCollisions = 0xe8,
118*4882a593Smuzhiyun 	MultiColFrames = 0xec,
119*4882a593Smuzhiyun 	SingleColFrames = 0xf0,
120*4882a593Smuzhiyun 	BcstFramesXmtdOk = 0xf6,
121*4882a593Smuzhiyun 	CarrierSenseErrors = 0xf8,
122*4882a593Smuzhiyun 	MacControlFramesXmtd = 0xfa,
123*4882a593Smuzhiyun 	FramesAbortXSColls = 0xfc,
124*4882a593Smuzhiyun 	FramesWEXDeferal = 0xfe,
125*4882a593Smuzhiyun 	/* RMON statistic register offsets */
126*4882a593Smuzhiyun 	EtherStatsCollisions = 0x100,
127*4882a593Smuzhiyun 	EtherStatsOctetsTransmit = 0x104,
128*4882a593Smuzhiyun 	EtherStatsPktsTransmit = 0x108,
129*4882a593Smuzhiyun 	EtherStatsPkts64OctetTransmit = 0x10c,
130*4882a593Smuzhiyun 	EtherStats65to127OctetsTransmit = 0x110,
131*4882a593Smuzhiyun 	EtherStatsPkts128to255OctetsTransmit = 0x114,
132*4882a593Smuzhiyun 	EtherStatsPkts256to511OctetsTransmit = 0x118,
133*4882a593Smuzhiyun 	EtherStatsPkts512to1023OctetsTransmit = 0x11c,
134*4882a593Smuzhiyun 	EtherStatsPkts1024to1518OctetsTransmit = 0x120,
135*4882a593Smuzhiyun 	EtherStatsCRCAlignErrors = 0x124,
136*4882a593Smuzhiyun 	EtherStatsUndersizePkts = 0x128,
137*4882a593Smuzhiyun 	EtherStatsFragments = 0x12c,
138*4882a593Smuzhiyun 	EtherStatsJabbers = 0x130,
139*4882a593Smuzhiyun 	EtherStatsOctets = 0x134,
140*4882a593Smuzhiyun 	EtherStatsPkts = 0x138,
141*4882a593Smuzhiyun 	EtherStats64Octets = 0x13c,
142*4882a593Smuzhiyun 	EtherStatsPkts65to127Octets = 0x140,
143*4882a593Smuzhiyun 	EtherStatsPkts128to255Octets = 0x144,
144*4882a593Smuzhiyun 	EtherStatsPkts256to511Octets = 0x148,
145*4882a593Smuzhiyun 	EtherStatsPkts512to1023Octets = 0x14c,
146*4882a593Smuzhiyun 	EtherStatsPkts1024to1518Octets = 0x150,
147*4882a593Smuzhiyun };
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun /* Bits in the interrupt status/mask registers. */
150*4882a593Smuzhiyun enum IntStatus_bits {
151*4882a593Smuzhiyun 	InterruptStatus = 0x0001,
152*4882a593Smuzhiyun 	HostError = 0x0002,
153*4882a593Smuzhiyun 	MACCtrlFrame = 0x0008,
154*4882a593Smuzhiyun 	TxComplete = 0x0004,
155*4882a593Smuzhiyun 	RxComplete = 0x0010,
156*4882a593Smuzhiyun 	RxEarly = 0x0020,
157*4882a593Smuzhiyun 	IntRequested = 0x0040,
158*4882a593Smuzhiyun 	UpdateStats = 0x0080,
159*4882a593Smuzhiyun 	LinkEvent = 0x0100,
160*4882a593Smuzhiyun 	TxDMAComplete = 0x0200,
161*4882a593Smuzhiyun 	RxDMAComplete = 0x0400,
162*4882a593Smuzhiyun 	RFDListEnd = 0x0800,
163*4882a593Smuzhiyun 	RxDMAPriority = 0x1000,
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun /* Bits in the ReceiveMode register. */
167*4882a593Smuzhiyun enum ReceiveMode_bits {
168*4882a593Smuzhiyun 	ReceiveUnicast = 0x0001,
169*4882a593Smuzhiyun 	ReceiveMulticast = 0x0002,
170*4882a593Smuzhiyun 	ReceiveBroadcast = 0x0004,
171*4882a593Smuzhiyun 	ReceiveAllFrames = 0x0008,
172*4882a593Smuzhiyun 	ReceiveMulticastHash = 0x0010,
173*4882a593Smuzhiyun 	ReceiveIPMulticast = 0x0020,
174*4882a593Smuzhiyun 	ReceiveVLANMatch = 0x0100,
175*4882a593Smuzhiyun 	ReceiveVLANHash = 0x0200,
176*4882a593Smuzhiyun };
177*4882a593Smuzhiyun /* Bits in MACCtrl. */
178*4882a593Smuzhiyun enum MACCtrl_bits {
179*4882a593Smuzhiyun 	DuplexSelect = 0x20,
180*4882a593Smuzhiyun 	TxFlowControlEnable = 0x80,
181*4882a593Smuzhiyun 	RxFlowControlEnable = 0x0100,
182*4882a593Smuzhiyun 	RcvFCS = 0x200,
183*4882a593Smuzhiyun 	AutoVLANtagging = 0x1000,
184*4882a593Smuzhiyun 	AutoVLANuntagging = 0x2000,
185*4882a593Smuzhiyun 	StatsEnable = 0x00200000,
186*4882a593Smuzhiyun 	StatsDisable = 0x00400000,
187*4882a593Smuzhiyun 	StatsEnabled = 0x00800000,
188*4882a593Smuzhiyun 	TxEnable = 0x01000000,
189*4882a593Smuzhiyun 	TxDisable = 0x02000000,
190*4882a593Smuzhiyun 	TxEnabled = 0x04000000,
191*4882a593Smuzhiyun 	RxEnable = 0x08000000,
192*4882a593Smuzhiyun 	RxDisable = 0x10000000,
193*4882a593Smuzhiyun 	RxEnabled = 0x20000000,
194*4882a593Smuzhiyun };
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun enum ASICCtrl_LoWord_bits {
197*4882a593Smuzhiyun 	PhyMedia = 0x0080,
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun enum ASICCtrl_HiWord_bits {
201*4882a593Smuzhiyun 	GlobalReset = 0x0001,
202*4882a593Smuzhiyun 	RxReset = 0x0002,
203*4882a593Smuzhiyun 	TxReset = 0x0004,
204*4882a593Smuzhiyun 	DMAReset = 0x0008,
205*4882a593Smuzhiyun 	FIFOReset = 0x0010,
206*4882a593Smuzhiyun 	NetworkReset = 0x0020,
207*4882a593Smuzhiyun 	HostReset = 0x0040,
208*4882a593Smuzhiyun 	ResetBusy = 0x0400,
209*4882a593Smuzhiyun };
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun #define IPG_AC_LED_MODE		BIT(14)
212*4882a593Smuzhiyun #define IPG_AC_LED_SPEED	BIT(27)
213*4882a593Smuzhiyun #define IPG_AC_LED_MODE_BIT_1	BIT(29)
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /* Transmit Frame Control bits */
216*4882a593Smuzhiyun enum TFC_bits {
217*4882a593Smuzhiyun 	DwordAlign = 0x00000000,
218*4882a593Smuzhiyun 	WordAlignDisable = 0x00030000,
219*4882a593Smuzhiyun 	WordAlign = 0x00020000,
220*4882a593Smuzhiyun 	TCPChecksumEnable = 0x00040000,
221*4882a593Smuzhiyun 	UDPChecksumEnable = 0x00080000,
222*4882a593Smuzhiyun 	IPChecksumEnable = 0x00100000,
223*4882a593Smuzhiyun 	FCSAppendDisable = 0x00200000,
224*4882a593Smuzhiyun 	TxIndicate = 0x00400000,
225*4882a593Smuzhiyun 	TxDMAIndicate = 0x00800000,
226*4882a593Smuzhiyun 	FragCountShift = 24,
227*4882a593Smuzhiyun 	VLANTagInsert = 0x0000000010000000,
228*4882a593Smuzhiyun 	TFDDone = 0x80000000,
229*4882a593Smuzhiyun 	VIDShift = 32,
230*4882a593Smuzhiyun 	UsePriorityShift = 48,
231*4882a593Smuzhiyun };
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun /* Receive Frames Status bits */
234*4882a593Smuzhiyun enum RFS_bits {
235*4882a593Smuzhiyun 	RxFIFOOverrun = 0x00010000,
236*4882a593Smuzhiyun 	RxRuntFrame = 0x00020000,
237*4882a593Smuzhiyun 	RxAlignmentError = 0x00040000,
238*4882a593Smuzhiyun 	RxFCSError = 0x00080000,
239*4882a593Smuzhiyun 	RxOverSizedFrame = 0x00100000,
240*4882a593Smuzhiyun 	RxLengthError = 0x00200000,
241*4882a593Smuzhiyun 	VLANDetected = 0x00400000,
242*4882a593Smuzhiyun 	TCPDetected = 0x00800000,
243*4882a593Smuzhiyun 	TCPError = 0x01000000,
244*4882a593Smuzhiyun 	UDPDetected = 0x02000000,
245*4882a593Smuzhiyun 	UDPError = 0x04000000,
246*4882a593Smuzhiyun 	IPDetected = 0x08000000,
247*4882a593Smuzhiyun 	IPError = 0x10000000,
248*4882a593Smuzhiyun 	FrameStart = 0x20000000,
249*4882a593Smuzhiyun 	FrameEnd = 0x40000000,
250*4882a593Smuzhiyun 	RFDDone = 0x80000000,
251*4882a593Smuzhiyun 	TCIShift = 32,
252*4882a593Smuzhiyun 	RFS_Errors = 0x003f0000,
253*4882a593Smuzhiyun };
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun #define MII_RESET_TIME_OUT		10000
256*4882a593Smuzhiyun /* MII register */
257*4882a593Smuzhiyun enum _mii_reg {
258*4882a593Smuzhiyun 	MII_PHY_SCR = 16,
259*4882a593Smuzhiyun };
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun /* PCS register */
262*4882a593Smuzhiyun enum _pcs_reg {
263*4882a593Smuzhiyun 	PCS_BMCR = 0,
264*4882a593Smuzhiyun 	PCS_BMSR = 1,
265*4882a593Smuzhiyun 	PCS_ANAR = 4,
266*4882a593Smuzhiyun 	PCS_ANLPAR = 5,
267*4882a593Smuzhiyun 	PCS_ANER = 6,
268*4882a593Smuzhiyun 	PCS_ANNPT = 7,
269*4882a593Smuzhiyun 	PCS_ANLPRNP = 8,
270*4882a593Smuzhiyun 	PCS_ESR = 15,
271*4882a593Smuzhiyun };
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun /* IEEE Extened Status Register */
274*4882a593Smuzhiyun enum _mii_esr {
275*4882a593Smuzhiyun 	MII_ESR_1000BX_FD = 0x8000,
276*4882a593Smuzhiyun 	MII_ESR_1000BX_HD = 0x4000,
277*4882a593Smuzhiyun 	MII_ESR_1000BT_FD = 0x2000,
278*4882a593Smuzhiyun 	MII_ESR_1000BT_HD = 0x1000,
279*4882a593Smuzhiyun };
280*4882a593Smuzhiyun /* PHY Specific Control Register */
281*4882a593Smuzhiyun #if 0
282*4882a593Smuzhiyun typedef union t_MII_PHY_SCR {
283*4882a593Smuzhiyun 	u16 image;
284*4882a593Smuzhiyun 	struct {
285*4882a593Smuzhiyun 		u16 disable_jabber:1;	// bit 0
286*4882a593Smuzhiyun 		u16 polarity_reversal:1;	// bit 1
287*4882a593Smuzhiyun 		u16 SEQ_test:1;	// bit 2
288*4882a593Smuzhiyun 		u16 _bit_3:1;	// bit 3
289*4882a593Smuzhiyun 		u16 disable_CLK125:1;	// bit 4
290*4882a593Smuzhiyun 		u16 mdi_crossover_mode:2;	// bit 6:5
291*4882a593Smuzhiyun 		u16 enable_ext_dist:1;	// bit 7
292*4882a593Smuzhiyun 		u16 _bit_8_9:2;	// bit 9:8
293*4882a593Smuzhiyun 		u16 force_link:1;	// bit 10
294*4882a593Smuzhiyun 		u16 assert_CRS:1;	// bit 11
295*4882a593Smuzhiyun 		u16 rcv_fifo_depth:2;	// bit 13:12
296*4882a593Smuzhiyun 		u16 xmit_fifo_depth:2;	// bit 15:14
297*4882a593Smuzhiyun 	} bits;
298*4882a593Smuzhiyun } PHY_SCR_t, *PPHY_SCR_t;
299*4882a593Smuzhiyun #endif
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun typedef enum t_MII_ADMIN_STATUS {
302*4882a593Smuzhiyun 	adm_reset,
303*4882a593Smuzhiyun 	adm_operational,
304*4882a593Smuzhiyun 	adm_loopback,
305*4882a593Smuzhiyun 	adm_power_down,
306*4882a593Smuzhiyun 	adm_isolate
307*4882a593Smuzhiyun } MII_ADMIN_t, *PMII_ADMIN_t;
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun /* Physical Coding Sublayer Management (PCS) */
310*4882a593Smuzhiyun /* PCS control and status registers bitmap as the same as MII */
311*4882a593Smuzhiyun /* PCS Extended Status register bitmap as the same as MII */
312*4882a593Smuzhiyun /* PCS ANAR */
313*4882a593Smuzhiyun enum _pcs_anar {
314*4882a593Smuzhiyun 	PCS_ANAR_NEXT_PAGE = 0x8000,
315*4882a593Smuzhiyun 	PCS_ANAR_REMOTE_FAULT = 0x3000,
316*4882a593Smuzhiyun 	PCS_ANAR_ASYMMETRIC = 0x0100,
317*4882a593Smuzhiyun 	PCS_ANAR_PAUSE = 0x0080,
318*4882a593Smuzhiyun 	PCS_ANAR_HALF_DUPLEX = 0x0040,
319*4882a593Smuzhiyun 	PCS_ANAR_FULL_DUPLEX = 0x0020,
320*4882a593Smuzhiyun };
321*4882a593Smuzhiyun /* PCS ANLPAR */
322*4882a593Smuzhiyun enum _pcs_anlpar {
323*4882a593Smuzhiyun 	PCS_ANLPAR_NEXT_PAGE = PCS_ANAR_NEXT_PAGE,
324*4882a593Smuzhiyun 	PCS_ANLPAR_REMOTE_FAULT = PCS_ANAR_REMOTE_FAULT,
325*4882a593Smuzhiyun 	PCS_ANLPAR_ASYMMETRIC = PCS_ANAR_ASYMMETRIC,
326*4882a593Smuzhiyun 	PCS_ANLPAR_PAUSE = PCS_ANAR_PAUSE,
327*4882a593Smuzhiyun 	PCS_ANLPAR_HALF_DUPLEX = PCS_ANAR_HALF_DUPLEX,
328*4882a593Smuzhiyun 	PCS_ANLPAR_FULL_DUPLEX = PCS_ANAR_FULL_DUPLEX,
329*4882a593Smuzhiyun };
330*4882a593Smuzhiyun 
331*4882a593Smuzhiyun typedef struct t_SROM {
332*4882a593Smuzhiyun 	u16 config_param;	/* 0x00 */
333*4882a593Smuzhiyun 	u16 asic_ctrl;		/* 0x02 */
334*4882a593Smuzhiyun 	u16 sub_vendor_id;	/* 0x04 */
335*4882a593Smuzhiyun 	u16 sub_system_id;	/* 0x06 */
336*4882a593Smuzhiyun 	u16 pci_base_1;		/* 0x08 (IP1000A only) */
337*4882a593Smuzhiyun 	u16 pci_base_2;		/* 0x0a (IP1000A only) */
338*4882a593Smuzhiyun 	u16 led_mode;		/* 0x0c (IP1000A only) */
339*4882a593Smuzhiyun 	u16 reserved1[9];	/* 0x0e-0x1f */
340*4882a593Smuzhiyun 	u8 mac_addr[6];		/* 0x20-0x25 */
341*4882a593Smuzhiyun 	u8 reserved2[10];	/* 0x26-0x2f */
342*4882a593Smuzhiyun 	u8 sib[204];		/* 0x30-0xfb */
343*4882a593Smuzhiyun 	u32 crc;		/* 0xfc-0xff */
344*4882a593Smuzhiyun } SROM_t, *PSROM_t;
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun /* Ioctl custom data */
347*4882a593Smuzhiyun struct ioctl_data {
348*4882a593Smuzhiyun 	char signature[10];
349*4882a593Smuzhiyun 	int cmd;
350*4882a593Smuzhiyun 	int len;
351*4882a593Smuzhiyun 	char *data;
352*4882a593Smuzhiyun };
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun /* The Rx and Tx buffer descriptors. */
355*4882a593Smuzhiyun struct netdev_desc {
356*4882a593Smuzhiyun 	__le64 next_desc;
357*4882a593Smuzhiyun 	__le64 status;
358*4882a593Smuzhiyun 	__le64 fraginfo;
359*4882a593Smuzhiyun };
360*4882a593Smuzhiyun 
361*4882a593Smuzhiyun #define PRIV_ALIGN	15	/* Required alignment mask */
362*4882a593Smuzhiyun /* Use  __attribute__((aligned (L1_CACHE_BYTES)))  to maintain alignment
363*4882a593Smuzhiyun    within the structure. */
364*4882a593Smuzhiyun struct netdev_private {
365*4882a593Smuzhiyun 	/* Descriptor rings first for alignment. */
366*4882a593Smuzhiyun 	struct netdev_desc *rx_ring;
367*4882a593Smuzhiyun 	struct netdev_desc *tx_ring;
368*4882a593Smuzhiyun 	struct sk_buff *rx_skbuff[RX_RING_SIZE];
369*4882a593Smuzhiyun 	struct sk_buff *tx_skbuff[TX_RING_SIZE];
370*4882a593Smuzhiyun 	dma_addr_t tx_ring_dma;
371*4882a593Smuzhiyun 	dma_addr_t rx_ring_dma;
372*4882a593Smuzhiyun 	struct pci_dev *pdev;
373*4882a593Smuzhiyun 	void __iomem *ioaddr;
374*4882a593Smuzhiyun 	void __iomem *eeprom_addr;
375*4882a593Smuzhiyun 	spinlock_t tx_lock;
376*4882a593Smuzhiyun 	spinlock_t rx_lock;
377*4882a593Smuzhiyun 	unsigned int rx_buf_sz;		/* Based on MTU+slack. */
378*4882a593Smuzhiyun 	unsigned int speed;		/* Operating speed */
379*4882a593Smuzhiyun 	unsigned int vlan;		/* VLAN Id */
380*4882a593Smuzhiyun 	unsigned int chip_id;		/* PCI table chip id */
381*4882a593Smuzhiyun 	unsigned int rx_coalesce; 	/* Maximum frames each RxDMAComplete intr */
382*4882a593Smuzhiyun 	unsigned int rx_timeout; 	/* Wait time between RxDMAComplete intr */
383*4882a593Smuzhiyun 	unsigned int tx_coalesce;	/* Maximum frames each tx interrupt */
384*4882a593Smuzhiyun 	unsigned int full_duplex:1;	/* Full-duplex operation requested. */
385*4882a593Smuzhiyun 	unsigned int an_enable:2;	/* Auto-Negotiated Enable */
386*4882a593Smuzhiyun 	unsigned int jumbo:1;		/* Jumbo frame enable */
387*4882a593Smuzhiyun 	unsigned int coalesce:1;	/* Rx coalescing enable */
388*4882a593Smuzhiyun 	unsigned int tx_flow:1;		/* Tx flow control enable */
389*4882a593Smuzhiyun 	unsigned int rx_flow:1;		/* Rx flow control enable */
390*4882a593Smuzhiyun 	unsigned int phy_media:1;	/* 1: fiber, 0: copper */
391*4882a593Smuzhiyun 	unsigned int link_status:1;	/* Current link status */
392*4882a593Smuzhiyun 	struct netdev_desc *last_tx;	/* Last Tx descriptor used. */
393*4882a593Smuzhiyun 	unsigned long cur_rx, old_rx;	/* Producer/consumer ring indices */
394*4882a593Smuzhiyun 	unsigned long cur_tx, old_tx;
395*4882a593Smuzhiyun 	struct timer_list timer;
396*4882a593Smuzhiyun 	int wake_polarity;
397*4882a593Smuzhiyun 	char name[256];		/* net device description */
398*4882a593Smuzhiyun 	u8 duplex_polarity;
399*4882a593Smuzhiyun 	u16 mcast_filter[4];
400*4882a593Smuzhiyun 	u16 advertising;	/* NWay media advertisement */
401*4882a593Smuzhiyun 	u16 negotiate;		/* Negotiated media */
402*4882a593Smuzhiyun 	int phy_addr;		/* PHY addresses. */
403*4882a593Smuzhiyun 	u16 led_mode;		/* LED mode read from EEPROM (IP1000A only) */
404*4882a593Smuzhiyun };
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun /* The station address location in the EEPROM. */
407*4882a593Smuzhiyun /* The struct pci_device_id consist of:
408*4882a593Smuzhiyun         vendor, device          Vendor and device ID to match (or PCI_ANY_ID)
409*4882a593Smuzhiyun         subvendor, subdevice    Subsystem vendor and device ID to match (or PCI_ANY_ID)
410*4882a593Smuzhiyun         class                   Device class to match. The class_mask tells which bits
411*4882a593Smuzhiyun         class_mask              of the class are honored during the comparison.
412*4882a593Smuzhiyun         driver_data             Data private to the driver.
413*4882a593Smuzhiyun */
414*4882a593Smuzhiyun #define CHIP_IP1000A	1
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun static const struct pci_device_id rio_pci_tbl[] = {
417*4882a593Smuzhiyun 	{0x1186, 0x4000, PCI_ANY_ID, PCI_ANY_ID, },
418*4882a593Smuzhiyun 	{0x13f0, 0x1021, PCI_ANY_ID, PCI_ANY_ID, },
419*4882a593Smuzhiyun 	{ PCI_VDEVICE(SUNDANCE,	0x1023), CHIP_IP1000A },
420*4882a593Smuzhiyun 	{ PCI_VDEVICE(SUNDANCE,	0x2021), CHIP_IP1000A },
421*4882a593Smuzhiyun 	{ PCI_VDEVICE(DLINK,	0x9021), CHIP_IP1000A },
422*4882a593Smuzhiyun 	{ PCI_VDEVICE(DLINK,	0x4020), CHIP_IP1000A },
423*4882a593Smuzhiyun 	{ }
424*4882a593Smuzhiyun };
425*4882a593Smuzhiyun MODULE_DEVICE_TABLE (pci, rio_pci_tbl);
426*4882a593Smuzhiyun #define TX_TIMEOUT  (4*HZ)
427*4882a593Smuzhiyun #define PACKET_SIZE		1536
428*4882a593Smuzhiyun #define MAX_JUMBO		8000
429*4882a593Smuzhiyun #define RIO_IO_SIZE             340
430*4882a593Smuzhiyun #define DEFAULT_RXC		5
431*4882a593Smuzhiyun #define DEFAULT_RXT		750
432*4882a593Smuzhiyun #define DEFAULT_TXC		1
433*4882a593Smuzhiyun #define MAX_TXC			8
434*4882a593Smuzhiyun #endif				/* __DL2K_H__ */
435