1 1.44 thorpej /* $NetBSD: if_ae_nubus.c,v 1.44 2023/12/20 00:40:43 thorpej Exp $ */ 2 1.1 scottr 3 1.1 scottr /* 4 1.1 scottr * Copyright (C) 1997 Scott Reynolds 5 1.1 scottr * All rights reserved. 6 1.1 scottr * 7 1.1 scottr * Redistribution and use in source and binary forms, with or without 8 1.1 scottr * modification, are permitted provided that the following conditions 9 1.1 scottr * are met: 10 1.1 scottr * 1. Redistributions of source code must retain the above copyright 11 1.1 scottr * notice, this list of conditions and the following disclaimer. 12 1.1 scottr * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 scottr * notice, this list of conditions and the following disclaimer in the 14 1.1 scottr * documentation and/or other materials provided with the distribution. 15 1.21 scottr * 3. The name of the author may not be used to endorse or promote products 16 1.1 scottr * derived from this software without specific prior written permission. 17 1.1 scottr * 18 1.1 scottr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19 1.1 scottr * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20 1.1 scottr * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21 1.1 scottr * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22 1.1 scottr * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23 1.1 scottr * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 1.1 scottr * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 1.1 scottr * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 1.1 scottr * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 1.1 scottr * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 1.1 scottr */ 29 1.11 scottr /* 30 1.11 scottr * Some parts are derived from code adapted for MacBSD by Brad Parker 31 1.11 scottr * <brad (at) fcr.com>. 32 1.11 scottr * 33 1.11 scottr * Currently supports: 34 1.11 scottr * Apple NB Ethernet Card 35 1.11 scottr * Apple NB Ethernet Card II 36 1.11 scottr * Interlan A310 NuBus Ethernet card 37 1.11 scottr * Cayman Systems GatorCard 38 1.11 scottr * Asante MacCon II/E 39 1.11 scottr * Kinetics EtherPort SE/30 40 1.11 scottr */ 41 1.34 lukem 42 1.34 lukem #include <sys/cdefs.h> 43 1.44 thorpej __KERNEL_RCSID(0, "$NetBSD: if_ae_nubus.c,v 1.44 2023/12/20 00:40:43 thorpej Exp $"); 44 1.1 scottr 45 1.1 scottr #include <sys/param.h> 46 1.1 scottr #include <sys/device.h> 47 1.1 scottr #include <sys/errno.h> 48 1.1 scottr #include <sys/ioctl.h> 49 1.1 scottr #include <sys/socket.h> 50 1.4 scottr #include <sys/syslog.h> 51 1.1 scottr #include <sys/systm.h> 52 1.1 scottr 53 1.1 scottr #include <net/if.h> 54 1.24 thorpej #include <net/if_media.h> 55 1.7 is #include <net/if_ether.h> 56 1.1 scottr 57 1.1 scottr #include <machine/bus.h> 58 1.1 scottr #include <machine/viareg.h> 59 1.1 scottr 60 1.1 scottr #include <dev/ic/dp8390reg.h> 61 1.14 scottr #include <dev/ic/dp8390var.h> 62 1.26 scottr #include <mac68k/nubus/nubus.h> 63 1.19 scottr #include <mac68k/dev/if_aevar.h> 64 1.19 scottr #include <mac68k/dev/if_aereg.h> 65 1.1 scottr 66 1.41 tsutsui static int ae_nubus_match(device_t, cfdata_t, void *); 67 1.41 tsutsui static void ae_nubus_attach(device_t, device_t, void *); 68 1.35 chs static int ae_nb_card_vendor(bus_space_tag_t, bus_space_handle_t, 69 1.35 chs struct nubus_attach_args *); 70 1.35 chs static int ae_nb_get_enaddr(bus_space_tag_t, bus_space_handle_t, 71 1.35 chs struct nubus_attach_args *, u_int8_t *); 72 1.11 scottr #ifdef DEBUG 73 1.35 chs static void ae_nb_watchdog(struct ifnet *); 74 1.11 scottr #endif 75 1.1 scottr 76 1.35 chs void ae_nubus_intr(void *); 77 1.22 thorpej 78 1.41 tsutsui CFATTACH_DECL_NEW(ae_nubus, sizeof(struct dp8390_softc), 79 1.33 thorpej ae_nubus_match, ae_nubus_attach, NULL, NULL); 80 1.1 scottr 81 1.1 scottr static int 82 1.41 tsutsui ae_nubus_match(device_t parent, cfdata_t cf, void *aux) 83 1.1 scottr { 84 1.41 tsutsui struct nubus_attach_args *na = aux; 85 1.1 scottr bus_space_handle_t bsh; 86 1.1 scottr int rv; 87 1.1 scottr 88 1.1 scottr if (bus_space_map(na->na_tag, NUBUS_SLOT2PA(na->slot), NBMEMSIZE, 89 1.1 scottr 0, &bsh)) 90 1.1 scottr return (0); 91 1.1 scottr 92 1.1 scottr rv = 0; 93 1.1 scottr 94 1.1 scottr if (na->category == NUBUS_CATEGORY_NETWORK && 95 1.1 scottr na->type == NUBUS_TYPE_ETHERNET) { 96 1.18 scottr switch (ae_nb_card_vendor(na->na_tag, bsh, na)) { 97 1.14 scottr case DP8390_VENDOR_APPLE: 98 1.14 scottr case DP8390_VENDOR_ASANTE: 99 1.14 scottr case DP8390_VENDOR_FARALLON: 100 1.14 scottr case DP8390_VENDOR_INTERLAN: 101 1.14 scottr case DP8390_VENDOR_KINETICS: 102 1.27 scottr case DP8390_VENDOR_CABLETRON: 103 1.1 scottr rv = 1; 104 1.1 scottr break; 105 1.14 scottr case DP8390_VENDOR_DAYNA: 106 1.1 scottr rv = UNSUPP; 107 1.1 scottr break; 108 1.1 scottr default: 109 1.1 scottr break; 110 1.1 scottr } 111 1.1 scottr } 112 1.1 scottr 113 1.1 scottr bus_space_unmap(na->na_tag, bsh, NBMEMSIZE); 114 1.1 scottr 115 1.1 scottr return rv; 116 1.1 scottr } 117 1.1 scottr 118 1.1 scottr /* 119 1.1 scottr * Install interface into kernel networking data structures 120 1.1 scottr */ 121 1.1 scottr static void 122 1.41 tsutsui ae_nubus_attach(device_t parent, device_t self, void *aux) 123 1.1 scottr { 124 1.41 tsutsui struct dp8390_softc *sc = device_private(self); 125 1.41 tsutsui struct nubus_attach_args *na = aux; 126 1.11 scottr #ifdef DEBUG 127 1.7 is struct ifnet *ifp = &sc->sc_ec.ec_if; 128 1.11 scottr #endif 129 1.1 scottr bus_space_tag_t bst; 130 1.1 scottr bus_space_handle_t bsh; 131 1.11 scottr int i, success; 132 1.36 rjs const char *cardtype; 133 1.1 scottr 134 1.41 tsutsui sc->sc_dev = self; 135 1.1 scottr bst = na->na_tag; 136 1.1 scottr if (bus_space_map(bst, NUBUS_SLOT2PA(na->slot), NBMEMSIZE, 137 1.1 scottr 0, &bsh)) { 138 1.41 tsutsui aprint_error(": can't map memory space\n"); 139 1.1 scottr return; 140 1.1 scottr } 141 1.1 scottr 142 1.4 scottr sc->sc_regt = sc->sc_buft = bst; 143 1.38 thorpej sc->sc_flags = device_cfdata(self)->cf_flags; 144 1.14 scottr 145 1.18 scottr cardtype = nubus_get_card_name(bst, bsh, na->fmt); 146 1.14 scottr 147 1.14 scottr sc->is790 = 0; 148 1.14 scottr 149 1.14 scottr sc->mem_start = 0; 150 1.1 scottr sc->mem_size = 0; 151 1.1 scottr 152 1.1 scottr success = 0; 153 1.1 scottr 154 1.23 briggs switch (ae_nb_card_vendor(bst, bsh, na)) { 155 1.14 scottr case DP8390_VENDOR_APPLE: /* Apple-compatible cards */ 156 1.14 scottr case DP8390_VENDOR_ASANTE: 157 1.11 scottr /* Map register offsets */ 158 1.11 scottr for (i = 0; i < 16; i++) /* reverse order, longword aligned */ 159 1.11 scottr sc->sc_reg_map[i] = (15 - i) << 2; 160 1.11 scottr 161 1.16 scottr sc->dcr_reg = (ED_DCR_FT1 | ED_DCR_WTS | ED_DCR_LS); 162 1.1 scottr if (bus_space_subregion(bst, bsh, 163 1.4 scottr AE_REG_OFFSET, AE_REG_SIZE, &sc->sc_regh)) { 164 1.41 tsutsui aprint_error(": failed to map register space\n"); 165 1.1 scottr break; 166 1.1 scottr } 167 1.1 scottr if ((sc->mem_size = ae_size_card_memory(bst, bsh, 168 1.1 scottr AE_DATA_OFFSET)) == 0) { 169 1.41 tsutsui aprint_error(": failed to determine size of RAM.\n"); 170 1.1 scottr break; 171 1.1 scottr } 172 1.1 scottr if (bus_space_subregion(bst, bsh, 173 1.4 scottr AE_DATA_OFFSET, sc->mem_size, &sc->sc_bufh)) { 174 1.41 tsutsui aprint_error(": failed to map register space\n"); 175 1.1 scottr break; 176 1.1 scottr } 177 1.3 scottr #ifdef AE_OLD_GET_ENADDR 178 1.1 scottr /* Get station address from on-board ROM */ 179 1.1 scottr for (i = 0; i < ETHER_ADDR_LEN; ++i) 180 1.14 scottr sc->sc_enaddr[i] = 181 1.1 scottr bus_space_read_1(bst, bsh, (AE_ROM_OFFSET + i * 2)); 182 1.3 scottr #else 183 1.18 scottr if (ae_nb_get_enaddr(bst, bsh, na, sc->sc_enaddr)) { 184 1.41 tsutsui aprint_error(": can't find MAC address\n"); 185 1.3 scottr break; 186 1.3 scottr } 187 1.3 scottr #endif 188 1.1 scottr 189 1.1 scottr success = 1; 190 1.1 scottr break; 191 1.1 scottr 192 1.14 scottr case DP8390_VENDOR_DAYNA: 193 1.11 scottr /* Map register offsets */ 194 1.11 scottr for (i = 0; i < 16; i++) /* normal order, longword aligned */ 195 1.11 scottr sc->sc_reg_map[i] = i << 2; 196 1.11 scottr 197 1.16 scottr sc->dcr_reg = (ED_DCR_FT1 | ED_DCR_WTS | ED_DCR_LS); 198 1.1 scottr if (bus_space_subregion(bst, bsh, 199 1.4 scottr DP_REG_OFFSET, AE_REG_SIZE, &sc->sc_regh)) { 200 1.41 tsutsui aprint_error(": failed to map register space\n"); 201 1.1 scottr break; 202 1.1 scottr } 203 1.1 scottr sc->mem_size = 8192; 204 1.1 scottr if (bus_space_subregion(bst, bsh, 205 1.4 scottr DP_DATA_OFFSET, sc->mem_size, &sc->sc_bufh)) { 206 1.41 tsutsui aprint_error(": failed to map register space\n"); 207 1.1 scottr break; 208 1.1 scottr } 209 1.3 scottr #ifdef AE_OLD_GET_ENADDR 210 1.1 scottr /* Get station address from on-board ROM */ 211 1.1 scottr for (i = 0; i < ETHER_ADDR_LEN; ++i) 212 1.14 scottr sc->sc_enaddr[i] = 213 1.1 scottr bus_space_read_1(bst, bsh, (DP_ROM_OFFSET + i * 2)); 214 1.3 scottr #else 215 1.18 scottr if (ae_nb_get_enaddr(bst, bsh, na, sc->sc_enaddr)) { 216 1.41 tsutsui aprint_error(": can't find MAC address\n"); 217 1.3 scottr break; 218 1.3 scottr } 219 1.3 scottr #endif 220 1.1 scottr 221 1.41 tsutsui aprint_error(": unsupported Dayna hardware\n"); 222 1.1 scottr break; 223 1.1 scottr 224 1.14 scottr case DP8390_VENDOR_FARALLON: 225 1.11 scottr /* Map register offsets */ 226 1.11 scottr for (i = 0; i < 16; i++) /* reverse order, longword aligned */ 227 1.11 scottr sc->sc_reg_map[i] = (15 - i) << 2; 228 1.11 scottr 229 1.16 scottr sc->dcr_reg = (ED_DCR_FT1 | ED_DCR_WTS | ED_DCR_LS); 230 1.1 scottr if (bus_space_subregion(bst, bsh, 231 1.4 scottr AE_REG_OFFSET, AE_REG_SIZE, &sc->sc_regh)) { 232 1.41 tsutsui aprint_error(": failed to map register space\n"); 233 1.1 scottr break; 234 1.1 scottr } 235 1.1 scottr if ((sc->mem_size = ae_size_card_memory(bst, bsh, 236 1.1 scottr AE_DATA_OFFSET)) == 0) { 237 1.41 tsutsui aprint_error(": failed to determine size of RAM.\n"); 238 1.1 scottr break; 239 1.1 scottr } 240 1.1 scottr if (bus_space_subregion(bst, bsh, 241 1.4 scottr AE_DATA_OFFSET, sc->mem_size, &sc->sc_bufh)) { 242 1.41 tsutsui aprint_error(": failed to map register space\n"); 243 1.1 scottr break; 244 1.1 scottr } 245 1.3 scottr #ifdef AE_OLD_GET_ENADDR 246 1.1 scottr /* Get station address from on-board ROM */ 247 1.1 scottr for (i = 0; i < ETHER_ADDR_LEN; ++i) 248 1.14 scottr sc->sc_enaddr[i] = 249 1.1 scottr bus_space_read_1(bst, bsh, (FE_ROM_OFFSET + i)); 250 1.6 scottr #else 251 1.18 scottr if (ae_nb_get_enaddr(bst, bsh, na, sc->sc_enaddr)) { 252 1.41 tsutsui aprint_error(": can't find MAC address\n"); 253 1.6 scottr break; 254 1.6 scottr } 255 1.3 scottr #endif 256 1.1 scottr 257 1.1 scottr success = 1; 258 1.1 scottr break; 259 1.1 scottr 260 1.14 scottr case DP8390_VENDOR_INTERLAN: 261 1.11 scottr /* Map register offsets */ 262 1.11 scottr for (i = 0; i < 16; i++) /* normal order, longword aligned */ 263 1.11 scottr sc->sc_reg_map[i] = i << 2; 264 1.11 scottr 265 1.16 scottr sc->dcr_reg = (ED_DCR_FT1 | ED_DCR_WTS | ED_DCR_LS); 266 1.2 scottr if (bus_space_subregion(bst, bsh, 267 1.4 scottr GC_REG_OFFSET, AE_REG_SIZE, &sc->sc_regh)) { 268 1.41 tsutsui aprint_error(": failed to map register space\n"); 269 1.2 scottr break; 270 1.2 scottr } 271 1.2 scottr if ((sc->mem_size = ae_size_card_memory(bst, bsh, 272 1.3 scottr GC_DATA_OFFSET)) == 0) { 273 1.41 tsutsui aprint_error(": failed to determine size of RAM.\n"); 274 1.2 scottr break; 275 1.2 scottr } 276 1.2 scottr if (bus_space_subregion(bst, bsh, 277 1.4 scottr GC_DATA_OFFSET, sc->mem_size, &sc->sc_bufh)) { 278 1.41 tsutsui aprint_error(": failed to map register space\n"); 279 1.2 scottr break; 280 1.2 scottr } 281 1.2 scottr 282 1.3 scottr /* reset the NIC chip */ 283 1.3 scottr bus_space_write_1(bst, bsh, GC_RESET_OFFSET, 0); 284 1.3 scottr 285 1.18 scottr if (ae_nb_get_enaddr(bst, bsh, na, sc->sc_enaddr)) { 286 1.9 scottr /* Fall back to snarf directly from ROM. Ick. */ 287 1.9 scottr for (i = 0; i < ETHER_ADDR_LEN; ++i) 288 1.14 scottr sc->sc_enaddr[i] = 289 1.9 scottr bus_space_read_1(bst, bsh, 290 1.9 scottr (GC_ROM_OFFSET + i * 4)); 291 1.2 scottr } 292 1.2 scottr 293 1.2 scottr success = 1; 294 1.2 scottr break; 295 1.2 scottr 296 1.14 scottr case DP8390_VENDOR_KINETICS: 297 1.11 scottr /* Map register offsets */ 298 1.11 scottr for (i = 0; i < 16; i++) /* normal order, longword aligned */ 299 1.11 scottr sc->sc_reg_map[i] = i << 2; 300 1.11 scottr 301 1.3 scottr if (bus_space_subregion(bst, bsh, 302 1.4 scottr KE_REG_OFFSET, AE_REG_SIZE, &sc->sc_regh)) { 303 1.41 tsutsui aprint_error(": failed to map register space\n"); 304 1.3 scottr break; 305 1.3 scottr } 306 1.3 scottr if ((sc->mem_size = ae_size_card_memory(bst, bsh, 307 1.3 scottr KE_DATA_OFFSET)) == 0) { 308 1.41 tsutsui aprint_error(": failed to determine size of RAM.\n"); 309 1.3 scottr break; 310 1.3 scottr } 311 1.3 scottr if (bus_space_subregion(bst, bsh, 312 1.4 scottr KE_DATA_OFFSET, sc->mem_size, &sc->sc_bufh)) { 313 1.41 tsutsui aprint_error(": failed to map register space\n"); 314 1.3 scottr break; 315 1.3 scottr } 316 1.18 scottr if (ae_nb_get_enaddr(bst, bsh, na, sc->sc_enaddr)) { 317 1.41 tsutsui aprint_error(": can't find MAC address\n"); 318 1.3 scottr break; 319 1.3 scottr } 320 1.3 scottr 321 1.3 scottr success = 1; 322 1.3 scottr break; 323 1.3 scottr 324 1.27 scottr case DP8390_VENDOR_CABLETRON: 325 1.27 scottr /* Map register offsets */ 326 1.27 scottr for (i = 0; i < 16; i++) 327 1.27 scottr sc->sc_reg_map[i] = i << 1 ; /* normal order, word aligned */ 328 1.27 scottr sc->dcr_reg = (ED_DCR_FT1 | ED_DCR_WTS | ED_DCR_LS); 329 1.27 scottr if (bus_space_subregion(bst, bsh, 330 1.27 scottr CT_REG_OFFSET, AE_REG_SIZE, &sc->sc_regh)) { 331 1.41 tsutsui aprint_error(": failed to map register space\n"); 332 1.27 scottr break; 333 1.27 scottr } 334 1.27 scottr if ((sc->mem_size = ae_size_card_memory(bst, bsh, 335 1.27 scottr CT_DATA_OFFSET)) == 0) { 336 1.41 tsutsui aprint_error(": failed to determine size of RAM.\n"); 337 1.27 scottr break; 338 1.27 scottr } 339 1.27 scottr if (bus_space_subregion(bst, bsh, 340 1.27 scottr CT_DATA_OFFSET, sc->mem_size, &sc->sc_bufh)) { 341 1.41 tsutsui aprint_error(": failed to map register space\n"); 342 1.27 scottr break; 343 1.27 scottr } 344 1.27 scottr if (ae_nb_get_enaddr(bst, bsh, na, sc->sc_enaddr)) { 345 1.41 tsutsui aprint_error(": can't find MAC address\n"); 346 1.27 scottr break; 347 1.27 scottr } 348 1.27 scottr success = 1; 349 1.27 scottr break; 350 1.1 scottr default: 351 1.1 scottr break; 352 1.1 scottr } 353 1.1 scottr 354 1.1 scottr if (!success) { 355 1.1 scottr bus_space_unmap(bst, bsh, NBMEMSIZE); 356 1.1 scottr return; 357 1.1 scottr } 358 1.1 scottr 359 1.14 scottr /* 360 1.14 scottr * Override test_mem and write_mbuf functions; other defaults 361 1.14 scottr * already work properly. 362 1.14 scottr */ 363 1.14 scottr sc->test_mem = ae_test_mem; 364 1.14 scottr sc->write_mbuf = ae_write_mbuf; 365 1.11 scottr #ifdef DEBUG 366 1.4 scottr ifp->if_watchdog = ae_nb_watchdog; /* Override watchdog */ 367 1.11 scottr #endif 368 1.31 thorpej sc->sc_media_init = dp8390_media_init; 369 1.14 scottr 370 1.22 thorpej /* Interface is always enabled. */ 371 1.22 thorpej sc->sc_enabled = 1; 372 1.22 thorpej 373 1.41 tsutsui aprint_normal(": %s, %dKB memory\n", cardtype, sc->mem_size / 1024); 374 1.22 thorpej 375 1.31 thorpej if (dp8390_config(sc)) { 376 1.5 scottr bus_space_unmap(bst, bsh, NBMEMSIZE); 377 1.5 scottr return; 378 1.5 scottr } 379 1.1 scottr 380 1.22 thorpej /* make sure interrupts are vectored to us */ 381 1.22 thorpej add_nubus_intr(na->slot, ae_nubus_intr, sc); 382 1.22 thorpej } 383 1.22 thorpej 384 1.22 thorpej void 385 1.35 chs ae_nubus_intr(void *arg) 386 1.22 thorpej { 387 1.41 tsutsui struct dp8390_softc *sc = arg; 388 1.43 skrll 389 1.25 scottr (void)dp8390_intr(sc); 390 1.1 scottr } 391 1.1 scottr 392 1.1 scottr static int 393 1.35 chs ae_nb_card_vendor(bus_space_tag_t bst, bus_space_handle_t bsh, 394 1.35 chs struct nubus_attach_args *na) 395 1.1 scottr { 396 1.1 scottr int vendor; 397 1.1 scottr 398 1.1 scottr switch (na->drsw) { 399 1.1 scottr case NUBUS_DRSW_3COM: 400 1.12 briggs switch (na->drhw) { 401 1.12 briggs case NUBUS_DRHW_APPLE_SN: 402 1.17 briggs case NUBUS_DRHW_APPLE_SNT: 403 1.14 scottr vendor = DP8390_VENDOR_UNKNOWN; 404 1.12 briggs break; 405 1.12 briggs default: 406 1.14 scottr vendor = DP8390_VENDOR_APPLE; 407 1.12 briggs break; 408 1.12 briggs } 409 1.12 briggs break; 410 1.1 scottr case NUBUS_DRSW_APPLE: 411 1.29 scottr if (na->drhw == NUBUS_DRHW_ASANTE_LC) { 412 1.29 scottr vendor = DP8390_VENDOR_UNKNOWN; 413 1.29 scottr break; 414 1.29 scottr } 415 1.29 scottr /* FALLTHROUGH */ 416 1.20 briggs case NUBUS_DRSW_DAYNA2: 417 1.1 scottr case NUBUS_DRSW_TECHWORKS: 418 1.28 scottr case NUBUS_DRSW_TFLLAN: 419 1.27 scottr if (na->drhw == NUBUS_DRHW_CABLETRON) { 420 1.27 scottr vendor = DP8390_VENDOR_CABLETRON; 421 1.27 scottr } else { 422 1.27 scottr vendor = DP8390_VENDOR_APPLE; 423 1.27 scottr } 424 1.1 scottr break; 425 1.1 scottr case NUBUS_DRSW_ASANTE: 426 1.14 scottr vendor = DP8390_VENDOR_ASANTE; 427 1.1 scottr break; 428 1.1 scottr case NUBUS_DRSW_FARALLON: 429 1.14 scottr vendor = DP8390_VENDOR_FARALLON; 430 1.1 scottr break; 431 1.1 scottr case NUBUS_DRSW_GATOR: 432 1.1 scottr switch (na->drhw) { 433 1.1 scottr default: 434 1.1 scottr case NUBUS_DRHW_INTERLAN: 435 1.14 scottr vendor = DP8390_VENDOR_INTERLAN; 436 1.1 scottr break; 437 1.1 scottr case NUBUS_DRHW_KINETICS: 438 1.18 scottr if (strncmp(nubus_get_card_name(bst, bsh, na->fmt), 439 1.18 scottr "EtherPort", 9) == 0) 440 1.14 scottr vendor = DP8390_VENDOR_KINETICS; 441 1.2 scottr else 442 1.14 scottr vendor = DP8390_VENDOR_DAYNA; 443 1.1 scottr break; 444 1.1 scottr } 445 1.1 scottr break; 446 1.1 scottr default: 447 1.14 scottr vendor = DP8390_VENDOR_UNKNOWN; 448 1.1 scottr } 449 1.1 scottr return vendor; 450 1.3 scottr } 451 1.3 scottr 452 1.3 scottr static int 453 1.35 chs ae_nb_get_enaddr(bus_space_tag_t bst, bus_space_handle_t bsh, 454 1.35 chs struct nubus_attach_args *na, u_int8_t *ep) 455 1.3 scottr { 456 1.3 scottr nubus_dir dir; 457 1.3 scottr nubus_dirent dirent; 458 1.28 scottr int rv; 459 1.3 scottr 460 1.3 scottr /* 461 1.28 scottr * XXX - note hardwired resource IDs here; these are assumed to 462 1.28 scottr * be used by all cards, but should be fixed when we find out 463 1.28 scottr * more about Ethernet card resources. 464 1.3 scottr */ 465 1.3 scottr nubus_get_main_dir(na->fmt, &dir); 466 1.28 scottr switch (ae_nb_card_vendor(bst, bsh, na)) { 467 1.28 scottr case DP8390_VENDOR_APPLE: 468 1.28 scottr if (na->drsw == NUBUS_DRSW_TFLLAN) { /* TFL LAN E410/E420 */ 469 1.28 scottr rv = nubus_find_rsrc(bst, bsh, na->fmt, 470 1.28 scottr &dir, 0x08, &dirent); 471 1.28 scottr break; 472 1.28 scottr } 473 1.28 scottr /*FALLTHROUGH*/ 474 1.28 scottr default: 475 1.28 scottr rv = nubus_find_rsrc(bst, bsh, na->fmt, &dir, 0x80, &dirent); 476 1.28 scottr break; 477 1.28 scottr } 478 1.28 scottr if (rv <= 0) 479 1.3 scottr return 1; 480 1.3 scottr nubus_get_dir_from_rsrc(na->fmt, &dirent, &dir); 481 1.18 scottr if (nubus_find_rsrc(bst, bsh, na->fmt, &dir, 0x80, &dirent) <= 0) 482 1.3 scottr return 1; 483 1.18 scottr if (nubus_get_ind_data(bst, bsh, 484 1.18 scottr na->fmt, &dirent, ep, ETHER_ADDR_LEN) <= 0) 485 1.3 scottr return 1; 486 1.3 scottr 487 1.3 scottr return 0; 488 1.4 scottr } 489 1.4 scottr 490 1.11 scottr #ifdef DEBUG 491 1.4 scottr static void 492 1.35 chs ae_nb_watchdog(struct ifnet *ifp) 493 1.4 scottr { 494 1.14 scottr struct dp8390_softc *sc = ifp->if_softc; 495 1.4 scottr 496 1.4 scottr /* 497 1.4 scottr * This is a kludge! The via code seems to miss slot interrupts 498 1.4 scottr * sometimes. This kludges around that by calling the handler 499 1.4 scottr * by hand if the watchdog is activated. -- XXX (akb) 500 1.4 scottr */ 501 1.25 scottr (*via2itab[1])((void *)1); 502 1.4 scottr 503 1.40 hauke log(LOG_ERR, "%s: device timeout\n", device_xname(sc->sc_dev)); 504 1.42 skrll if_statinc(ifp, if_oerrors); 505 1.4 scottr 506 1.14 scottr dp8390_reset(sc); 507 1.1 scottr } 508 1.11 scottr #endif 509