if_fe_cbus.c revision 119418
1/* 2 * All Rights Reserved, Copyright (C) Fujitsu Limited 1995 3 * 4 * This software may be used, modified, copied, distributed, and sold, in 5 * both source and binary form provided that the above copyright, these 6 * terms and the following disclaimer are retained. The name of the author 7 * and/or the contributor may not be used to endorse or promote products 8 * derived from this software without specific prior written permission. 9 * 10 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND THE CONTRIBUTOR ``AS IS'' AND 11 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 12 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 13 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR THE CONTRIBUTOR BE LIABLE 14 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 15 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 16 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION. 17 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 19 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 20 * SUCH DAMAGE. 21 * 22 */ 23 24#include <sys/cdefs.h> 25__FBSDID("$FreeBSD: head/sys/dev/fe/if_fe_cbus.c 119418 2003-08-24 17:55:58Z obrien $"); 26 27#include <sys/param.h> 28#include <sys/systm.h> 29#include <sys/kernel.h> 30#include <sys/socket.h> 31#include <sys/module.h> 32 33#include <sys/bus.h> 34#include <machine/bus.h> 35#include <sys/rman.h> 36#include <machine/resource.h> 37 38#include <net/ethernet.h> 39#include <net/if.h> 40#include <net/if_mib.h> 41#include <net/if_media.h> 42 43#include <netinet/in.h> 44#include <netinet/if_ether.h> 45 46#include <i386/isa/ic/mb86960.h> 47#include <dev/fe/if_fereg.h> 48#include <dev/fe/if_fevar.h> 49 50#include <isa/isavar.h> 51 52/* 53 * Cbus specific code. 54 */ 55static int fe_isa_probe(device_t); 56static int fe_isa_attach(device_t); 57 58static struct isa_pnp_id fe_ids[] = { 59 { 0x101ee0d, NULL }, /* CON0101 - Contec C-NET(98)P2-T */ 60 { 0, NULL } 61}; 62 63static device_method_t fe_isa_methods[] = { 64 /* Device interface */ 65 DEVMETHOD(device_probe, fe_isa_probe), 66 DEVMETHOD(device_attach, fe_isa_attach), 67 68 { 0, 0 } 69}; 70 71static driver_t fe_isa_driver = { 72 "fe", 73 fe_isa_methods, 74 sizeof (struct fe_softc) 75}; 76 77DRIVER_MODULE(fe, isa, fe_isa_driver, fe_devclass, 0, 0); 78 79 80static int fe98_alloc_port(device_t, int); 81 82static int fe_probe_re1000(device_t); 83static int fe_probe_cnet9ne(device_t); 84static int fe_probe_rex(device_t); 85static int fe_probe_ssi(device_t); 86static int fe_probe_jli(device_t); 87static int fe_probe_lnx(device_t); 88static int fe_probe_gwy(device_t); 89static int fe_probe_ubn(device_t); 90 91/* 92 * Determine if the device is present at a specified I/O address. The 93 * main entry to the driver. 94 */ 95static int 96fe_isa_probe(device_t dev) 97{ 98 struct fe_softc *sc; 99 int error; 100 101 /* Prepare for the softc struct. */ 102 sc = device_get_softc(dev); 103 sc->sc_unit = device_get_unit(dev); 104 105 /* Check isapnp ids */ 106 error = ISA_PNP_PROBE(device_get_parent(dev), dev, fe_ids); 107 108 /* If the card had a PnP ID that didn't match any we know about */ 109 if (error == ENXIO) 110 goto end; 111 112 /* If we had some other problem. */ 113 if (!(error == 0 || error == ENOENT)) 114 goto end; 115 116 /* Probe for supported boards. */ 117 if ((error = fe_probe_re1000(dev)) == 0) 118 goto end; 119 fe_release_resource(dev); 120 121 if ((error = fe_probe_cnet9ne(dev)) == 0) 122 goto end; 123 fe_release_resource(dev); 124 125 if ((error = fe_probe_rex(dev)) == 0) 126 goto end; 127 fe_release_resource(dev); 128 129 if ((error = fe_probe_ssi(dev)) == 0) 130 goto end; 131 fe_release_resource(dev); 132 133 if ((error = fe_probe_jli(dev)) == 0) 134 goto end; 135 fe_release_resource(dev); 136 137 if ((error = fe_probe_lnx(dev)) == 0) 138 goto end; 139 fe_release_resource(dev); 140 141 if ((error = fe_probe_ubn(dev)) == 0) 142 goto end; 143 fe_release_resource(dev); 144 145 if ((error = fe_probe_gwy(dev)) == 0) 146 goto end; 147 fe_release_resource(dev); 148 149end: 150 if (error == 0) 151 error = fe_alloc_irq(dev, 0); 152 153 fe_release_resource(dev); 154 return (error); 155} 156 157static int 158fe_isa_attach(device_t dev) 159{ 160 struct fe_softc *sc = device_get_softc(dev); 161 162 if (sc->port_used) 163 fe98_alloc_port(dev, sc->type); 164 fe_alloc_irq(dev, 0); 165 166 return fe_attach(dev); 167} 168 169 170/* Generic I/O address table */ 171static bus_addr_t ioaddr_generic[MAXREGISTERS] = { 172 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 173 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, 174 0x010, 0x011, 0x012, 0x013, 0x014, 0x015, 0x016, 0x017, 175 0x018, 0x019, 0x01a, 0x01b, 0x01c, 0x01d, 0x01e, 0x01f, 176}; 177 178/* I/O address table for RE1000/1000Plus */ 179static bus_addr_t ioaddr_re1000[MAXREGISTERS] = { 180 0x0000, 0x0001, 0x0200, 0x0201, 0x0400, 0x0401, 0x0600, 0x0601, 181 0x0800, 0x0801, 0x0a00, 0x0a01, 0x0c00, 0x0c01, 0x0e00, 0x0e01, 182 0x1000, 0x1200, 0x1400, 0x1600, 0x1800, 0x1a00, 0x1c00, 0x1e00, 183 0x1001, 0x1201, 0x1401, 0x1601, 0x1801, 0x1a01, 0x1c01, 0x1e01, 184}; 185 186/* I/O address table for CNET9NE */ 187static bus_addr_t ioaddr_cnet9ne[MAXREGISTERS] = { 188 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 189 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, 190 0x400, 0x402, 0x404, 0x406, 0x408, 0x40a, 0x40c, 0x40e, 191 0x401, 0x403, 0x405, 0x407, 0x409, 0x40b, 0x40d, 0x40f, 192}; 193 194/* I/O address table for LAC-98 */ 195static bus_addr_t ioaddr_lnx[MAXREGISTERS] = { 196 0x000, 0x002, 0x004, 0x006, 0x008, 0x00a, 0x00c, 0x00e, 197 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10e, 198 0x200, 0x202, 0x204, 0x206, 0x208, 0x20a, 0x20c, 0x20e, 199 0x300, 0x302, 0x304, 0x306, 0x308, 0x30a, 0x30c, 0x30e, 200}; 201 202/* I/O address table for Access/PC N98C+ */ 203static bus_addr_t ioaddr_ubn[MAXREGISTERS] = { 204 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 205 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, 206 0x200, 0x201, 0x202, 0x203, 0x204, 0x205, 0x206, 0x207, 207 0x208, 0x209, 0x20a, 0x20b, 0x20c, 0x20d, 0x20e, 0x20f, 208}; 209 210/* I/O address table for REX-9880 */ 211static bus_addr_t ioaddr_rex[MAXREGISTERS] = { 212 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 213 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, 214 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 215 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f, 216}; 217 218static int 219fe98_alloc_port(device_t dev, int type) 220{ 221 struct fe_softc *sc = device_get_softc(dev); 222 struct resource *res; 223 bus_addr_t *iat; 224 int size, rid; 225 226 switch (type) { 227 case FE_TYPE_RE1000: 228 iat = ioaddr_re1000; 229 size = MAXREGISTERS; 230 break; 231 case FE_TYPE_CNET9NE: 232 iat = ioaddr_cnet9ne; 233 size = MAXREGISTERS; 234 break; 235 case FE_TYPE_SSI: 236 iat = ioaddr_generic; 237 size = MAXREGISTERS; 238 break; 239 case FE_TYPE_LNX: 240 iat = ioaddr_lnx; 241 size = MAXREGISTERS; 242 break; 243 case FE_TYPE_GWY: 244 iat = ioaddr_generic; 245 size = MAXREGISTERS; 246 break; 247 case FE_TYPE_UBN: 248 iat = ioaddr_ubn; 249 size = MAXREGISTERS; 250 break; 251 case FE_TYPE_REX: 252 iat = ioaddr_rex; 253 size = MAXREGISTERS; 254 break; 255 default: 256 iat = ioaddr_generic; 257 size = MAXREGISTERS; 258 break; 259 } 260 261 rid = 0; 262 res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, 263 iat, size, RF_ACTIVE); 264 if (res == NULL) 265 return ENOENT; 266 267 isa_load_resourcev(res, iat, size); 268 269 sc->type = type; 270 sc->port_used = size; 271 sc->port_res = res; 272 sc->iot = rman_get_bustag(res); 273 sc->ioh = rman_get_bushandle(res); 274 return (0); 275} 276 277 278/* 279 * Probe and initialization for Allied-Telesis RE1000 series. 280 */ 281static void 282fe_init_re1000(struct fe_softc *sc) 283{ 284 /* Setup IRQ control register on the ASIC. */ 285 fe_outb(sc, FE_RE1000_IRQCONF, sc->priv_info); 286} 287 288static int 289fe_probe_re1000(device_t dev) 290{ 291 struct fe_softc *sc = device_get_softc(dev); 292 int i, n; 293 u_long iobase, irq; 294 u_char sum; 295 296 static struct fe_simple_probe_struct probe_table [] = { 297 { FE_DLCR2, 0x58, 0x00 }, 298 { FE_DLCR4, 0x08, 0x00 }, 299 { 0 } 300 }; 301 302 /* See if the specified I/O address is possible for RE1000. */ 303 /* [01]D[02468ACE] are allowed. */ 304 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) 305 return ENXIO; 306 if ((iobase & ~0x10E) != 0xD0) 307 return ENXIO; 308 309 if (fe98_alloc_port(dev, FE_TYPE_RE1000)) 310 return ENXIO; 311 312 /* Fill the softc struct with default values. */ 313 fe_softc_defaults(sc); 314 315 /* See if the card is on its address. */ 316 if (!fe_simple_probe(sc, probe_table)) 317 return ENXIO; 318 319 /* Get our station address from EEPROM. */ 320 fe_inblk(sc, 0x18, sc->sc_enaddr, ETHER_ADDR_LEN); 321 322 /* Make sure it is Allied-Telesis's. */ 323 if (!valid_Ether_p(sc->sc_enaddr, 0x0000F4)) 324 return ENXIO; 325#if 1 326 /* Calculate checksum. */ 327 sum = fe_inb(sc, 0x1e); 328 for (i = 0; i < ETHER_ADDR_LEN; i++) 329 sum ^= sc->sc_enaddr[i]; 330 if (sum != 0) 331 return ENXIO; 332#endif 333 /* Setup the board type. */ 334 sc->typestr = "RE1000"; 335 336 /* This looks like an RE1000 board. It requires an 337 explicit IRQ setting in config. Make sure we have one, 338 determining an appropriate value for the IRQ control 339 register. */ 340 irq = 0; 341 bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); 342 switch (irq) { 343 case 3: n = 0x10; break; 344 case 5: n = 0x20; break; 345 case 6: n = 0x40; break; 346 case 12: n = 0x80; break; 347 default: 348 fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); 349 return ENXIO; 350 } 351 sc->priv_info = (fe_inb(sc, FE_RE1000_IRQCONF) & 0x0f) | n; 352 353 /* Setup hooks. We need a special initialization procedure. */ 354 sc->init = fe_init_re1000; 355 356 return 0; 357} 358 359/* JLI sub-probe for Allied-Telesis RE1000Plus/ME1500 series. */ 360static u_short const * 361fe_probe_jli_re1000p(struct fe_softc * sc, u_char const * eeprom) 362{ 363 int i; 364 static u_short const irqmaps_re1000p [4] = { 3, 5, 6, 12 }; 365 366 /* Make sure the EEPROM contains Allied-Telesis bit pattern. */ 367 if (eeprom[1] != 0xFF) return NULL; 368 for (i = 2; i < 8; i++) if (eeprom[i] != 0xFF) return NULL; 369 for (i = 14; i < 24; i++) if (eeprom[i] != 0xFF) return NULL; 370 371 /* Get our station address from EEPROM, and make sure the 372 EEPROM contains Allied-Telesis's address. */ 373 bcopy(eeprom + 8, sc->sc_enaddr, ETHER_ADDR_LEN); 374 if (!valid_Ether_p(sc->sc_enaddr, 0x0000F4)) 375 return NULL; 376 377 /* I don't know any sub-model identification. */ 378 sc->typestr = "RE1000Plus/ME1500"; 379 380 /* Returns the IRQ table for the RE1000Plus. */ 381 return irqmaps_re1000p; 382} 383 384 385/* 386 * Probe for Allied-Telesis RE1000Plus/ME1500 series. 387 */ 388static int 389fe_probe_jli(device_t dev) 390{ 391 struct fe_softc *sc = device_get_softc(dev); 392 int i, n, xirq, error; 393 u_long iobase, irq; 394 u_char eeprom [JLI_EEPROM_SIZE]; 395 u_short const * irqmap; 396 397 static u_short const baseaddr [8] = 398 { 0x1D6, 0x1D8, 0x1DA, 0x1D4, 0x0D4, 0x0D2, 0x0D8, 0x0D0 }; 399 static struct fe_simple_probe_struct const probe_table [] = { 400 /* { FE_DLCR1, 0x20, 0x00 }, Doesn't work. */ 401 { FE_DLCR2, 0x50, 0x00 }, 402 { FE_DLCR4, 0x08, 0x00 }, 403 /* { FE_DLCR5, 0x80, 0x00 }, Doesn't work. */ 404#if 0 405 { FE_BMPR16, 0x1B, 0x00 }, 406 { FE_BMPR17, 0x7F, 0x00 }, 407#endif 408 { 0 } 409 }; 410 411 /* 412 * See if the specified address is possible for MB86965A JLI mode. 413 */ 414 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) 415 return ENXIO; 416 for (i = 0; i < 8; i++) { 417 if (baseaddr[i] == iobase) 418 break; 419 } 420 if (i == 8) 421 return ENXIO; 422 423 if (fe98_alloc_port(dev, FE_TYPE_RE1000)) 424 return ENXIO; 425 426 /* Fill the softc struct with default values. */ 427 fe_softc_defaults(sc); 428 429 /* 430 * We should test if MB86965A is on the base address now. 431 * Unfortunately, it is very hard to probe it reliably, since 432 * we have no way to reset the chip under software control. 433 * On cold boot, we could check the "signature" bit patterns 434 * described in the Fujitsu document. On warm boot, however, 435 * we can predict almost nothing about register values. 436 */ 437 if (!fe_simple_probe(sc, probe_table)) 438 return ENXIO; 439 440 /* Check if our I/O address matches config info on 86965. */ 441 n = (fe_inb(sc, FE_BMPR19) & FE_B19_ADDR) >> FE_B19_ADDR_SHIFT; 442 if (baseaddr[n] != iobase) 443 return ENXIO; 444 445 /* 446 * We are now almost sure we have an MB86965 at the given 447 * address. So, read EEPROM through it. We have to write 448 * into LSI registers to read from EEPROM. I want to avoid it 449 * at this stage, but I cannot test the presence of the chip 450 * any further without reading EEPROM. FIXME. 451 */ 452 fe_read_eeprom_jli(sc, eeprom); 453 454 /* Make sure that config info in EEPROM and 86965 agree. */ 455 if (eeprom[FE_EEPROM_CONF] != fe_inb(sc, FE_BMPR19)) 456 return ENXIO; 457 458 /* Use 86965 media selection scheme, unless othewise 459 specified. It is "AUTO always" and "select with BMPR13". 460 This behaviour covers most of the 86965 based board (as 461 minimum requirements.) It is backward compatible with 462 previous versions, also. */ 463 sc->mbitmap = MB_HA; 464 sc->defmedia = MB_HA; 465 sc->msel = fe_msel_965; 466 467 /* Perform board-specific probe. */ 468 if ((irqmap = fe_probe_jli_re1000p(sc, eeprom)) == NULL) 469 return ENXIO; 470 471 /* Find the IRQ read from EEPROM. */ 472 n = (fe_inb(sc, FE_BMPR19) & FE_B19_IRQ) >> FE_B19_IRQ_SHIFT; 473 xirq = irqmap[n]; 474 475 /* Try to determine IRQ setting. */ 476 error = bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); 477 if (error && xirq == NO_IRQ) { 478 /* The device must be configured with an explicit IRQ. */ 479 device_printf(dev, "IRQ auto-detection does not work\n"); 480 return ENXIO; 481 } else if (error && xirq != NO_IRQ) { 482 /* Just use the probed IRQ value. */ 483 bus_set_resource(dev, SYS_RES_IRQ, 0, xirq, 1); 484 } else if (!error && xirq == NO_IRQ) { 485 /* No problem. Go ahead. */ 486 } else if (irq == xirq) { 487 /* Good. Go ahead. */ 488 } else { 489 /* User must be warned in this case. */ 490 sc->stability |= UNSTABLE_IRQ; 491 } 492 493 /* Setup a hook, which resets te 86965 when the driver is being 494 initialized. This may solve a nasty bug. FIXME. */ 495 sc->init = fe_init_jli; 496 497 return 0; 498} 499 500 501/* 502 * Probe and initialization for Contec C-NET(9N)E series. 503 */ 504 505/* TODO: Should be in "if_fereg.h" */ 506#define FE_CNET9NE_INTR 0x10 /* Interrupt Mask? */ 507 508static void 509fe_init_cnet9ne(struct fe_softc *sc) 510{ 511 /* Enable interrupt? FIXME. */ 512 fe_outb(sc, FE_CNET9NE_INTR, 0x10); 513} 514 515static int 516fe_probe_cnet9ne (device_t dev) 517{ 518 struct fe_softc *sc = device_get_softc(dev); 519 u_long iobase, irq; 520 521 static struct fe_simple_probe_struct probe_table [] = { 522 { FE_DLCR2, 0x58, 0x00 }, 523 { FE_DLCR4, 0x08, 0x00 }, 524 { 0 } 525 }; 526 527 /* See if the specified I/O address is possible for C-NET(9N)E. */ 528 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) 529 return ENXIO; 530 if (iobase != 0x73D0) 531 return ENXIO; 532 533 if (fe98_alloc_port(dev, FE_TYPE_CNET9NE)) 534 return ENXIO; 535 536 /* Fill the softc struct with default values. */ 537 fe_softc_defaults(sc); 538 539 /* See if the card is on its address. */ 540 if (!fe_simple_probe(sc, probe_table)) 541 return ENXIO; 542 543 /* Get our station address from EEPROM. */ 544 fe_inblk(sc, 0x18, sc->sc_enaddr, ETHER_ADDR_LEN); 545 546 /* Make sure it is Contec's. */ 547 if (!valid_Ether_p(sc->sc_enaddr, 0x00804C)) 548 return ENXIO; 549 550 /* Determine the card type. */ 551 if (sc->sc_enaddr[3] == 0x06) { 552 sc->typestr = "C-NET(9N)C"; 553 554 /* We seems to need our own IDENT bits... FIXME. */ 555 sc->proto_dlcr7 = FE_D7_BYTSWP_LH | FE_D7_IDENT_NICE; 556 557 /* C-NET(9N)C requires an explicit IRQ to work. */ 558 if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) { 559 fe_irq_failure(sc->typestr, sc->sc_unit, NO_IRQ, NULL); 560 return ENXIO; 561 } 562 } else { 563 sc->typestr = "C-NET(9N)E"; 564 565 /* C-NET(9N)E works only IRQ5. */ 566 if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) 567 return ENXIO; 568 if (irq != 5) { 569 fe_irq_failure(sc->typestr, sc->sc_unit, irq, "5"); 570 return ENXIO; 571 } 572 573 /* We need an init hook to initialize ASIC before we start. */ 574 sc->init = fe_init_cnet9ne; 575 } 576 577 /* C-NET(9N)E has 64KB SRAM. */ 578 sc->proto_dlcr6 = FE_D6_BUFSIZ_64KB | FE_D6_TXBSIZ_2x4KB 579 | FE_D6_BBW_WORD | FE_D6_SBW_WORD | FE_D6_SRAM; 580 581 return 0; 582} 583 584 585/* 586 * Probe for Contec C-NET(98)P2 series. 587 * (Logitec LAN-98TP/LAN-98T25P - parhaps) 588 */ 589static int 590fe_probe_ssi(device_t dev) 591{ 592 struct fe_softc *sc = device_get_softc(dev); 593 u_long iobase, irq; 594 595 u_char eeprom [SSI_EEPROM_SIZE]; 596 static struct fe_simple_probe_struct probe_table [] = { 597 { FE_DLCR2, 0x08, 0x00 }, 598 { FE_DLCR4, 0x08, 0x00 }, 599 { 0 } 600 }; 601 static u_short const irqmap[] = { 602 /* INT0 INT1 INT2 */ 603 NO_IRQ, NO_IRQ, NO_IRQ, 3, NO_IRQ, 5, 6, NO_IRQ, 604 NO_IRQ, 9, 10, NO_IRQ, 12, 13, NO_IRQ, NO_IRQ, 605 /* INT3 INT41 INT5 INT6 */ 606 }; 607 608 /* See if the specified I/O address is possible for 78Q8377A. */ 609 /* [0-D]3D0 are allowed. */ 610 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) 611 return ENXIO; 612 if ((iobase & 0xFFF) != 0x3D0) 613 return ENXIO; 614 615 if (fe98_alloc_port(dev, FE_TYPE_SSI)) 616 return ENXIO; 617 618 /* Fill the softc struct with default values. */ 619 fe_softc_defaults(sc); 620 621 /* See if the card is on its address. */ 622 if (!fe_simple_probe(sc, probe_table)) 623 return ENXIO; 624 625 /* We now have to read the config EEPROM. We should be very 626 careful, since doing so destroys a register. (Remember, we 627 are not yet sure we have a C-NET(98)P2 board here.) Don't 628 remember to select BMPRs bofore reading EEPROM, since other 629 register bank may be selected before the probe() is called. */ 630 fe_read_eeprom_ssi(sc, eeprom); 631 632 /* Make sure the Ethernet (MAC) station address is of Contec's. */ 633 if (!valid_Ether_p(eeprom + FE_SSI_EEP_ADDR, 0x00804C)) 634 return ENXIO; 635 bcopy(eeprom + FE_SSI_EEP_ADDR, sc->sc_enaddr, ETHER_ADDR_LEN); 636 637 /* Setup the board type. */ 638 sc->typestr = "C-NET(98)P2"; 639 640 /* Non-PnP mode, set static resource from eeprom. */ 641 if (!isa_get_vendorid(dev)) { 642 /* Get IRQ configuration from EEPROM. */ 643 irq = irqmap[eeprom[FE_SSI_EEP_IRQ]]; 644 if (irq == NO_IRQ) { 645 fe_irq_failure(sc->typestr, sc->sc_unit, irq, 646 "3/5/6/9/10/12/13"); 647 return ENXIO; 648 } 649 bus_set_resource(dev, SYS_RES_IRQ, 0, irq, 1); 650 } 651 652 /* Get Duplex-mode configuration from EEPROM. */ 653 sc->proto_dlcr4 |= (eeprom[FE_SSI_EEP_DUPLEX] & FE_D4_DSC); 654 655 /* Fill softc struct accordingly. */ 656 sc->mbitmap = MB_HT; 657 sc->defmedia = MB_HT; 658 659 return 0; 660} 661 662 663/* 664 * Probe for TDK LAC-98012/013/025/9N011 - parhaps. 665 */ 666static int 667fe_probe_lnx(device_t dev) 668{ 669 struct fe_softc *sc = device_get_softc(dev); 670 671 u_long iobase, irq; 672 u_char eeprom [LNX_EEPROM_SIZE]; 673 674 static struct fe_simple_probe_struct probe_table [] = { 675 { FE_DLCR2, 0x58, 0x00 }, 676 { FE_DLCR4, 0x08, 0x00 }, 677 { 0 } 678 }; 679 680 /* See if the specified I/O address is possible for TDK/LANX boards. */ 681 /* 0D0, 4D0, 8D0, and CD0 are allowed. */ 682 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) 683 return ENXIO; 684 if ((iobase & ~0xC00) != 0xD0) 685 return ENXIO; 686 687 if (fe98_alloc_port(dev, FE_TYPE_LNX)) 688 return ENXIO; 689 690 /* Fill the softc struct with default values. */ 691 fe_softc_defaults(sc); 692 693 /* See if the card is on its address. */ 694 if (!fe_simple_probe(sc, probe_table)) 695 return ENXIO; 696 697 /* We now have to read the config EEPROM. We should be very 698 careful, since doing so destroys a register. (Remember, we 699 are not yet sure we have a LAC-98012/98013 board here.) */ 700 fe_read_eeprom_lnx(sc, eeprom); 701 702 /* Make sure the Ethernet (MAC) station address is of TDK/LANX's. */ 703 if (!valid_Ether_p(eeprom, 0x008098)) 704 return ENXIO; 705 bcopy(eeprom, sc->sc_enaddr, ETHER_ADDR_LEN); 706 707 /* Setup the board type. */ 708 sc->typestr = "LAC-98012/98013"; 709 710 /* This looks like a TDK/LANX board. It requires an 711 explicit IRQ setting in config. Make sure we have one, 712 determining an appropriate value for the IRQ control 713 register. */ 714 irq = 0; 715 if (bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL) != 0) 716 return ENXIO; 717 switch (irq) { 718 case 3 : sc->priv_info = 0x10 | LNX_CLK_LO | LNX_SDA_HI; break; 719 case 5 : sc->priv_info = 0x20 | LNX_CLK_LO | LNX_SDA_HI; break; 720 case 6 : sc->priv_info = 0x40 | LNX_CLK_LO | LNX_SDA_HI; break; 721 case 12: sc->priv_info = 0x80 | LNX_CLK_LO | LNX_SDA_HI; break; 722 default: 723 fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); 724 return ENXIO; 725 } 726 727 /* LAC-98's system bus width is 8-bit. */ 728 sc->proto_dlcr6 = FE_D6_BUFSIZ_32KB | FE_D6_TXBSIZ_2x2KB 729 | FE_D6_BBW_BYTE | FE_D6_SBW_BYTE | FE_D6_SRAM_150ns; 730 731 /* Setup hooks. We need a special initialization procedure. */ 732 sc->init = fe_init_lnx; 733 734 return 0; 735} 736 737 738/* 739 * Probe for Gateway Communications' old cards. 740 * (both as Generic MB86960 probe routine) 741 */ 742static int 743fe_probe_gwy(device_t dev) 744{ 745 struct fe_softc *sc = device_get_softc(dev); 746 747 static struct fe_simple_probe_struct probe_table [] = { 748 /* { FE_DLCR2, 0x70, 0x00 }, */ 749 { FE_DLCR2, 0x58, 0x00 }, 750 { FE_DLCR4, 0x08, 0x00 }, 751 { 0 } 752 }; 753 754 /* 755 * XXX 756 * I'm not sure which address is possible, so accepts any. 757 */ 758 759 if (fe98_alloc_port(dev, FE_TYPE_GWY)) 760 return ENXIO; 761 762 /* Fill the softc struct with default values. */ 763 fe_softc_defaults(sc); 764 765 /* See if the card is on its address. */ 766 if (!fe_simple_probe(sc, probe_table)) 767 return ENXIO; 768 769 /* Get our station address from EEPROM. */ 770 fe_inblk(sc, 0x18, sc->sc_enaddr, ETHER_ADDR_LEN); 771 if (!valid_Ether_p(sc->sc_enaddr, 0x000000)) 772 return ENXIO; 773 774 /* Determine the card type. */ 775 sc->typestr = "Generic MB86960 Ethernet"; 776 if (valid_Ether_p(sc->sc_enaddr, 0x000061)) 777 sc->typestr = "Gateway Ethernet (Fujitsu chipset)"; 778 779 /* Gateway's board requires an explicit IRQ to work, since it 780 is not possible to probe the setting of jumpers. */ 781 if (bus_get_resource(dev, SYS_RES_IRQ, 0, NULL, NULL) != 0) { 782 fe_irq_failure(sc->typestr, sc->sc_unit, NO_IRQ, NULL); 783 return ENXIO; 784 } 785 786 return 0; 787} 788 789 790/* 791 * Probe for Ungermann-Bass Access/PC N98C+(Model 85152). 792 */ 793static int 794fe_probe_ubn(device_t dev) 795{ 796 struct fe_softc *sc = device_get_softc(dev); 797 798 u_char sum, save7; 799 u_long iobase, irq; 800 int i; 801 static struct fe_simple_probe_struct const probe_table [] = { 802 { FE_DLCR2, 0x58, 0x00 }, 803 { FE_DLCR4, 0x08, 0x00 }, 804 { 0 } 805 }; 806 807 /* See if the specified I/O address is possible for Access/PC. */ 808 /* [01][048C]D0 are allowed. */ 809 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) 810 return ENXIO; 811 if ((iobase & ~0x1C00) != 0xD0) 812 return ENXIO; 813 814 if (fe98_alloc_port(dev, FE_TYPE_UBN)) 815 return ENXIO; 816 817 /* Fill the softc struct with default values. */ 818 fe_softc_defaults(sc); 819 820 /* Simple probe. */ 821 if (!fe_simple_probe(sc, probe_table)) 822 return ENXIO; 823 824 /* NOTE: Access/NOTE N98 sometimes freeze when reading station 825 address. In case of using it togather with C-NET(9N)C, 826 this problem usually happens. 827 Writing DLCR7 prevents freezing, but I don't know why. FIXME. */ 828 829 /* Save the current value for the DLCR7 register we are about 830 to destroy. */ 831 save7 = fe_inb(sc, FE_DLCR7); 832 fe_outb(sc, FE_DLCR7, 833 sc->proto_dlcr7 | FE_D7_RBS_BMPR | FE_D7_POWER_UP); 834 835 /* Get our station address form ID ROM and make sure it is UBN's. */ 836 fe_inblk(sc, 0x18, sc->sc_enaddr, ETHER_ADDR_LEN); 837 if (!valid_Ether_p(sc->sc_enaddr, 0x00DD01)) 838 goto fail_ubn; 839#if 1 840 /* Calculate checksum. */ 841 sum = fe_inb(sc, 0x1e); 842 for (i = 0; i < ETHER_ADDR_LEN; i++) 843 sum ^= sc->sc_enaddr[i]; 844 if (sum != 0) 845 goto fail_ubn; 846#endif 847 848 /* Setup the board type. */ 849 sc->typestr = "Access/PC"; 850 851 /* This looks like an AccessPC/N98C+ board. It requires an 852 explicit IRQ setting in config. Make sure we have one, 853 determining an appropriate value for the IRQ control 854 register. */ 855 irq = 0; 856 bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); 857 switch (irq) { 858 case 3: sc->priv_info = 0x01; break; 859 case 5: sc->priv_info = 0x02; break; 860 case 6: sc->priv_info = 0x04; break; 861 case 12: sc->priv_info = 0x08; break; 862 default: 863 fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); 864 goto fail_ubn; 865 } 866 867 /* Setup hooks. We need a special initialization procedure. */ 868 sc->init = fe_init_ubn; 869 870 return 0; 871 872fail_ubn: 873 fe_outb(sc, FE_DLCR7, save7); 874 return ENXIO; 875} 876 877 878/* 879 * REX boards(non-JLI type) support routine. 880 */ 881 882#define REX_EEPROM_SIZE 32 883#define REX_DAT 0x01 884 885static void 886fe_read_eeprom_rex(struct fe_softc *sc, u_char *data) 887{ 888 int i; 889 u_char bit, val; 890 u_char save16; 891 892 save16 = fe_inb(sc, 0x10); 893 894 /* Issue a start condition. */ 895 val = fe_inb(sc, 0x10) & 0xf0; 896 fe_outb(sc, 0x10, val); 897 898 (void) fe_inb(sc, 0x10); 899 (void) fe_inb(sc, 0x10); 900 (void) fe_inb(sc, 0x10); 901 (void) fe_inb(sc, 0x10); 902 903 /* Read bytes from EEPROM. */ 904 for (i = 0; i < REX_EEPROM_SIZE; i++) { 905 /* Read a byte and store it into the buffer. */ 906 val = 0x00; 907 for (bit = 0x01; bit != 0x00; bit <<= 1) 908 if (fe_inb(sc, 0x10) & REX_DAT) 909 val |= bit; 910 *data++ = val; 911 } 912 913 fe_outb(sc, 0x10, save16); 914 915#if 1 916 /* Report what we got. */ 917 if (bootverbose) { 918 data -= REX_EEPROM_SIZE; 919 for (i = 0; i < REX_EEPROM_SIZE; i += 16) { 920 printf("fe%d: EEPROM(REX):%3x: %16D\n", 921 sc->sc_unit, i, data + i, " "); 922 } 923 } 924#endif 925} 926 927 928static void 929fe_init_rex(struct fe_softc *sc) 930{ 931 /* Setup IRQ control register on the ASIC. */ 932 fe_outb(sc, 0x10, sc->priv_info); 933} 934 935/* 936 * Probe for RATOC REX-9880/81/82/83 series. 937 */ 938static int 939fe_probe_rex(device_t dev) 940{ 941 struct fe_softc *sc = device_get_softc(dev); 942 943 int i; 944 u_long iobase, irq; 945 u_char eeprom [REX_EEPROM_SIZE]; 946 947 static struct fe_simple_probe_struct probe_table [] = { 948 { FE_DLCR2, 0x58, 0x00 }, 949 { FE_DLCR4, 0x08, 0x00 }, 950 { 0 } 951 }; 952 953 /* See if the specified I/O address is possible for REX-9880. */ 954 /* 6[46CE]D0 are allowed. */ 955 if (bus_get_resource(dev, SYS_RES_IOPORT, 0, &iobase, NULL) != 0) 956 return ENXIO; 957 if ((iobase & ~0xA00) != 0x64D0) 958 return ENXIO; 959 960 if (fe98_alloc_port(dev, FE_TYPE_REX)) 961 return ENXIO; 962 963 /* Fill the softc struct with default values. */ 964 fe_softc_defaults(sc); 965 966 /* See if the card is on its address. */ 967 if (!fe_simple_probe(sc, probe_table)) 968 return ENXIO; 969 970 /* We now have to read the config EEPROM. We should be very 971 careful, since doing so destroys a register. (Remember, we 972 are not yet sure we have a REX-9880 board here.) */ 973 fe_read_eeprom_rex(sc, eeprom); 974 for (i = 0; i < ETHER_ADDR_LEN; i++) 975 sc->sc_enaddr[i] = eeprom[7 - i]; 976 977 /* Make sure it is RATOC's. */ 978 if (!valid_Ether_p(sc->sc_enaddr, 0x00C0D0) && 979 !valid_Ether_p(sc->sc_enaddr, 0x00803D)) 980 return 0; 981 982 /* Setup the board type. */ 983 sc->typestr = "REX-9880/9883"; 984 985 /* This looks like a REX-9880 board. It requires an 986 explicit IRQ setting in config. Make sure we have one, 987 determining an appropriate value for the IRQ control 988 register. */ 989 irq = 0; 990 bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, NULL); 991 switch (irq) { 992 case 3: sc->priv_info = 0x10; break; 993 case 5: sc->priv_info = 0x20; break; 994 case 6: sc->priv_info = 0x40; break; 995 case 12: sc->priv_info = 0x80; break; 996 default: 997 fe_irq_failure(sc->typestr, sc->sc_unit, irq, "3/5/6/12"); 998 return ENXIO; 999 } 1000 1001 /* Setup hooks. We need a special initialization procedure. */ 1002 sc->init = fe_init_rex; 1003 1004 /* REX-9880 has 64KB SRAM. */ 1005 sc->proto_dlcr6 = FE_D6_BUFSIZ_64KB | FE_D6_TXBSIZ_2x4KB 1006 | FE_D6_BBW_WORD | FE_D6_SBW_WORD | FE_D6_SRAM; 1007#if 1 1008 sc->proto_dlcr7 |= FE_D7_EOPPOL; /* XXX */ 1009#endif 1010 1011 return 0; 1012} 1013