| 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 | |