if_ed_cbus.c revision 141495
1/*- 2 * Copyright (c) 1995, David Greenman 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice unmodified, this list of conditions, and the following 10 * disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * 27 * $FreeBSD: head/sys/dev/ed/if_ed_cbus.c 141495 2005-02-08 05:59:43Z imp $ 28 */ 29 30#include <sys/param.h> 31#include <sys/systm.h> 32#include <sys/socket.h> 33#include <sys/kernel.h> 34 35#include <sys/module.h> 36#include <sys/bus.h> 37#include <machine/bus.h> 38#ifdef PC98 39#include <sys/rman.h> 40#include <machine/resource.h> 41#include <machine/clock.h> 42#include <machine/md_var.h> 43#endif 44 45#include <net/ethernet.h> 46#include <net/if.h> 47#include <net/if_arp.h> 48#include <net/if_mib.h> 49 50#include <isa/isavar.h> 51 52#include <dev/ed/if_edvar.h> 53#ifdef PC98 54#include <dev/ed/if_edreg.h> 55#include <dev/ed/if_ed98.h> 56 57static int ed98_alloc_port (device_t, int); 58static int ed98_alloc_memory (device_t, int); 59static int ed_pio_testmem (struct ed_softc *, int, int, int); 60static int ed_probe_SIC98 (device_t, int, int); 61static int ed_probe_CNET98 (device_t, int, int); 62static int ed_probe_CNET98EL (device_t, int, int); 63static int ed_probe_NEC77 (device_t, int, int); 64static int ed_probe_NW98X (device_t, int, int); 65static int ed_probe_SB98 (device_t, int, int); 66static int ed_probe_EZ98 (device_t, int, int); 67static int ed98_probe_Novell (device_t, int, int); 68static int ed98_probe_generic8390 (struct ed_softc *); 69static void ed_reset_CNET98 (struct ed_softc *, int); 70static void ed_winsel_CNET98 (struct ed_softc *, u_short); 71static void ed_get_SB98 (struct ed_softc *); 72#endif 73 74static int ed_isa_probe (device_t); 75static int ed_isa_attach (device_t); 76 77static struct isa_pnp_id ed_ids[] = { 78#ifdef PC98 79/* TODO - list up PnP boards for PC-98 */ 80 { 0, NULL } 81#endif 82}; 83 84static int 85ed_isa_probe(dev) 86 device_t dev; 87{ 88 struct ed_softc *sc = device_get_softc(dev); 89 int flags = device_get_flags(dev); 90 int error = 0; 91 92 bzero(sc, sizeof(struct ed_softc)); 93#ifdef PC98 94 sc->type = ED_TYPE98(flags); 95#ifdef ED_DEBUG 96 device_printf(dev, "ed_isa_probe: sc->type=%x\n", sc->type); 97#endif 98#endif 99 100 /* Check isapnp ids */ 101 error = ISA_PNP_PROBE(device_get_parent(dev), dev, ed_ids); 102#ifdef ED_DEBUG 103 device_printf(dev, "ed_isa_probe: ISA_PNP_PROBE returns %d\n", error); 104#endif 105 106 /* If the card had a PnP ID that didn't match any we know about */ 107 if (error == ENXIO) { 108 goto end; 109 } 110 111 /* If we had some other problem. */ 112 if (!(error == 0 || error == ENOENT)) { 113 goto end; 114 } 115 116 /* Heuristic probes */ 117#ifdef ED_DEBUG 118 device_printf(dev, "ed_isa_probe: Heuristic probes start\n"); 119#endif 120#ifdef PC98 121 switch (sc->type) { 122 case ED_TYPE98_GENERIC: 123 /* 124 * CAUTION! 125 * sc->type of these boards are overwritten by PC/AT's value. 126 */ 127 128 /* 129 * SMC EtherEZ98 130 */ 131 error = ed_probe_EZ98(dev, 0, flags); 132 if (error == 0) { 133 goto end; 134 } 135 136 ed_release_resources(dev); 137 138 /* 139 * Allied Telesis CenterCom LA-98-T 140 */ 141 error = ed_probe_Novell(dev, 0, flags); 142 if (error == 0) { 143 goto end; 144 } 145 146 break; 147 148 /* 149 * NE2000-like boards probe routine 150 */ 151 case ED_TYPE98_BDN: 152 /* 153 * ELECOM LANEED LD-BDN 154 * PLANET SMART COM 98 EN-2298 155 */ 156 case ED_TYPE98_LGY: 157 /* 158 * MELCO LGY-98, IND-SP, IND-SS 159 * MACNICA NE2098 160 */ 161 case ED_TYPE98_ICM: 162 /* 163 * ICM DT-ET-25, DT-ET-T5, IF-2766ET, IF-2771ET 164 * D-Link DE-298P, DE-298 165 */ 166 case ED_TYPE98_EGY: 167 /* 168 * MELCO EGY-98 169 * Contec C-NET(98)E-A, C-NET(98)L-A 170 */ 171 case ED_TYPE98_108: 172 /* 173 * NEC PC-9801-107,108 174 */ 175 case ED_TYPE98_NC5098: 176 /* 177 * NextCom NC5098 178 */ 179 180 error = ed98_probe_Novell(dev, 0, flags); 181 182 break; 183 184 /* 185 * other boards with special probe routine 186 */ 187 case ED_TYPE98_SIC: 188 /* 189 * Allied Telesis SIC-98 190 */ 191 error = ed_probe_SIC98(dev, 0, flags); 192 193 break; 194 195 case ED_TYPE98_CNET98EL: 196 /* 197 * Contec C-NET(98)E/L 198 */ 199 error = ed_probe_CNET98EL(dev, 0, flags); 200 201 break; 202 203 case ED_TYPE98_CNET98: 204 /* 205 * Contec C-NET(98) 206 */ 207 error = ed_probe_CNET98(dev, 0, flags); 208 209 break; 210 211 case ED_TYPE98_LA98: 212 /* 213 * IO-DATA LA/T-98 214 * NEC PC-9801-77,78 215 */ 216 error = ed_probe_NEC77(dev, 0, flags); 217 218 break; 219 220 case ED_TYPE98_NW98X: 221 /* 222 * Networld EC/EP-98X 223 */ 224 error = ed_probe_NW98X(dev, 0, flags); 225 226 break; 227 228 case ED_TYPE98_SB98: 229 /* 230 * Soliton SB-9801 231 * Fujikura FN-9801 232 */ 233 234 error = ed_probe_SB98(dev, 0, flags); 235 236 break; 237 } 238#endif 239 240end: 241#ifdef ED_DEBUG 242 device_printf(dev, "ed_isa_probe: end, error=%d\n", error); 243#endif 244 if (error == 0) 245 error = ed_alloc_irq(dev, 0, 0); 246 247 ed_release_resources(dev); 248 return (error); 249} 250 251static int 252ed_isa_attach(dev) 253 device_t dev; 254{ 255 struct ed_softc *sc = device_get_softc(dev); 256 int flags = device_get_flags(dev); 257 int error; 258 259 if (sc->port_used > 0) { 260#ifdef PC98 261 if (ED_TYPE98(flags) == ED_TYPE98_GENERIC) { 262 ed_alloc_port(dev, sc->port_rid, sc->port_used); 263 } else { 264 ed98_alloc_port(dev, sc->port_rid); 265 } 266#endif 267 } 268 if (sc->mem_used) 269 ed_alloc_memory(dev, sc->mem_rid, sc->mem_used); 270 271 ed_alloc_irq(dev, sc->irq_rid, 0); 272 273 error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET, 274 edintr, sc, &sc->irq_handle); 275 if (error) { 276 ed_release_resources(dev); 277 return (error); 278 } 279 280 return ed_attach(dev); 281} 282 283#ifdef PC98 284/* 285 * Interrupt conversion table for EtherEZ98 286 */ 287static uint16_t ed_EZ98_intr_val[] = { 288 0, 289 3, 290 5, 291 6, 292 0, 293 9, 294 12, 295 13 296}; 297 298static int 299ed_probe_EZ98(dev, port_rid, flags) 300 device_t dev; 301 int port_rid; 302 int flags; 303{ 304 struct ed_softc *sc = device_get_softc(dev); 305 int error; 306 static unsigned short *intr_vals[] = {NULL, ed_EZ98_intr_val}; 307 308 error = ed_alloc_port(dev, port_rid, ED_EZ98_IO_PORTS); 309 if (error) { 310 return (error); 311 } 312 313 sc->asic_offset = ED_EZ98_ASIC_OFFSET; 314 sc->nic_offset = ED_EZ98_NIC_OFFSET; 315 316 return ed_probe_WD80x3_generic(dev, flags, intr_vals); 317} 318 319/* 320 * I/O conversion tables 321 */ 322 323/* LGY-98, ICM, C-NET(98)E/L */ 324static bus_addr_t ed98_ioaddr_generic[] = { 325 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 326}; 327 328/* 329 * Definitions for Contec C-NET(98)E/L 330 */ 331#define ED_CNET98EL_ICR 2 /* Interrupt Configuration Register */ 332 333#define ED_CNET98EL_ICR_IRQ3 0x01 334#define ED_CNET98EL_ICR_IRQ5 0x02 335#define ED_CNET98EL_ICR_IRQ6 0x04 336#define ED_CNET98EL_ICR_IRQ12 0x20 337 338#define ED_CNET98EL_IMR 4 /* Interrupt Mask Register */ 339#define ED_CNET98EL_ISR 5 /* Interrupt Status Register */ 340 341/* EGY-98 */ 342static bus_addr_t ed98_ioaddr_egy98[] = { 343 0, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e, 344 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10e 345}; 346 347/* SIC-98 */ 348static bus_addr_t ed98_ioaddr_sic98[] = { 349 0x0000, 0x0200, 0x0400, 0x0600, 0x0800, 0x0a00, 0x0c00, 0x0e00, 350 0x1000, 0x1200, 0x1400, 0x1600, 0x1800, 0x1a00, 0x1c00, 0x1e00 351}; 352 353/* LA/T-98, LD-BDN, PC-9801-77, SB-9801 */ 354static bus_addr_t ed98_ioaddr_la98[] = { 355 0x0000, 0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000, 356 0x8000, 0x9000, 0xa000, 0xb000, 0xc000, 0xd000, 0xe000, 0xf000, 357 0x0100 /* for NEC 77(see below) */ 358}; 359 360/* 361 * Definitions for NEC PC-9801-77 362 */ 363#define ED_NEC77_IRQ 16 /* Interrupt Configuration Register */ 364 365#define ED_NEC77_IRQ3 0x04 366#define ED_NEC77_IRQ5 0x06 367#define ED_NEC77_IRQ6 0x08 368#define ED_NEC77_IRQ12 0x0a 369#define ED_NEC77_IRQ13 0x02 370 371/* 372 * Definitions for Soliton SB-9801 373 */ 374#define ED_SB98_CFG 1 /* Board configuration */ 375 376#define ED_SB98_CFG_IRQ3 0x00 377#define ED_SB98_CFG_IRQ5 0x04 378#define ED_SB98_CFG_IRQ6 0x08 379#define ED_SB98_CFG_IRQ12 0x0c 380#define ED_SB98_CFG_ALTPORT 0x40 /* use EXTERNAL media */ 381#define ED_SB98_CFG_ENABLE 0xa0 /* enable configuration */ 382 383#define ED_SB98_EEPENA 2 /* EEPROM access enable */ 384 385#define ED_SB98_EEPENA_DISABLE 0x00 386#define ED_SB98_EEPENA_ENABLE 0x01 387 388#define ED_SB98_EEP 3 /* EEPROM access */ 389 390#define ED_SB98_EEP_SDA 0x01 /* Serial Data */ 391#define ED_SB98_EEP_SCL 0x02 /* Serial Clock */ 392#define ED_SB98_EEP_READ 0x01 /* Read Command */ 393 394#define ED_SB98_EEP_DELAY 300 395 396#define ED_SB98_ADDRESS 0x01 /* Station Address(1-6) */ 397 398#define ED_SB98_POLARITY 4 /* Polarity */ 399 400/* PC-9801-108 */ 401static bus_addr_t ed98_ioaddr_nec108[] = { 402 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e, 403 0x1000, 0x1002, 0x1004, 0x1006, 0x1008, 0x100a, 0x100c, 0x100e 404}; 405 406/* C-NET(98) */ 407static bus_addr_t ed98_ioaddr_cnet98[] = { 408 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e, 409 0x0400, 0x0402, 0x0404, 0x0406, 0x0408, 0x040a, 0x040c, 0x040e 410}; 411 412/* 413 * Definitions for Contec C-NET(98) 414 */ 415#define ED_CNET98_MAP_REG0L 0 /* MAPPING register0 Low */ 416#define ED_CNET98_MAP_REG1L 1 /* MAPPING register1 Low */ 417#define ED_CNET98_MAP_REG2L 2 /* MAPPING register2 Low */ 418#define ED_CNET98_MAP_REG3L 3 /* MAPPING register3 Low */ 419#define ED_CNET98_MAP_REG0H 4 /* MAPPING register0 Hi */ 420#define ED_CNET98_MAP_REG1H 5 /* MAPPING register1 Hi */ 421#define ED_CNET98_MAP_REG2H 6 /* MAPPING register2 Hi */ 422#define ED_CNET98_MAP_REG3H 7 /* MAPPING register3 Hi */ 423#define ED_CNET98_WIN_REG 8 /* Window register */ 424#define ED_CNET98_INT_LEV 9 /* Init level register */ 425 426#define ED_CNET98_INT_IRQ3 0x01 /* INT 0 */ 427#define ED_CNET98_INT_IRQ5 0x02 /* INT 1 */ 428#define ED_CNET98_INT_IRQ6 0x04 /* INT 2 */ 429#define ED_CNET98_INT_IRQ9 0x08 /* INT 3 */ 430#define ED_CNET98_INT_IRQ12 0x20 /* INT 5 */ 431#define ED_CNET98_INT_IRQ13 0x40 /* INT 6 */ 432 433#define ED_CNET98_INT_REQ 10 /* Init request register */ 434#define ED_CNET98_INT_MASK 11 /* Init mask register */ 435#define ED_CNET98_INT_STAT 12 /* Init status register */ 436#define ED_CNET98_INT_CLR 12 /* Init clear register */ 437#define ED_CNET98_RESERVE1 13 438#define ED_CNET98_RESERVE2 14 439#define ED_CNET98_RESERVE3 15 440 441/* EC/EP-98X, NC5098 */ 442static bus_addr_t ed98_ioaddr_nw98x[] = { 443 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700, 444 0x0800, 0x0900, 0x0a00, 0x0b00, 0x0c00, 0x0d00, 0x0e00, 0x0f00, 445 0x1000 /* for EC/EP-98X(see below) */ 446}; 447 448/* 449 * Definitions for Networld EC/EP-98X 450 */ 451#define ED_NW98X_IRQ 16 /* Interrupt Configuration Register */ 452 453#define ED_NW98X_IRQ3 0x04 454#define ED_NW98X_IRQ5 0x06 455#define ED_NW98X_IRQ6 0x08 456#define ED_NW98X_IRQ12 0x0a 457#define ED_NW98X_IRQ13 0x02 458 459/* NC5098 ASIC */ 460static bus_addr_t ed98_asic_nc5098[] = { 461/* DATA ENADDR RESET */ 462 0x0000, 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x4000, 463 0, 0, 0, 0, 0, 0, 0, 0 464}; 465 466/* 467 * Definitions for NextCom NC5098 468 */ 469#define ED_NC5098_ENADDR 1 /* Station Address(1-6) */ 470 471/* 472 * Allocate a port resource with the given resource id. 473 */ 474static int 475ed98_alloc_port(dev, rid) 476 device_t dev; 477 int rid; 478{ 479 struct ed_softc *sc = device_get_softc(dev); 480 struct resource *res; 481 int error; 482 bus_addr_t *io_nic, *io_asic, adj; 483 static bus_addr_t io_res[ED_NOVELL_IO_PORTS + 1]; 484 int i, n; 485 int offset, reset, data; 486 487 /* Set i/o table for resource manager */ 488 io_nic = io_asic = ed98_ioaddr_generic; 489 offset = ED_NOVELL_ASIC_OFFSET; 490 reset = ED_NOVELL_RESET; 491 data = ED_NOVELL_DATA; 492 n = ED_NOVELL_IO_PORTS; 493 494 switch (sc->type) { 495 case ED_TYPE98_LGY: 496 io_asic = ed98_ioaddr_egy98; /* XXX - Yes, we use egy98 */ 497 offset = 0x0200; 498 reset = 8; 499 break; 500 501 case ED_TYPE98_EGY: 502 io_nic = io_asic = ed98_ioaddr_egy98; 503 offset = 0x0200; 504 reset = 8; 505 break; 506 507 case ED_TYPE98_ICM: 508 offset = 0x0100; 509 break; 510 511 case ED_TYPE98_BDN: 512 io_nic = io_asic = ed98_ioaddr_la98; 513 offset = 0x0100; 514 reset = 0x0c; 515 break; 516 517 case ED_TYPE98_SIC: 518 io_nic = io_asic = ed98_ioaddr_sic98; 519 offset = 0x2000; 520 n = 16+1; 521 break; 522 523 case ED_TYPE98_108: 524 io_nic = io_asic = ed98_ioaddr_nec108; 525 offset = 0x0888; /* XXX - overwritten after */ 526 reset = 1; 527 n = 16; /* XXX - does not set ASIC i/o here */ 528 break; 529 530 case ED_TYPE98_LA98: 531 io_nic = io_asic = ed98_ioaddr_la98; 532 offset = 0x0100; 533 break; 534 535 case ED_TYPE98_CNET98EL: 536 offset = 0x0400; 537 data = 0x0e; 538 break; 539 540 case ED_TYPE98_CNET98: 541 /* XXX - Yes, we use generic i/o here */ 542 offset = 0x0400; 543 break; 544 545 case ED_TYPE98_NW98X: 546 io_nic = io_asic = ed98_ioaddr_nw98x; 547 offset = 0x1000; 548 break; 549 550 case ED_TYPE98_SB98: 551 io_nic = io_asic = ed98_ioaddr_la98; 552 offset = 0x0400; 553 reset = 7; 554 break; 555 556 case ED_TYPE98_NC5098: 557 io_nic = ed98_ioaddr_nw98x; 558 io_asic = ed98_asic_nc5098; 559 offset = 0x2000; 560 reset = 7; 561 n = 16+8; /* XXX */ 562 break; 563 } 564 565 bcopy(io_nic, io_res, sizeof(io_nic[0]) * ED_NOVELL_ASIC_OFFSET); 566 for (i = ED_NOVELL_ASIC_OFFSET; i < ED_NOVELL_IO_PORTS; i++) { 567 io_res[i] = io_asic[i - ED_NOVELL_ASIC_OFFSET] + offset; 568 } 569 570 res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, 571 io_res, n, RF_ACTIVE); 572 if (!res) { 573 return (ENOENT); 574 } 575 576 sc->port_rid = rid; 577 sc->port_res = res; 578 sc->port_used = n; 579 580 /* Re-map i/o table if needed */ 581 switch (sc->type) { 582 case ED_TYPE98_LA98: 583 case ED_TYPE98_NW98X: 584 io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset; 585 n++; 586 break; 587 588 case ED_TYPE98_108: 589 adj = (rman_get_start(res) & 0xf000) / 2; 590 offset = (offset | adj) - rman_get_start(res); 591 592 for (n = ED_NOVELL_ASIC_OFFSET; n < ED_NOVELL_IO_PORTS; n++) { 593 io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset; 594 } 595 break; 596 597 case ED_TYPE98_CNET98: 598 io_nic = io_asic = ed98_ioaddr_cnet98; 599 offset = 1; 600 601 bcopy(io_nic, io_res, sizeof(io_nic[0]) * ED_NOVELL_ASIC_OFFSET); 602 for (n = ED_NOVELL_ASIC_OFFSET; n < ED_NOVELL_IO_PORTS; n++) { 603 io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset; 604 } 605 break; 606 607 case ED_TYPE98_NC5098: 608 n = ED_NOVELL_IO_PORTS; 609 break; 610 } 611 612 if (reset != ED_NOVELL_RESET) { 613 io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_RESET] = 614 io_res[ED_NOVELL_ASIC_OFFSET + reset]; 615 } 616 if (data != ED_NOVELL_DATA) { 617 io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_DATA] = 618 io_res[ED_NOVELL_ASIC_OFFSET + data]; 619#if 0 620 io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_DATA + 1] = 621 io_res[ED_NOVELL_ASIC_OFFSET + data + 1]; 622#endif 623 } 624 625 error = isa_load_resourcev(res, io_res, n); 626 if (error != 0) { 627 return (ENOENT); 628 } 629#ifdef ED_DEBUG 630 device_printf(dev, "ed98_alloc_port: i/o ports = %d\n", n); 631 for (i = 0; i < n; i++) { 632 printf("%x,", io_res[i]); 633 } 634 printf("\n"); 635#endif 636 return (0); 637} 638 639static int 640ed98_alloc_memory(dev, rid) 641 device_t dev; 642 int rid; 643{ 644 struct ed_softc *sc = device_get_softc(dev); 645 int error; 646 u_long conf_maddr, conf_msize; 647 648 error = bus_get_resource(dev, SYS_RES_MEMORY, 0, 649 &conf_maddr, &conf_msize); 650 if (error) { 651 return (error); 652 } 653 654 if ((conf_maddr == 0) || (conf_msize == 0)) { 655 return (ENXIO); 656 } 657 658 error = ed_alloc_memory(dev, rid, (int) conf_msize); 659 if (error) { 660 return (error); 661 } 662 663 sc->mem_start = (caddr_t) rman_get_virtual(sc->mem_res); 664 sc->mem_size = conf_msize; 665 666 return (0); 667} 668 669/* 670 * Generic probe routine for testing for the existance of a DS8390. 671 * Must be called after the NIC has just been reset. This routine 672 * works by looking at certain register values that are guaranteed 673 * to be initialized a certain way after power-up or reset. Seems 674 * not to currently work on the 83C690. 675 * 676 * Specifically: 677 * 678 * Register reset bits set bits 679 * Command Register (CR) TXP, STA RD2, STP 680 * Interrupt Status (ISR) RST 681 * Interrupt Mask (IMR) All bits 682 * Data Control (DCR) LAS 683 * Transmit Config. (TCR) LB1, LB0 684 * 685 * XXX - We only check the CR register. 686 * 687 * Return 1 if 8390 was found, 0 if not. 688 */ 689 690static int 691ed98_probe_generic8390(sc) 692 struct ed_softc *sc; 693{ 694 u_char tmp = ed_nic_inb(sc, ED_P0_CR); 695#ifdef DIAGNOSTIC 696 printf("ed?: inb(ED_P0_CR)=%x\n", tmp); 697#endif 698 if ((tmp & (ED_CR_RD2 | ED_CR_TXP | ED_CR_STA | ED_CR_STP)) != 699 (ED_CR_RD2 | ED_CR_STP)) { 700 return (0); 701 } 702 703 (void) ed_nic_inb(sc, ED_P0_ISR); 704 705 return (1); 706} 707 708static int 709ed98_probe_Novell(dev, port_rid, flags) 710 device_t dev; 711 int port_rid; 712 int flags; 713{ 714 struct ed_softc *sc = device_get_softc(dev); 715 int error; 716 int n; 717 u_char romdata[ETHER_ADDR_LEN * 2], tmp; 718 719#ifdef ED_DEBUG 720 device_printf(dev, "ed98_probe_Novell: start\n"); 721#endif 722 error = ed98_alloc_port(dev, port_rid); 723 if (error) { 724 return (error); 725 } 726 727 sc->asic_offset = ED_NOVELL_ASIC_OFFSET; 728 sc->nic_offset = ED_NOVELL_NIC_OFFSET; 729 730 /* Reset the board */ 731#ifdef ED_DEBUG 732 device_printf(dev, "ed98_probe_Novell: reset\n"); 733#endif 734 switch (sc->type) { 735#if 1 /* XXX - I'm not sure this is really necessary... */ 736 case ED_TYPE98_BDN: 737 tmp = ed_asic_inb(sc, ED_NOVELL_RESET); 738 ed_asic_outb(sc, ED_NOVELL_RESET, (tmp & 0xf0) | 0x08); 739 ed_nic_outb(sc, 0x04, tmp); 740 (void) ed_asic_inb(sc, 0x08); 741 ed_asic_outb(sc, 0x08, tmp); 742 ed_asic_outb(sc, 0x08, tmp & 0x7f); 743 break; 744#endif 745 case ED_TYPE98_NC5098: 746 ed_asic_outb(sc, ED_NOVELL_RESET, 0x00); 747 DELAY(5000); 748 ed_asic_outb(sc, ED_NOVELL_RESET, 0x01); 749 break; 750 751 default: 752 tmp = ed_asic_inb(sc, ED_NOVELL_RESET); 753 754 /* 755 * I don't know if this is necessary; probably cruft leftover from 756 * Clarkson packet driver code. Doesn't do a thing on the boards I've 757 * tested. -DG [note that an outb(0x84, 0) seems to work here, and is 758 * non-invasive...but some boards don't seem to reset and I don't have 759 * complete documentation on what the 'right' thing to do is...so we 760 * do the invasive thing for now. Yuck.] 761 */ 762 ed_asic_outb(sc, ED_NOVELL_RESET, tmp); 763 break; 764 } 765 DELAY(5000); 766 767 /* 768 * This is needed because some NE clones apparently don't reset the 769 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX 770 * - this makes the probe invasive! ...Done against my better 771 * judgement. -DLG 772 */ 773 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP); 774 DELAY(5000); 775 776 /* Make sure that we really have an 8390 based board */ 777 if (!ed98_probe_generic8390(sc)) { 778 return (ENXIO); 779 } 780 781 /* Test memory via PIO */ 782#ifdef ED_DEBUG 783 device_printf(dev, "ed98_probe_Novell: test memory\n"); 784#endif 785 sc->cr_proto = ED_CR_RD2; 786 if (!ed_pio_testmem(sc, 8192, 0, flags) 787 && !ed_pio_testmem(sc, 16384, 1, flags)) { 788 return (ENXIO); 789 } 790 791 /* Setup the board type */ 792#ifdef ED_DEBUG 793 device_printf(dev, "ed98_probe_Novell: board type\n"); 794#endif 795 switch (sc->type) { 796 case ED_TYPE98_BDN: 797 sc->type_str = "LD-BDN"; 798 break; 799 case ED_TYPE98_EGY: 800 sc->type_str = "EGY-98"; 801 break; 802 case ED_TYPE98_LGY: 803 sc->type_str = "LGY-98"; 804 break; 805 case ED_TYPE98_ICM: 806 sc->type_str = "ICM"; 807 break; 808 case ED_TYPE98_108: 809 sc->type_str = "PC-9801-108"; 810 break; 811 case ED_TYPE98_LA98: 812 sc->type_str = "LA-98"; 813 break; 814 case ED_TYPE98_NW98X: 815 sc->type_str = "NW98X"; 816 break; 817 case ED_TYPE98_NC5098: 818 sc->type_str = "NC5098"; 819 break; 820 default: 821 sc->type_str = NULL; 822 break; 823 } 824 825 /* Get station address */ 826 switch (sc->type) { 827 case ED_TYPE98_NC5098: 828 for (n = 0; n < ETHER_ADDR_LEN; n++) { 829 sc->arpcom.ac_enaddr[n] = 830 ed_asic_inb(sc, ED_NC5098_ENADDR + n); 831 } 832 break; 833 834 default: 835 ed_pio_readmem(sc, 0, romdata, sizeof(romdata)); 836 for (n = 0; n < ETHER_ADDR_LEN; n++) { 837 sc->arpcom.ac_enaddr[n] = 838 romdata[n * (sc->isa16bit + 1)]; 839 } 840 break; 841 } 842 843 /* clear any pending interrupts that might have occurred above */ 844 ed_nic_outb(sc, ED_P0_ISR, 0xff); 845 846 return (0); 847} 848 849/* 850 * Probe and vendor-specific initialization routine for SIC-98 boards 851 */ 852static int 853ed_probe_SIC98(dev, port_rid, flags) 854 device_t dev; 855 int port_rid; 856 int flags; 857{ 858 struct ed_softc *sc = device_get_softc(dev); 859 int error; 860 int i; 861 u_char sum; 862 863 /* 864 * Setup card RAM and I/O address 865 * Kernel Virtual to segment C0000-DFFFF???? 866 */ 867 error = ed98_alloc_port(dev, port_rid); 868 if (error) { 869 return (error); 870 } 871 872 sc->asic_offset = ED_SIC_ASIC_OFFSET; 873 sc->nic_offset = ED_SIC_NIC_OFFSET; 874 875 error = ed98_alloc_memory(dev, 0); 876 if (error) { 877 return (error); 878 } 879 880 /* Reset card to force it into a known state. */ 881 ed_asic_outb(sc, 0, 0x00); 882 DELAY(100); 883 if (ED_TYPE98SUB(flags) == 0) { 884 /* SIC-98/SIU-98 */ 885 ed_asic_outb(sc, 0, 0x94); 886 DELAY(100); 887 ed_asic_outb(sc, 0, 0x94); 888 } else { 889 /* SIU-98-D */ 890 ed_asic_outb(sc, 0, 0x80); 891 DELAY(100); 892 ed_asic_outb(sc, 0, 0x94); 893 DELAY(100); 894 ed_asic_outb(sc, 0, 0x9e); 895 } 896 DELAY(100); 897 898 /* 899 * Here we check the card ROM, if the checksum passes, and the 900 * type code and ethernet address check out, then we know we have 901 * an SIC card. 902 */ 903 sum = sc->mem_start[6 * 2]; 904 for (i = 0; i < ETHER_ADDR_LEN; i++) { 905 sum ^= (sc->arpcom.ac_enaddr[i] = sc->mem_start[i * 2]); 906 } 907#ifdef ED_DEBUG 908 device_printf(dev, "ed_probe_sic98: got address %6D\n", 909 sc->arpcom.ac_enaddr, ":"); 910#endif 911 if (sum != 0) { 912 return (ENXIO); 913 } 914 if ((sc->arpcom.ac_enaddr[0] | sc->arpcom.ac_enaddr[1] | 915 sc->arpcom.ac_enaddr[2]) == 0) { 916 return (ENXIO); 917 } 918 919 sc->vendor = ED_VENDOR_SIC; 920 sc->type_str = "SIC98"; 921 sc->isa16bit = 1; 922 sc->cr_proto = 0; 923 924 /* 925 * SIC RAM page 0x0000-0x3fff(or 0x7fff) 926 */ 927 if (ED_TYPE98SUB(flags) == 0) { 928 ed_asic_outb(sc, 0, 0x90); 929 } else { 930 ed_asic_outb(sc, 0, 0x8e); 931 } 932 DELAY(100); 933 934 /* 935 * clear interface memory, then sum to make sure its valid 936 */ 937 bzero(sc->mem_start, sc->mem_size); 938 939 for (i = 0; i < sc->mem_size; i++) { 940 if (sc->mem_start[i]) { 941 device_printf(dev, "failed to clear shared memory " 942 "at %x - check configuration\n", 943 kvtop(sc->mem_start + i)); 944 945 return (ENXIO); 946 } 947 } 948 949 sc->mem_shared = 1; 950 sc->mem_end = sc->mem_start + sc->mem_size; 951 952 /* 953 * allocate one xmit buffer if < 16k, two buffers otherwise 954 */ 955 if ((sc->mem_size < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING)) { 956 sc->txb_cnt = 1; 957 } else { 958 sc->txb_cnt = 2; 959 } 960 sc->tx_page_start = 0; 961 962 sc->rec_page_start = sc->tx_page_start + ED_TXBUF_SIZE * sc->txb_cnt; 963 sc->rec_page_stop = sc->tx_page_start + sc->mem_size / ED_PAGE_SIZE; 964 965 sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE; 966 967 return (0); 968} 969 970/* 971 * Contec C-NET(98) series support routines 972 */ 973static void 974ed_reset_CNET98(sc, flags) 975 struct ed_softc *sc; 976 int flags; 977{ 978 u_int init_addr = ED_CNET98_INIT; 979 u_char tmp; 980 981 /* Choose initial register address */ 982 if (ED_TYPE98SUB(flags) != 0) { 983 init_addr = ED_CNET98_INIT2; 984 } 985#ifdef ED_DEBUG 986 printf("ed?: initial register=%x\n", init_addr); 987#endif 988 /* 989 * Reset the board to force it into a known state. 990 */ 991 outb(init_addr, 0x00); /* request */ 992 DELAY(5000); 993 outb(init_addr, 0x01); /* cancel */ 994 DELAY(5000); 995 996 /* 997 * Set I/O address(A15-12) and cpu type 998 * 999 * AAAAIXXC(8bit) 1000 * AAAA: A15-A12, I: I/O enable, XX: reserved, C: CPU type 1001 * 1002 * CPU type is 1:80286 or higher, 0:not. 1003 * But FreeBSD runs under i386 or higher, thus it must be 1. 1004 */ 1005 tmp = (rman_get_start(sc->port_res) & 0xf000) >> 8; 1006 tmp |= (0x08 | 0x01); 1007#ifdef ED_DEBUG 1008 printf("ed?: outb(%x, %x)\n", init_addr + 2, tmp); 1009#endif 1010 outb(init_addr + 2, tmp); 1011 DELAY(5000); 1012 1013 /* 1014 * This is needed because some NE clones apparently don't reset the 1015 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX 1016 * - this makes the probe invasive! ...Done against my better 1017 * judgement. -DLG 1018 */ 1019 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP); 1020 DELAY(5000); 1021} 1022 1023static void 1024ed_winsel_CNET98(sc, bank) 1025 struct ed_softc *sc; 1026 u_short bank; 1027{ 1028 u_char mem = (kvtop(sc->mem_start) >> 12) & 0xff; 1029 1030 /* 1031 * Disable window memory 1032 * bit7 is 0:disable 1033 */ 1034 ed_asic_outb(sc, ED_CNET98_WIN_REG, mem & 0x7f); 1035 DELAY(10); 1036 1037 /* 1038 * Select window address 1039 * FreeBSD address 0xf00xxxxx 1040 */ 1041 ed_asic_outb(sc, ED_CNET98_MAP_REG0L, bank & 0xff); 1042 DELAY(10); 1043 ed_asic_outb(sc, ED_CNET98_MAP_REG0H, (bank >> 8) & 0xff); 1044 DELAY(10); 1045 ed_asic_outb(sc, ED_CNET98_MAP_REG1L, 0x00); 1046 DELAY(10); 1047 ed_asic_outb(sc, ED_CNET98_MAP_REG1H, 0x41); 1048 DELAY(10); 1049 ed_asic_outb(sc, ED_CNET98_MAP_REG2L, 0x00); 1050 DELAY(10); 1051 ed_asic_outb(sc, ED_CNET98_MAP_REG2H, 0x42); 1052 DELAY(10); 1053 ed_asic_outb(sc, ED_CNET98_MAP_REG3L, 0x00); 1054 DELAY(10); 1055 ed_asic_outb(sc, ED_CNET98_MAP_REG3H, 0x43); 1056 DELAY(10); 1057 1058 /* 1059 * Enable window memory(16Kbyte) 1060 * bit7 is 1:enable 1061 */ 1062#ifdef ED_DEBUG 1063 printf("ed?: window start address=%x\n", mem); 1064#endif 1065 ed_asic_outb(sc, ED_CNET98_WIN_REG, mem); 1066 DELAY(10); 1067} 1068 1069/* 1070 * Probe and vendor-specific initialization routine for C-NET(98) boards 1071 */ 1072static int 1073ed_probe_CNET98(dev, port_rid, flags) 1074 device_t dev; 1075 int port_rid; 1076 int flags; 1077{ 1078 struct ed_softc *sc = device_get_softc(dev); 1079 int error; 1080 u_char tmp; 1081 u_long conf_irq, junk; 1082 int i; 1083#ifdef DIAGNOSTIC 1084 u_char tmp_s; 1085#endif 1086 1087 error = ed98_alloc_port(dev, port_rid); 1088 if (error) { 1089 return (error); 1090 } 1091 1092 sc->asic_offset = ED_NOVELL_ASIC_OFFSET; 1093 sc->nic_offset = ED_NOVELL_NIC_OFFSET; 1094 1095 error = ed98_alloc_memory(dev, 0); 1096 if (error) { 1097 return (error); 1098 } 1099 1100 /* Check I/O address. 0x[a-f]3d0 are allowed. */ 1101 if (((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0) 1102 || ((rman_get_start(sc->port_res) & 0xf000) < (u_short) 0xa000)) { 1103#ifdef DIAGNOSTIC 1104 device_printf(dev, "Invalid i/o port configuration (0x%lx) " 1105 "must be %s for %s\n", rman_get_start(sc->port_res), 1106 "0x[a-f]3d0", "CNET98"); 1107#endif 1108 return (ENXIO); 1109 } 1110 1111#ifdef DIAGNOSTIC 1112 /* Check window area address */ 1113 tmp_s = kvtop(sc->mem_start) >> 12; 1114 if (tmp_s < 0x80) { 1115 device_printf(dev, "Please change window address(0x%x)\n", 1116 kvtop(sc->mem_start)); 1117 return (ENXIO); 1118 } 1119 1120 tmp_s &= 0x0f; 1121 tmp = rman_get_start(sc->port_res) >> 12; 1122 if ((tmp_s <= tmp) && (tmp < (tmp_s + 4))) { 1123 device_printf(dev, "Please change iobase address(0x%lx) " 1124 "or window address(0x%x)\n", 1125 rman_get_start(sc->port_res), kvtop(sc->mem_start)); 1126 return (ENXIO); 1127 } 1128#endif 1129 /* Reset the board */ 1130 ed_reset_CNET98(sc, flags); 1131 1132 /* 1133 * This is needed because some NE clones apparently don't reset the 1134 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX 1135 * - this makes the probe invasive! ...Done against my better 1136 * judgement. -DLG 1137 */ 1138 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP); 1139 DELAY(5000); 1140 1141 /* Make sure that we really have an 8390 based board */ 1142 if (!ed98_probe_generic8390(sc)) { 1143 return (ENXIO); 1144 } 1145 1146 /* 1147 * Set window ethernet address area 1148 * board memory base 0x480000 data 256byte 1149 */ 1150 ed_winsel_CNET98(sc, 0x4800); 1151 1152 /* 1153 * Get station address from on-board ROM 1154 */ 1155 bcopy(sc->mem_start, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN); 1156 1157 sc->vendor = ED_VENDOR_MISC; 1158 sc->type_str = "CNET98"; 1159 sc->isa16bit = 0; 1160 sc->cr_proto = ED_CR_RD2; 1161 1162 /* 1163 * Set window buffer memory area 1164 * board memory base 0x400000 data 16kbyte 1165 */ 1166 ed_winsel_CNET98(sc, 0x4000); 1167 1168 /* 1169 * clear interface memory, then sum to make sure its valid 1170 */ 1171 bzero(sc->mem_start, sc->mem_size); 1172 1173 for (i = 0; i < sc->mem_size; i++) { 1174 if (sc->mem_start[i]) { 1175 device_printf(dev, "failed to clear shared memory " 1176 "at %x - check configuration\n", 1177 kvtop(sc->mem_start + i)); 1178 1179 return (ENXIO); 1180 } 1181 } 1182 1183 sc->mem_shared = 1; 1184 sc->mem_end = sc->mem_start + sc->mem_size; 1185 1186 sc->txb_cnt = 1; /* XXX */ 1187 sc->tx_page_start = 0; 1188 1189 sc->rec_page_start = sc->tx_page_start + ED_TXBUF_SIZE; 1190 sc->rec_page_stop = sc->tx_page_start + sc->mem_size / ED_PAGE_SIZE; 1191 1192 sc->mem_ring = sc->mem_start + ED_PAGE_SIZE * ED_TXBUF_SIZE; 1193 1194 /* 1195 * Set interrupt level 1196 */ 1197 error = bus_get_resource(dev, SYS_RES_IRQ, 0, 1198 &conf_irq, &junk); 1199 if (error) 1200 return (error); 1201 1202 switch (conf_irq) { 1203 case 3: 1204 tmp = ED_CNET98_INT_IRQ3; 1205 break; 1206 case 5: 1207 tmp = ED_CNET98_INT_IRQ5; 1208 break; 1209 case 6: 1210 tmp = ED_CNET98_INT_IRQ6; 1211 break; 1212 case 9: 1213 tmp = ED_CNET98_INT_IRQ9; 1214 break; 1215 case 12: 1216 tmp = ED_CNET98_INT_IRQ12; 1217 break; 1218 case 13: 1219 tmp = ED_CNET98_INT_IRQ13; 1220 break; 1221 default: 1222 device_printf(dev, "Invalid irq configuration (%ld) must be " 1223 "%s for %s\n", conf_irq, "3,5,6,9,12,13", "CNET98"); 1224 return (ENXIO); 1225 } 1226 ed_asic_outb(sc, ED_CNET98_INT_LEV, tmp); 1227 DELAY(1000); 1228 /* 1229 * Set interrupt mask. 1230 * bit7:1 all interrupt mask 1231 * bit1:1 timer interrupt mask 1232 * bit0:0 NS controler interrupt enable 1233 */ 1234 ed_asic_outb(sc, ED_CNET98_INT_MASK, 0x7e); 1235 DELAY(1000); 1236 1237 return (0); 1238} 1239 1240/* 1241 * Probe and vendor-specific initialization routine for C-NET(98)E/L boards 1242 */ 1243static int 1244ed_probe_CNET98EL(dev, port_rid, flags) 1245 device_t dev; 1246 int port_rid; 1247 int flags; 1248{ 1249 struct ed_softc *sc = device_get_softc(dev); 1250 int error; 1251 int i; 1252 u_char romdata[ETHER_ADDR_LEN * 2], tmp; 1253 u_long conf_irq, junk; 1254 1255 error = ed98_alloc_port(dev, port_rid); 1256 if (error) { 1257 return (error); 1258 } 1259 1260 sc->asic_offset = ED_NOVELL_ASIC_OFFSET; 1261 sc->nic_offset = ED_NOVELL_NIC_OFFSET; 1262 1263 /* Check I/O address. 0x[0-f]3d0 are allowed. */ 1264 if ((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0) { 1265#ifdef DIAGNOSTIC 1266 device_printf(dev, "Invalid i/o port configuration (0x%lx) " 1267 "must be %s for %s\n", rman_get_start(sc->port_res), 1268 "0x?3d0", "CNET98E/L"); 1269#endif 1270 return (ENXIO); 1271 } 1272 1273 /* Reset the board */ 1274 ed_reset_CNET98(sc, flags); 1275 1276 /* 1277 * This is needed because some NE clones apparently don't reset the 1278 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX 1279 * - this makes the probe invasive! ...Done against my better 1280 * judgement. -DLG 1281 */ 1282 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP); 1283 DELAY(5000); 1284 1285 /* Make sure that we really have an 8390 based board */ 1286 if (!ed98_probe_generic8390(sc)) { 1287 return (ENXIO); 1288 } 1289 1290 /* Test memory via PIO */ 1291 sc->cr_proto = ED_CR_RD2; 1292 if (!ed_pio_testmem(sc, ED_CNET98EL_PAGE_OFFSET, 1, flags)) { 1293 return (ENXIO); 1294 } 1295 1296 /* This looks like a C-NET(98)E/L board. */ 1297 sc->type_str = "CNET98E/L"; 1298 1299 /* 1300 * Set IRQ. C-NET(98)E/L only allows a choice of irq 3,5,6. 1301 */ 1302 error = bus_get_resource(dev, SYS_RES_IRQ, 0, 1303 &conf_irq, &junk); 1304 if (error) { 1305 return (error); 1306 } 1307 1308 switch (conf_irq) { 1309 case 3: 1310 tmp = ED_CNET98EL_ICR_IRQ3; 1311 break; 1312 case 5: 1313 tmp = ED_CNET98EL_ICR_IRQ5; 1314 break; 1315 case 6: 1316 tmp = ED_CNET98EL_ICR_IRQ6; 1317 break; 1318#if 0 1319 case 12: 1320 tmp = ED_CNET98EL_ICR_IRQ12; 1321 break; 1322#endif 1323 default: 1324 device_printf(dev, "Invalid irq configuration (%ld) must be " 1325 "%s for %s\n", conf_irq, "3,5,6", "CNET98E/L"); 1326 return (ENXIO); 1327 } 1328 ed_asic_outb(sc, ED_CNET98EL_ICR, tmp); 1329 ed_asic_outb(sc, ED_CNET98EL_IMR, 0x7e); 1330 1331 /* Get station address from on-board ROM */ 1332 ed_pio_readmem(sc, 16384, romdata, sizeof(romdata)); 1333 for (i = 0; i < ETHER_ADDR_LEN; i++) { 1334 sc->arpcom.ac_enaddr[i] = romdata[i * 2]; 1335 } 1336 1337 /* clear any pending interrupts that might have occurred above */ 1338 ed_nic_outb(sc, ED_P0_ISR, 0xff); 1339 1340 return (0); 1341} 1342 1343/* 1344 * Probe and vendor-specific initialization routine for PC-9801-77 boards 1345 */ 1346static int 1347ed_probe_NEC77(dev, port_rid, flags) 1348 device_t dev; 1349 int port_rid; 1350 int flags; 1351{ 1352 struct ed_softc *sc = device_get_softc(dev); 1353 int error; 1354 u_char tmp; 1355 u_long conf_irq, junk; 1356 1357 error = ed98_probe_Novell(dev, port_rid, flags); 1358 if (error) { 1359 return (error); 1360 } 1361 1362 /* LA/T-98 does not need IRQ setting. */ 1363 if (ED_TYPE98SUB(flags) == 0) { 1364 return (0); 1365 } 1366 1367 /* 1368 * Set IRQ. PC-9801-77 only allows a choice of irq 3,5,6,12,13. 1369 */ 1370 error = bus_get_resource(dev, SYS_RES_IRQ, 0, 1371 &conf_irq, &junk); 1372 if (error) { 1373 return (error); 1374 } 1375 1376 switch (conf_irq) { 1377 case 3: 1378 tmp = ED_NEC77_IRQ3; 1379 break; 1380 case 5: 1381 tmp = ED_NEC77_IRQ5; 1382 break; 1383 case 6: 1384 tmp = ED_NEC77_IRQ6; 1385 break; 1386 case 12: 1387 tmp = ED_NEC77_IRQ12; 1388 break; 1389 case 13: 1390 tmp = ED_NEC77_IRQ13; 1391 break; 1392 default: 1393 device_printf(dev, "Invalid irq configuration (%ld) must be " 1394 "%s for %s\n", conf_irq, "3,5,6,12,13", "PC-9801-77"); 1395 return (ENXIO); 1396 } 1397 ed_asic_outb(sc, ED_NEC77_IRQ, tmp); 1398 1399 return (0); 1400} 1401 1402/* 1403 * Probe and vendor-specific initialization routine for EC/EP-98X boards 1404 */ 1405static int 1406ed_probe_NW98X(dev, port_rid, flags) 1407 device_t dev; 1408 int port_rid; 1409 int flags; 1410{ 1411 struct ed_softc *sc = device_get_softc(dev); 1412 int error; 1413 u_char tmp; 1414 u_long conf_irq, junk; 1415 1416 error = ed98_probe_Novell(dev, port_rid, flags); 1417 if (error) { 1418 return (error); 1419 } 1420 1421 /* Networld 98X3 does not need IRQ setting. */ 1422 if (ED_TYPE98SUB(flags) == 0) { 1423 return (0); 1424 } 1425 1426 /* 1427 * Set IRQ. EC/EP-98X only allows a choice of irq 3,5,6,12,13. 1428 */ 1429 error = bus_get_resource(dev, SYS_RES_IRQ, 0, 1430 &conf_irq, &junk); 1431 if (error) { 1432 return (error); 1433 } 1434 1435 switch (conf_irq) { 1436 case 3: 1437 tmp = ED_NW98X_IRQ3; 1438 break; 1439 case 5: 1440 tmp = ED_NW98X_IRQ5; 1441 break; 1442 case 6: 1443 tmp = ED_NW98X_IRQ6; 1444 break; 1445 case 12: 1446 tmp = ED_NW98X_IRQ12; 1447 break; 1448 case 13: 1449 tmp = ED_NW98X_IRQ13; 1450 break; 1451 default: 1452 device_printf(dev, "Invalid irq configuration (%ld) must be " 1453 "%s for %s\n", conf_irq, "3,5,6,12,13", "EC/EP-98X"); 1454 return (ENXIO); 1455 } 1456 ed_asic_outb(sc, ED_NW98X_IRQ, tmp); 1457 1458 return (0); 1459} 1460 1461/* 1462 * Read SB-9801 station address from Serial Two-Wire EEPROM 1463 */ 1464static void 1465ed_get_SB98(sc) 1466 struct ed_softc *sc; 1467{ 1468 int i, j; 1469 u_char mask, val; 1470 1471 /* enable EEPROM acceess */ 1472 ed_asic_outb(sc, ED_SB98_EEPENA, ED_SB98_EEPENA_ENABLE); 1473 1474 /* output start command */ 1475 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL); 1476 DELAY(ED_SB98_EEP_DELAY); 1477 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL); 1478 DELAY(ED_SB98_EEP_DELAY); 1479 1480 /* output address (7bit) */ 1481 for (mask = 0x40; mask != 0; mask >>= 1) { 1482 val = 0; 1483 if (ED_SB98_ADDRESS & mask) 1484 val = ED_SB98_EEP_SDA; 1485 ed_asic_outb(sc, ED_SB98_EEP, val); 1486 DELAY(ED_SB98_EEP_DELAY); 1487 ed_asic_outb(sc, ED_SB98_EEP, val | ED_SB98_EEP_SCL); 1488 DELAY(ED_SB98_EEP_DELAY); 1489 } 1490 1491 /* output READ command */ 1492 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_READ); 1493 DELAY(ED_SB98_EEP_DELAY); 1494 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_READ | ED_SB98_EEP_SCL); 1495 DELAY(ED_SB98_EEP_DELAY); 1496 1497 /* read station address */ 1498 for (i = 0; i < ETHER_ADDR_LEN; i++) { 1499 /* output ACK */ 1500 ed_asic_outb(sc, ED_SB98_EEP, 0); 1501 DELAY(ED_SB98_EEP_DELAY); 1502 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL); 1503 DELAY(ED_SB98_EEP_DELAY); 1504 1505 val = 0; 1506 for (j = 0; j < 8; j++) { 1507 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA); 1508 DELAY(ED_SB98_EEP_DELAY); 1509 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL); 1510 DELAY(ED_SB98_EEP_DELAY); 1511 val <<= 1; 1512 val |= (ed_asic_inb(sc, ED_SB98_EEP) & ED_SB98_EEP_SDA); 1513 DELAY(ED_SB98_EEP_DELAY); 1514 } 1515 sc->arpcom.ac_enaddr[i] = val; 1516 } 1517 1518 /* output Last ACK */ 1519 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA); 1520 DELAY(ED_SB98_EEP_DELAY); 1521 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL); 1522 DELAY(ED_SB98_EEP_DELAY); 1523 1524 /* output stop command */ 1525 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL); 1526 DELAY(ED_SB98_EEP_DELAY); 1527 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL); 1528 DELAY(ED_SB98_EEP_DELAY); 1529 1530 /* disable EEPROM access */ 1531 ed_asic_outb(sc, ED_SB98_EEPENA, ED_SB98_EEPENA_DISABLE); 1532} 1533 1534/* 1535 * Probe and vendor-specific initialization routine for SB-9801 boards 1536 */ 1537static int 1538ed_probe_SB98(dev, port_rid, flags) 1539 device_t dev; 1540 int port_rid; 1541 int flags; 1542{ 1543 struct ed_softc *sc = device_get_softc(dev); 1544 int error; 1545 u_char tmp; 1546 u_long conf_irq, junk; 1547 1548 error = ed98_alloc_port(dev, port_rid); 1549 if (error) { 1550 return (error); 1551 } 1552 1553 sc->asic_offset = ED_NOVELL_ASIC_OFFSET; 1554 sc->nic_offset = ED_NOVELL_NIC_OFFSET; 1555 1556 /* Check I/O address. 00d[02468ace] are allowed. */ 1557 if ((rman_get_start(sc->port_res) & ~0x000e) != 0x00d0) { 1558#ifdef DIAGNOSTIC 1559 device_printf(dev, "Invalid i/o port configuration (0x%lx) " 1560 "must be %s for %s\n", rman_get_start(sc->port_res), 1561 "0xd?", "SB9801"); 1562#endif 1563 return (ENXIO); 1564 } 1565 1566 /* Write I/O port address and read 4 times */ 1567 outb(ED_SB98_IO_INHIBIT, rman_get_start(sc->port_res) & 0xff); 1568 (void) inb(ED_SB98_IO_INHIBIT); DELAY(300); 1569 (void) inb(ED_SB98_IO_INHIBIT); DELAY(300); 1570 (void) inb(ED_SB98_IO_INHIBIT); DELAY(300); 1571 (void) inb(ED_SB98_IO_INHIBIT); DELAY(300); 1572 1573 /* 1574 * Check IRQ. Soliton SB-9801 only allows a choice of 1575 * irq 3,5,6,12 1576 */ 1577 error = bus_get_resource(dev, SYS_RES_IRQ, 0, 1578 &conf_irq, &junk); 1579 if (error) { 1580 return (error); 1581 } 1582 1583 switch (conf_irq) { 1584 case 3: 1585 tmp = ED_SB98_CFG_IRQ3; 1586 break; 1587 case 5: 1588 tmp = ED_SB98_CFG_IRQ5; 1589 break; 1590 case 6: 1591 tmp = ED_SB98_CFG_IRQ6; 1592 break; 1593 case 12: 1594 tmp = ED_SB98_CFG_IRQ12; 1595 break; 1596 default: 1597 device_printf(dev, "Invalid irq configuration (%ld) must be " 1598 "%s for %s\n", conf_irq, "3,5,6,12", "SB9801"); 1599 return (ENXIO); 1600 } 1601 1602 if (flags & ED_FLAGS_DISABLE_TRANCEIVER) { 1603 tmp |= ED_SB98_CFG_ALTPORT; 1604 } 1605 ed_asic_outb(sc, ED_SB98_CFG, ED_SB98_CFG_ENABLE | tmp); 1606 ed_asic_outb(sc, ED_SB98_POLARITY, 0x01); 1607 1608 /* Reset the board. */ 1609 ed_asic_outb(sc, ED_NOVELL_RESET, 0x7a); 1610 DELAY(300); 1611 ed_asic_outb(sc, ED_NOVELL_RESET, 0x79); 1612 DELAY(300); 1613 1614 /* 1615 * This is needed because some NE clones apparently don't reset the 1616 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX 1617 * - this makes the probe invasive! ...Done against my better 1618 * judgement. -DLG 1619 */ 1620 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP); 1621 DELAY(5000); 1622 1623 /* Make sure that we really have an 8390 based board */ 1624 if (!ed98_probe_generic8390(sc)) { 1625 return (ENXIO); 1626 } 1627 1628 /* Test memory via PIO */ 1629 sc->cr_proto = ED_CR_RD2; 1630 if (!ed_pio_testmem(sc, 16384, 1, flags)) { 1631 return (ENXIO); 1632 } 1633 1634 /* This looks like an SB9801 board. */ 1635 sc->type_str = "SB9801"; 1636 1637 /* Get station address */ 1638 ed_get_SB98(sc); 1639 1640 /* clear any pending interrupts that might have occurred above */ 1641 ed_nic_outb(sc, ED_P0_ISR, 0xff); 1642 1643 return (0); 1644} 1645 1646/* 1647 * Test the ability to read and write to the NIC memory. 1648 */ 1649static int 1650ed_pio_testmem(sc, page_offset, isa16bit, flags) 1651 struct ed_softc *sc; 1652 int page_offset; 1653 int isa16bit; 1654 int flags; 1655{ 1656 u_long memsize; 1657 static char test_pattern[32] = "THIS is A memory TEST pattern"; 1658 char test_buffer[32]; 1659#ifdef DIAGNOSTIC 1660 int page_end; 1661#endif 1662 1663 sc->vendor = ED_VENDOR_NOVELL; 1664 sc->mem_shared = 0; 1665 sc->isa16bit = isa16bit; 1666 1667 /* 8k of memory plus an additional 8k if 16bit */ 1668 memsize = (isa16bit ? 16384 : 8192); 1669 1670 /* 1671 * This prevents packets from being stored in the NIC memory when the 1672 * readmem routine turns on the start bit in the CR. 1673 */ 1674 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_MON); 1675 1676 /* Initialize DCR for byte/word operations */ 1677 if (isa16bit) { 1678 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS); 1679 } else { 1680 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_FT1 | ED_DCR_LS); 1681 } 1682 ed_nic_outb(sc, ED_P0_PSTART, page_offset / ED_PAGE_SIZE); 1683 ed_nic_outb(sc, ED_P0_PSTOP, (page_offset + memsize) / ED_PAGE_SIZE); 1684#ifdef ED_DEBUG 1685 printf("ed?: ed_pio_testmem: page start=%x, end=%lx", 1686 page_offset, page_offset + memsize); 1687#endif 1688 1689 /* 1690 * Write a test pattern. If this fails, then we don't know 1691 * what this board is. 1692 */ 1693 ed_pio_writemem(sc, test_pattern, page_offset, sizeof(test_pattern)); 1694 ed_pio_readmem(sc, page_offset, test_buffer, sizeof(test_pattern)); 1695 1696 if (bcmp(test_pattern, test_buffer, sizeof(test_pattern))) { 1697#ifdef ED_DEBUG 1698 printf("ed?: ed_pio_testmem: bcmp(page %x) NG", 1699 page_offset); 1700#endif 1701 return (0); 1702 } 1703 1704#ifdef DIAGNOSTIC 1705 /* Check the bottom. */ 1706 page_end = page_offset + memsize - ED_PAGE_SIZE; 1707 ed_pio_writemem(sc, test_pattern, page_end, sizeof(test_pattern)); 1708 ed_pio_readmem(sc, page_end, test_buffer, sizeof(test_pattern)); 1709 1710 if (bcmp(test_pattern, test_buffer, sizeof(test_pattern))) { 1711#ifdef ED_DEBUG 1712 printf("ed?: ed_pio_testmem: bcmp(page %x) NG", 1713 page_end); 1714#endif 1715 return (0); 1716 } 1717#endif 1718 sc->mem_size = memsize; 1719 sc->mem_start = (char *) page_offset; 1720 sc->mem_end = sc->mem_start + memsize; 1721 sc->tx_page_start = page_offset / ED_PAGE_SIZE; 1722 1723 /* 1724 * Use one xmit buffer if < 16k, two buffers otherwise (if not told 1725 * otherwise). 1726 */ 1727 if ((memsize < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING)) { 1728 sc->txb_cnt = 1; 1729 } else { 1730 sc->txb_cnt = 2; 1731 } 1732 1733 sc->rec_page_start = sc->tx_page_start + sc->txb_cnt * ED_TXBUF_SIZE; 1734 sc->rec_page_stop = sc->tx_page_start + memsize / ED_PAGE_SIZE; 1735 1736 sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE; 1737 1738 return (1); 1739} 1740#endif /* PC98 */ 1741 1742static device_method_t ed_isa_methods[] = { 1743 /* Device interface */ 1744 DEVMETHOD(device_probe, ed_isa_probe), 1745 DEVMETHOD(device_attach, ed_isa_attach), 1746 DEVMETHOD(device_attach, ed_detach), 1747 1748 { 0, 0 } 1749}; 1750 1751static driver_t ed_isa_driver = { 1752 "ed", 1753 ed_isa_methods, 1754 sizeof(struct ed_softc) 1755}; 1756 1757DRIVER_MODULE(ed, isa, ed_isa_driver, ed_devclass, 0, 0); 1758MODULE_DEPEND(ed, isa, 1, 1, 1); 1759MODULE_DEPEND(ed, ether, 1, 1, 1); 1760