This source file includes following definitions.
- LMC_21040_GENERIC
- LMC_21140_ISV
- LMC_21142_ISV
- LMC_21143_ISV
- LMC_21140_DEC_EB
- LMC_21140_MII
- LMC_21140_DEC_DE500
- LMC_21140_SMC_9332
- LMC_21140_COGENT_EM100
- LMC_21140_ZNYX_ZX34X
- LMC_21140_ASANTE
- LMC_21140_EN1207
- LMC_21041_GENERIC
- lmc_board_t
- LMC_MEDIAPOLL_TIMER
- LMC_MEDIAPOLL_FASTTIMER
- LMC_MEDIAPOLL_LINKFAIL
- LMC_MEDIAPOLL_LINKPASS
- LMC_MEDIAPOLL_START
- LMC_MEDIAPOLL_TXPROBE_OK
- LMC_MEDIAPOLL_TXPROBE_FAILED
- LMC_MEDIAPOLL_MAX
- lmc_mediapoll_event_t
- lmc_regfile_t
- LMC_21140
- LMC_21140A
- LMC_CHIPID_UNKNOWN
- lmc_chipid_t
- lmc_dot3_stats_t
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 #define LMC_MTU 1500
67 #define PPP_HEADER_LEN 4
68 #define BIG_PACKET
69 #define LMC_DATA_PER_DESC 2032
70
71
72
73
74
75 #if 0
76 #define LMC_DEBUG
77 typedef enum {
78 LMC_21040_GENERIC,
79 LMC_21140_ISV,
80 LMC_21142_ISV,
81 LMC_21143_ISV,
82 LMC_21140_DEC_EB,
83 LMC_21140_MII,
84 LMC_21140_DEC_DE500,
85 LMC_21140_SMC_9332,
86 LMC_21140_COGENT_EM100,
87 LMC_21140_ZNYX_ZX34X,
88 LMC_21140_ASANTE,
89 LMC_21140_EN1207,
90 LMC_21041_GENERIC
91 } lmc_board_t;
92
93 typedef enum {
94 LMC_MEDIAPOLL_TIMER,
95 LMC_MEDIAPOLL_FASTTIMER,
96 LMC_MEDIAPOLL_LINKFAIL,
97 LMC_MEDIAPOLL_LINKPASS,
98 LMC_MEDIAPOLL_START,
99 LMC_MEDIAPOLL_TXPROBE_OK,
100 LMC_MEDIAPOLL_TXPROBE_FAILED,
101 LMC_MEDIAPOLL_MAX
102 } lmc_mediapoll_event_t;
103 #define DP(x) printf x
104 #else
105 #define DP(x)
106 #endif
107
108
109
110
111
112
113 #ifndef TULIP_DSTS_RxMIIERR
114 #define TULIP_DSTS_RxMIIERR 0x00000008
115 #endif
116 #define LMC_DSTS_ERRSUM (TULIP_DSTS_RxMIIERR)
117
118
119
120
121 #define PCI_CFID 0x00
122 #define PCI_CFCS 0x04
123 #define PCI_CFRV 0x08
124 #define PCI_CFLT 0x0c
125 #define PCI_CBIO 0x10
126 #define PCI_CBMA 0x14
127 #define PCI_SSID 0x2c
128 #define PCI_CFIT 0x3c
129 #define PCI_CFDA 0x40
130
131 #define LMC_HZ 10
132
133 #ifndef TULIP_GP_PINSET
134 #define TULIP_GP_PINSET 0x00000100L
135 #endif
136 #ifndef TULIP_BUSMODE_READMULTIPLE
137 #define TULIP_BUSMODE_READMULTIPLE 0x00200000L
138 #endif
139
140 #define LMC_CSR_READ(sc, csr) \
141 bus_space_read_4((sc)->lmc_bustag, (sc)->lmc_bushandle, (sc)->lmc_csrs.csr)
142 #define LMC_CSR_WRITE(sc, csr, val) \
143 bus_space_write_4((sc)->lmc_bustag, (sc)->lmc_bushandle, (sc)->lmc_csrs.csr, (val))
144
145 #define LMC_CSR_READBYTE(sc, csr) \
146 bus_space_read_1((sc)->lmc_bustag, (sc)->lmc_bushandle, (sc)->lmc_csrs.csr)
147 #define LMC_CSR_WRITEBYTE(sc, csr, val) \
148 bus_space_write_1((sc)->lmc_bustag, (sc)->lmc_bushandle, (sc)->lmc_csrs.csr, (val))
149
150 #define LMC_PCI_CSRSIZE 8
151 #define LMC_PCI_CSROFFSET 0
152
153
154
155
156
157 typedef struct {
158 lmc_csrptr_t csr_busmode;
159 lmc_csrptr_t csr_txpoll;
160 lmc_csrptr_t csr_rxpoll;
161 lmc_csrptr_t csr_rxlist;
162 lmc_csrptr_t csr_txlist;
163 lmc_csrptr_t csr_status;
164 lmc_csrptr_t csr_command;
165 lmc_csrptr_t csr_intr;
166 lmc_csrptr_t csr_missed_frames;
167 lmc_csrptr_t csr_9;
168 lmc_csrptr_t csr_10;
169 lmc_csrptr_t csr_11;
170 lmc_csrptr_t csr_12;
171 lmc_csrptr_t csr_13;
172 lmc_csrptr_t csr_14;
173 lmc_csrptr_t csr_15;
174 } lmc_regfile_t;
175
176 #define csr_enetrom csr_9
177 #define csr_reserved csr_10
178 #define csr_full_duplex csr_11
179 #define csr_bootrom csr_10
180 #define csr_gp csr_12
181 #define csr_watchdog csr_15
182 #define csr_gp_timer csr_11
183 #define csr_srom_mii csr_9
184 #define csr_sia_status csr_12
185 #define csr_sia_connectivity csr_13
186 #define csr_sia_tx_rx csr_14
187 #define csr_sia_general csr_15
188
189
190
191
192
193
194 struct lmc_ringinfo {
195 lmc_desc_t *ri_first;
196 lmc_desc_t *ri_last;
197 lmc_desc_t *ri_nextin;
198 lmc_desc_t *ri_nextout;
199 int ri_max;
200 int ri_free;
201 };
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229 #define LMC_RXDESCS 48
230 #define LMC_TXDESCS 128
231 #define LMC_RXQ_TARGET 32
232 #if LMC_RXQ_TARGET >= LMC_RXDESCS
233 #error LMC_RXQ_TARGET must be less than LMC_RXDESCS
234 #endif
235
236 #define LMC_RX_BUFLEN ((MCLBYTES < 2048 ? MCLBYTES : 2048) - 16)
237
238 #define LMC_LINK_UP 1
239 #define LMC_LINK_DOWN 0
240
241 typedef enum {
242 LMC_21140, LMC_21140A,
243 LMC_CHIPID_UNKNOWN
244 } lmc_chipid_t;
245
246 #define LMC_BIT(b) (1L << ((int)(b)))
247
248 typedef struct {
249
250
251
252 u_int32_t dot3StatsSingleCollisionFrames;
253 u_int32_t dot3StatsMultipleCollisionFrames;
254 u_int32_t dot3StatsSQETestErrors;
255 u_int32_t dot3StatsDeferredTransmissions;
256 u_int32_t dot3StatsLateCollisions;
257 u_int32_t dot3StatsExcessiveCollisions;
258 u_int32_t dot3StatsCarrierSenseErrors;
259 u_int32_t dot3StatsInternalMacTransmitErrors;
260 u_int32_t dot3StatsInternalTransmitUnderflows;
261 u_int32_t dot3StatsInternalTransmitBabbles;
262
263
264
265 u_int32_t dot3StatsMissedFrames;
266 u_int32_t dot3StatsAlignmentErrors;
267 u_int32_t dot3StatsFCSErrors;
268 u_int32_t dot3StatsFrameTooLongs;
269 u_int32_t dot3StatsInternalMacReceiveErrors;
270 } lmc_dot3_stats_t;
271
272
273
274
275
276
277 struct lmc___softc {
278 struct device lmc_dev;
279 void *lmc_ih;
280 void *lmc_ats;
281 bus_space_tag_t lmc_bustag;
282 bus_space_handle_t lmc_bushandle;
283 pci_chipset_tag_t lmc_pc;
284
285 struct sppp lmc_sppp;
286 #define lmc_if lmc_sppp.pp_if
287
288 u_int8_t lmc_enaddr[6];
289 lmc_regfile_t lmc_csrs;
290 volatile u_int32_t lmc_txtick;
291 volatile u_int32_t lmc_rxtick;
292 u_int32_t lmc_flags;
293
294 u_int32_t lmc_features;
295 u_int32_t lmc_intrmask;
296 u_int32_t lmc_cmdmode;
297 u_int32_t lmc_last_system_error : 3;
298 u_int32_t lmc_system_errors;
299 u_int32_t lmc_statusbits;
300
301 u_int8_t lmc_revinfo;
302 u_int8_t lmc_cardtype;
303 u_int32_t lmc_gpio_io;
304 u_int32_t lmc_gpio;
305 u_int8_t lmc_gp;
306
307 lmc_chipid_t lmc_chipid;
308 u_int32_t lmc_miireg16;
309 struct ifqueue lmc_txq;
310 struct ifqueue lmc_rxq;
311 lmc_dot3_stats_t lmc_dot3stats;
312 lmc_ringinfo_t lmc_rxinfo;
313 lmc_ringinfo_t lmc_txinfo;
314 u_int8_t lmc_rombuf[128];
315 lmc_media_t *lmc_media;
316 lmc_ctl_t ictl;
317
318 bus_dma_tag_t lmc_dmatag;
319 bus_dmamap_t lmc_setupmap;
320 bus_dmamap_t lmc_txdescmap;
321 bus_dmamap_t lmc_txmaps[LMC_TXDESCS];
322 unsigned lmc_txmaps_free;
323 bus_dmamap_t lmc_rxdescmap;
324 bus_dmamap_t lmc_rxmaps[LMC_RXDESCS];
325 unsigned lmc_rxmaps_free;
326
327 struct device *lmc_pci_busno;
328 u_int8_t lmc_pci_devno;
329 lmc_desc_t *lmc_rxdescs;
330 lmc_desc_t *lmc_txdescs;
331
332 u_int32_t lmc_crcSize;
333 u_int32_t tx_clockState;
334 char lmc_yel, lmc_blue, lmc_red;
335 char lmc_timing;
336 u_int16_t t1_alarm1_status;
337 u_int16_t t1_alarm2_status;
338 #if defined(LMC_DEBUG)
339
340
341
342 struct {
343 lmc_media_t dbg_last_media;
344 u_int32_t dbg_intrs;
345 u_int32_t dbg_media_probes;
346 u_int32_t dbg_txprobe_nocarr;
347 u_int32_t dbg_txprobe_exccoll;
348 u_int32_t dbg_link_downed;
349 u_int32_t dbg_link_suspected;
350 u_int32_t dbg_link_intrs;
351 u_int32_t dbg_link_pollintrs;
352 u_int32_t dbg_link_failures;
353 u_int32_t dbg_nway_starts;
354 u_int32_t dbg_nway_failures;
355 u_int16_t dbg_phyregs[32][4];
356 u_int32_t dbg_rxlowbufs;
357 u_int32_t dbg_rxintrs;
358 u_int32_t dbg_last_rxintrs;
359 u_int32_t dbg_high_rxintrs_hz;
360 u_int32_t dbg_no_txmaps;
361 u_int32_t dbg_txput_finishes[8];
362 u_int32_t dbg_txprobes_ok;
363 u_int32_t dbg_txprobes_failed;
364 u_int32_t dbg_events[LMC_MEDIAPOLL_MAX];
365 u_int32_t dbg_rxpktsperintr[LMC_RXDESCS];
366 } lmc_dbg;
367 #endif
368 };
369
370
371
372
373 #define LMC_IFUP 0x00000001
374 #define LMC_00000002 0x00000002
375 #define LMC_00000004 0x00000004
376 #define LMC_00000008 0x00000008
377 #define LMC_00000010 0x00000010
378 #define LMC_MODEMOK 0x00000020
379 #define LMC_00000040 0x00000040
380 #define LMC_00000080 0x00000080
381 #define LMC_RXACT 0x00000100
382 #define LMC_INRESET 0x00000200
383 #define LMC_NEEDRESET 0x00000400
384 #define LMC_00000800 0x00000800
385 #define LMC_00001000 0x00001000
386 #define LMC_00002000 0x00002000
387 #define LMC_WANTTXSTART 0x00004000
388 #define LMC_NEWTXTHRESH 0x00008000
389 #define LMC_NOAUTOSENSE 0x00010000
390 #define LMC_PRINTLINKUP 0x00020000
391 #define LMC_LINKUP 0x00040000
392 #define LMC_RXBUFSLOW 0x00080000
393 #define LMC_NOMESSAGES 0x00100000
394 #define LMC_SYSTEMERROR 0x00200000
395 #define LMC_TIMEOUTPENDING 0x00400000
396 #define LMC_00800000 0x00800000
397 #define LMC_01000000 0x01000000
398 #define LMC_02000000 0x02000000
399 #define LMC_RXIGNORE 0x04000000
400 #define LMC_08000000 0x08000000
401 #define LMC_10000000 0x10000000
402 #define LMC_20000000 0x20000000
403 #define LMC_40000000 0x40000000
404 #define LMC_80000000 0x80000000
405
406
407
408
409 #define LMC_HAVE_GPR 0x00000001
410 #define LMC_HAVE_RXBADOVRFLW 0x00000002
411 #define LMC_HAVE_POWERMGMT 0x00000004
412 #define LMC_HAVE_MII 0x00000008
413 #define LMC_HAVE_SIANWAY 0x00000010
414 #define LMC_HAVE_DUALSENSE 0x00000020
415 #define LMC_HAVE_SIAGP 0x00000040
416 #define LMC_HAVE_BROKEN_HASH 0x00000080
417 #define LMC_HAVE_ISVSROM 0x00000100
418 #define LMC_HAVE_BASEROM 0x00000200
419 #define LMC_HAVE_SLAVEDROM 0x00000400
420 #define LMC_HAVE_SLAVEDINTR 0x00000800
421 #define LMC_HAVE_SHAREDINTR 0x00001000
422 #define LMC_HAVE_OKROM 0x00002000
423 #define LMC_HAVE_NOMEDIA 0x00004000
424 #define LMC_HAVE_STOREFWD 0x00008000
425 #define LMC_HAVE_SIA100 0x00010000
426
427 #if 0
428 static const char * const lmc_status_bits[] = {
429 NULL,
430 "transmit process stopped",
431 NULL,
432 "transmit jabber timeout",
433
434 NULL,
435 "transmit underflow",
436 NULL,
437 "receive underflow",
438
439 "receive process stopped",
440 "receive watchdog timeout",
441 NULL,
442 NULL,
443
444 "link failure",
445 NULL,
446 NULL,
447 };
448 #endif
449
450
451
452
453 #define LMC_MAX_DEVICES 32
454
455 #define LMC_RXDESC_PRESYNC(sc, di, s) \
456 bus_dmamap_sync((sc)->lmc_dmatag, (sc)->lmc_rxdescmap, \
457 (caddr_t) di - (caddr_t) (sc)->lmc_rxdescs, \
458 (s), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
459 #define LMC_RXDESC_POSTSYNC(sc, di, s) \
460 bus_dmamap_sync((sc)->lmc_dmatag, (sc)->lmc_rxdescmap, \
461 (caddr_t) di - (caddr_t) (sc)->lmc_rxdescs, \
462 (s), BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
463 #define LMC_RXMAP_PRESYNC(sc, map) \
464 bus_dmamap_sync((sc)->lmc_dmatag, (map), 0, (map)->dm_mapsize, \
465 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
466 #define LMC_RXMAP_POSTSYNC(sc, map) \
467 bus_dmamap_sync((sc)->lmc_dmatag, (map), 0, (map)->dm_mapsize, \
468 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
469 #define LMC_RXMAP_CREATE(sc, mapp) \
470 bus_dmamap_create((sc)->lmc_dmatag, LMC_RX_BUFLEN, 2, \
471 LMC_DATA_PER_DESC, 0, \
472 BUS_DMA_NOWAIT|BUS_DMA_ALLOCNOW, (mapp))
473
474 #define LMC_TXDESC_PRESYNC(sc, di, s) \
475 bus_dmamap_sync((sc)->lmc_dmatag, (sc)->lmc_txdescmap, \
476 (caddr_t) di - (caddr_t) (sc)->lmc_txdescs, \
477 (s), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
478 #define LMC_TXDESC_POSTSYNC(sc, di, s) \
479 bus_dmamap_sync((sc)->lmc_dmatag, (sc)->lmc_txdescmap, \
480 (caddr_t) di - (caddr_t) (sc)->lmc_txdescs, \
481 (s), BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
482 #define LMC_TXMAP_PRESYNC(sc, map) \
483 bus_dmamap_sync((sc)->lmc_dmatag, (map), 0, (map)->dm_mapsize, \
484 BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)
485 #define LMC_TXMAP_POSTSYNC(sc, map) \
486 bus_dmamap_sync((sc)->lmc_dmatag, (map), 0, (map)->dm_mapsize, \
487 BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)
488 #define LMC_TXMAP_CREATE(sc, mapp) \
489 bus_dmamap_create((sc)->lmc_dmatag, LMC_DATA_PER_DESC, \
490 LMC_MAX_TXSEG, LMC_DATA_PER_DESC, \
491 0, BUS_DMA_NOWAIT, (mapp))
492
493 typedef void ifnet_ret_t;
494 typedef u_long ioctl_cmd_t;
495 extern struct cfattach lmc_ca;
496 extern struct cfdriver lmc_cd;
497 #define LMC_UNIT_TO_SOFTC(unit) ((lmc_softc_t *) lmc_cd.cd_devs[unit])
498 #define LMC_IFP_TO_SOFTC(ifp) ((lmc_softc_t *)((ifp)->if_softc))
499 #define lmc_unit lmc_dev.dv_unit
500 #define lmc_xname lmc_if.if_xname
501 #define LMC_RAISESPL() splnet()
502 #define LMC_RAISESOFTSPL() splsoftnet()
503 #define LMC_RESTORESPL(s) splx(s)
504
505 #define loudprintf printf
506 #define LMC_PRINTF_FMT "%s"
507 #define LMC_PRINTF_ARGS sc->lmc_xname
508
509 #ifndef LMC_PRINTF_FMT
510 #define LMC_PRINTF_FMT "%s%d"
511 #endif
512 #ifndef LMC_PRINTF_ARGS
513 #define LMC_PRINTF_ARGS sc->lmc_name, sc->lmc_unit
514 #endif
515
516 #ifndef LMC_BURSTSIZE
517 #define LMC_BURSTSIZE(unit) 3
518 #endif
519
520 #ifndef lmc_unit
521 #define lmc_unit lmc_sppp.pp_if.if_unit
522 #endif
523
524 #ifndef lmc_name
525 #define lmc_name lmc_sppp.pp_if.if_name
526 #endif
527
528 #if !defined(lmc_bpf)
529 #define lmc_bpf lmc_sppp.pp_if.if_bpf
530 #endif
531
532 #ifndef LMC_RAISESPL
533 #define LMC_RAISESPL() splnet()
534 #endif
535 #ifndef LMC_RAISESOFTSPL
536 #define LMC_RAISESOFTSPL() splnet()
537 #endif
538 #ifndef TULUP_RESTORESPL
539 #define LMC_RESTORESPL(s) splx(s)
540 #endif
541
542
543
544
545
546 #if !defined(LMC_BPF_MTAP) && NBPFILTER > 0
547 #define LMC_BPF_MTAP(sc, m, d) bpf_mtap((sc)->lmc_bpf, m, d)
548 #define LMC_BPF_TAP(sc, p, l, d) bpf_tap((sc)->lmc_bpf, p, l, d)
549 #define LMC_BPF_ATTACH(sc) bpfattach(&(sc)->lmc_bpf, &(sc)->lmc_sppp.pp_if, DLT_PPP, PPP_HEADER_LEN)
550 #endif
551
552
553
554
555 #if !defined(LMC_EADDR_FMT)
556 #define LMC_EADDR_FMT "%s"
557 #define LMC_EADDR_ARGS(addr) ether_sprintf(addr)
558 #endif
559
560 #define LMC_CRC32_POLY 0xEDB88320UL
561 #define LMC_MAX_TXSEG 30
562
563 #define LMC_ADDREQUAL(a1, a2) \
564 (((u_int16_t *)a1)[0] == ((u_int16_t *)a2)[0] \
565 && ((u_int16_t *)a1)[1] == ((u_int16_t *)a2)[1] \
566 && ((u_int16_t *)a1)[2] == ((u_int16_t *)a2)[2])
567 #define LMC_ADDRBRDCST(a1) \
568 (((u_int16_t *)a1)[0] == 0xFFFFU \
569 && ((u_int16_t *)a1)[1] == 0xFFFFU \
570 && ((u_int16_t *)a1)[2] == 0xFFFFU)
571
572 typedef int lmc_spl_t;
573
574 #define LMC_GETCTX(m, t) ((t) (m)->m_pkthdr.rcvif + 0)
575 #define LMC_SETCTX(m, c) ((void) ((m)->m_pkthdr.rcvif = (void *) (c)))