1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #ifndef _DEV_PCI_IF_STGEREG_H_
41 #define _DEV_PCI_IF_STGEREG_H_
42
43
44
45
46
47
48
49
50
51
52
53
54 #define CSR_WRITE_4(_sc, reg, val) \
55 bus_space_write_4((_sc)->sc_st, (_sc)->sc_sh, (reg), (val))
56 #define CSR_WRITE_2(_sc, reg, val) \
57 bus_space_write_2((_sc)->sc_st, (_sc)->sc_sh, (reg), (val))
58 #define CSR_WRITE_1(_sc, reg, val) \
59 bus_space_write_1((_sc)->sc_st, (_sc)->sc_sh, (reg), (val))
60
61 #define CSR_READ_4(_sc, reg) \
62 bus_space_read_4((_sc)->sc_st, (_sc)->sc_sh, (reg))
63 #define CSR_READ_2(_sc, reg) \
64 bus_space_read_2((_sc)->sc_st, (_sc)->sc_sh, (reg))
65 #define CSR_READ_1(_sc, reg) \
66 bus_space_read_1((_sc)->sc_st, (_sc)->sc_sh, (reg))
67
68
69
70
71 struct stge_frag {
72 uint64_t frag_word0;
73 } __packed;
74
75 #define FRAG_ADDR(x) (((uint64_t)(x)) << 0)
76 #define FRAG_ADDR_MASK FRAG_ADDR(0xfffffffffULL)
77 #define FRAG_LEN(x) (((uint64_t)(x)) << 48)
78 #define FRAG_LEN_MASK FRAG_LEN(0xffffULL)
79
80
81
82
83
84 #define STGE_NTXFRAGS 12
85 struct stge_tfd {
86 uint64_t tfd_next;
87 uint64_t tfd_control;
88
89 struct stge_frag tfd_frags[STGE_NTXFRAGS];
90 } __packed;
91
92 #define TFD_FrameId(x) ((x) << 0)
93 #define TFD_FrameId_MAX 0xffff
94 #define TFD_WordAlign(x) ((x) << 16)
95 #define TFD_WordAlign_dword 0
96 #define TFD_WordAlign_word 2
97 #define TFD_WordAlign_disable 1
98 #define TFD_TCPChecksumEnable (1ULL << 18)
99 #define TFD_UDPChecksumEnable (1ULL << 19)
100 #define TFD_IPChecksumEnable (1ULL << 20)
101 #define TFD_FcsAppendDisable (1ULL << 21)
102 #define TFD_TxIndicate (1ULL << 22)
103 #define TFD_TxDMAIndicate (1ULL << 23)
104 #define TFD_FragCount(x) ((x) << 24)
105 #define TFD_VLANTagInsert (1ULL << 28)
106 #define TFD_TFDDone (1ULL << 31)
107 #define TFD_VID(x) (((uint64_t)(x)) << 32)
108 #define TFD_CFI (1ULL << 44)
109 #define TFD_UserPriority(x) (((uint64_t)(x)) << 45)
110
111
112
113
114
115 struct stge_rfd {
116 uint64_t rfd_next;
117 uint64_t rfd_status;
118 struct stge_frag rfd_frag;
119 } __packed;
120
121 #define RFD_RxDMAFrameLen(x) ((x) & 0xffff)
122 #define RFD_RxFIFOOverrun (1ULL << 16)
123 #define RFD_RxRuntFrame (1ULL << 17)
124 #define RFD_RxAlignmentError (1ULL << 18)
125 #define RFD_RxFCSError (1ULL << 19)
126 #define RFD_RxOversizedFrame (1ULL << 20)
127 #define RFD_RxLengthError (1ULL << 21)
128 #define RFD_VLANDetected (1ULL << 22)
129 #define RFD_TCPDetected (1ULL << 23)
130 #define RFD_TCPError (1ULL << 24)
131 #define RFD_UDPDetected (1ULL << 25)
132 #define RFD_UDPError (1ULL << 26)
133 #define RFD_IPDetected (1ULL << 27)
134 #define RFD_IPError (1ULL << 28)
135 #define RFD_FrameStart (1ULL << 29)
136 #define RFD_FrameEnd (1ULL << 30)
137 #define RFD_RFDDone (1ULL << 31)
138 #define RFD_TCI(x) ((((uint64_t)(x)) >> 32) & 0xffff)
139
140
141
142
143
144 #define STGE_PCI_IOBA (PCI_MAPREG_START + 0x00)
145 #define STGE_PCI_MMBA (PCI_MAPREG_START + 0x04)
146
147
148
149
150 #define STGE_EEPROM_ConfigParam 0x00
151 #define STGE_EEPROM_AsicCtrl 0x01
152 #define STGE_EEPROM_SubSystemVendorId 0x02
153 #define STGE_EEPROM_SubSystemId 0x03
154 #define STGE_EEPROM_StationAddress0 0x10
155 #define STGE_EEPROM_StationAddress1 0x11
156 #define STGE_EEPROM_StationAddress2 0x12
157
158
159
160
161
162 #define STGE_DMACtrl 0x00
163 #define DMAC_RxDMAComplete (1U << 3)
164 #define DMAC_RxDMAPollNow (1U << 4)
165 #define DMAC_TxDMAComplete (1U << 11)
166 #define DMAC_TxDMAPollNow (1U << 12)
167 #define DMAC_TxDMAInProg (1U << 15)
168 #define DMAC_RxEarlyDisable (1U << 16)
169 #define DMAC_MWIDisable (1U << 18)
170 #define DMAC_TxWiteBackDisable (1U << 19)
171 #define DMAC_TxBurstLimit(x) ((x) << 20)
172 #define DMAC_TargetAbort (1U << 30)
173 #define DMAC_MasterAbort (1U << 31)
174
175 #define STGE_RxDMAStatus 0x08
176
177 #define STGE_TFDListPtrLo 0x10
178
179 #define STGE_TFDListPtrHi 0x14
180
181 #define STGE_TxDMABurstThresh 0x18
182
183 #define STGE_TxDMAUrgentThresh 0x19
184
185 #define STGE_TxDMAPollPeriod 0x1a
186
187 #define STGE_RFDListPtrLo 0x1c
188
189 #define STGE_RFDListPtrHi 0x20
190
191 #define STGE_RxDMABurstThresh 0x24
192
193 #define STGE_RxDMAUrgentThresh 0x25
194
195 #define STGE_RxDMAPollPeriod 0x26
196
197 #define STGE_RxDMAIntCtrl 0x28
198 #define RDIC_RxFrameCount(x) ((x) & 0xff)
199 #define RDIC_PriorityThresh(x) ((x) << 10)
200 #define RDIC_RxDMAWaitTime(x) ((x) << 16)
201
202 #define STGE_DebugCtrl 0x2c
203 #define DC_GPIO0Ctrl (1U << 0)
204 #define DC_GPIO1Ctrl (1U << 1)
205 #define DC_GPIO0 (1U << 2)
206 #define DC_GPIO1 (1U << 3)
207
208 #define STGE_AsicCtrl 0x30
209 #define AC_ExpRomDisable (1U << 0)
210 #define AC_ExpRomSize (1U << 1)
211 #define AC_PhySpeed10 (1U << 4)
212 #define AC_PhySpeed100 (1U << 5)
213 #define AC_PhySpeed1000 (1U << 6)
214 #define AC_PhyMedia (1U << 7)
215 #define AC_ForcedConfig(x) ((x) << 8)
216 #define AC_ForcedConfig_MASK AC_ForcedConfig(7)
217 #define AC_D3ResetDisable (1U << 11)
218 #define AC_SpeedupMode (1U << 13)
219 #define AC_LEDMode (1U << 14)
220 #define AC_RstOutPolarity (1U << 15)
221 #define AC_GlobalReset (1U << 16)
222 #define AC_RxReset (1U << 17)
223 #define AC_TxReset (1U << 18)
224 #define AC_DMA (1U << 19)
225 #define AC_FIFO (1U << 20)
226 #define AC_Network (1U << 21)
227 #define AC_Host (1U << 22)
228 #define AC_AutoInit (1U << 23)
229 #define AC_RstOut (1U << 24)
230 #define AC_InterruptRequest (1U << 25)
231 #define AC_ResetBusy (1U << 26)
232
233 #define STGE_FIFOCtrl 0x38
234 #define FC_RAMTestMode (1U << 0)
235 #define FC_Transmitting (1U << 14)
236 #define FC_Receiving (1U << 15)
237
238 #define STGE_RxEarlyThresh 0x3a
239
240 #define STGE_FlowOffThresh 0x3c
241
242 #define STGE_FlowOnTresh 0x3e
243
244 #define STGE_TxStartThresh 0x44
245
246 #define STGE_EepromData 0x48
247
248 #define STGE_EepromCtrl 0x4a
249 #define EC_EepromAddress(x) ((x) & 0xff)
250 #define EC_EepromOpcode(x) ((x) << 8)
251 #define EC_OP_WE 0
252 #define EC_OP_WR 1
253 #define EC_OP_RR 2
254 #define EC_OP_ER 3
255 #define EC_EepromBusy (1U << 15)
256
257 #define STGE_ExpRomAddr 0x4c
258
259 #define STGE_ExpRomData 0x50
260
261 #define STGE_WakeEvent 0x51
262
263 #define STGE_Countdown 0x54
264 #define CD_Count(x) ((x) & 0xffff)
265 #define CD_CountdownSpeed (1U << 24)
266 #define CD_CountdownMode (1U << 25)
267 #define CD_CountdownIntEnabled (1U << 26)
268
269 #define STGE_IntStatusAck 0x5a
270
271 #define STGE_IntStatus 0x5e
272
273 #define STGE_IntEnable 0x5c
274
275 #define IS_InterruptStatus (1U << 0)
276 #define IS_HostError (1U << 1)
277 #define IS_TxComplete (1U << 2)
278 #define IS_MACControlFrame (1U << 3)
279 #define IS_RxComplete (1U << 4)
280 #define IS_RxEarly (1U << 5)
281 #define IS_InRequested (1U << 6)
282 #define IS_UpdateStats (1U << 7)
283 #define IS_LinkEvent (1U << 8)
284 #define IS_TxDMAComplete (1U << 9)
285 #define IS_RxDMAComplete (1U << 10)
286 #define IS_RFDListEnd (1U << 11)
287 #define IS_RxDMAPriority (1U << 12)
288
289 #define STGE_TxStatus 0x60
290 #define TS_TxError (1U << 0)
291 #define TS_LateCollision (1U << 2)
292 #define TS_MaxCollisions (1U << 3)
293 #define TS_TxUnderrun (1U << 4)
294 #define TS_TxIndicateReqd (1U << 6)
295 #define TS_TxComplete (1U << 7)
296 #define TS_TxFrameId_get(x) ((x) >> 16)
297
298 #define STGE_MACCtrl 0x6c
299 #define MC_IFSSelect(x) ((x) & 3)
300 #define MC_DuplexSelect (1U << 5)
301 #define MC_RcvLargeFrames (1U << 6)
302 #define MC_TxFlowControlEnable (1U << 7)
303 #define MC_RxFlowControlEnable (1U << 8)
304 #define MC_RcvFCS (1U << 9)
305 #define MC_FIFOLoopback (1U << 10)
306 #define MC_MACLoopback (1U << 11)
307 #define MC_AutoVLANtagging (1U << 12)
308 #define MC_AutoVLANuntagging (1U << 13)
309 #define MC_CollisionDetect (1U << 16)
310 #define MC_CarrierSense (1U << 17)
311 #define MC_StatisticsEnable (1U << 21)
312 #define MC_StatisticsDisable (1U << 22)
313 #define MC_StatisticsEnabled (1U << 23)
314 #define MC_TxEnable (1U << 24)
315 #define MC_TxDisable (1U << 25)
316 #define MC_TxEnabled (1U << 26)
317 #define MC_RxEnable (1U << 27)
318 #define MC_RxDisable (1U << 28)
319 #define MC_RxEnabled (1U << 29)
320 #define MC_Paused (1U << 30)
321
322 #define STGE_VLANTag 0x70
323
324 #define STGE_PhyCtrl 0x76
325 #define PC_MgmtClk (1U << 0)
326 #define PC_MgmtData (1U << 1)
327 #define PC_MgmtDir (1U << 2)
328 #define PC_PhyDuplexPolarity (1U << 3)
329 #define PC_PhyDuplexStatus (1U << 4)
330 #define PC_PhyLnkPolarity (1U << 5)
331 #define PC_LinkSpeed(x) (((x) >> 6) & 3)
332 #define PC_LinkSpeed_Down 0
333 #define PC_LinkSpeed_10 1
334 #define PC_LinkSpeed_100 2
335 #define PC_LinkSpeed_1000 3
336
337 #define STGE_StationAddress0 0x78
338
339 #define STGE_StationAddress1 0x7a
340
341 #define STGE_StationAddress2 0x7c
342
343 #define STGE_VLANHashTable 0x7e
344
345 #define STGE_VLANId 0x80
346
347 #define STGE_MaxFrameSize 0x86
348
349 #define STGE_ReceiveMode 0x88
350 #define RM_ReceiveUnicast (1U << 0)
351 #define RM_ReceiveMulticast (1U << 1)
352 #define RM_ReceiveBroadcast (1U << 2)
353 #define RM_ReceiveAllFrames (1U << 3)
354 #define RM_ReceiveMulticastHash (1U << 4)
355 #define RM_ReceiveIPMulticast (1U << 5)
356 #define RM_ReceiveVLANMatch (1U << 8)
357 #define RM_ReceiveVLANHash (1U << 9)
358
359 #define STGE_HashTable0 0x8c
360
361 #define STGE_HashTable1 0x90
362
363 #define STGE_RMONStatisticsMask 0x98
364
365 #define STGE_StatisticsMask 0x9c
366
367 #define STGE_RxJumboFrames 0xbc
368
369 #define STGE_TCPCheckSumErrors 0xc0
370
371 #define STGE_IPCheckSumErrors 0xc2
372
373 #define STGE_UDPCheckSumErrors 0xc4
374
375 #define STGE_TxJumboFrames 0xf4
376
377
378
379
380
381 #define STGE_OctetRcvOk 0xa8
382
383 #define STGE_McstOctetRcvdOk 0xac
384
385 #define STGE_BcstOctetRcvdOk 0xb0
386
387 #define STGE_FramesRcvdOk 0xb4
388
389 #define STGE_McstFramesRcvdOk 0xb8
390
391 #define STGE_BcstFramesRcvdOk 0xbe
392
393 #define STGE_MacControlFramesRcvd 0xc6
394
395 #define STGE_FrameTooLongErrors 0xc8
396
397 #define STGE_InRangeLengthErrors 0xca
398
399 #define STGE_FramesCheckSeqErrors 0xcc
400
401 #define STGE_FramesLostRxErrors 0xce
402
403 #define STGE_OctetXmtdOk 0xd0
404
405 #define STGE_McstOctetXmtdOk 0xd4
406
407 #define STGE_BcstOctetXmtdOk 0xd8
408
409 #define STGE_FramesXmtdOk 0xdc
410
411 #define STGE_McstFramesXmtdOk 0xe0
412
413 #define STGE_FramesWDeferredXmt 0xe4
414
415 #define STGE_LateCollisions 0xe8
416
417 #define STGE_MultiColFrames 0xec
418
419 #define STGE_SingleColFrames 0xf0
420
421 #define STGE_BcstFramesXmtdOk 0xf6
422
423 #define STGE_CarrierSenseErrors 0xf8
424
425 #define STGE_MacControlFramesXmtd 0xfa
426
427 #define STGE_FramesAbortXSColls 0xfc
428
429 #define STGE_FramesWEXDeferal 0xfe
430
431
432
433
434
435 #define STGE_EtherStatsCollisions 0x100
436
437 #define STGE_EtherStatsOctetsTransmit 0x104
438
439 #define STGE_EtherStatsPktsTransmit 0x108
440
441 #define STGE_EtherStatsPkts64OctetsTransmit 0x10c
442
443 #define STGE_EtherStatsPkts64to127OctetsTransmit 0x110
444
445 #define STGE_EtherStatsPkts128to255OctetsTransmit 0x114
446
447 #define STGE_EtherStatsPkts256to511OctetsTransmit 0x118
448
449 #define STGE_EtherStatsPkts512to1023OctetsTransmit 0x11c
450
451 #define STGE_EtherStatsPkts1024to1518OctetsTransmit 0x120
452
453 #define STGE_EtherStatsCRCAlignErrors 0x124
454
455 #define STGE_EtherStatsUndersizePkts 0x128
456
457 #define STGE_EtherStatsFragments 0x12c
458
459 #define STGE_EtherStatsJabbers 0x130
460
461 #define STGE_EtherStatsOctets 0x134
462
463 #define STGE_EtherStatsPkts 0x138
464
465 #define STGE_EtherStatsPkts64Octets 0x13c
466
467 #define STGE_EtherStatsPkts65to127Octets 0x140
468
469 #define STGE_EtherStatsPkts128to255Octets 0x144
470
471 #define STGE_EtherStatsPkts256to511Octets 0x148
472
473 #define STGE_EtherStatsPkts512to1023Octets 0x14c
474
475 #define STGE_EtherStatsPkts1024to1518Octets 0x150
476
477
478
479
480 #define STGE_NTXDESC 256
481 #define STGE_NTXDESC_MASK (STGE_NTXDESC - 1)
482 #define STGE_NEXTTX(x) (((x) + 1) & STGE_NTXDESC_MASK)
483
484
485
486
487 #define STGE_NRXDESC 256
488 #define STGE_NRXDESC_MASK (STGE_NRXDESC - 1)
489 #define STGE_NEXTRX(x) (((x) + 1) & STGE_NRXDESC_MASK)
490
491
492
493
494 #define STGE_TXINTR_SPACING 16
495 #define STGE_TXINTR_SPACING_MASK (STGE_TXINTR_SPACING - 1)
496
497 #define STGE_JUMBO_FRAMELEN 9022
498 #define STGE_JUMBO_MTU \
499 (STGE_JUMBO_FRAMELEN - ETHER_HDR_LEN - ETHER_CRC_LEN)
500
501
502
503
504
505
506 struct stge_control_data {
507
508
509
510 struct stge_tfd scd_txdescs[STGE_NTXDESC];
511
512
513
514
515 struct stge_rfd scd_rxdescs[STGE_NRXDESC];
516 };
517
518 #define STGE_CDOFF(x) offsetof(struct stge_control_data, x)
519 #define STGE_CDTXOFF(x) STGE_CDOFF(scd_txdescs[(x)])
520 #define STGE_CDRXOFF(x) STGE_CDOFF(scd_rxdescs[(x)])
521
522
523
524
525 struct stge_descsoft {
526 struct mbuf *ds_mbuf;
527 bus_dmamap_t ds_dmamap;
528 };
529
530
531
532
533 struct stge_softc {
534 struct device sc_dev;
535 bus_space_tag_t sc_st;
536 bus_space_handle_t sc_sh;
537 bus_dma_tag_t sc_dmat;
538 struct arpcom sc_arpcom;
539 void *sc_sdhook;
540 int sc_rev;
541 int stge_if_flags;
542 void *sc_ih;
543
544 struct mii_data sc_mii;
545
546 struct timeout sc_timeout;
547
548 bus_dmamap_t sc_cddmamap;
549 #define sc_cddma sc_cddmamap->dm_segs[0].ds_addr
550
551
552
553
554 struct stge_descsoft sc_txsoft[STGE_NTXDESC];
555 struct stge_descsoft sc_rxsoft[STGE_NRXDESC];
556
557
558
559
560 struct stge_control_data *sc_control_data;
561 #define sc_txdescs sc_control_data->scd_txdescs
562 #define sc_rxdescs sc_control_data->scd_rxdescs
563
564 int sc_txpending;
565 int sc_txdirty;
566 int sc_txlast;
567
568 int sc_rxptr;
569 int sc_rxdiscard;
570 int sc_rxlen;
571 struct mbuf *sc_rxhead;
572 struct mbuf *sc_rxtail;
573 struct mbuf **sc_rxtailp;
574
575 int sc_txthresh;
576 uint32_t sc_usefiber:1;
577 uint32_t sc_stge1023:1;
578 uint32_t sc_DMACtrl;
579 uint32_t sc_MACCtrl;
580 uint16_t sc_IntEnable;
581 uint16_t sc_ReceiveMode;
582 uint8_t sc_PhyCtrl;
583 };
584
585 #define STGE_RXCHAIN_RESET(sc) \
586 do { \
587 (sc)->sc_rxtailp = &(sc)->sc_rxhead; \
588 *(sc)->sc_rxtailp = NULL; \
589 (sc)->sc_rxlen = 0; \
590 } while (0)
591
592 #define STGE_RXCHAIN_LINK(sc, m) \
593 do { \
594 *(sc)->sc_rxtailp = (sc)->sc_rxtail = (m); \
595 (sc)->sc_rxtailp = &(m)->m_next; \
596 } while (0)
597
598 #define STGE_CDTXADDR(sc, x) ((sc)->sc_cddma + STGE_CDTXOFF((x)))
599 #define STGE_CDRXADDR(sc, x) ((sc)->sc_cddma + STGE_CDRXOFF((x)))
600
601 #define STGE_CDTXSYNC(sc, x, ops) \
602 bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \
603 STGE_CDTXOFF((x)), sizeof(struct stge_tfd), (ops))
604
605 #define STGE_CDRXSYNC(sc, x, ops) \
606 bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \
607 STGE_CDRXOFF((x)), sizeof(struct stge_rfd), (ops))
608
609 #define STGE_INIT_RXDESC(sc, x) \
610 do { \
611 struct stge_descsoft *__ds = &(sc)->sc_rxsoft[(x)]; \
612 struct stge_rfd *__rfd = &(sc)->sc_rxdescs[(x)]; \
613 \
614
615
616
617
618 \
619 __rfd->rfd_frag.frag_word0 = \
620 htole64(FRAG_ADDR(__ds->ds_dmamap->dm_segs[0].ds_addr + 2) |\
621 FRAG_LEN(MCLBYTES - 2)); \
622 __rfd->rfd_next = \
623 htole64((uint64_t)STGE_CDRXADDR((sc), STGE_NEXTRX((x)))); \
624 __rfd->rfd_status = 0; \
625 STGE_CDRXSYNC((sc), (x), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \
626 } while (0)
627
628 #define STGE_TIMEOUT 1000
629
630 #endif