1 /*        $NetBSD: tulipvar.h,v 1.70 2019/09/13 07:55:06 msaitoh 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           u_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