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