diff options
-rw-r--r-- | sys/dev/ed/if_ed_pccard.c | 21 | ||||
-rw-r--r-- | sys/dev/ed/if_ed_wd80x3.c | 9 | ||||
-rw-r--r-- | sys/dev/ed/if_edvar.h | 5 |
3 files changed, 27 insertions, 8 deletions
diff --git a/sys/dev/ed/if_ed_pccard.c b/sys/dev/ed/if_ed_pccard.c index 916f9d7..bbd76db 100644 --- a/sys/dev/ed/if_ed_pccard.c +++ b/sys/dev/ed/if_ed_pccard.c @@ -126,6 +126,7 @@ static const struct ed_product { #define NE2000DVF_DL100XX 0x0001 /* chip is D-Link DL10019/22 */ #define NE2000DVF_AX88X90 0x0002 /* chip is ASIX AX88[17]90 */ #define NE2000DVF_TC5299J 0x0004 /* chip is Tamarack TC5299J */ +#define NE2000DVF_TOSHIBA 0x0008 /* Toshiba DP83902A */ #define NE2000DVF_ENADDR 0x0100 /* Get MAC from attr mem */ #define NE2000DVF_ANYFUNC 0x0200 /* Allow any function type */ #define NE2000DVF_MODEM 0x0400 /* Has a modem/serial */ @@ -226,7 +227,7 @@ static const struct ed_product { { PCMCIA_CARD(TELECOMDEVICE, LM5LT), 0 }, { PCMCIA_CARD(TELECOMDEVICE, TCD_HPC100), NE2000DVF_AX88X90}, { PCMCIA_CARD(TJ, PTJ_LAN_T), 0 }, - { PCMCIA_CARD(TOSHIBA2, LANCT00A), NE2000DVF_ANYFUNC}, /* NG */ + { PCMCIA_CARD(TOSHIBA2, LANCT00A), NE2000DVF_ANYFUNC | NE2000DVF_TOSHIBA}, { PCMCIA_CARD(ZONET, ZEN), 0}, { { NULL } } }; @@ -434,9 +435,10 @@ ed_pccard_attach(device_t dev) u_char sum; u_char enaddr[ETHER_ADDR_LEN]; const struct ed_product *pp; - int error, i; + int error, i, flags; struct ed_softc *sc = device_get_softc(dev); u_long size; + static uint16_t *intr_vals[] = {NULL, NULL}; if ((pp = (const struct ed_product *) pccard_product_lookup(dev, (const struct pccard_product *) ed_pccard_products, @@ -474,6 +476,7 @@ ed_pccard_attach(device_t dev) sc->asic_offset = ED_NOVELL_ASIC_OFFSET; sc->nic_offset = ED_NOVELL_NIC_OFFSET; error = ENXIO; + flags = device_get_flags(dev); if (error != 0) error = ed_pccard_dl100xx(dev, pp); if (error != 0) @@ -481,7 +484,15 @@ ed_pccard_attach(device_t dev) if (error != 0) error = ed_pccard_tc5299j(dev, pp); if (error != 0) - error = ed_probe_Novell_generic(dev, device_get_flags(dev)); + error = ed_probe_Novell_generic(dev, flags); + if (error != 0) { + if (pp->flags & NE2000DVF_TOSHIBA) + flags |= ED_FLAGS_TOSH_ETHER; + flags |= ED_FLAGS_PCCARD; + sc->asic_offset = ED_WD_ASIC_OFFSET; + sc->nic_offset = ED_WD_NIC_OFFSET; + error = ed_probe_WD80x3_generic(dev, flags, intr_vals); + } if (error) goto bad; @@ -502,7 +513,9 @@ ed_pccard_attach(device_t dev) * default value. In all fails, we should fail the attach, * but don't right now. */ - if (sc->chip_type == ED_CHIP_TYPE_DP8390) { + for (i = 0, sum = 0; i < ETHER_ADDR_LEN; i++) + sum |= sc->enaddr[i]; + if (sc->chip_type == ED_CHIP_TYPE_DP8390 && sum == 0) { pccard_get_ether(dev, enaddr); if (bootverbose) device_printf(dev, "CIS MAC %6D\n", enaddr, ":"); diff --git a/sys/dev/ed/if_ed_wd80x3.c b/sys/dev/ed/if_ed_wd80x3.c index b3cb439..4ff2286 100644 --- a/sys/dev/ed/if_ed_wd80x3.c +++ b/sys/dev/ed/if_ed_wd80x3.c @@ -119,7 +119,6 @@ ed_probe_WD80x3_generic(device_t dev, int flags, uint16_t *intr_vals[]) sum += ed_asic_inb(sc, ED_WD_PROM + i); if (sum != totalsum) { - /* * Checksum is invalid. This often happens with cheap WD8003E * clones. In this case, the checksum byte (the eighth byte) @@ -268,9 +267,11 @@ ed_probe_WD80x3_generic(device_t dev, int flags, uint16_t *intr_vals[]) printf("%x -> %x\n", i, ed_asic_inb(sc, i)); #endif pmem = rman_get_start(sc->mem_res); - error = ed_isa_mem_ok(dev, pmem, memsize); - if (error) - return (error); + if (!(flags & ED_FLAGS_PCCARD)) { + error = ed_isa_mem_ok(dev, pmem, memsize); + if (error) + return (error); + } /* * (note that if the user specifies both of the following flags that diff --git a/sys/dev/ed/if_edvar.h b/sys/dev/ed/if_edvar.h index 170558e..e072532 100644 --- a/sys/dev/ed/if_edvar.h +++ b/sys/dev/ed/if_edvar.h @@ -267,6 +267,11 @@ extern devclass_t ed_devclass; #define ED_FLAGS_FORCE_PIO 0x0010 /* + * This forces a PC Card, and disables ISA memory range checks + */ +#define ED_FLAGS_PCCARD 0x0020 + +/* * These are flags describing the chip type. */ #define ED_FLAGS_TOSH_ETHER 0x10000 |