]> CyberLeo.Net >> Repos - FreeBSD/stable/8.git/blob - sys/dev/stge/if_stgereg.h
MFC r362623:
[FreeBSD/stable/8.git] / sys / dev / stge / if_stgereg.h
1 /*      $NetBSD: if_stgereg.h,v 1.3 2003/02/10 21:10:07 christos Exp $  */
2
3 /*-
4  * Copyright (c) 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *      This product includes software developed by the NetBSD
21  *      Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38
39 /* $FreeBSD$ */
40
41 /*
42  * Sundance Technology PCI vendor ID
43  */
44 #define VENDOR_SUNDANCETI       0x13f0
45
46 /*
47  * Tamarack Microelectronics PCI vendor ID
48  */
49 #define VENDOR_TAMARACK         0x143d
50
51 /*
52  * D-Link Systems PCI vendor ID
53  */
54 #define VENDOR_DLINK            0x1186
55
56 /*
57  * Antares Microsystems PCI vendor ID
58  */
59 #define VENDOR_ANTARES          0x1754
60
61 /*
62  * Sundance Technology device ID
63  */
64 #define DEVICEID_SUNDANCETI_ST1023      0x1023
65 #define DEVICEID_SUNDANCETI_ST2021      0x2021
66 #define DEVICEID_TAMARACK_TC9021        0x1021
67 #define DEVICEID_TAMARACK_TC9021_ALT    0x9021
68
69 /*
70  * D-Link Systems device ID
71  */
72 #define DEVICEID_DLINK_DL4000           0x4000
73
74 /*
75  * Antares Microsystems device ID
76  */
77 #define DEVICEID_ANTARES_TC9021         0x1021
78
79 /*
80  * Register description for the Sundance Tech. TC9021 10/100/1000
81  * Ethernet controller.
82  *
83  * Note that while DMA addresses are all in 64-bit fields, only
84  * the lower 40 bits of a DMA address are valid.
85  */
86 #if (BUS_SPACE_MAXADDR < 0xFFFFFFFFFF)
87 #define STGE_DMA_MAXADDR        BUS_SPACE_MAXADDR
88 #else
89 #define STGE_DMA_MAXADDR        0xFFFFFFFFFF
90 #endif
91
92 /*
93  * Register access macros
94  */
95 #define CSR_WRITE_4(_sc, reg, val)      \
96         bus_write_4((_sc)->sc_res[0], (reg), (val))
97 #define CSR_WRITE_2(_sc, reg, val)      \
98         bus_write_2((_sc)->sc_res[0], (reg), (val))
99 #define CSR_WRITE_1(_sc, reg, val)      \
100         bus_write_1((_sc)->sc_res[0], (reg), (val))
101
102 #define CSR_READ_4(_sc, reg)            \
103         bus_read_4((_sc)->sc_res[0], (reg))
104 #define CSR_READ_2(_sc, reg)            \
105         bus_read_2((_sc)->sc_res[0], (reg))
106 #define CSR_READ_1(_sc, reg)            \
107         bus_read_1((_sc)->sc_res[0], (reg))
108
109 #define CSR_BARRIER(_sc, reg, length, flags)                            \
110         bus_barrier((_sc)->sc_res[0], reg, length, flags)
111
112 /*
113  * TC9021 buffer fragment descriptor.
114  */
115 struct stge_frag {
116         uint64_t        frag_word0;     /* address, length */
117 };
118
119 #define FRAG_ADDR(x)    (((uint64_t)(x)) << 0)
120 #define FRAG_ADDR_MASK  FRAG_ADDR(0xfffffffffULL)
121 #define FRAG_LEN(x)     (((uint64_t)(x)) << 48)
122 #define FRAG_LEN_MASK   FRAG_LEN(0xffffULL)
123
124 /*
125  * TC9021 Transmit Frame Descriptor.  Note the number of fragments
126  * here is arbitrary, but we can't have any more than 15.
127  */
128 #define STGE_NTXFRAGS   15
129 struct stge_tfd {
130         uint64_t        tfd_next;       /* next TFD in list */
131         uint64_t        tfd_control;    /* control bits */
132                                         /* the buffer fragments */
133         struct stge_frag tfd_frags[STGE_NTXFRAGS];
134 };
135
136 #define TFD_FrameId(x)          ((x) << 0)
137 #define TFD_FrameId_MAX         0xffff
138 #define TFD_WordAlign(x)        ((x) << 16)
139 #define TFD_WordAlign_dword     0               /* align to dword in TxFIFO */
140 #define TFD_WordAlign_word      2               /* align to word in TxFIFO */
141 #define TFD_WordAlign_disable   1               /* disable alignment */
142 #define TFD_TCPChecksumEnable   (1ULL << 18)
143 #define TFD_UDPChecksumEnable   (1ULL << 19)
144 #define TFD_IPChecksumEnable    (1ULL << 20)
145 #define TFD_FcsAppendDisable    (1ULL << 21)
146 #define TFD_TxIndicate          (1ULL << 22)
147 #define TFD_TxDMAIndicate       (1ULL << 23)
148 #define TFD_FragCount(x)        ((x) << 24)
149 #define TFD_VLANTagInsert       (1ULL << 28)
150 #define TFD_TFDDone             (1ULL << 31)
151 #define TFD_VID(x)              (((uint64_t)(x)) << 32)
152 #define TFD_CFI                 (1ULL << 44)
153 #define TFD_UserPriority(x)     (((uint64_t)(x)) << 45)
154
155 /*
156  * TC9021 Receive Frame Descriptor.  Each RFD has a single fragment
157  * in it, and the chip tells us the beginning and end of the frame.
158  */
159 struct stge_rfd {
160         uint64_t        rfd_next;       /* next RFD in list */
161         uint64_t        rfd_status;     /* status bits */
162         struct stge_frag rfd_frag;      /* the buffer */
163 };
164
165 /* Low word of rfd_status */
166 #define RFD_RxStatus(x)         ((x) & 0xffffffff)
167 #define RFD_RxDMAFrameLen(x)    ((x) & 0xffff)
168 #define RFD_RxFIFOOverrun       0x00010000
169 #define RFD_RxRuntFrame         0x00020000
170 #define RFD_RxAlignmentError    0x00040000
171 #define RFD_RxFCSError          0x00080000
172 #define RFD_RxOversizedFrame    0x00100000
173 #define RFD_RxLengthError       0x00200000
174 #define RFD_VLANDetected        0x00400000
175 #define RFD_TCPDetected         0x00800000
176 #define RFD_TCPError            0x01000000
177 #define RFD_UDPDetected         0x02000000
178 #define RFD_UDPError            0x04000000
179 #define RFD_IPDetected          0x08000000
180 #define RFD_IPError             0x10000000
181 #define RFD_FrameStart          0x20000000
182 #define RFD_FrameEnd            0x40000000
183 #define RFD_RFDDone             0x80000000
184 /* High word of rfd_status */
185 #define RFD_TCI(x)              ((((uint64_t)(x)) >> 32) & 0xffff)
186
187 /*
188  * EEPROM offsets.
189  */
190 #define STGE_EEPROM_ConfigParam         0x00
191 #define STGE_EEPROM_AsicCtrl            0x01
192 #define STGE_EEPROM_SubSystemVendorId   0x02
193 #define STGE_EEPROM_SubSystemId         0x03
194 #define STGE_EEPROM_LEDMode             0x06
195 #define STGE_EEPROM_StationAddress0     0x10
196 #define STGE_EEPROM_StationAddress1     0x11
197 #define STGE_EEPROM_StationAddress2     0x12
198
199 /*
200  * The TC9021 register space.
201  */
202
203 #define STGE_DMACtrl                    0x00
204 #define DMAC_RxDMAComplete              (1U << 3)
205 #define DMAC_RxDMAPollNow               (1U << 4)
206 #define DMAC_TxDMAComplete              (1U << 11)
207 #define DMAC_TxDMAPollNow               (1U << 12)
208 #define DMAC_TxDMAInProg                (1U << 15)
209 #define DMAC_RxEarlyDisable             (1U << 16)
210 #define DMAC_MWIDisable                 (1U << 18)
211 #define DMAC_TxWriteBackDisable         (1U << 19)
212 #define DMAC_TxBurstLimit(x)            ((x) << 20)
213 #define DMAC_TargetAbort                (1U << 30)
214 #define DMAC_MasterAbort                (1U << 31)
215
216 #define STGE_RxDMAStatus                0x08
217
218 #define STGE_TFDListPtrLo               0x10
219
220 #define STGE_TFDListPtrHi               0x14
221
222 #define STGE_TxDMABurstThresh           0x18    /* 8-bit */
223
224 #define STGE_TxDMAUrgentThresh          0x19    /* 8-bit */
225
226 #define STGE_TxDMAPollPeriod            0x1a    /* 8-bit, 320ns increments */
227
228 #define STGE_RFDListPtrLo               0x1c
229
230 #define STGE_RFDListPtrHi               0x20
231
232 #define STGE_RxDMABurstThresh           0x24    /* 8-bit */
233
234 #define STGE_RxDMAUrgentThresh          0x25    /* 8-bit */
235
236 #define STGE_RxDMAPollPeriod            0x26    /* 8-bit, 320ns increments */
237
238 #define STGE_RxDMAIntCtrl               0x28
239 #define RDIC_RxFrameCount(x)            ((x) & 0xff)
240 #define RDIC_PriorityThresh(x)          ((x) << 10)
241 #define RDIC_RxDMAWaitTime(x)           ((x) << 16)
242 /*
243  * Number of receive frames transferred via DMA before a Rx interrupt is issued.
244  */
245 #define STGE_RXINT_NFRAME_DEFAULT       8
246 #define STGE_RXINT_NFRAME_MIN           1
247 #define STGE_RXINT_NFRAME_MAX           255
248 /*
249  * Maximum amount of time (in 64ns increments) to wait before issuing a Rx
250  * interrupt if number of frames recevied is less than STGE_RXINT_NFRAME
251  * (STGE_RXINT_NFRAME_MIN <= STGE_RXINT_NFRAME <= STGE_RXINT_NFRAME_MAX)
252  */
253 #define STGE_RXINT_DMAWAIT_DEFAULT      30      /* 30us */
254 #define STGE_RXINT_DMAWAIT_MIN          0
255 #define STGE_RXINT_DMAWAIT_MAX          4194
256 #define STGE_RXINT_USECS2TICK(x)        (((x) * 1000)/64)
257
258 #define STGE_DebugCtrl                  0x2c    /* 16-bit */
259 #define DC_GPIO0Ctrl                    (1U << 0)
260 #define DC_GPIO1Ctrl                    (1U << 1)
261 #define DC_GPIO0                        (1U << 2)
262 #define DC_GPIO1                        (1U << 3)
263
264 #define STGE_AsicCtrl                   0x30
265 #define AC_ExpRomDisable                (1U << 0)
266 #define AC_ExpRomSize                   (1U << 1)
267 #define AC_PhySpeed10                   (1U << 4)
268 #define AC_PhySpeed100                  (1U << 5)
269 #define AC_PhySpeed1000                 (1U << 6)
270 #define AC_PhyMedia                     (1U << 7)
271 #define AC_ForcedConfig(x)              ((x) << 8)
272 #define AC_ForcedConfig_MASK            AC_ForcedConfig(7)
273 #define AC_D3ResetDisable               (1U << 11)
274 #define AC_SpeedupMode                  (1U << 13)
275 #define AC_LEDMode                      (1U << 14)
276 #define AC_RstOutPolarity               (1U << 15)
277 #define AC_GlobalReset                  (1U << 16)
278 #define AC_RxReset                      (1U << 17)
279 #define AC_TxReset                      (1U << 18)
280 #define AC_DMA                          (1U << 19)
281 #define AC_FIFO                         (1U << 20)
282 #define AC_Network                      (1U << 21)
283 #define AC_Host                         (1U << 22)
284 #define AC_AutoInit                     (1U << 23)
285 #define AC_RstOut                       (1U << 24)
286 #define AC_InterruptRequest             (1U << 25)
287 #define AC_ResetBusy                    (1U << 26)
288 #define AC_LEDSpeed                     (1U << 27)
289 #define AC_LEDModeBit1                  (1U << 29)
290
291 #define STGE_FIFOCtrl                   0x38    /* 16-bit */
292 #define FC_RAMTestMode                  (1U << 0)
293 #define FC_Transmitting                 (1U << 14)
294 #define FC_Receiving                    (1U << 15)
295
296 #define STGE_RxEarlyThresh              0x3a    /* 16-bit */
297
298 #define STGE_FlowOffThresh              0x3c    /* 16-bit */
299
300 #define STGE_FlowOnTresh                0x3e    /* 16-bit */
301
302 #define STGE_TxStartThresh              0x44    /* 16-bit */
303
304 #define STGE_EepromData                 0x48    /* 16-bit */
305
306 #define STGE_EepromCtrl                 0x4a    /* 16-bit */
307 #define EC_EepromAddress(x)             ((x) & 0xff)
308 #define EC_EepromOpcode(x)              ((x) << 8)
309 #define EC_OP_WE                        0
310 #define EC_OP_WR                        1
311 #define EC_OP_RR                        2
312 #define EC_OP_ER                        3
313 #define EC_EepromBusy                   (1U << 15)
314
315 #define STGE_ExpRomAddr                 0x4c
316
317 #define STGE_ExpRomData                 0x50    /* 8-bit */
318
319 #define STGE_WakeEvent                  0x51    /* 8-bit */
320 #define WE_WakePktEnable                (1U << 0)
321 #define WE_MagicPktEnable               (1U << 1)
322 #define WE_LinkEventEnable              (1U << 2)
323 #define WE_WakePolarity                 (1U << 3)
324 #define WE_WakePktEvent                 (1U << 4)
325 #define WE_MagicPktEvent                (1U << 5)
326 #define WE_LinkEvent                    (1U << 6)
327 #define WE_WakeOnLanEnable              (1U << 7)
328
329 #define STGE_Countdown                  0x54
330 #define CD_Count(x)                     ((x) & 0xffff)
331 #define CD_CountdownSpeed               (1U << 24)
332 #define CD_CountdownMode                (1U << 25)
333 #define CD_CountdownIntEnabled          (1U << 26)
334
335 #define STGE_IntStatusAck               0x5a    /* 16-bit */
336
337 #define STGE_IntEnable                  0x5c    /* 16-bit */
338
339 #define STGE_IntStatus                  0x5e    /* 16-bit */
340
341 #define IS_InterruptStatus              (1U << 0)
342 #define IS_HostError                    (1U << 1)
343 #define IS_TxComplete                   (1U << 2)
344 #define IS_MACControlFrame              (1U << 3)
345 #define IS_RxComplete                   (1U << 4)
346 #define IS_RxEarly                      (1U << 5)
347 #define IS_InRequested                  (1U << 6)
348 #define IS_UpdateStats                  (1U << 7)
349 #define IS_LinkEvent                    (1U << 8)
350 #define IS_TxDMAComplete                (1U << 9)
351 #define IS_RxDMAComplete                (1U << 10)
352 #define IS_RFDListEnd                   (1U << 11)
353 #define IS_RxDMAPriority                (1U << 12)
354
355 #define STGE_TxStatus                   0x60
356 #define TS_TxError                      (1U << 0)
357 #define TS_LateCollision                (1U << 2)
358 #define TS_MaxCollisions                (1U << 3)
359 #define TS_TxUnderrun                   (1U << 4)
360 #define TS_TxIndicateReqd               (1U << 6)
361 #define TS_TxComplete                   (1U << 7)
362 #define TS_TxFrameId_get(x)             ((x) >> 16)
363
364 #define STGE_MACCtrl                    0x6c
365 #define MC_IFSSelect(x)                 ((x) & 3)
366 #define MC_IFS96bit                     0
367 #define MC_IFS1024bit                   1
368 #define MC_IFS1792bit                   2
369 #define MC_IFS4352bit                   3
370
371 #define MC_DuplexSelect                 (1U << 5)
372 #define MC_RcvLargeFrames               (1U << 6)
373 #define MC_TxFlowControlEnable          (1U << 7)
374 #define MC_RxFlowControlEnable          (1U << 8)
375 #define MC_RcvFCS                       (1U << 9)
376 #define MC_FIFOLoopback                 (1U << 10)
377 #define MC_MACLoopback                  (1U << 11)
378 #define MC_AutoVLANtagging              (1U << 12)
379 #define MC_AutoVLANuntagging            (1U << 13)
380 #define MC_CollisionDetect              (1U << 16)
381 #define MC_CarrierSense                 (1U << 17)
382 #define MC_StatisticsEnable             (1U << 21)
383 #define MC_StatisticsDisable            (1U << 22)
384 #define MC_StatisticsEnabled            (1U << 23)
385 #define MC_TxEnable                     (1U << 24)
386 #define MC_TxDisable                    (1U << 25)
387 #define MC_TxEnabled                    (1U << 26)
388 #define MC_RxEnable                     (1U << 27)
389 #define MC_RxDisable                    (1U << 28)
390 #define MC_RxEnabled                    (1U << 29)
391 #define MC_Paused                       (1U << 30)
392 #define MC_MASK                         0x7fe33fa3
393
394 #define STGE_VLANTag                    0x70
395
396 #define STGE_PhySet                     0x75    /* 8-bit */
397 #define PS_MemLenb9b                    (1U << 0)
398 #define PS_MemLen                       (1U << 1)
399 #define PS_NonCompdet                   (1U << 2)
400
401 #define STGE_PhyCtrl                    0x76    /* 8-bit */
402 #define PC_MgmtClk                      (1U << 0)
403 #define PC_MgmtData                     (1U << 1)
404 #define PC_MgmtDir                      (1U << 2)       /* MAC->PHY */
405 #define PC_PhyDuplexPolarity            (1U << 3)
406 #define PC_PhyDuplexStatus              (1U << 4)
407 #define PC_PhyLnkPolarity               (1U << 5)
408 #define PC_LinkSpeed(x)                 (((x) >> 6) & 3)
409 #define PC_LinkSpeed_Down               0
410 #define PC_LinkSpeed_10                 1
411 #define PC_LinkSpeed_100                2
412 #define PC_LinkSpeed_1000               3
413
414 #define STGE_StationAddress0            0x78    /* 16-bit */
415
416 #define STGE_StationAddress1            0x7a    /* 16-bit */
417
418 #define STGE_StationAddress2            0x7c    /* 16-bit */
419
420 #define STGE_VLANHashTable              0x7e    /* 16-bit */
421
422 #define STGE_VLANId                     0x80
423
424 #define STGE_MaxFrameSize               0x86
425
426 #define STGE_ReceiveMode                0x88    /* 16-bit */
427 #define RM_ReceiveUnicast               (1U << 0)
428 #define RM_ReceiveMulticast             (1U << 1)
429 #define RM_ReceiveBroadcast             (1U << 2)
430 #define RM_ReceiveAllFrames             (1U << 3)
431 #define RM_ReceiveMulticastHash         (1U << 4)
432 #define RM_ReceiveIPMulticast           (1U << 5)
433 #define RM_ReceiveVLANMatch             (1U << 8)
434 #define RM_ReceiveVLANHash              (1U << 9)
435
436 #define STGE_HashTable0                 0x8c
437
438 #define STGE_HashTable1                 0x90
439
440 #define STGE_RMONStatisticsMask         0x98    /* set to disable */
441
442 #define STGE_StatisticsMask             0x9c    /* set to disable */
443
444 #define STGE_RxJumboFrames              0xbc    /* 16-bit */
445
446 #define STGE_TCPCheckSumErrors          0xc0    /* 16-bit */
447
448 #define STGE_IPCheckSumErrors           0xc2    /* 16-bit */
449
450 #define STGE_UDPCheckSumErrors          0xc4    /* 16-bit */
451
452 #define STGE_TxJumboFrames              0xf4    /* 16-bit */
453
454 /*
455  * TC9021 statistics.  Available memory and I/O mapped.
456  */
457
458 #define STGE_OctetRcvOk                 0xa8
459
460 #define STGE_McstOctetRcvdOk            0xac
461
462 #define STGE_BcstOctetRcvdOk            0xb0
463
464 #define STGE_FramesRcvdOk               0xb4
465
466 #define STGE_McstFramesRcvdOk           0xb8
467
468 #define STGE_BcstFramesRcvdOk           0xbe    /* 16-bit */
469
470 #define STGE_MacControlFramesRcvd       0xc6    /* 16-bit */
471
472 #define STGE_FrameTooLongErrors         0xc8    /* 16-bit */
473
474 #define STGE_InRangeLengthErrors        0xca    /* 16-bit */
475
476 #define STGE_FramesCheckSeqErrors       0xcc    /* 16-bit */
477
478 #define STGE_FramesLostRxErrors         0xce    /* 16-bit */
479
480 #define STGE_OctetXmtdOk                0xd0
481
482 #define STGE_McstOctetXmtdOk            0xd4
483
484 #define STGE_BcstOctetXmtdOk            0xd8
485
486 #define STGE_FramesXmtdOk               0xdc
487
488 #define STGE_McstFramesXmtdOk           0xe0
489
490 #define STGE_FramesWDeferredXmt         0xe4
491
492 #define STGE_LateCollisions             0xe8
493
494 #define STGE_MultiColFrames             0xec
495
496 #define STGE_SingleColFrames            0xf0
497
498 #define STGE_BcstFramesXmtdOk           0xf6    /* 16-bit */
499
500 #define STGE_CarrierSenseErrors         0xf8    /* 16-bit */
501
502 #define STGE_MacControlFramesXmtd       0xfa    /* 16-bit */
503
504 #define STGE_FramesAbortXSColls         0xfc    /* 16-bit */
505
506 #define STGE_FramesWEXDeferal           0xfe    /* 16-bit */
507
508 /*
509  * RMON-compatible statistics.  Only accessible if memory-mapped.
510  */
511
512 #define STGE_EtherStatsCollisions                       0x100
513
514 #define STGE_EtherStatsOctetsTransmit                   0x104
515
516 #define STGE_EtherStatsPktsTransmit                     0x108
517
518 #define STGE_EtherStatsPkts64OctetsTransmit             0x10c
519
520 #define STGE_EtherStatsPkts64to127OctetsTransmit        0x110
521
522 #define STGE_EtherStatsPkts128to255OctetsTransmit       0x114
523
524 #define STGE_EtherStatsPkts256to511OctetsTransmit       0x118
525
526 #define STGE_EtherStatsPkts512to1023OctetsTransmit      0x11c
527
528 #define STGE_EtherStatsPkts1024to1518OctetsTransmit     0x120
529
530 #define STGE_EtherStatsCRCAlignErrors                   0x124
531
532 #define STGE_EtherStatsUndersizePkts                    0x128
533
534 #define STGE_EtherStatsFragments                        0x12c
535
536 #define STGE_EtherStatsJabbers                          0x130
537
538 #define STGE_EtherStatsOctets                           0x134
539
540 #define STGE_EtherStatsPkts                             0x138
541
542 #define STGE_EtherStatsPkts64Octets                     0x13c
543
544 #define STGE_EtherStatsPkts65to127Octets                0x140
545
546 #define STGE_EtherStatsPkts128to255Octets               0x144
547
548 #define STGE_EtherStatsPkts256to511Octets               0x148
549
550 #define STGE_EtherStatsPkts512to1023Octets              0x14c
551
552 #define STGE_EtherStatsPkts1024to1518Octets             0x150
553
554 /*
555  * Transmit descriptor list size.
556  */
557 #define STGE_TX_RING_CNT        256
558 #define STGE_TX_LOWAT           (STGE_TX_RING_CNT/32)
559 #define STGE_TX_HIWAT           (STGE_TX_RING_CNT - STGE_TX_LOWAT)
560
561 /*
562  * Receive descriptor list size.
563  */
564 #define STGE_RX_RING_CNT        256
565
566 #define STGE_MAXTXSEGS          STGE_NTXFRAGS
567
568 #define STGE_JUMBO_FRAMELEN     9022
569 #define STGE_JUMBO_MTU  \
570         (STGE_JUMBO_FRAMELEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
571
572 struct stge_txdesc {
573         struct mbuf *tx_m;              /* head of our mbuf chain */
574         bus_dmamap_t tx_dmamap;         /* our DMA map */
575         STAILQ_ENTRY(stge_txdesc) tx_q;
576 };
577
578 STAILQ_HEAD(stge_txdq, stge_txdesc);
579
580 struct stge_rxdesc {
581         struct mbuf *rx_m;
582         bus_dmamap_t rx_dmamap;
583 };
584
585 #define STGE_ADDR_LO(x)         ((u_int64_t) (x) & 0xffffffff)
586 #define STGE_ADDR_HI(x)         ((u_int64_t) (x) >> 32)
587
588 #define STGE_RING_ALIGN         8
589
590 struct stge_chain_data{
591         bus_dma_tag_t           stge_parent_tag;
592         bus_dma_tag_t           stge_tx_tag;
593         struct stge_txdesc      stge_txdesc[STGE_TX_RING_CNT];
594         struct stge_txdq        stge_txfreeq;
595         struct stge_txdq        stge_txbusyq;
596         bus_dma_tag_t           stge_rx_tag;
597         struct stge_rxdesc      stge_rxdesc[STGE_RX_RING_CNT];
598         bus_dma_tag_t           stge_tx_ring_tag;
599         bus_dmamap_t            stge_tx_ring_map;
600         bus_dma_tag_t           stge_rx_ring_tag;
601         bus_dmamap_t            stge_rx_ring_map;
602         bus_dmamap_t            stge_rx_sparemap;
603
604         int                     stge_tx_prod;
605         int                     stge_tx_cons;
606         int                     stge_tx_cnt;
607         int                     stge_rx_cons;
608 #ifdef DEVICE_POLLING
609         int                     stge_rxcycles;
610 #endif
611         int                     stge_rxlen;
612         struct mbuf             *stge_rxhead;
613         struct mbuf             *stge_rxtail;
614 };
615
616 struct stge_ring_data {
617         struct stge_tfd         *stge_tx_ring;
618         bus_addr_t              stge_tx_ring_paddr;
619         struct stge_rfd         *stge_rx_ring;
620         bus_addr_t              stge_rx_ring_paddr;
621 };
622
623 #define STGE_TX_RING_ADDR(sc, i)        \
624     ((sc)->sc_rdata.stge_tx_ring_paddr + sizeof(struct stge_tfd) * (i))
625 #define STGE_RX_RING_ADDR(sc, i)        \
626     ((sc)->sc_rdata.stge_rx_ring_paddr + sizeof(struct stge_rfd) * (i))
627
628 #define STGE_TX_RING_SZ         \
629     (sizeof(struct stge_tfd) * STGE_TX_RING_CNT)
630 #define STGE_RX_RING_SZ         \
631     (sizeof(struct stge_rfd) * STGE_RX_RING_CNT)
632
633 /*
634  * Software state per device.
635  */
636 struct stge_softc {
637         struct ifnet            *sc_ifp;        /* interface info */
638         device_t                sc_dev;
639         device_t                sc_miibus;
640         struct resource         *sc_res[2];
641         struct resource_spec    *sc_spec;
642         void                    *sc_ih;         /* interrupt cookie */
643         int                     sc_rev;         /* silicon revision */
644
645         struct callout          sc_tick_ch;     /* tick callout */
646
647         struct stge_chain_data  sc_cdata;
648         struct stge_ring_data   sc_rdata;
649         int                     sc_if_flags;
650         int                     sc_if_framesize;
651         int                     sc_txthresh;    /* Tx threshold */
652         uint32_t                sc_usefiber:1;  /* if we're fiber */
653         uint32_t                sc_stge1023:1;  /* are we a 1023 */
654         uint32_t                sc_DMACtrl;     /* prototype DMACtrl reg. */
655         uint32_t                sc_MACCtrl;     /* prototype MacCtrl reg. */
656         uint16_t                sc_IntEnable;   /* prototype IntEnable reg. */
657         uint16_t                sc_led;         /* LED conf. from EEPROM */
658         uint8_t                 sc_PhyCtrl;     /* prototype PhyCtrl reg. */
659         int                     sc_suspended;
660         int                     sc_detach;
661
662         int                     sc_rxint_nframe;
663         int                     sc_rxint_dmawait;
664         int                     sc_nerr;
665         int                     sc_watchdog_timer;
666         int                     sc_link;
667
668         struct task             sc_link_task;
669         struct mtx              sc_mii_mtx;     /* MII mutex */
670         struct mtx              sc_mtx;
671 };
672
673 #define STGE_LOCK(_sc)          mtx_lock(&(_sc)->sc_mtx)
674 #define STGE_UNLOCK(_sc)        mtx_unlock(&(_sc)->sc_mtx)
675 #define STGE_LOCK_ASSERT(_sc)   mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
676 #define STGE_MII_LOCK(_sc)      mtx_lock(&(_sc)->sc_mii_mtx)
677 #define STGE_MII_UNLOCK(_sc)    mtx_unlock(&(_sc)->sc_mii_mtx)
678
679 #define STGE_MAXERR     5
680
681 #define STGE_RXCHAIN_RESET(_sc)                                         \
682 do {                                                                    \
683         (_sc)->sc_cdata.stge_rxhead = NULL;                             \
684         (_sc)->sc_cdata.stge_rxtail = NULL;                             \
685         (_sc)->sc_cdata.stge_rxlen = 0;                                 \
686 } while (/*CONSTCOND*/0)
687
688 #define STGE_TIMEOUT 1000
689
690 #define STGE_RESET_NONE 0x00
691 #define STGE_RESET_TX   0x01
692 #define STGE_RESET_RX   0x02
693 #define STGE_RESET_FULL 0x04