2 * Copyright (c) 1995, David Greenman
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice unmodified, this list of conditions, and the following
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.
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
30 #include <sys/param.h>
31 #include <sys/systm.h>
32 #include <sys/socket.h>
33 #include <sys/kernel.h>
35 #include <sys/module.h>
37 #include <machine/bus.h>
39 #include <machine/resource.h>
41 #include <net/ethernet.h>
43 #include <net/if_arp.h>
44 #include <net/if_media.h>
45 #include <net/if_mib.h>
47 #include <isa/isavar.h>
49 #include <dev/ed/if_edvar.h>
50 #include <dev/ed/if_edreg.h>
51 #include <dev/ed/if_ed98.h>
53 static int ed98_alloc_port(device_t, int);
54 static int ed98_alloc_memory(device_t, int);
55 static int ed_pio_testmem(struct ed_softc *, int, int, int);
56 static int ed_probe_CNET98(device_t, int, int);
57 static int ed_probe_CNET98EL(device_t, int, int);
58 static int ed_probe_EZ98(device_t, int, int);
59 static int ed_probe_NEC77(device_t, int, int);
60 static int ed_probe_NW98X(device_t, int, int);
61 static int ed_probe_SB98(device_t, int, int);
62 static int ed_probe_SIC98(device_t, int, int);
63 static int ed98_probe_Novell(device_t, int, int);
64 static int ed98_probe_generic8390(struct ed_softc *);
65 static void ed_reset_CNET98(struct ed_softc *, int);
66 static void ed_winsel_CNET98(struct ed_softc *, u_short);
67 static void ed_get_SB98(struct ed_softc *);
69 static int ed_cbus_probe(device_t);
70 static int ed_cbus_attach(device_t);
72 static struct isa_pnp_id ed_ids[] = {
73 /* TODO - list up PnP boards for PC-98 */
78 ed_cbus_probe(device_t dev)
80 struct ed_softc *sc = device_get_softc(dev);
81 int flags = device_get_flags(dev);
84 sc->type = ED_TYPE98(flags);
86 device_printf(dev, "ed_cbus_probe: sc->type=%x\n", sc->type);
89 /* Check isapnp ids */
90 error = ISA_PNP_PROBE(device_get_parent(dev), dev, ed_ids);
92 device_printf(dev, "ed_cbus_probe: ISA_PNP_PROBE returns %d\n", error);
95 /* If the card had a PnP ID that didn't match any we know about */
99 /* If we had some other problem. */
100 if (!(error == 0 || error == ENOENT))
103 /* Heuristic probes */
105 device_printf(dev, "ed_cbus_probe: Heuristic probes start\n");
108 case ED_TYPE98_GENERIC:
111 * sc->type of these boards are overwritten by PC/AT's value.
117 error = ed_probe_EZ98(dev, 0, flags);
121 ed_release_resources(dev);
124 * Allied Telesis CenterCom LA-98-T
126 error = ed_probe_Novell(dev, 0, flags);
128 ed_Novell_read_mac(sc);
134 * NE2000-like boards probe routine
138 * ELECOM LANEED LD-BDN
139 * PLANET SMART COM 98 EN-2298
143 * MELCO LGY-98, IND-SP, IND-SS
148 * ICM DT-ET-25, DT-ET-T5, IF-2766ET, IF-2771ET
149 * D-Link DE-298P, DE-298
154 * Contec C-NET(98)E-A, C-NET(98)L-A
158 * NEC PC-9801-107,108
160 case ED_TYPE98_NC5098:
164 error = ed98_probe_Novell(dev, 0, flags);
168 * other boards with special probe routine
172 * Allied Telesis SIC-98
174 error = ed_probe_SIC98(dev, 0, flags);
177 case ED_TYPE98_CNET98EL:
179 * Contec C-NET(98)E/L
181 error = ed_probe_CNET98EL(dev, 0, flags);
184 case ED_TYPE98_CNET98:
188 error = ed_probe_CNET98(dev, 0, flags);
196 error = ed_probe_NEC77(dev, 0, flags);
199 case ED_TYPE98_NW98X:
203 error = ed_probe_NW98X(dev, 0, flags);
211 error = ed_probe_SB98(dev, 0, flags);
217 device_printf(dev, "ed_cbus_probe: end, error=%d\n", error);
220 error = ed_alloc_irq(dev, 0, 0);
222 ed_release_resources(dev);
230 struct ed_softc *sc = device_get_softc(dev);
231 int flags = device_get_flags(dev);
234 if (sc->port_used > 0) {
235 if (ED_TYPE98(flags) == ED_TYPE98_GENERIC)
236 ed_alloc_port(dev, 0, sc->port_used);
238 ed98_alloc_port(dev, 0);
241 ed_alloc_memory(dev, 0, sc->mem_used);
243 ed_alloc_irq(dev, 0, 0);
245 if (sc->sc_media_ioctl == NULL)
246 ed_gen_ifmedia_init(sc);
247 error = ed_attach(dev);
249 ed_release_resources(dev);
252 error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE,
253 NULL, edintr, sc, &sc->irq_handle);
255 ed_release_resources(dev);
260 * Interrupt conversion table for EtherEZ98
262 static uint16_t ed_EZ98_intr_val[] = {
274 ed_probe_EZ98(device_t dev, int port_rid, int flags)
276 struct ed_softc *sc = device_get_softc(dev);
278 static unsigned short *intr_vals[] = {NULL, ed_EZ98_intr_val};
280 error = ed_alloc_port(dev, port_rid, ED_EZ98_IO_PORTS);
285 sc->asic_offset = ED_EZ98_ASIC_OFFSET;
286 sc->nic_offset = ED_EZ98_NIC_OFFSET;
288 return ed_probe_WD80x3_generic(dev, flags, intr_vals);
292 * I/O conversion tables
295 /* LGY-98, ICM, C-NET(98)E/L */
296 static bus_addr_t ed98_ioaddr_generic[] = {
297 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
301 * Definitions for Contec C-NET(98)E/L
303 #define ED_CNET98EL_ICR 2 /* Interrupt Configuration Register */
305 #define ED_CNET98EL_ICR_IRQ3 0x01
306 #define ED_CNET98EL_ICR_IRQ5 0x02
307 #define ED_CNET98EL_ICR_IRQ6 0x04
308 #define ED_CNET98EL_ICR_IRQ12 0x20
310 #define ED_CNET98EL_IMR 4 /* Interrupt Mask Register */
311 #define ED_CNET98EL_ISR 5 /* Interrupt Status Register */
314 static bus_addr_t ed98_ioaddr_egy98[] = {
315 0, 0x02, 0x04, 0x06, 0x08, 0x0a, 0x0c, 0x0e,
316 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10e
320 static bus_addr_t ed98_ioaddr_sic98[] = {
321 0x0000, 0x0200, 0x0400, 0x0600, 0x0800, 0x0a00, 0x0c00, 0x0e00,
322 0x1000, 0x1200, 0x1400, 0x1600, 0x1800, 0x1a00, 0x1c00, 0x1e00
325 /* LA/T-98, LD-BDN, PC-9801-77, SB-9801 */
326 static bus_addr_t ed98_ioaddr_la98[] = {
327 0x0000, 0x1000, 0x2000, 0x3000, 0x4000, 0x5000, 0x6000, 0x7000,
328 0x8000, 0x9000, 0xa000, 0xb000, 0xc000, 0xd000, 0xe000, 0xf000,
329 0x0100 /* for NEC 77(see below) */
333 * Definitions for NEC PC-9801-77
335 #define ED_NEC77_IRQ 16 /* Interrupt Configuration Register */
337 #define ED_NEC77_IRQ3 0x04
338 #define ED_NEC77_IRQ5 0x06
339 #define ED_NEC77_IRQ6 0x08
340 #define ED_NEC77_IRQ12 0x0a
341 #define ED_NEC77_IRQ13 0x02
344 * Definitions for Soliton SB-9801
346 #define ED_SB98_CFG 1 /* Board configuration */
348 #define ED_SB98_CFG_IRQ3 0x00
349 #define ED_SB98_CFG_IRQ5 0x04
350 #define ED_SB98_CFG_IRQ6 0x08
351 #define ED_SB98_CFG_IRQ12 0x0c
352 #define ED_SB98_CFG_ALTPORT 0x40 /* use EXTERNAL media */
353 #define ED_SB98_CFG_ENABLE 0xa0 /* enable configuration */
355 #define ED_SB98_EEPENA 2 /* EEPROM access enable */
357 #define ED_SB98_EEPENA_DISABLE 0x00
358 #define ED_SB98_EEPENA_ENABLE 0x01
360 #define ED_SB98_EEP 3 /* EEPROM access */
362 #define ED_SB98_EEP_SDA 0x01 /* Serial Data */
363 #define ED_SB98_EEP_SCL 0x02 /* Serial Clock */
364 #define ED_SB98_EEP_READ 0x01 /* Read Command */
366 #define ED_SB98_EEP_DELAY 300
368 #define ED_SB98_ADDRESS 0x01 /* Station Address(1-6) */
370 #define ED_SB98_POLARITY 4 /* Polarity */
373 static bus_addr_t ed98_ioaddr_nec108[] = {
374 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e,
375 0x1000, 0x1002, 0x1004, 0x1006, 0x1008, 0x100a, 0x100c, 0x100e
379 static bus_addr_t ed98_ioaddr_cnet98[] = {
380 0x0000, 0x0002, 0x0004, 0x0006, 0x0008, 0x000a, 0x000c, 0x000e,
381 0x0400, 0x0402, 0x0404, 0x0406, 0x0408, 0x040a, 0x040c, 0x040e
385 * Definitions for Contec C-NET(98)
387 #define ED_CNET98_MAP_REG0L 0 /* MAPPING register0 Low */
388 #define ED_CNET98_MAP_REG1L 1 /* MAPPING register1 Low */
389 #define ED_CNET98_MAP_REG2L 2 /* MAPPING register2 Low */
390 #define ED_CNET98_MAP_REG3L 3 /* MAPPING register3 Low */
391 #define ED_CNET98_MAP_REG0H 4 /* MAPPING register0 Hi */
392 #define ED_CNET98_MAP_REG1H 5 /* MAPPING register1 Hi */
393 #define ED_CNET98_MAP_REG2H 6 /* MAPPING register2 Hi */
394 #define ED_CNET98_MAP_REG3H 7 /* MAPPING register3 Hi */
395 #define ED_CNET98_WIN_REG 8 /* Window register */
396 #define ED_CNET98_INT_LEV 9 /* Init level register */
398 #define ED_CNET98_INT_IRQ3 0x01 /* INT 0 */
399 #define ED_CNET98_INT_IRQ5 0x02 /* INT 1 */
400 #define ED_CNET98_INT_IRQ6 0x04 /* INT 2 */
401 #define ED_CNET98_INT_IRQ9 0x08 /* INT 3 */
402 #define ED_CNET98_INT_IRQ12 0x20 /* INT 5 */
403 #define ED_CNET98_INT_IRQ13 0x40 /* INT 6 */
405 #define ED_CNET98_INT_REQ 10 /* Init request register */
406 #define ED_CNET98_INT_MASK 11 /* Init mask register */
407 #define ED_CNET98_INT_STAT 12 /* Init status register */
408 #define ED_CNET98_INT_CLR 12 /* Init clear register */
409 #define ED_CNET98_RESERVE1 13
410 #define ED_CNET98_RESERVE2 14
411 #define ED_CNET98_RESERVE3 15
413 /* EC/EP-98X, NC5098 */
414 static bus_addr_t ed98_ioaddr_nw98x[] = {
415 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600, 0x0700,
416 0x0800, 0x0900, 0x0a00, 0x0b00, 0x0c00, 0x0d00, 0x0e00, 0x0f00,
417 0x1000 /* for EC/EP-98X(see below) */
421 * Definitions for Networld EC/EP-98X
423 #define ED_NW98X_IRQ 16 /* Interrupt Configuration Register */
425 #define ED_NW98X_IRQ3 0x04
426 #define ED_NW98X_IRQ5 0x06
427 #define ED_NW98X_IRQ6 0x08
428 #define ED_NW98X_IRQ12 0x0a
429 #define ED_NW98X_IRQ13 0x02
432 static bus_addr_t ed98_asic_nc5098[] = {
433 /* DATA ENADDR RESET */
434 0x0000, 0x2000, 0x2100, 0x2200, 0x2300, 0x2400, 0x2500, 0x4000,
435 0, 0, 0, 0, 0, 0, 0, 0
439 * Definitions for NextCom NC5098
441 #define ED_NC5098_ENADDR 1 /* Station Address(1-6) */
444 * Allocate a port resource with the given resource id.
447 ed98_alloc_port(device_t dev, int rid)
449 struct ed_softc *sc = device_get_softc(dev);
450 struct resource *res;
452 bus_addr_t *io_nic, *io_asic, adj;
453 static bus_addr_t io_res[ED_NOVELL_IO_PORTS + 1];
455 int offset, reset, data;
457 /* Set i/o table for resource manager */
458 io_nic = io_asic = ed98_ioaddr_generic;
459 offset = ED_NOVELL_ASIC_OFFSET;
460 reset = ED_NOVELL_RESET;
461 data = ED_NOVELL_DATA;
462 n = ED_NOVELL_IO_PORTS;
466 io_asic = ed98_ioaddr_egy98; /* XXX - Yes, we use egy98 */
472 io_nic = io_asic = ed98_ioaddr_egy98;
482 io_nic = io_asic = ed98_ioaddr_la98;
488 io_nic = io_asic = ed98_ioaddr_sic98;
494 io_nic = io_asic = ed98_ioaddr_nec108;
495 offset = 0x0888; /* XXX - overwritten after */
497 n = 16; /* XXX - does not set ASIC i/o here */
501 io_nic = io_asic = ed98_ioaddr_la98;
505 case ED_TYPE98_CNET98EL:
510 case ED_TYPE98_CNET98:
511 /* XXX - Yes, we use generic i/o here */
515 case ED_TYPE98_NW98X:
516 io_nic = io_asic = ed98_ioaddr_nw98x;
521 io_nic = io_asic = ed98_ioaddr_la98;
526 case ED_TYPE98_NC5098:
527 io_nic = ed98_ioaddr_nw98x;
528 io_asic = ed98_asic_nc5098;
535 bcopy(io_nic, io_res, sizeof(io_nic[0]) * ED_NOVELL_ASIC_OFFSET);
536 for (i = ED_NOVELL_ASIC_OFFSET; i < ED_NOVELL_IO_PORTS; i++)
537 io_res[i] = io_asic[i - ED_NOVELL_ASIC_OFFSET] + offset;
539 res = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &rid, io_res, n,
546 sc->port_bst = rman_get_bustag(res);
547 sc->port_bsh = rman_get_bushandle(res);
549 /* Re-map i/o table if needed */
552 case ED_TYPE98_NW98X:
553 io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset;
558 adj = (rman_get_start(res) & 0xf000) / 2;
559 offset = (offset | adj) - rman_get_start(res);
561 for (n = ED_NOVELL_ASIC_OFFSET; n < ED_NOVELL_IO_PORTS; n++)
562 io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset;
565 case ED_TYPE98_CNET98:
566 io_nic = io_asic = ed98_ioaddr_cnet98;
569 bcopy(io_nic, io_res, sizeof(io_nic[0]) * ED_NOVELL_ASIC_OFFSET);
570 for (n = ED_NOVELL_ASIC_OFFSET; n < ED_NOVELL_IO_PORTS; n++)
571 io_res[n] = io_asic[n - ED_NOVELL_ASIC_OFFSET] + offset;
574 case ED_TYPE98_NC5098:
575 n = ED_NOVELL_IO_PORTS;
579 if (reset != ED_NOVELL_RESET)
580 io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_RESET] =
581 io_res[ED_NOVELL_ASIC_OFFSET + reset];
582 if (data != ED_NOVELL_DATA) {
583 io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_DATA] =
584 io_res[ED_NOVELL_ASIC_OFFSET + data];
586 io_res[ED_NOVELL_ASIC_OFFSET + ED_NOVELL_DATA + 1] =
587 io_res[ED_NOVELL_ASIC_OFFSET + data + 1];
591 error = isa_load_resourcev(res, io_res, n);
595 device_printf(dev, "ed98_alloc_port: i/o ports = %d\n", n);
596 for (i = 0; i < n; i++)
597 printf("%x,", io_res[i]);
604 ed98_alloc_memory(dev, rid)
608 struct ed_softc *sc = device_get_softc(dev);
610 rman_res_t conf_maddr, conf_msize;
612 error = bus_get_resource(dev, SYS_RES_MEMORY, 0, &conf_maddr,
617 if ((conf_maddr == 0) || (conf_msize == 0))
620 error = ed_alloc_memory(dev, rid, (int) conf_msize);
625 sc->mem_size = conf_msize;
631 * Generic probe routine for testing for the existance of a DS8390.
632 * Must be called after the NIC has just been reset. This routine
633 * works by looking at certain register values that are guaranteed
634 * to be initialized a certain way after power-up or reset. Seems
635 * not to currently work on the 83C690.
639 * Register reset bits set bits
640 * Command Register (CR) TXP, STA RD2, STP
641 * Interrupt Status (ISR) RST
642 * Interrupt Mask (IMR) All bits
643 * Data Control (DCR) LAS
644 * Transmit Config. (TCR) LB1, LB0
646 * XXX - We only check the CR register.
648 * Return 1 if 8390 was found, 0 if not.
652 ed98_probe_generic8390(struct ed_softc *sc)
654 u_char tmp = ed_nic_inb(sc, ED_P0_CR);
656 printf("ed?: inb(ED_P0_CR)=%x\n", tmp);
658 if ((tmp & (ED_CR_RD2 | ED_CR_TXP | ED_CR_STA | ED_CR_STP)) !=
659 (ED_CR_RD2 | ED_CR_STP))
662 (void) ed_nic_inb(sc, ED_P0_ISR);
668 ed98_probe_Novell(device_t dev, int port_rid, int flags)
670 struct ed_softc *sc = device_get_softc(dev);
673 u_char romdata[ETHER_ADDR_LEN * 2], tmp;
676 device_printf(dev, "ed98_probe_Novell: start\n");
678 error = ed98_alloc_port(dev, port_rid);
682 sc->asic_offset = ED_NOVELL_ASIC_OFFSET;
683 sc->nic_offset = ED_NOVELL_NIC_OFFSET;
685 /* Reset the board */
687 device_printf(dev, "ed98_probe_Novell: reset\n");
690 #if 1 /* XXX - I'm not sure this is really necessary... */
692 tmp = ed_asic_inb(sc, ED_NOVELL_RESET);
693 ed_asic_outb(sc, ED_NOVELL_RESET, (tmp & 0xf0) | 0x08);
694 ed_nic_outb(sc, 0x04, tmp);
695 (void) ed_asic_inb(sc, 0x08);
696 ed_asic_outb(sc, 0x08, tmp);
697 ed_asic_outb(sc, 0x08, tmp & 0x7f);
700 case ED_TYPE98_NC5098:
701 ed_asic_outb(sc, ED_NOVELL_RESET, 0x00);
703 ed_asic_outb(sc, ED_NOVELL_RESET, 0x01);
707 tmp = ed_asic_inb(sc, ED_NOVELL_RESET);
710 * I don't know if this is necessary; probably cruft leftover from
711 * Clarkson packet driver code. Doesn't do a thing on the boards I've
712 * tested. -DG [note that an outb(0x84, 0) seems to work here, and is
713 * non-invasive...but some boards don't seem to reset and I don't have
714 * complete documentation on what the 'right' thing to do is...so we
715 * do the invasive thing for now. Yuck.]
717 ed_asic_outb(sc, ED_NOVELL_RESET, tmp);
723 * This is needed because some NE clones apparently don't reset the
724 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
725 * - this makes the probe invasive! ...Done against my better
728 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
731 /* Make sure that we really have an 8390 based board */
732 if (!ed98_probe_generic8390(sc))
735 /* Test memory via PIO */
737 device_printf(dev, "ed98_probe_Novell: test memory\n");
739 sc->cr_proto = ED_CR_RD2;
740 if (!ed_pio_testmem(sc, 8192, 0, flags) &&
741 !ed_pio_testmem(sc, 16384, 1, flags))
744 /* Setup the board type */
746 device_printf(dev, "ed98_probe_Novell: board type\n");
750 sc->type_str = "LD-BDN";
753 sc->type_str = "EGY-98";
756 sc->type_str = "LGY-98";
759 sc->type_str = "ICM";
762 sc->type_str = "PC-9801-108";
765 sc->type_str = "LA-98";
767 case ED_TYPE98_NW98X:
768 sc->type_str = "NW98X";
770 case ED_TYPE98_NC5098:
771 sc->type_str = "NC5098";
778 /* Get station address */
780 case ED_TYPE98_NC5098:
781 for (n = 0; n < ETHER_ADDR_LEN; n++)
782 sc->enaddr[n] = ed_asic_inb(sc, ED_NC5098_ENADDR + n);
786 ed_pio_readmem(sc, 0, romdata, sizeof(romdata));
787 for (n = 0; n < ETHER_ADDR_LEN; n++)
788 sc->enaddr[n] = romdata[n * (sc->isa16bit + 1)];
792 /* clear any pending interrupts that might have occurred above */
793 ed_nic_outb(sc, ED_P0_ISR, 0xff);
795 sc->sc_write_mbufs = ed_pio_write_mbufs;
800 * Probe and vendor-specific initialization routine for SIC-98 boards
803 ed_probe_SIC98(device_t dev, int port_rid, int flags)
805 struct ed_softc *sc = device_get_softc(dev);
811 * Setup card RAM and I/O address
812 * Kernel Virtual to segment C0000-DFFFF????
814 error = ed98_alloc_port(dev, port_rid);
818 sc->asic_offset = ED_SIC_ASIC_OFFSET;
819 sc->nic_offset = ED_SIC_NIC_OFFSET;
821 error = ed98_alloc_memory(dev, 0);
825 /* Reset card to force it into a known state. */
826 ed_asic_outb(sc, 0, 0x00);
828 if (ED_TYPE98SUB(flags) == 0) {
830 ed_asic_outb(sc, 0, 0x94);
832 ed_asic_outb(sc, 0, 0x94);
835 ed_asic_outb(sc, 0, 0x80);
837 ed_asic_outb(sc, 0, 0x94);
839 ed_asic_outb(sc, 0, 0x9e);
844 * Here we check the card ROM, if the checksum passes, and the
845 * type code and ethernet address check out, then we know we have
848 sum = bus_space_read_1(sc->mem_bst, sc->mem_bsh, 6 * 2);
849 for (i = 0; i < ETHER_ADDR_LEN; i++)
850 sum ^= (sc->enaddr[i] =
851 bus_space_read_1(sc->mem_bst, sc->mem_bsh, i * 2));
853 device_printf(dev, "ed_probe_sic98: got address %6D\n",
858 if ((sc->enaddr[0] | sc->enaddr[1] | sc->enaddr[2]) == 0)
861 sc->vendor = ED_VENDOR_SIC;
862 sc->type_str = "SIC98";
867 * SIC RAM page 0x0000-0x3fff(or 0x7fff)
869 if (ED_TYPE98SUB(flags) == 0)
870 ed_asic_outb(sc, 0, 0x90);
872 ed_asic_outb(sc, 0, 0x8e);
875 error = ed_clear_memory(dev);
880 sc->mem_end = sc->mem_start + sc->mem_size;
883 * allocate one xmit buffer if < 16k, two buffers otherwise
885 if ((sc->mem_size < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING))
889 sc->tx_page_start = 0;
891 sc->rec_page_start = sc->tx_page_start + ED_TXBUF_SIZE * sc->txb_cnt;
892 sc->rec_page_stop = sc->tx_page_start + sc->mem_size / ED_PAGE_SIZE;
894 sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
896 sc->sc_write_mbufs = ed_shmem_write_mbufs;
901 * Contec C-NET(98) series support routines
904 ed_reset_CNET98(struct ed_softc *sc, int flags)
906 u_int init_addr = ED_CNET98_INIT;
909 /* Choose initial register address */
910 if (ED_TYPE98SUB(flags) != 0) {
911 init_addr = ED_CNET98_INIT2;
914 printf("ed?: initial register=%x\n", init_addr);
917 * Reset the board to force it into a known state.
919 outb(init_addr, 0x00); /* request */
921 outb(init_addr, 0x01); /* cancel */
925 * Set I/O address(A15-12) and cpu type
928 * AAAA: A15-A12, I: I/O enable, XX: reserved, C: CPU type
930 * CPU type is 1:80286 or higher, 0:not.
931 * But FreeBSD runs under i386 or higher, thus it must be 1.
933 tmp = (rman_get_start(sc->port_res) & 0xf000) >> 8;
934 tmp |= (0x08 | 0x01);
936 printf("ed?: outb(%x, %x)\n", init_addr + 2, tmp);
938 outb(init_addr + 2, tmp);
942 * This is needed because some NE clones apparently don't reset the
943 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
944 * - this makes the probe invasive! ...Done against my better
947 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
952 ed_winsel_CNET98(struct ed_softc *sc, u_short bank)
954 u_char mem = (rman_get_start(sc->mem_res) >> 12) & 0xff;
957 * Disable window memory
960 ed_asic_outb(sc, ED_CNET98_WIN_REG, mem & 0x7f);
964 * Select window address
965 * FreeBSD address 0xf00xxxxx
967 ed_asic_outb(sc, ED_CNET98_MAP_REG0L, bank & 0xff);
969 ed_asic_outb(sc, ED_CNET98_MAP_REG0H, (bank >> 8) & 0xff);
971 ed_asic_outb(sc, ED_CNET98_MAP_REG1L, 0x00);
973 ed_asic_outb(sc, ED_CNET98_MAP_REG1H, 0x41);
975 ed_asic_outb(sc, ED_CNET98_MAP_REG2L, 0x00);
977 ed_asic_outb(sc, ED_CNET98_MAP_REG2H, 0x42);
979 ed_asic_outb(sc, ED_CNET98_MAP_REG3L, 0x00);
981 ed_asic_outb(sc, ED_CNET98_MAP_REG3H, 0x43);
985 * Enable window memory(16Kbyte)
989 printf("ed?: window start address=%x\n", mem);
991 ed_asic_outb(sc, ED_CNET98_WIN_REG, mem);
996 * Probe and vendor-specific initialization routine for C-NET(98) boards
999 ed_probe_CNET98(device_t dev, int port_rid, int flags)
1001 struct ed_softc *sc = device_get_softc(dev);
1004 rman_res_t conf_irq, junk;
1009 error = ed98_alloc_port(dev, port_rid);
1013 sc->asic_offset = ED_NOVELL_ASIC_OFFSET;
1014 sc->nic_offset = ED_NOVELL_NIC_OFFSET;
1016 error = ed98_alloc_memory(dev, 0);
1020 /* Check I/O address. 0x[a-f]3d0 are allowed. */
1021 if (((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0)
1022 || ((rman_get_start(sc->port_res) & 0xf000) < (u_short) 0xa000)) {
1024 device_printf(dev, "Invalid i/o port configuration (0x%jx) "
1025 "must be %s for %s\n", rman_get_start(sc->port_res),
1026 "0x[a-f]3d0", "CNET98");
1032 /* Check window area address */
1033 tmp_s = rman_get_start(sc->mem_res) >> 12;
1035 device_printf(dev, "Please change window address(0x%jx)\n",
1036 rman_get_start(sc->mem_res));
1041 tmp = rman_get_start(sc->port_res) >> 12;
1042 if ((tmp_s <= tmp) && (tmp < (tmp_s + 4))) {
1043 device_printf(dev, "Please change iobase address(0x%jx) "
1044 "or window address(0x%jx)\n",
1045 rman_get_start(sc->port_res),
1046 rman_get_start(sc->mem_res));
1050 /* Reset the board */
1051 ed_reset_CNET98(sc, flags);
1054 * This is needed because some NE clones apparently don't reset the
1055 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
1056 * - this makes the probe invasive! ...Done against my better
1059 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
1062 /* Make sure that we really have an 8390 based board */
1063 if (!ed98_probe_generic8390(sc))
1067 * Set window ethernet address area
1068 * board memory base 0x480000 data 256byte
1070 ed_winsel_CNET98(sc, 0x4800);
1073 * Get station address from on-board ROM
1075 bus_space_read_region_1(sc->mem_bst, sc->mem_bsh, sc->mem_start,
1076 sc->enaddr, ETHER_ADDR_LEN);
1078 sc->vendor = ED_VENDOR_MISC;
1079 sc->type_str = "CNET98";
1081 sc->cr_proto = ED_CR_RD2;
1084 * Set window buffer memory area
1085 * board memory base 0x400000 data 16kbyte
1087 ed_winsel_CNET98(sc, 0x4000);
1089 error = ed_clear_memory(dev);
1094 sc->mem_end = sc->mem_start + sc->mem_size;
1096 sc->txb_cnt = 1; /* XXX */
1097 sc->tx_page_start = 0;
1099 sc->rec_page_start = sc->tx_page_start + ED_TXBUF_SIZE;
1100 sc->rec_page_stop = sc->tx_page_start + sc->mem_size / ED_PAGE_SIZE;
1102 sc->mem_ring = sc->mem_start + ED_PAGE_SIZE * ED_TXBUF_SIZE;
1105 * Set interrupt level
1107 error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk);
1113 tmp = ED_CNET98_INT_IRQ3;
1116 tmp = ED_CNET98_INT_IRQ5;
1119 tmp = ED_CNET98_INT_IRQ6;
1122 tmp = ED_CNET98_INT_IRQ9;
1125 tmp = ED_CNET98_INT_IRQ12;
1128 tmp = ED_CNET98_INT_IRQ13;
1131 device_printf(dev, "Invalid irq configuration (%jd) must be "
1132 "%s for %s\n", conf_irq, "3,5,6,9,12,13", "CNET98");
1135 ed_asic_outb(sc, ED_CNET98_INT_LEV, tmp);
1138 * Set interrupt mask.
1139 * bit7:1 all interrupt mask
1140 * bit1:1 timer interrupt mask
1141 * bit0:0 NS controler interrupt enable
1143 ed_asic_outb(sc, ED_CNET98_INT_MASK, 0x7e);
1146 sc->sc_write_mbufs = ed_shmem_write_mbufs;
1151 * Probe and vendor-specific initialization routine for C-NET(98)E/L boards
1154 ed_probe_CNET98EL(device_t dev, int port_rid, int flags)
1156 struct ed_softc *sc = device_get_softc(dev);
1159 u_char romdata[ETHER_ADDR_LEN * 2], tmp;
1160 rman_res_t conf_irq, junk;
1162 error = ed98_alloc_port(dev, port_rid);
1166 sc->asic_offset = ED_NOVELL_ASIC_OFFSET;
1167 sc->nic_offset = ED_NOVELL_NIC_OFFSET;
1169 /* Check I/O address. 0x[0-f]3d0 are allowed. */
1170 if ((rman_get_start(sc->port_res) & 0x0fff) != 0x03d0) {
1172 device_printf(dev, "Invalid i/o port configuration (0x%jx) "
1173 "must be %s for %s\n", rman_get_start(sc->port_res),
1174 "0x?3d0", "CNET98E/L");
1179 /* Reset the board */
1180 ed_reset_CNET98(sc, flags);
1183 * This is needed because some NE clones apparently don't reset the
1184 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
1185 * - this makes the probe invasive! ...Done against my better
1188 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
1191 /* Make sure that we really have an 8390 based board */
1192 if (!ed98_probe_generic8390(sc))
1195 /* Test memory via PIO */
1196 sc->cr_proto = ED_CR_RD2;
1197 if (!ed_pio_testmem(sc, ED_CNET98EL_PAGE_OFFSET, 1, flags))
1200 /* This looks like a C-NET(98)E/L board. */
1201 sc->type_str = "CNET98E/L";
1204 * Set IRQ. C-NET(98)E/L only allows a choice of irq 3,5,6.
1206 error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk);
1212 tmp = ED_CNET98EL_ICR_IRQ3;
1215 tmp = ED_CNET98EL_ICR_IRQ5;
1218 tmp = ED_CNET98EL_ICR_IRQ6;
1222 tmp = ED_CNET98EL_ICR_IRQ12;
1226 device_printf(dev, "Invalid irq configuration (%jd) must be "
1227 "%s for %s\n", conf_irq, "3,5,6", "CNET98E/L");
1230 ed_asic_outb(sc, ED_CNET98EL_ICR, tmp);
1231 ed_asic_outb(sc, ED_CNET98EL_IMR, 0x7e);
1233 /* Get station address from on-board ROM */
1234 ed_pio_readmem(sc, 16384, romdata, sizeof(romdata));
1235 for (i = 0; i < ETHER_ADDR_LEN; i++)
1236 sc->enaddr[i] = romdata[i * 2];
1238 /* clear any pending interrupts that might have occurred above */
1239 ed_nic_outb(sc, ED_P0_ISR, 0xff);
1241 sc->sc_write_mbufs = ed_pio_write_mbufs;
1246 * Probe and vendor-specific initialization routine for PC-9801-77 boards
1249 ed_probe_NEC77(device_t dev, int port_rid, int flags)
1251 struct ed_softc *sc = device_get_softc(dev);
1254 rman_res_t conf_irq, junk;
1256 error = ed98_probe_Novell(dev, port_rid, flags);
1260 /* LA/T-98 does not need IRQ setting. */
1261 if (ED_TYPE98SUB(flags) == 0)
1265 * Set IRQ. PC-9801-77 only allows a choice of irq 3,5,6,12,13.
1267 error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk);
1273 tmp = ED_NEC77_IRQ3;
1276 tmp = ED_NEC77_IRQ5;
1279 tmp = ED_NEC77_IRQ6;
1282 tmp = ED_NEC77_IRQ12;
1285 tmp = ED_NEC77_IRQ13;
1288 device_printf(dev, "Invalid irq configuration (%jd) must be "
1289 "%s for %s\n", conf_irq, "3,5,6,12,13", "PC-9801-77");
1292 ed_asic_outb(sc, ED_NEC77_IRQ, tmp);
1298 * Probe and vendor-specific initialization routine for EC/EP-98X boards
1301 ed_probe_NW98X(device_t dev, int port_rid, int flags)
1303 struct ed_softc *sc = device_get_softc(dev);
1306 rman_res_t conf_irq, junk;
1308 error = ed98_probe_Novell(dev, port_rid, flags);
1312 /* Networld 98X3 does not need IRQ setting. */
1313 if (ED_TYPE98SUB(flags) == 0)
1317 * Set IRQ. EC/EP-98X only allows a choice of irq 3,5,6,12,13.
1319 error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk);
1325 tmp = ED_NW98X_IRQ3;
1328 tmp = ED_NW98X_IRQ5;
1331 tmp = ED_NW98X_IRQ6;
1334 tmp = ED_NW98X_IRQ12;
1337 tmp = ED_NW98X_IRQ13;
1340 device_printf(dev, "Invalid irq configuration (%jd) must be "
1341 "%s for %s\n", conf_irq, "3,5,6,12,13", "EC/EP-98X");
1344 ed_asic_outb(sc, ED_NW98X_IRQ, tmp);
1350 * Read SB-9801 station address from Serial Two-Wire EEPROM
1353 ed_get_SB98(struct ed_softc *sc)
1358 /* enable EEPROM acceess */
1359 ed_asic_outb(sc, ED_SB98_EEPENA, ED_SB98_EEPENA_ENABLE);
1361 /* output start command */
1362 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL);
1363 DELAY(ED_SB98_EEP_DELAY);
1364 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL);
1365 DELAY(ED_SB98_EEP_DELAY);
1367 /* output address (7bit) */
1368 for (mask = 0x40; mask != 0; mask >>= 1) {
1370 if (ED_SB98_ADDRESS & mask)
1371 val = ED_SB98_EEP_SDA;
1372 ed_asic_outb(sc, ED_SB98_EEP, val);
1373 DELAY(ED_SB98_EEP_DELAY);
1374 ed_asic_outb(sc, ED_SB98_EEP, val | ED_SB98_EEP_SCL);
1375 DELAY(ED_SB98_EEP_DELAY);
1378 /* output READ command */
1379 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_READ);
1380 DELAY(ED_SB98_EEP_DELAY);
1381 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_READ | ED_SB98_EEP_SCL);
1382 DELAY(ED_SB98_EEP_DELAY);
1384 /* read station address */
1385 for (i = 0; i < ETHER_ADDR_LEN; i++) {
1387 ed_asic_outb(sc, ED_SB98_EEP, 0);
1388 DELAY(ED_SB98_EEP_DELAY);
1389 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL);
1390 DELAY(ED_SB98_EEP_DELAY);
1393 for (j = 0; j < 8; j++) {
1394 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA);
1395 DELAY(ED_SB98_EEP_DELAY);
1396 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL);
1397 DELAY(ED_SB98_EEP_DELAY);
1399 val |= (ed_asic_inb(sc, ED_SB98_EEP) & ED_SB98_EEP_SDA);
1400 DELAY(ED_SB98_EEP_DELAY);
1402 sc->enaddr[i] = val;
1405 /* output Last ACK */
1406 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA);
1407 DELAY(ED_SB98_EEP_DELAY);
1408 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL);
1409 DELAY(ED_SB98_EEP_DELAY);
1411 /* output stop command */
1412 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SCL);
1413 DELAY(ED_SB98_EEP_DELAY);
1414 ed_asic_outb(sc, ED_SB98_EEP, ED_SB98_EEP_SDA | ED_SB98_EEP_SCL);
1415 DELAY(ED_SB98_EEP_DELAY);
1417 /* disable EEPROM access */
1418 ed_asic_outb(sc, ED_SB98_EEPENA, ED_SB98_EEPENA_DISABLE);
1422 * Probe and vendor-specific initialization routine for SB-9801 boards
1425 ed_probe_SB98(device_t dev, int port_rid, int flags)
1427 struct ed_softc *sc = device_get_softc(dev);
1430 rman_res_t conf_irq, junk;
1432 error = ed98_alloc_port(dev, port_rid);
1436 sc->asic_offset = ED_NOVELL_ASIC_OFFSET;
1437 sc->nic_offset = ED_NOVELL_NIC_OFFSET;
1439 /* Check I/O address. 00d[02468ace] are allowed. */
1440 if ((rman_get_start(sc->port_res) & ~0x000e) != 0x00d0) {
1442 device_printf(dev, "Invalid i/o port configuration (0x%jx) "
1443 "must be %s for %s\n", rman_get_start(sc->port_res),
1449 /* Write I/O port address and read 4 times */
1450 outb(ED_SB98_IO_INHIBIT, rman_get_start(sc->port_res) & 0xff);
1451 (void) inb(ED_SB98_IO_INHIBIT); DELAY(300);
1452 (void) inb(ED_SB98_IO_INHIBIT); DELAY(300);
1453 (void) inb(ED_SB98_IO_INHIBIT); DELAY(300);
1454 (void) inb(ED_SB98_IO_INHIBIT); DELAY(300);
1457 * Check IRQ. Soliton SB-9801 only allows a choice of
1460 error = bus_get_resource(dev, SYS_RES_IRQ, 0, &conf_irq, &junk);
1466 tmp = ED_SB98_CFG_IRQ3;
1469 tmp = ED_SB98_CFG_IRQ5;
1472 tmp = ED_SB98_CFG_IRQ6;
1475 tmp = ED_SB98_CFG_IRQ12;
1478 device_printf(dev, "Invalid irq configuration (%jd) must be "
1479 "%s for %s\n", conf_irq, "3,5,6,12", "SB9801");
1483 if (flags & ED_FLAGS_DISABLE_TRANCEIVER)
1484 tmp |= ED_SB98_CFG_ALTPORT;
1485 ed_asic_outb(sc, ED_SB98_CFG, ED_SB98_CFG_ENABLE | tmp);
1486 ed_asic_outb(sc, ED_SB98_POLARITY, 0x01);
1488 /* Reset the board. */
1489 ed_asic_outb(sc, ED_NOVELL_RESET, 0x7a);
1491 ed_asic_outb(sc, ED_NOVELL_RESET, 0x79);
1495 * This is needed because some NE clones apparently don't reset the
1496 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
1497 * - this makes the probe invasive! ...Done against my better
1500 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
1503 /* Make sure that we really have an 8390 based board */
1504 if (!ed98_probe_generic8390(sc))
1507 /* Test memory via PIO */
1508 sc->cr_proto = ED_CR_RD2;
1509 if (!ed_pio_testmem(sc, 16384, 1, flags))
1512 /* This looks like an SB9801 board. */
1513 sc->type_str = "SB9801";
1515 /* Get station address */
1518 /* clear any pending interrupts that might have occurred above */
1519 ed_nic_outb(sc, ED_P0_ISR, 0xff);
1521 sc->sc_write_mbufs = ed_pio_write_mbufs;
1526 * Test the ability to read and write to the NIC memory.
1529 ed_pio_testmem(struct ed_softc *sc, int page_offset, int isa16bit, int flags)
1532 static char test_pattern[32] = "THIS is A memory TEST pattern";
1533 char test_buffer[32];
1538 sc->vendor = ED_VENDOR_NOVELL;
1540 sc->isa16bit = isa16bit;
1542 /* 8k of memory plus an additional 8k if 16bit */
1543 memsize = (isa16bit ? 16384 : 8192);
1546 * This prevents packets from being stored in the NIC memory when the
1547 * readmem routine turns on the start bit in the CR.
1549 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_MON);
1551 /* Initialize DCR for byte/word operations */
1553 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS);
1555 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_FT1 | ED_DCR_LS);
1556 ed_nic_outb(sc, ED_P0_PSTART, page_offset / ED_PAGE_SIZE);
1557 ed_nic_outb(sc, ED_P0_PSTOP, (page_offset + memsize) / ED_PAGE_SIZE);
1559 printf("ed?: ed_pio_testmem: page start=%x, end=%lx",
1560 page_offset, page_offset + memsize);
1564 * Write a test pattern. If this fails, then we don't know
1565 * what this board is.
1567 ed_pio_writemem(sc, test_pattern, page_offset, sizeof(test_pattern));
1568 ed_pio_readmem(sc, page_offset, test_buffer, sizeof(test_pattern));
1570 if (bcmp(test_pattern, test_buffer, sizeof(test_pattern))) {
1572 printf("ed?: ed_pio_testmem: bcmp(page %x) NG", page_offset);
1578 /* Check the bottom. */
1579 page_end = page_offset + memsize - ED_PAGE_SIZE;
1580 ed_pio_writemem(sc, test_pattern, page_end, sizeof(test_pattern));
1581 ed_pio_readmem(sc, page_end, test_buffer, sizeof(test_pattern));
1583 if (bcmp(test_pattern, test_buffer, sizeof(test_pattern))) {
1585 printf("ed?: ed_pio_testmem: bcmp(page %x) NG", page_end);
1590 sc->mem_size = memsize;
1591 sc->mem_start = page_offset;
1592 sc->mem_end = sc->mem_start + memsize;
1593 sc->tx_page_start = page_offset / ED_PAGE_SIZE;
1596 * Use one xmit buffer if < 16k, two buffers otherwise (if not told
1599 if ((memsize < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING))
1604 sc->rec_page_start = sc->tx_page_start + sc->txb_cnt * ED_TXBUF_SIZE;
1605 sc->rec_page_stop = sc->tx_page_start + memsize / ED_PAGE_SIZE;
1607 sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
1612 static device_method_t ed_cbus_methods[] = {
1613 /* Device interface */
1614 DEVMETHOD(device_probe, ed_cbus_probe),
1615 DEVMETHOD(device_attach, ed_cbus_attach),
1616 DEVMETHOD(device_detach, ed_detach),
1621 static driver_t ed_cbus_driver = {
1624 sizeof(struct ed_softc)
1627 DRIVER_MODULE(ed, isa, ed_cbus_driver, ed_devclass, 0, 0);
1628 MODULE_DEPEND(ed, isa, 1, 1, 1);
1629 MODULE_DEPEND(ed, ether, 1, 1, 1);