summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/ed/if_ed_pccard.c21
-rw-r--r--sys/dev/ed/if_ed_wd80x3.c9
-rw-r--r--sys/dev/ed/if_edvar.h5
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
OpenPOWER on IntegriCloud