if_stgereg.h revision 169158
1160641Syongari/*	$NetBSD: if_stgereg.h,v 1.3 2003/02/10 21:10:07 christos Exp $	*/
2160641Syongari
3160641Syongari/*-
4160641Syongari * Copyright (c) 2001 The NetBSD Foundation, Inc.
5160641Syongari * All rights reserved.
6160641Syongari *
7160641Syongari * This code is derived from software contributed to The NetBSD Foundation
8160641Syongari * by Jason R. Thorpe.
9160641Syongari *
10160641Syongari * Redistribution and use in source and binary forms, with or without
11160641Syongari * modification, are permitted provided that the following conditions
12160641Syongari * are met:
13160641Syongari * 1. Redistributions of source code must retain the above copyright
14160641Syongari *    notice, this list of conditions and the following disclaimer.
15160641Syongari * 2. Redistributions in binary form must reproduce the above copyright
16160641Syongari *    notice, this list of conditions and the following disclaimer in the
17160641Syongari *    documentation and/or other materials provided with the distribution.
18160641Syongari * 3. All advertising materials mentioning features or use of this software
19160641Syongari *    must display the following acknowledgement:
20160641Syongari *	This product includes software developed by the NetBSD
21160641Syongari *	Foundation, Inc. and its contributors.
22160641Syongari * 4. Neither the name of The NetBSD Foundation nor the names of its
23160641Syongari *    contributors may be used to endorse or promote products derived
24160641Syongari *    from this software without specific prior written permission.
25160641Syongari *
26160641Syongari * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27160641Syongari * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28160641Syongari * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29160641Syongari * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30160641Syongari * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31160641Syongari * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32160641Syongari * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33160641Syongari * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34160641Syongari * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35160641Syongari * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36160641Syongari * POSSIBILITY OF SUCH DAMAGE.
37160641Syongari */
38160641Syongari
39160641Syongari/* $FreeBSD: head/sys/dev/stge/if_stgereg.h 169158 2007-05-01 03:35:48Z yongari $ */
40160641Syongari
41160641Syongari/*
42160641Syongari * Sundance Technology PCI vendor ID
43160641Syongari */
44160641Syongari#define	VENDOR_SUNDANCETI	0x13f0
45160641Syongari
46160641Syongari/*
47160641Syongari * Tamarack Microelectronics PCI vendor ID
48160641Syongari */
49160641Syongari#define	VENDOR_TAMARACK		0x143d
50160641Syongari
51160641Syongari/*
52160641Syongari * D-Link Systems PCI vendor ID
53160641Syongari */
54160641Syongari#define	VENDOR_DLINK		0x1186
55160641Syongari
56160641Syongari/*
57160641Syongari * Antares Microsystems PCI vendor ID
58160641Syongari */
59160641Syongari#define	VENDOR_ANTARES		0x1754
60160641Syongari
61160641Syongari/*
62160641Syongari * Sundance Technology device ID
63160641Syongari */
64160641Syongari#define	DEVICEID_SUNDANCETI_ST1023	0x1023
65160641Syongari#define	DEVICEID_SUNDANCETI_ST2021	0x2021
66160641Syongari#define	DEVICEID_TAMARACK_TC9021	0x1021
67160641Syongari#define	DEVICEID_TAMARACK_TC9021_ALT	0x9021
68160641Syongari
69160641Syongari/*
70160641Syongari * D-Link Systems device ID
71160641Syongari */
72160641Syongari#define	DEVICEID_DLINK_DL4000		0x4000
73160641Syongari
74160641Syongari/*
75160641Syongari * Antares Microsystems device ID
76160641Syongari */
77160641Syongari#define	DEVICEID_ANTARES_TC9021		0x1021
78160641Syongari
79160641Syongari/*
80160641Syongari * Register description for the Sundance Tech. TC9021 10/100/1000
81160641Syongari * Ethernet controller.
82160641Syongari *
83160641Syongari * Note that while DMA addresses are all in 64-bit fields, only
84160641Syongari * the lower 40 bits of a DMA address are valid.
85160641Syongari */
86160641Syongari#if (BUS_SPACE_MAXADDR < 0xFFFFFFFFFF)
87160641Syongari#define	STGE_DMA_MAXADDR	BUS_SPACE_MAXADDR
88160641Syongari#else
89160641Syongari#define	STGE_DMA_MAXADDR	0xFFFFFFFFFF
90160641Syongari#endif
91160641Syongari
92160641Syongari/*
93160641Syongari * Register access macros
94160641Syongari */
95160641Syongari#define CSR_WRITE_4(_sc, reg, val)	\
96160641Syongari	bus_write_4((_sc)->sc_res[0], (reg), (val))
97160641Syongari#define CSR_WRITE_2(_sc, reg, val)	\
98160641Syongari	bus_write_2((_sc)->sc_res[0], (reg), (val))
99160641Syongari#define CSR_WRITE_1(_sc, reg, val)	\
100160641Syongari	bus_write_1((_sc)->sc_res[0], (reg), (val))
101160641Syongari
102160641Syongari#define CSR_READ_4(_sc, reg)		\
103160641Syongari	bus_read_4((_sc)->sc_res[0], (reg))
104160641Syongari#define CSR_READ_2(_sc, reg)		\
105160641Syongari	bus_read_2((_sc)->sc_res[0], (reg))
106160641Syongari#define CSR_READ_1(_sc, reg)		\
107160641Syongari	bus_read_1((_sc)->sc_res[0], (reg))
108160641Syongari
109160641Syongari/*
110160641Syongari * TC9021 buffer fragment descriptor.
111160641Syongari */
112160641Syongaristruct stge_frag {
113160641Syongari	uint64_t	frag_word0;	/* address, length */
114160641Syongari};
115160641Syongari
116160641Syongari#define	FRAG_ADDR(x)	(((uint64_t)(x)) << 0)
117160641Syongari#define	FRAG_ADDR_MASK	FRAG_ADDR(0xfffffffffULL)
118160641Syongari#define	FRAG_LEN(x)	(((uint64_t)(x)) << 48)
119160641Syongari#define	FRAG_LEN_MASK	FRAG_LEN(0xffffULL)
120160641Syongari
121160641Syongari/*
122160641Syongari * TC9021 Transmit Frame Descriptor.  Note the number of fragments
123160641Syongari * here is arbitrary, but we can't have any more than 15.
124160641Syongari */
125160641Syongari#define	STGE_NTXFRAGS	15
126160641Syongaristruct stge_tfd {
127160641Syongari	uint64_t	tfd_next;	/* next TFD in list */
128160641Syongari	uint64_t	tfd_control;	/* control bits */
129160641Syongari					/* the buffer fragments */
130160641Syongari	struct stge_frag tfd_frags[STGE_NTXFRAGS];
131160641Syongari};
132160641Syongari
133160641Syongari#define	TFD_FrameId(x)		((x) << 0)
134160641Syongari#define	TFD_FrameId_MAX		0xffff
135160641Syongari#define	TFD_WordAlign(x)	((x) << 16)
136160641Syongari#define	TFD_WordAlign_dword	0		/* align to dword in TxFIFO */
137160641Syongari#define	TFD_WordAlign_word	2		/* align to word in TxFIFO */
138160641Syongari#define	TFD_WordAlign_disable	1		/* disable alignment */
139160641Syongari#define	TFD_TCPChecksumEnable	(1ULL << 18)
140160641Syongari#define	TFD_UDPChecksumEnable	(1ULL << 19)
141160641Syongari#define	TFD_IPChecksumEnable	(1ULL << 20)
142160641Syongari#define	TFD_FcsAppendDisable	(1ULL << 21)
143160641Syongari#define	TFD_TxIndicate		(1ULL << 22)
144160641Syongari#define	TFD_TxDMAIndicate	(1ULL << 23)
145160641Syongari#define	TFD_FragCount(x)	((x) << 24)
146160641Syongari#define	TFD_VLANTagInsert	(1ULL << 28)
147160641Syongari#define	TFD_TFDDone		(1ULL << 31)
148160641Syongari#define	TFD_VID(x)		(((uint64_t)(x)) << 32)
149160641Syongari#define	TFD_CFI			(1ULL << 44)
150160641Syongari#define	TFD_UserPriority(x)	(((uint64_t)(x)) << 45)
151160641Syongari
152160641Syongari/*
153160641Syongari * TC9021 Receive Frame Descriptor.  Each RFD has a single fragment
154160641Syongari * in it, and the chip tells us the beginning and end of the frame.
155160641Syongari */
156160641Syongaristruct stge_rfd {
157160641Syongari	uint64_t	rfd_next;	/* next RFD in list */
158160641Syongari	uint64_t	rfd_status;	/* status bits */
159160641Syongari	struct stge_frag rfd_frag;	/* the buffer */
160160641Syongari};
161160641Syongari
162160641Syongari/* Low word of rfd_status */
163160641Syongari#define RFD_RxStatus(x)		((x) & 0xffffffff)
164160641Syongari#define	RFD_RxDMAFrameLen(x)	((x) & 0xffff)
165160641Syongari#define	RFD_RxFIFOOverrun	0x00010000
166160641Syongari#define	RFD_RxRuntFrame		0x00020000
167160641Syongari#define	RFD_RxAlignmentError	0x00040000
168160641Syongari#define	RFD_RxFCSError		0x00080000
169160641Syongari#define	RFD_RxOversizedFrame	0x00100000
170160641Syongari#define	RFD_RxLengthError	0x00200000
171160641Syongari#define	RFD_VLANDetected	0x00400000
172160641Syongari#define	RFD_TCPDetected		0x00800000
173160641Syongari#define	RFD_TCPError		0x01000000
174160641Syongari#define	RFD_UDPDetected		0x02000000
175160641Syongari#define	RFD_UDPError		0x04000000
176160641Syongari#define	RFD_IPDetected		0x08000000
177160641Syongari#define	RFD_IPError		0x10000000
178160641Syongari#define	RFD_FrameStart		0x20000000
179160641Syongari#define	RFD_FrameEnd		0x40000000
180160641Syongari#define	RFD_RFDDone		0x80000000
181160641Syongari/* High word of rfd_status */
182160641Syongari#define	RFD_TCI(x)		((((uint64_t)(x)) >> 32) & 0xffff)
183160641Syongari
184160641Syongari/*
185160641Syongari * EEPROM offsets.
186160641Syongari */
187160641Syongari#define	STGE_EEPROM_ConfigParam		0x00
188160641Syongari#define	STGE_EEPROM_AsicCtrl		0x01
189160641Syongari#define	STGE_EEPROM_SubSystemVendorId	0x02
190160641Syongari#define	STGE_EEPROM_SubSystemId		0x03
191160641Syongari#define	STGE_EEPROM_LEDMode		0x06
192160641Syongari#define	STGE_EEPROM_StationAddress0	0x10
193160641Syongari#define	STGE_EEPROM_StationAddress1	0x11
194160641Syongari#define	STGE_EEPROM_StationAddress2	0x12
195160641Syongari
196160641Syongari/*
197160641Syongari * The TC9021 register space.
198160641Syongari */
199160641Syongari
200160641Syongari#define	STGE_DMACtrl			0x00
201160641Syongari#define	DMAC_RxDMAComplete		(1U << 3)
202160641Syongari#define	DMAC_RxDMAPollNow		(1U << 4)
203160641Syongari#define	DMAC_TxDMAComplete		(1U << 11)
204160641Syongari#define	DMAC_TxDMAPollNow		(1U << 12)
205160641Syongari#define	DMAC_TxDMAInProg		(1U << 15)
206160641Syongari#define	DMAC_RxEarlyDisable		(1U << 16)
207160641Syongari#define	DMAC_MWIDisable			(1U << 18)
208160641Syongari#define	DMAC_TxWriteBackDisable		(1U << 19)
209160641Syongari#define	DMAC_TxBurstLimit(x)		((x) << 20)
210160641Syongari#define	DMAC_TargetAbort		(1U << 30)
211160641Syongari#define	DMAC_MasterAbort		(1U << 31)
212160641Syongari
213160641Syongari#define	STGE_RxDMAStatus		0x08
214160641Syongari
215160641Syongari#define	STGE_TFDListPtrLo		0x10
216160641Syongari
217160641Syongari#define	STGE_TFDListPtrHi		0x14
218160641Syongari
219160641Syongari#define	STGE_TxDMABurstThresh		0x18	/* 8-bit */
220160641Syongari
221160641Syongari#define	STGE_TxDMAUrgentThresh		0x19	/* 8-bit */
222160641Syongari
223160641Syongari#define	STGE_TxDMAPollPeriod		0x1a	/* 8-bit, 320ns increments */
224160641Syongari
225160641Syongari#define	STGE_RFDListPtrLo		0x1c
226160641Syongari
227160641Syongari#define	STGE_RFDListPtrHi		0x20
228160641Syongari
229160641Syongari#define	STGE_RxDMABurstThresh		0x24	/* 8-bit */
230160641Syongari
231160641Syongari#define	STGE_RxDMAUrgentThresh		0x25	/* 8-bit */
232160641Syongari
233160641Syongari#define	STGE_RxDMAPollPeriod		0x26	/* 8-bit, 320ns increments */
234160641Syongari
235160641Syongari#define	STGE_RxDMAIntCtrl		0x28
236160641Syongari#define	RDIC_RxFrameCount(x)		((x) & 0xff)
237160641Syongari#define	RDIC_PriorityThresh(x)		((x) << 10)
238160641Syongari#define	RDIC_RxDMAWaitTime(x)		((x) << 16)
239160641Syongari/*
240160641Syongari * Number of receive frames transferred via DMA before a Rx interrupt is issued.
241160641Syongari */
242160641Syongari#define	STGE_RXINT_NFRAME_DEFAULT	8
243160641Syongari#define	STGE_RXINT_NFRAME_MIN		1
244160641Syongari#define	STGE_RXINT_NFRAME_MAX		255
245160641Syongari/*
246160641Syongari * Maximum amount of time (in 64ns increments) to wait before issuing a Rx
247160641Syongari * interrupt if number of frames recevied is less than STGE_RXINT_NFRAME
248160641Syongari * (STGE_RXINT_NFRAME_MIN <= STGE_RXINT_NFRAME <= STGE_RXINT_NFRAME_MAX)
249160641Syongari */
250160641Syongari#define	STGE_RXINT_DMAWAIT_DEFAULT	30	/* 30us */
251160641Syongari#define	STGE_RXINT_DMAWAIT_MIN		0
252160641Syongari#define	STGE_RXINT_DMAWAIT_MAX		4194
253160641Syongari#define	STGE_RXINT_USECS2TICK(x)	(((x) * 1000)/64)
254160641Syongari
255160641Syongari#define	STGE_DebugCtrl			0x2c	/* 16-bit */
256160641Syongari#define	DC_GPIO0Ctrl			(1U << 0)
257160641Syongari#define	DC_GPIO1Ctrl			(1U << 1)
258160641Syongari#define	DC_GPIO0			(1U << 2)
259160641Syongari#define	DC_GPIO1			(1U << 3)
260160641Syongari
261160641Syongari#define	STGE_AsicCtrl			0x30
262160641Syongari#define	AC_ExpRomDisable		(1U << 0)
263160641Syongari#define	AC_ExpRomSize			(1U << 1)
264160641Syongari#define	AC_PhySpeed10			(1U << 4)
265160641Syongari#define	AC_PhySpeed100			(1U << 5)
266160641Syongari#define	AC_PhySpeed1000			(1U << 6)
267160641Syongari#define	AC_PhyMedia			(1U << 7)
268160641Syongari#define	AC_ForcedConfig(x)		((x) << 8)
269160641Syongari#define	AC_ForcedConfig_MASK		AC_ForcedConfig(7)
270160641Syongari#define	AC_D3ResetDisable		(1U << 11)
271160641Syongari#define	AC_SpeedupMode			(1U << 13)
272160641Syongari#define	AC_LEDMode			(1U << 14)
273160641Syongari#define	AC_RstOutPolarity		(1U << 15)
274160641Syongari#define	AC_GlobalReset			(1U << 16)
275160641Syongari#define	AC_RxReset			(1U << 17)
276160641Syongari#define	AC_TxReset			(1U << 18)
277160641Syongari#define	AC_DMA				(1U << 19)
278160641Syongari#define	AC_FIFO				(1U << 20)
279160641Syongari#define	AC_Network			(1U << 21)
280160641Syongari#define	AC_Host				(1U << 22)
281160641Syongari#define	AC_AutoInit			(1U << 23)
282160641Syongari#define	AC_RstOut			(1U << 24)
283160641Syongari#define	AC_InterruptRequest		(1U << 25)
284160641Syongari#define	AC_ResetBusy			(1U << 26)
285160641Syongari#define	AC_LEDSpeed			(1U << 27)
286160641Syongari#define	AC_LEDModeBit1			(1U << 29)
287160641Syongari
288160641Syongari#define	STGE_FIFOCtrl			0x38	/* 16-bit */
289160641Syongari#define	FC_RAMTestMode			(1U << 0)
290160641Syongari#define	FC_Transmitting			(1U << 14)
291160641Syongari#define	FC_Receiving			(1U << 15)
292160641Syongari
293160641Syongari#define	STGE_RxEarlyThresh		0x3a	/* 16-bit */
294160641Syongari
295160641Syongari#define	STGE_FlowOffThresh		0x3c	/* 16-bit */
296160641Syongari
297160641Syongari#define	STGE_FlowOnTresh		0x3e	/* 16-bit */
298160641Syongari
299160641Syongari#define	STGE_TxStartThresh		0x44	/* 16-bit */
300160641Syongari
301160641Syongari#define	STGE_EepromData			0x48	/* 16-bit */
302160641Syongari
303160641Syongari#define	STGE_EepromCtrl			0x4a	/* 16-bit */
304160641Syongari#define	EC_EepromAddress(x)		((x) & 0xff)
305160641Syongari#define	EC_EepromOpcode(x)		((x) << 8)
306160641Syongari#define	EC_OP_WE			0
307160641Syongari#define	EC_OP_WR			1
308160641Syongari#define	EC_OP_RR			2
309160641Syongari#define	EC_OP_ER			3
310160641Syongari#define	EC_EepromBusy			(1U << 15)
311160641Syongari
312160641Syongari#define	STGE_ExpRomAddr			0x4c
313160641Syongari
314160641Syongari#define	STGE_ExpRomData			0x50	/* 8-bit */
315160641Syongari
316160641Syongari#define	STGE_WakeEvent			0x51	/* 8-bit */
317160641Syongari
318160641Syongari#define	STGE_Countdown			0x54
319160641Syongari#define	CD_Count(x)			((x) & 0xffff)
320160641Syongari#define	CD_CountdownSpeed		(1U << 24)
321160641Syongari#define	CD_CountdownMode		(1U << 25)
322160641Syongari#define	CD_CountdownIntEnabled		(1U << 26)
323160641Syongari
324160641Syongari#define	STGE_IntStatusAck		0x5a	/* 16-bit */
325160641Syongari
326160641Syongari#define	STGE_IntEnable			0x5c	/* 16-bit */
327160641Syongari
328160641Syongari#define	STGE_IntStatus			0x5e	/* 16-bit */
329160641Syongari
330160641Syongari#define	IS_InterruptStatus		(1U << 0)
331160641Syongari#define	IS_HostError			(1U << 1)
332160641Syongari#define	IS_TxComplete			(1U << 2)
333160641Syongari#define	IS_MACControlFrame		(1U << 3)
334160641Syongari#define	IS_RxComplete			(1U << 4)
335160641Syongari#define	IS_RxEarly			(1U << 5)
336160641Syongari#define	IS_InRequested			(1U << 6)
337160641Syongari#define	IS_UpdateStats			(1U << 7)
338160641Syongari#define	IS_LinkEvent			(1U << 8)
339160641Syongari#define	IS_TxDMAComplete		(1U << 9)
340160641Syongari#define	IS_RxDMAComplete		(1U << 10)
341160641Syongari#define	IS_RFDListEnd			(1U << 11)
342160641Syongari#define	IS_RxDMAPriority		(1U << 12)
343160641Syongari
344160641Syongari#define	STGE_TxStatus			0x60
345160641Syongari#define	TS_TxError			(1U << 0)
346160641Syongari#define	TS_LateCollision		(1U << 2)
347160641Syongari#define	TS_MaxCollisions		(1U << 3)
348160641Syongari#define	TS_TxUnderrun			(1U << 4)
349160641Syongari#define	TS_TxIndicateReqd		(1U << 6)
350160641Syongari#define	TS_TxComplete			(1U << 7)
351160641Syongari#define	TS_TxFrameId_get(x)		((x) >> 16)
352160641Syongari
353160641Syongari#define	STGE_MACCtrl			0x6c
354160641Syongari#define	MC_IFSSelect(x)			((x) & 3)
355160641Syongari#define	MC_IFS96bit			0
356160641Syongari#define	MC_IFS1024bit			1
357160641Syongari#define	MC_IFS1792bit			2
358160641Syongari#define	MC_IFS4352bit			3
359160641Syongari
360160641Syongari#define	MC_DuplexSelect			(1U << 5)
361160641Syongari#define	MC_RcvLargeFrames		(1U << 6)
362160641Syongari#define	MC_TxFlowControlEnable		(1U << 7)
363160641Syongari#define	MC_RxFlowControlEnable		(1U << 8)
364160641Syongari#define	MC_RcvFCS			(1U << 9)
365160641Syongari#define	MC_FIFOLoopback			(1U << 10)
366160641Syongari#define	MC_MACLoopback			(1U << 11)
367160641Syongari#define	MC_AutoVLANtagging		(1U << 12)
368160641Syongari#define	MC_AutoVLANuntagging		(1U << 13)
369160641Syongari#define	MC_CollisionDetect		(1U << 16)
370160641Syongari#define	MC_CarrierSense			(1U << 17)
371160641Syongari#define	MC_StatisticsEnable		(1U << 21)
372160641Syongari#define	MC_StatisticsDisable		(1U << 22)
373160641Syongari#define	MC_StatisticsEnabled		(1U << 23)
374160641Syongari#define	MC_TxEnable			(1U << 24)
375160641Syongari#define	MC_TxDisable			(1U << 25)
376160641Syongari#define	MC_TxEnabled			(1U << 26)
377160641Syongari#define	MC_RxEnable			(1U << 27)
378160641Syongari#define	MC_RxDisable			(1U << 28)
379160641Syongari#define	MC_RxEnabled			(1U << 29)
380160641Syongari#define	MC_Paused			(1U << 30)
381160641Syongari#define	MC_MASK				0x7fe33fa3
382160641Syongari
383160641Syongari#define	STGE_VLANTag			0x70
384160641Syongari
385160641Syongari#define STGE_PhySet			0x75	/* 8-bit */
386160641Syongari#define	PS_MemLenb9b			(1U << 0)
387160641Syongari#define	PS_MemLen			(1U << 1)
388160641Syongari#define	PS_NonCompdet			(1U << 2)
389160641Syongari
390160641Syongari#define	STGE_PhyCtrl			0x76	/* 8-bit */
391160641Syongari#define	PC_MgmtClk			(1U << 0)
392160641Syongari#define	PC_MgmtData			(1U << 1)
393160641Syongari#define	PC_MgmtDir			(1U << 2)	/* MAC->PHY */
394160641Syongari#define	PC_PhyDuplexPolarity		(1U << 3)
395160641Syongari#define	PC_PhyDuplexStatus		(1U << 4)
396160641Syongari#define	PC_PhyLnkPolarity		(1U << 5)
397160641Syongari#define	PC_LinkSpeed(x)			(((x) >> 6) & 3)
398160641Syongari#define	PC_LinkSpeed_Down		0
399160641Syongari#define	PC_LinkSpeed_10			1
400160641Syongari#define	PC_LinkSpeed_100		2
401160641Syongari#define	PC_LinkSpeed_1000		3
402160641Syongari
403160641Syongari#define	STGE_StationAddress0		0x78	/* 16-bit */
404160641Syongari
405160641Syongari#define	STGE_StationAddress1		0x7a	/* 16-bit */
406160641Syongari
407160641Syongari#define	STGE_StationAddress2		0x7c	/* 16-bit */
408160641Syongari
409160641Syongari#define	STGE_VLANHashTable		0x7e	/* 16-bit */
410160641Syongari
411160641Syongari#define	STGE_VLANId			0x80
412160641Syongari
413160641Syongari#define	STGE_MaxFrameSize		0x86
414160641Syongari
415160641Syongari#define	STGE_ReceiveMode		0x88	/* 16-bit */
416160641Syongari#define	RM_ReceiveUnicast		(1U << 0)
417160641Syongari#define	RM_ReceiveMulticast		(1U << 1)
418160641Syongari#define	RM_ReceiveBroadcast		(1U << 2)
419160641Syongari#define	RM_ReceiveAllFrames		(1U << 3)
420160641Syongari#define	RM_ReceiveMulticastHash		(1U << 4)
421160641Syongari#define	RM_ReceiveIPMulticast		(1U << 5)
422160641Syongari#define	RM_ReceiveVLANMatch		(1U << 8)
423160641Syongari#define	RM_ReceiveVLANHash		(1U << 9)
424160641Syongari
425160641Syongari#define	STGE_HashTable0			0x8c
426160641Syongari
427160641Syongari#define	STGE_HashTable1			0x90
428160641Syongari
429160641Syongari#define	STGE_RMONStatisticsMask		0x98	/* set to disable */
430160641Syongari
431160641Syongari#define	STGE_StatisticsMask		0x9c	/* set to disable */
432160641Syongari
433160641Syongari#define	STGE_RxJumboFrames		0xbc	/* 16-bit */
434160641Syongari
435160641Syongari#define	STGE_TCPCheckSumErrors		0xc0	/* 16-bit */
436160641Syongari
437160641Syongari#define	STGE_IPCheckSumErrors		0xc2	/* 16-bit */
438160641Syongari
439160641Syongari#define	STGE_UDPCheckSumErrors		0xc4	/* 16-bit */
440160641Syongari
441160641Syongari#define	STGE_TxJumboFrames		0xf4	/* 16-bit */
442160641Syongari
443160641Syongari/*
444160641Syongari * TC9021 statistics.  Available memory and I/O mapped.
445160641Syongari */
446160641Syongari
447160641Syongari#define	STGE_OctetRcvOk			0xa8
448160641Syongari
449160641Syongari#define	STGE_McstOctetRcvdOk		0xac
450160641Syongari
451160641Syongari#define	STGE_BcstOctetRcvdOk		0xb0
452160641Syongari
453160641Syongari#define	STGE_FramesRcvdOk		0xb4
454160641Syongari
455160641Syongari#define	STGE_McstFramesRcvdOk		0xb8
456160641Syongari
457160641Syongari#define	STGE_BcstFramesRcvdOk		0xbe	/* 16-bit */
458160641Syongari
459160641Syongari#define	STGE_MacControlFramesRcvd	0xc6	/* 16-bit */
460160641Syongari
461160641Syongari#define	STGE_FrameTooLongErrors		0xc8	/* 16-bit */
462160641Syongari
463160641Syongari#define	STGE_InRangeLengthErrors	0xca	/* 16-bit */
464160641Syongari
465160641Syongari#define	STGE_FramesCheckSeqErrors	0xcc	/* 16-bit */
466160641Syongari
467160641Syongari#define	STGE_FramesLostRxErrors		0xce	/* 16-bit */
468160641Syongari
469160641Syongari#define	STGE_OctetXmtdOk		0xd0
470160641Syongari
471160641Syongari#define	STGE_McstOctetXmtdOk		0xd4
472160641Syongari
473160641Syongari#define	STGE_BcstOctetXmtdOk		0xd8
474160641Syongari
475160641Syongari#define	STGE_FramesXmtdOk		0xdc
476160641Syongari
477160641Syongari#define	STGE_McstFramesXmtdOk		0xe0
478160641Syongari
479160641Syongari#define	STGE_FramesWDeferredXmt		0xe4
480160641Syongari
481160641Syongari#define	STGE_LateCollisions		0xe8
482160641Syongari
483160641Syongari#define	STGE_MultiColFrames		0xec
484160641Syongari
485160641Syongari#define	STGE_SingleColFrames		0xf0
486160641Syongari
487160641Syongari#define	STGE_BcstFramesXmtdOk		0xf6	/* 16-bit */
488160641Syongari
489160641Syongari#define	STGE_CarrierSenseErrors		0xf8	/* 16-bit */
490160641Syongari
491160641Syongari#define	STGE_MacControlFramesXmtd	0xfa	/* 16-bit */
492160641Syongari
493160641Syongari#define	STGE_FramesAbortXSColls		0xfc	/* 16-bit */
494160641Syongari
495160641Syongari#define	STGE_FramesWEXDeferal		0xfe	/* 16-bit */
496160641Syongari
497160641Syongari/*
498160641Syongari * RMON-compatible statistics.  Only accessible if memory-mapped.
499160641Syongari */
500160641Syongari
501160641Syongari#define	STGE_EtherStatsCollisions			0x100
502160641Syongari
503160641Syongari#define	STGE_EtherStatsOctetsTransmit			0x104
504160641Syongari
505160641Syongari#define	STGE_EtherStatsPktsTransmit			0x108
506160641Syongari
507160641Syongari#define	STGE_EtherStatsPkts64OctetsTransmit		0x10c
508160641Syongari
509160641Syongari#define	STGE_EtherStatsPkts64to127OctetsTransmit	0x110
510160641Syongari
511160641Syongari#define	STGE_EtherStatsPkts128to255OctetsTransmit	0x114
512160641Syongari
513160641Syongari#define	STGE_EtherStatsPkts256to511OctetsTransmit	0x118
514160641Syongari
515160641Syongari#define	STGE_EtherStatsPkts512to1023OctetsTransmit	0x11c
516160641Syongari
517160641Syongari#define	STGE_EtherStatsPkts1024to1518OctetsTransmit	0x120
518160641Syongari
519160641Syongari#define	STGE_EtherStatsCRCAlignErrors			0x124
520160641Syongari
521160641Syongari#define	STGE_EtherStatsUndersizePkts			0x128
522160641Syongari
523160641Syongari#define	STGE_EtherStatsFragments			0x12c
524160641Syongari
525160641Syongari#define	STGE_EtherStatsJabbers				0x130
526160641Syongari
527160641Syongari#define	STGE_EtherStatsOctets				0x134
528160641Syongari
529160641Syongari#define	STGE_EtherStatsPkts				0x138
530160641Syongari
531160641Syongari#define	STGE_EtherStatsPkts64Octets			0x13c
532160641Syongari
533160641Syongari#define	STGE_EtherStatsPkts65to127Octets		0x140
534160641Syongari
535160641Syongari#define	STGE_EtherStatsPkts128to255Octets		0x144
536160641Syongari
537160641Syongari#define	STGE_EtherStatsPkts256to511Octets		0x148
538160641Syongari
539160641Syongari#define	STGE_EtherStatsPkts512to1023Octets		0x14c
540160641Syongari
541160641Syongari#define	STGE_EtherStatsPkts1024to1518Octets		0x150
542160641Syongari
543160641Syongari/*
544160641Syongari * Transmit descriptor list size.
545160641Syongari */
546160641Syongari#define	STGE_TX_RING_CNT	256
547160641Syongari#define	STGE_TX_LOWAT		(STGE_TX_RING_CNT/32)
548160641Syongari#define	STGE_TX_HIWAT		(STGE_TX_RING_CNT - STGE_TX_LOWAT)
549160641Syongari
550160641Syongari/*
551160641Syongari * Receive descriptor list size.
552160641Syongari */
553160641Syongari#define	STGE_RX_RING_CNT	256
554160641Syongari
555160641Syongari#define	STGE_MAXTXSEGS		STGE_NTXFRAGS
556160641Syongari
557160641Syongari#define STGE_JUMBO_FRAMELEN	9022
558160641Syongari#define STGE_JUMBO_MTU	\
559160641Syongari	(STGE_JUMBO_FRAMELEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
560160641Syongari
561160641Syongaristruct stge_txdesc {
562160641Syongari	struct mbuf *tx_m;		/* head of our mbuf chain */
563160641Syongari	bus_dmamap_t tx_dmamap;		/* our DMA map */
564160641Syongari	STAILQ_ENTRY(stge_txdesc) tx_q;
565160641Syongari};
566160641Syongari
567160641SyongariSTAILQ_HEAD(stge_txdq, stge_txdesc);
568160641Syongari
569160641Syongaristruct stge_rxdesc {
570160641Syongari	struct mbuf *rx_m;
571160641Syongari	bus_dmamap_t rx_dmamap;
572160641Syongari};
573160641Syongari
574160641Syongari#define	STGE_ADDR_LO(x)		((u_int64_t) (x) & 0xffffffff)
575160641Syongari#define	STGE_ADDR_HI(x)		((u_int64_t) (x) >> 32)
576160641Syongari
577160641Syongari#define	STGE_RING_ALIGN		8
578160641Syongari
579160641Syongaristruct stge_chain_data{
580160641Syongari	bus_dma_tag_t		stge_parent_tag;
581160641Syongari	bus_dma_tag_t		stge_tx_tag;
582160641Syongari	struct stge_txdesc	stge_txdesc[STGE_TX_RING_CNT];
583160641Syongari	struct stge_txdq	stge_txfreeq;
584160641Syongari	struct stge_txdq	stge_txbusyq;
585160641Syongari	bus_dma_tag_t		stge_rx_tag;
586160641Syongari	struct stge_rxdesc	stge_rxdesc[STGE_RX_RING_CNT];
587160641Syongari	bus_dma_tag_t		stge_tx_ring_tag;
588160641Syongari	bus_dmamap_t		stge_tx_ring_map;
589160641Syongari	bus_dma_tag_t		stge_rx_ring_tag;
590160641Syongari	bus_dmamap_t		stge_rx_ring_map;
591160641Syongari	bus_dmamap_t		stge_rx_sparemap;
592160641Syongari
593160641Syongari	int			stge_tx_prod;
594160641Syongari	int			stge_tx_cons;
595160641Syongari	int			stge_tx_cnt;
596160641Syongari	int			stge_rx_cons;
597160641Syongari#ifdef DEVICE_POLLING
598160641Syongari	int			stge_rxcycles;
599160641Syongari#endif
600160641Syongari	int			stge_rxlen;
601160641Syongari	struct mbuf		*stge_rxhead;
602160641Syongari	struct mbuf		*stge_rxtail;
603160641Syongari};
604160641Syongari
605160641Syongaristruct stge_ring_data {
606160641Syongari	struct stge_tfd		*stge_tx_ring;
607160641Syongari	bus_addr_t		stge_tx_ring_paddr;
608160641Syongari	struct stge_rfd		*stge_rx_ring;
609160641Syongari	bus_addr_t		stge_rx_ring_paddr;
610160641Syongari};
611160641Syongari
612160641Syongari#define STGE_TX_RING_ADDR(sc, i)	\
613160641Syongari    ((sc)->sc_rdata.stge_tx_ring_paddr + sizeof(struct stge_tfd) * (i))
614160641Syongari#define STGE_RX_RING_ADDR(sc, i)	\
615160641Syongari    ((sc)->sc_rdata.stge_rx_ring_paddr + sizeof(struct stge_rfd) * (i))
616160641Syongari
617160641Syongari#define STGE_TX_RING_SZ		\
618160641Syongari    (sizeof(struct stge_tfd) * STGE_TX_RING_CNT)
619160641Syongari#define STGE_RX_RING_SZ		\
620160641Syongari    (sizeof(struct stge_rfd) * STGE_RX_RING_CNT)
621160641Syongari
622160641Syongari/*
623160641Syongari * Software state per device.
624160641Syongari */
625160641Syongaristruct stge_softc {
626160641Syongari	struct ifnet 		*sc_ifp;	/* interface info */
627160641Syongari	device_t		sc_dev;
628160641Syongari	device_t		sc_miibus;
629160641Syongari	struct resource		*sc_res[2];
630160641Syongari	struct resource_spec	*sc_spec;
631160641Syongari	void			*sc_ih;		/* interrupt cookie */
632160641Syongari	int			sc_rev;		/* silicon revision */
633160641Syongari
634160641Syongari	struct callout		sc_tick_ch;	/* tick callout */
635160641Syongari
636160641Syongari	struct stge_chain_data	sc_cdata;
637160641Syongari	struct stge_ring_data	sc_rdata;
638160641Syongari	int			sc_if_flags;
639160641Syongari	int			sc_if_framesize;
640160641Syongari	int			sc_txthresh;	/* Tx threshold */
641160641Syongari	uint32_t		sc_usefiber:1;	/* if we're fiber */
642160641Syongari	uint32_t		sc_stge1023:1;	/* are we a 1023 */
643160641Syongari	uint32_t		sc_DMACtrl;	/* prototype DMACtrl reg. */
644160641Syongari	uint32_t		sc_MACCtrl;	/* prototype MacCtrl reg. */
645160641Syongari	uint16_t		sc_IntEnable;	/* prototype IntEnable reg. */
646160641Syongari	uint16_t		sc_led;		/* LED conf. from EEPROM */
647160641Syongari	uint8_t			sc_PhyCtrl;	/* prototype PhyCtrl reg. */
648160641Syongari	int			sc_suspended;
649160641Syongari	int			sc_detach;
650160641Syongari
651160641Syongari	int			sc_rxint_nframe;
652160641Syongari	int			sc_rxint_dmawait;
653160641Syongari	int			sc_nerr;
654169157Syongari	int			sc_watchdog_timer;
655169158Syongari	int			sc_link;
656160641Syongari
657160641Syongari	struct task		sc_link_task;
658160641Syongari	struct mtx		sc_mii_mtx;	/* MII mutex */
659160641Syongari	struct mtx		sc_mtx;
660160641Syongari};
661160641Syongari
662160641Syongari#define STGE_LOCK(_sc)		mtx_lock(&(_sc)->sc_mtx)
663160641Syongari#define STGE_UNLOCK(_sc)	mtx_unlock(&(_sc)->sc_mtx)
664160641Syongari#define STGE_LOCK_ASSERT(_sc)	mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
665160641Syongari#define STGE_MII_LOCK(_sc)	mtx_lock(&(_sc)->sc_mii_mtx)
666160641Syongari#define STGE_MII_UNLOCK(_sc)	mtx_unlock(&(_sc)->sc_mii_mtx)
667160641Syongari
668160641Syongari#define	STGE_MAXERR	5
669160641Syongari
670160641Syongari#define	STGE_RXCHAIN_RESET(_sc)						\
671160641Syongarido {									\
672160641Syongari	(_sc)->sc_cdata.stge_rxhead = NULL;				\
673160641Syongari	(_sc)->sc_cdata.stge_rxtail = NULL;				\
674160641Syongari	(_sc)->sc_cdata.stge_rxlen = 0;					\
675160641Syongari} while (/*CONSTCOND*/0)
676160641Syongari
677160641Syongari#define STGE_TIMEOUT 1000
678160641Syongari
679160641Syongaristruct stge_mii_frame {
680160641Syongari	uint8_t	mii_stdelim;
681160641Syongari	uint8_t	mii_opcode;
682160641Syongari	uint8_t	mii_phyaddr;
683160641Syongari	uint8_t	mii_regaddr;
684160641Syongari	uint8_t	mii_turnaround;
685160641Syongari	uint16_t mii_data;
686160641Syongari};
687160641Syongari
688160641Syongari/*
689160641Syongari * MII constants
690160641Syongari */
691160641Syongari#define STGE_MII_STARTDELIM	0x01
692160641Syongari#define STGE_MII_READOP		0x02
693160641Syongari#define STGE_MII_WRITEOP	0x01
694160641Syongari#define STGE_MII_TURNAROUND	0x02
695160641Syongari
696160641Syongari#define	STGE_RESET_NONE	0x00
697160641Syongari#define	STGE_RESET_TX	0x01
698160641Syongari#define	STGE_RESET_RX	0x02
699160641Syongari#define	STGE_RESET_FULL	0x04
700