1 | /* $NetBSD: tulipvar.h,v 1.69 2015/04/13 16:33:24 riastradh Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 1998, 1999, 2000 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 of the Numerical Aerospace Simulation Facility, |
9 | * NASA Ames Research Center. |
10 | * |
11 | * Redistribution and use in source and binary forms, with or without |
12 | * modification, are permitted provided that the following conditions |
13 | * are met: |
14 | * 1. Redistributions of source code must retain the above copyright |
15 | * notice, this list of conditions and the following disclaimer. |
16 | * 2. Redistributions in binary form must reproduce the above copyright |
17 | * notice, this list of conditions and the following disclaimer in the |
18 | * documentation and/or other materials provided with the distribution. |
19 | * |
20 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
21 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
22 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
23 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
24 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
25 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
26 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
27 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
28 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
29 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
30 | * POSSIBILITY OF SUCH DAMAGE. |
31 | */ |
32 | |
33 | #ifndef _DEV_IC_TULIPVAR_H_ |
34 | #define _DEV_IC_TULIPVAR_H_ |
35 | |
36 | #include <sys/queue.h> |
37 | #include <sys/callout.h> |
38 | |
39 | #include <sys/rndsource.h> |
40 | |
41 | /* |
42 | * Misc. definitions for the Digital Semiconductor ``Tulip'' (21x4x) |
43 | * Ethernet controller family driver. |
44 | */ |
45 | |
46 | /* |
47 | * Transmit descriptor list size. This is arbitrary, but allocate |
48 | * enough descriptors for 64 pending transmissions and 16 segments |
49 | * per packet. Since a descriptor holds 2 buffer addresses, that's |
50 | * 8 descriptors per packet. This MUST work out to a power of 2. |
51 | */ |
52 | #define TULIP_NTXSEGS 16 |
53 | |
54 | #define TULIP_TXQUEUELEN 64 |
55 | #define TULIP_NTXDESC (TULIP_TXQUEUELEN * TULIP_NTXSEGS) |
56 | #define TULIP_NTXDESC_MASK (TULIP_NTXDESC - 1) |
57 | #define TULIP_NEXTTX(x) ((x + 1) & TULIP_NTXDESC_MASK) |
58 | |
59 | /* |
60 | * Receive descriptor list size. We have one Rx buffer per incoming |
61 | * packet, so this logic is a little simpler. |
62 | */ |
63 | #define TULIP_NRXDESC 64 |
64 | #define TULIP_NRXDESC_MASK (TULIP_NRXDESC - 1) |
65 | #define TULIP_NEXTRX(x) ((x + 1) & TULIP_NRXDESC_MASK) |
66 | |
67 | /* |
68 | * Control structures are DMA'd to the TULIP chip. We allocate them in |
69 | * a single clump that maps to a single DMA segment to make several things |
70 | * easier. |
71 | */ |
72 | struct tulip_control_data { |
73 | /* |
74 | * The transmit descriptors. |
75 | */ |
76 | struct tulip_desc tcd_txdescs[TULIP_NTXDESC]; |
77 | |
78 | /* |
79 | * The receive descriptors. |
80 | */ |
81 | struct tulip_desc tcd_rxdescs[TULIP_NRXDESC]; |
82 | |
83 | /* |
84 | * The setup packet. |
85 | */ |
86 | uint32_t tcd_setup_packet[TULIP_SETUP_PACKET_LEN / sizeof(uint32_t)]; |
87 | }; |
88 | |
89 | #define TULIP_CDOFF(x) offsetof(struct tulip_control_data, x) |
90 | #define TULIP_CDTXOFF(x) TULIP_CDOFF(tcd_txdescs[(x)]) |
91 | #define TULIP_CDRXOFF(x) TULIP_CDOFF(tcd_rxdescs[(x)]) |
92 | #define TULIP_CDSPOFF TULIP_CDOFF(tcd_setup_packet) |
93 | |
94 | /* |
95 | * Software state for transmit jobs. |
96 | */ |
97 | struct tulip_txsoft { |
98 | struct mbuf *txs_mbuf; /* head of our mbuf chain */ |
99 | bus_dmamap_t txs_dmamap; /* our DMA map */ |
100 | int txs_firstdesc; /* first descriptor in packet */ |
101 | int txs_lastdesc; /* last descriptor in packet */ |
102 | int txs_ndescs; /* number of descriptors */ |
103 | SIMPLEQ_ENTRY(tulip_txsoft) txs_q; |
104 | }; |
105 | |
106 | SIMPLEQ_HEAD(tulip_txsq, tulip_txsoft); |
107 | |
108 | /* |
109 | * Software state for receive jobs. |
110 | */ |
111 | struct tulip_rxsoft { |
112 | struct mbuf *rxs_mbuf; /* head of our mbuf chain */ |
113 | bus_dmamap_t rxs_dmamap; /* our DMA map */ |
114 | }; |
115 | |
116 | /* |
117 | * Type of Tulip chip we're dealing with. |
118 | */ |
119 | typedef enum { |
120 | TULIP_CHIP_INVALID = 0, /* invalid chip type */ |
121 | TULIP_CHIP_DE425 = 1, /* DE-425 EISA */ |
122 | TULIP_CHIP_21040 = 2, /* DECchip 21040 */ |
123 | TULIP_CHIP_21041 = 3, /* DECchip 21041 */ |
124 | TULIP_CHIP_21140 = 4, /* DECchip 21140 */ |
125 | TULIP_CHIP_21140A = 5, /* DECchip 21140A */ |
126 | TULIP_CHIP_21142 = 6, /* DECchip 21142 */ |
127 | TULIP_CHIP_21143 = 7, /* DECchip 21143 */ |
128 | TULIP_CHIP_82C168 = 8, /* Lite-On 82C168 PNIC */ |
129 | TULIP_CHIP_82C169 = 9, /* Lite-On 82C169 PNIC */ |
130 | TULIP_CHIP_82C115 = 10, /* Lite-On 82C115 PNIC II */ |
131 | TULIP_CHIP_MX98713 = 11, /* Macronix 98713 PMAC */ |
132 | TULIP_CHIP_MX98713A = 12, /* Macronix 98713A PMAC */ |
133 | TULIP_CHIP_MX98715 = 13, /* Macronix 98715 PMAC */ |
134 | TULIP_CHIP_MX98715A = 14, /* Macronix 98715A PMAC */ |
135 | TULIP_CHIP_MX98715AEC_X = 15, /* Macronix 98715AEC-C, -E PMAC */ |
136 | TULIP_CHIP_MX98725 = 16, /* Macronix 98725 PMAC */ |
137 | TULIP_CHIP_WB89C840F = 17, /* Winbond 89C840F */ |
138 | TULIP_CHIP_DM9102 = 18, /* Davicom DM9102 */ |
139 | TULIP_CHIP_DM9102A = 19, /* Davicom DM9102A */ |
140 | TULIP_CHIP_AL981 = 20, /* ADMtek AL981 */ |
141 | TULIP_CHIP_AN983 = 21, /* ADMtek AN983 */ |
142 | TULIP_CHIP_AN985 = 22, /* ADMtek AN985 */ |
143 | TULIP_CHIP_AX88140 = 23, /* ASIX AX88140 */ |
144 | TULIP_CHIP_AX88141 = 24, /* ASIX AX88141 */ |
145 | TULIP_CHIP_X3201_3 = 25, /* Xircom X3201-3 */ |
146 | TULIP_CHIP_RS7112 = 26 /* Conexant RS7112 LANfinity */ |
147 | } tulip_chip_t; |
148 | |
149 | #define TULIP_CHIP_NAMES \ |
150 | { \ |
151 | NULL, \ |
152 | "DE-425", \ |
153 | "DECchip 21040", \ |
154 | "DECchip 21041", \ |
155 | "DECchip 21140", \ |
156 | "DECchip 21140A", \ |
157 | "DECchip 21142", \ |
158 | "DECchip 21143", \ |
159 | "Lite-On 82C168", \ |
160 | "Lite-On 82C169", \ |
161 | "Lite-On 82C115", \ |
162 | "Macronix MX98713", \ |
163 | "Macronix MX98713A", \ |
164 | "Macronix MX98715", \ |
165 | "Macronix MX98715A", \ |
166 | "Macronix MX98715AEC-x", \ |
167 | "Macronix MX98725", \ |
168 | "Winbond 89C840F", \ |
169 | "Davicom DM9102", \ |
170 | "Davicom DM9102A", \ |
171 | "ADMtek AL981", \ |
172 | "ADMtek AN983", \ |
173 | "ADMtek AN985", \ |
174 | "ASIX AX88140", \ |
175 | "ASIX AX88141", \ |
176 | "Xircom X3201-3", \ |
177 | "Conexant RS7112", \ |
178 | } |
179 | |
180 | struct tulip_softc; |
181 | |
182 | /* |
183 | * Media init, change, status function pointers. |
184 | */ |
185 | struct tulip_mediasw { |
186 | void (*tmsw_init)(struct tulip_softc *); |
187 | void (*tmsw_get)(struct tulip_softc *, struct ifmediareq *); |
188 | int (*tmsw_set)(struct tulip_softc *); |
189 | }; |
190 | |
191 | /* |
192 | * Table which describes the transmit threshold mode. We generally |
193 | * start at index 0. Whenever we get a transmit underrun, we increment |
194 | * our index, falling back if we encounter the NULL terminator. |
195 | */ |
196 | struct tulip_txthresh_tab { |
197 | uint32_t txth_opmode; /* OPMODE bits */ |
198 | const char *txth_name; /* name of mode */ |
199 | }; |
200 | |
201 | #define TLP_TXTHRESH_TAB_10 { \ |
202 | { OPMODE_TR_72, "72 bytes" }, \ |
203 | { OPMODE_TR_96, "96 bytes" }, \ |
204 | { OPMODE_TR_128, "128 bytes" }, \ |
205 | { OPMODE_TR_160, "160 bytes" }, \ |
206 | { 0, NULL }, \ |
207 | } |
208 | |
209 | #define TLP_TXTHRESH_TAB_10_100 { \ |
210 | { OPMODE_TR_72, "72/128 bytes" }, \ |
211 | { OPMODE_TR_96, "96/256 bytes" }, \ |
212 | { OPMODE_TR_128, "128/512 bytes" }, \ |
213 | { OPMODE_TR_160, "160/1024 bytes" }, \ |
214 | { OPMODE_SF, "store and forward mode" }, \ |
215 | { 0, NULL }, \ |
216 | } |
217 | |
218 | #define TXTH_72 0 |
219 | #define TXTH_96 1 |
220 | #define TXTH_128 2 |
221 | #define TXTH_160 3 |
222 | #define TXTH_SF 4 |
223 | |
224 | #define TLP_TXTHRESH_TAB_DM9102 { \ |
225 | { OPMODE_TR_72, "72/128 bytes" }, \ |
226 | { OPMODE_TR_96, "96/256 bytes" }, \ |
227 | { OPMODE_TR_128, "128/512 bytes" }, \ |
228 | { OPMODE_SF, "store and forward mode" }, \ |
229 | { 0, NULL }, \ |
230 | } |
231 | |
232 | #define TXTH_DM9102_72 0 |
233 | #define TXTH_DM9102_96 1 |
234 | #define TXTH_DM9102_128 2 |
235 | #define TXTH_DM9102_SF 3 |
236 | |
237 | /* |
238 | * The Winbond 89C840F does transmit threshold control totally |
239 | * differently. It simply has a 7-bit field which indicates |
240 | * the threshold: |
241 | * |
242 | * txth = ((OPMODE & OPMODE_WINB_TTH) >> OPMODE_WINB_TTH_SHIFT) * 16; |
243 | * |
244 | * However, we just do Store-and-Forward mode on these chips, since |
245 | * the DMA engines seem to be flaky. |
246 | */ |
247 | #define TLP_TXTHRESH_TAB_WINB { \ |
248 | { 0, "store and forward mode" }, \ |
249 | { 0, NULL }, \ |
250 | } |
251 | |
252 | #define TXTH_WINB_SF 0 |
253 | |
254 | /* |
255 | * Settings for Tulip SIA media. |
256 | */ |
257 | struct tulip_sia_media { |
258 | uint32_t tsm_siaconn; /* CSR13 value */ |
259 | uint32_t tsm_siatxrx; /* CSR14 value */ |
260 | uint32_t tsm_siagen; /* CSR15 value */ |
261 | }; |
262 | |
263 | /* |
264 | * Description of 2x14x media. |
265 | */ |
266 | struct tulip_21x4x_media { |
267 | int tm_type; /* type of media; see tulipreg.h */ |
268 | const char *tm_name; /* name of media */ |
269 | |
270 | void (*tm_get)(struct tulip_softc *, struct ifmediareq *); |
271 | int (*tm_set)(struct tulip_softc *); |
272 | |
273 | int tm_phyno; /* PHY # on MII */ |
274 | |
275 | int tm_gp_length; /* MII select sequence length */ |
276 | int tm_gp_offset; /* MII select sequence offset */ |
277 | |
278 | int tm_reset_length;/* MII reset sequence length */ |
279 | int tm_reset_offset;/* MII reset sequence offset */ |
280 | |
281 | uint32_t tm_opmode; /* OPMODE bits for this media */ |
282 | uint32_t tm_gpctl; /* GPIO control bits for this media */ |
283 | uint32_t tm_gpdata; /* GPIO bits for this media */ |
284 | uint32_t tm_actmask; /* `active' bits for this data */ |
285 | uint32_t tm_actdata; /* active high/low info */ |
286 | |
287 | struct tulip_sia_media tm_sia; /* SIA settings */ |
288 | #define tm_siaconn tm_sia.tsm_siaconn |
289 | #define tm_siatxrx tm_sia.tsm_siatxrx |
290 | #define tm_siagen tm_sia.tsm_siagen |
291 | }; |
292 | |
293 | /* |
294 | * Table for converting Tulip SROM media info into ifmedia data. |
295 | */ |
296 | struct tulip_srom_to_ifmedia { |
297 | uint8_t tsti_srom; /* SROM media type */ |
298 | int tsti_subtype; /* ifmedia subtype */ |
299 | int tsti_options; /* ifmedia options */ |
300 | const char *tsti_name; /* media name */ |
301 | |
302 | uint32_t tsti_opmode; /* OPMODE bits for this media */ |
303 | uint32_t tsti_sia_cap; /* "MII" capabilities for this media */ |
304 | |
305 | /* |
306 | * Settings for 21040, 21041, and 21142/21143 SIA, in the event |
307 | * the SROM doesn't have them. |
308 | */ |
309 | struct tulip_sia_media tsti_21040; |
310 | struct tulip_sia_media tsti_21041; |
311 | struct tulip_sia_media tsti_21142; |
312 | }; |
313 | |
314 | /* |
315 | * Some misc. statics, useful for debugging. |
316 | */ |
317 | struct tulip_stats { |
318 | u_long ts_tx_uf; /* transmit underflow errors */ |
319 | u_long ts_tx_to; /* transmit jabber timeouts */ |
320 | u_long ts_tx_ec; /* excessive collision count */ |
321 | u_long ts_tx_lc; /* late collision count */ |
322 | }; |
323 | |
324 | #ifndef _STANDALONE |
325 | /* |
326 | * Software state per device. |
327 | */ |
328 | struct tulip_softc { |
329 | device_t sc_dev; /* generic device information */ |
330 | bus_space_tag_t sc_st; /* bus space tag */ |
331 | bus_space_handle_t sc_sh; /* bus space handle */ |
332 | bus_dma_tag_t sc_dmat; /* bus DMA tag */ |
333 | struct ethercom sc_ethercom; /* ethernet common data */ |
334 | |
335 | struct tulip_stats sc_stats; /* debugging stats */ |
336 | |
337 | /* |
338 | * Contents of the SROM. |
339 | */ |
340 | uint8_t *sc_srom; |
341 | int sc_srom_addrbits; |
342 | |
343 | /* |
344 | * Media access functions for this chip. |
345 | */ |
346 | const struct tulip_mediasw *sc_mediasw; |
347 | mii_bitbang_ops_t sc_bitbang_ops; |
348 | |
349 | /* |
350 | * For chips with built-in NWay blocks, these are state |
351 | * variables required for autonegotiation. |
352 | */ |
353 | int sc_nway_ticks; /* tick counter */ |
354 | struct ifmedia_entry *sc_nway_active; /* the active media */ |
355 | struct callout sc_nway_callout; |
356 | |
357 | tulip_chip_t sc_chip; /* chip type */ |
358 | int sc_rev; /* chip revision */ |
359 | int sc_flags; /* misc flags. */ |
360 | char sc_name[32]; /* board name */ |
361 | uint32_t sc_cacheline; /* cache line size */ |
362 | uint32_t sc_maxburst; /* maximum burst length */ |
363 | int sc_devno; /* PCI device # */ |
364 | |
365 | struct mii_data sc_mii; /* MII/media information */ |
366 | |
367 | const struct tulip_txthresh_tab *sc_txth; |
368 | int sc_txthresh; /* current transmit threshold */ |
369 | |
370 | uint8_t sc_gp_dir; /* GPIO pin direction bits (21140) */ |
371 | int sc_media_seen; /* ISV media block types seen */ |
372 | int sc_tlp_minst; /* Tulip internal media instance */ |
373 | uint32_t sc_sia_cap; /* SIA media capabilities (21143) */ |
374 | |
375 | /* Reset function. */ |
376 | void (*sc_reset)(struct tulip_softc *); |
377 | |
378 | /* Pre-init function. */ |
379 | void (*sc_preinit)(struct tulip_softc *); |
380 | |
381 | /* Filter setup function. */ |
382 | void (*sc_filter_setup)(struct tulip_softc *); |
383 | |
384 | /* Media status update function. */ |
385 | void (*sc_statchg)(struct ifnet *); |
386 | |
387 | /* Media tick function. */ |
388 | void (*sc_tick)(void *); |
389 | struct callout sc_tick_callout; |
390 | |
391 | /* Power management hooks. */ |
392 | int (*sc_enable)(struct tulip_softc *); |
393 | void (*sc_disable)(struct tulip_softc *); |
394 | void (*sc_power)(struct tulip_softc *, int); |
395 | |
396 | /* |
397 | * The Winbond 89C840F places registers 4 bytes apart, instead |
398 | * of 8. |
399 | */ |
400 | int sc_regshift; |
401 | |
402 | uint32_t sc_busmode; /* copy of CSR_BUSMODE */ |
403 | uint32_t sc_opmode; /* copy of CSR_OPMODE */ |
404 | uint32_t sc_inten; /* copy of CSR_INTEN */ |
405 | |
406 | uint32_t sc_rxint_mask; /* mask of Rx interrupts we want */ |
407 | uint32_t sc_txint_mask; /* mask of Tx interrupts we want */ |
408 | |
409 | uint32_t sc_filtmode; /* filter mode we're using */ |
410 | |
411 | bus_dma_segment_t sc_cdseg; /* control data memory */ |
412 | int sc_cdnseg; /* number of segments */ |
413 | bus_dmamap_t sc_cddmamap; /* control data DMA map */ |
414 | #define sc_cddma sc_cddmamap->dm_segs[0].ds_addr |
415 | |
416 | /* |
417 | * Software state for transmit and receive descriptors. |
418 | */ |
419 | struct tulip_txsoft sc_txsoft[TULIP_TXQUEUELEN]; |
420 | struct tulip_rxsoft sc_rxsoft[TULIP_NRXDESC]; |
421 | |
422 | /* |
423 | * Control data structures. |
424 | */ |
425 | struct tulip_control_data *sc_control_data; |
426 | #define sc_txdescs sc_control_data->tcd_txdescs |
427 | #define sc_rxdescs sc_control_data->tcd_rxdescs |
428 | #define sc_setup_desc sc_control_data->tcd_setup_desc |
429 | |
430 | int sc_txfree; /* number of free Tx descriptors */ |
431 | int sc_txnext; /* next ready Tx descriptor */ |
432 | int sc_ntxsegs; /* number of transmit segs per pkt */ |
433 | |
434 | uint32_t sc_tdctl_ch; /* conditional desc chaining */ |
435 | uint32_t sc_tdctl_er; /* conditional desc end-of-ring */ |
436 | |
437 | uint32_t sc_setup_fsls; /* FS|LS on setup descriptor */ |
438 | |
439 | struct tulip_txsq sc_txfreeq; /* free Tx descsofts */ |
440 | struct tulip_txsq sc_txdirtyq; /* dirty Tx descsofts */ |
441 | |
442 | short sc_if_flags; |
443 | |
444 | int sc_rxptr; /* next ready RX descriptor/descsoft */ |
445 | |
446 | krndsource_t sc_rnd_source; /* random source */ |
447 | }; |
448 | #endif |
449 | |
450 | /* sc_flags */ |
451 | #define TULIPF_WANT_SETUP 0x00000001 /* want filter setup */ |
452 | #define TULIPF_DOING_SETUP 0x00000002 /* doing multicast setup */ |
453 | #define TULIPF_HAS_MII 0x00000004 /* has media on MII */ |
454 | #define TULIPF_IC_FS 0x00000008 /* IC bit on first tx seg */ |
455 | #define TULIPF_MRL 0x00000010 /* memory read line okay */ |
456 | #define TULIPF_MRM 0x00000020 /* memory read multi okay */ |
457 | #define TULIPF_MWI 0x00000040 /* memory write inval okay */ |
458 | #define TULIPF_AUTOPOLL 0x00000080 /* chip supports auto-poll */ |
459 | #define TULIPF_LINK_UP 0x00000100 /* link is up (non-MII) */ |
460 | #define TULIPF_LINK_VALID 0x00000200 /* link state valid */ |
461 | #define TULIPF_DOINGAUTO 0x00000400 /* doing autoneg (non-MII) */ |
462 | #define TULIPF_ATTACHED 0x00000800 /* attach has succeeded */ |
463 | #define TULIPF_ENABLED 0x00001000 /* chip is enabled */ |
464 | #define TULIPF_BLE 0x00002000 /* data is big endian */ |
465 | #define TULIPF_DBO 0x00004000 /* descriptor is big endian */ |
466 | #define TULIPF_VPC 0x00008000 /* Virtual PC Ethernet */ |
467 | |
468 | #define TULIP_IS_ENABLED(sc) ((sc)->sc_flags & TULIPF_ENABLED) |
469 | |
470 | /* |
471 | * This macro returns the current media entry. |
472 | */ |
473 | #define TULIP_CURRENT_MEDIA(sc) ((sc)->sc_mii.mii_media.ifm_cur) |
474 | |
475 | /* |
476 | * This macro determines if a change to media-related OPMODE bits requires |
477 | * a chip reset. |
478 | */ |
479 | #define TULIP_MEDIA_NEEDSRESET(sc, newbits) \ |
480 | (((sc)->sc_opmode & OPMODE_MEDIA_BITS) != \ |
481 | ((newbits) & OPMODE_MEDIA_BITS)) |
482 | |
483 | #define TULIP_CDTXADDR(sc, x) ((sc)->sc_cddma + TULIP_CDTXOFF((x))) |
484 | #define TULIP_CDRXADDR(sc, x) ((sc)->sc_cddma + TULIP_CDRXOFF((x))) |
485 | |
486 | #define TULIP_CDSPADDR(sc) ((sc)->sc_cddma + TULIP_CDSPOFF) |
487 | |
488 | #define TULIP_CDSP(sc) ((sc)->sc_control_data->tcd_setup_packet) |
489 | |
490 | #define TULIP_CDTXSYNC(sc, x, n, ops) \ |
491 | do { \ |
492 | int __x, __n; \ |
493 | \ |
494 | __x = (x); \ |
495 | __n = (n); \ |
496 | \ |
497 | /* If it will wrap around, sync to the end of the ring. */ \ |
498 | if ((__x + __n) > TULIP_NTXDESC) { \ |
499 | bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \ |
500 | TULIP_CDTXOFF(__x), sizeof(struct tulip_desc) * \ |
501 | (TULIP_NTXDESC - __x), (ops)); \ |
502 | __n -= (TULIP_NTXDESC - __x); \ |
503 | __x = 0; \ |
504 | } \ |
505 | \ |
506 | /* Now sync whatever is left. */ \ |
507 | bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \ |
508 | TULIP_CDTXOFF(__x), sizeof(struct tulip_desc) * __n, (ops)); \ |
509 | } while (0) |
510 | |
511 | #define TULIP_CDRXSYNC(sc, x, ops) \ |
512 | bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \ |
513 | TULIP_CDRXOFF((x)), sizeof(struct tulip_desc), (ops)) |
514 | |
515 | #define TULIP_CDSPSYNC(sc, ops) \ |
516 | bus_dmamap_sync((sc)->sc_dmat, (sc)->sc_cddmamap, \ |
517 | TULIP_CDSPOFF, TULIP_SETUP_PACKET_LEN, (ops)) |
518 | |
519 | /* |
520 | * Note we rely on MCLBYTES being a power of two. Because the `length' |
521 | * field is only 11 bits, we must subtract 1 from the length to avoid |
522 | * having it truncated to 0! |
523 | */ |
524 | #define TULIP_INIT_RXDESC(sc, x) \ |
525 | do { \ |
526 | struct tulip_rxsoft *__rxs = &sc->sc_rxsoft[(x)]; \ |
527 | struct tulip_desc *__rxd = &sc->sc_rxdescs[(x)]; \ |
528 | struct mbuf *__m = __rxs->rxs_mbuf; \ |
529 | \ |
530 | __m->m_data = __m->m_ext.ext_buf; \ |
531 | __rxd->td_bufaddr1 = \ |
532 | htole32(__rxs->rxs_dmamap->dm_segs[0].ds_addr); \ |
533 | __rxd->td_bufaddr2 = \ |
534 | htole32(TULIP_CDRXADDR((sc), TULIP_NEXTRX((x)))); \ |
535 | __rxd->td_ctl = \ |
536 | htole32((((__m->m_ext.ext_size - 1) & ~0x3U) \ |
537 | << TDCTL_SIZE1_SHIFT) | (sc)->sc_tdctl_ch | \ |
538 | ((x) == (TULIP_NRXDESC - 1) ? sc->sc_tdctl_er : 0)); \ |
539 | __rxd->td_status = htole32(TDSTAT_OWN|TDSTAT_Rx_FS|TDSTAT_Rx_LS); \ |
540 | TULIP_CDRXSYNC((sc), (x), BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); \ |
541 | } while (0) |
542 | |
543 | /* CSR access */ |
544 | #define TULIP_CSR_OFFSET(sc, csr) \ |
545 | (TULIP_CSR_INDEX(csr) << (sc)->sc_regshift) |
546 | |
547 | #define TULIP_READ(sc, reg) \ |
548 | bus_space_read_4((sc)->sc_st, (sc)->sc_sh, \ |
549 | TULIP_CSR_OFFSET((sc), (reg))) |
550 | |
551 | #define TULIP_WRITE(sc, reg, val) \ |
552 | bus_space_write_4((sc)->sc_st, (sc)->sc_sh, \ |
553 | TULIP_CSR_OFFSET((sc), (reg)), (val)) |
554 | |
555 | #define TULIP_SET(sc, reg, mask) \ |
556 | TULIP_WRITE((sc), (reg), TULIP_READ((sc), (reg)) | (mask)) |
557 | |
558 | #define TULIP_CLR(sc, reg, mask) \ |
559 | TULIP_WRITE((sc), (reg), TULIP_READ((sc), (reg)) & ~(mask)) |
560 | |
561 | #define TULIP_ISSET(sc, reg, mask) \ |
562 | (TULIP_READ((sc), (reg)) & (mask)) |
563 | |
564 | #define TULIP_SP_FIELD_C(a, b) ((b) << 8 | (a)) |
565 | #define TULIP_SP_FIELD(x, f) TULIP_SP_FIELD_C((x)[f * 2], (x)[f * 2 + 1]) |
566 | |
567 | #ifdef _KERNEL |
568 | extern const struct tulip_mediasw tlp_21040_mediasw; |
569 | extern const struct tulip_mediasw tlp_21040_tp_mediasw; |
570 | extern const struct tulip_mediasw tlp_21040_auibnc_mediasw; |
571 | extern const struct tulip_mediasw tlp_21041_mediasw; |
572 | extern const struct tulip_mediasw tlp_2114x_isv_mediasw; |
573 | extern const struct tulip_mediasw tlp_sio_mii_mediasw; |
574 | extern const struct tulip_mediasw tlp_pnic_mediasw; |
575 | extern const struct tulip_mediasw tlp_pmac_mediasw; |
576 | extern const struct tulip_mediasw tlp_al981_mediasw; |
577 | extern const struct tulip_mediasw tlp_an985_mediasw; |
578 | extern const struct tulip_mediasw tlp_dm9102_mediasw; |
579 | extern const struct tulip_mediasw tlp_asix_mediasw; |
580 | extern const struct tulip_mediasw tlp_rs7112_mediasw; |
581 | |
582 | int tlp_attach(struct tulip_softc *, const uint8_t *); |
583 | int tlp_activate(device_t, enum devact); |
584 | int tlp_detach(struct tulip_softc *); |
585 | int tlp_intr(void *); |
586 | int tlp_read_srom(struct tulip_softc *); |
587 | int tlp_srom_crcok(const uint8_t *); |
588 | int tlp_isv_srom(const uint8_t *); |
589 | int tlp_isv_srom_enaddr(struct tulip_softc *, uint8_t *); |
590 | int tlp_parse_old_srom(struct tulip_softc *, uint8_t *); |
591 | void tlp_reset(struct tulip_softc *); |
592 | void tlp_idle(struct tulip_softc *, uint32_t); |
593 | |
594 | int tlp_mediachange(struct ifnet *); |
595 | void tlp_mediastatus(struct ifnet *, struct ifmediareq *); |
596 | |
597 | void tlp_21140_gpio_get(struct tulip_softc *sc, struct ifmediareq *ifmr); |
598 | int tlp_21140_gpio_set(struct tulip_softc *sc); |
599 | const char *tlp_chip_name(tulip_chip_t); |
600 | |
601 | #endif /* _KERNEL */ |
602 | |
603 | #endif /* _DEV_IC_TULIPVAR_H_ */ |
604 | |