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