summaryrefslogtreecommitdiffstats
path: root/sys/dev/ed
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2005-09-06 22:44:26 +0000
committerimp <imp@FreeBSD.org>2005-09-06 22:44:26 +0000
commit442673342bd080723a76ac84ac326b6f8b1fafd0 (patch)
tree135afe0ae012ea83ddcbee31f1c78e935ca23e31 /sys/dev/ed
parentf1c36db980db477371caabefddd5e814f8abee76 (diff)
downloadFreeBSD-src-442673342bd080723a76ac84ac326b6f8b1fafd0.zip
FreeBSD-src-442673342bd080723a76ac84ac326b6f8b1fafd0.tar.gz
It turns out that many of the ambicom cards have their CIS resources
listed in different orders. Since it is easy to identify the Modem resources vs the Ethernet resources by looking at the size, use that rather than hard coded rids. For such parts, go ahead and guess which rid we should use based on the size. This guess appears reliable for the two example cards that I have with different CIS info.
Diffstat (limited to 'sys/dev/ed')
-rw-r--r--sys/dev/ed/if_ed_pccard.c34
-rw-r--r--sys/dev/ed/if_edvar.h1
2 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 fd20826..0c4ddae 100644
--- a/sys/dev/ed/if_ed_pccard.c
+++ b/sys/dev/ed/if_ed_pccard.c
@@ -107,8 +107,6 @@ static const struct ed_product {
#define NE2000DVF_ANYFUNC 0x0008 /* Allow any function type */
#define NE2000DVF_MODEM 0x0010 /* Has a modem/serial */
int enoff;
- int edrid;
- int siorid;
} ed_pccard_products[] = {
{ PCMCIA_CARD(ACCTON, EN2212), 0},
{ PCMCIA_CARD(ACCTON, EN2216), 0},
@@ -146,7 +144,7 @@ static const struct ed_product {
{ PCMCIA_CARD(EXP, THINLANCOMBO), 0},
{ PCMCIA_CARD(GREY_CELL, TDK3000), 0},
{ PCMCIA_CARD(GREY_CELL, DMF650TX),
- NE2000DVF_ANYFUNC | NE2000DVF_DL100XX | NE2000DVF_MODEM, -1, 1, 0},
+ NE2000DVF_ANYFUNC | NE2000DVF_DL100XX | NE2000DVF_MODEM},
{ PCMCIA_CARD(IBM, HOME_AND_AWAY), 0},
{ PCMCIA_CARD(IBM, INFOMOVER), NE2000DVF_ENADDR, 0xff0},
{ PCMCIA_CARD(IODATA3, PCLAT), 0},
@@ -251,9 +249,12 @@ ed_pccard_rom_mac(device_t dev, uint8_t *enaddr)
}
static int
-ed_pccard_add_modem(device_t dev, int rid)
+ed_pccard_add_modem(device_t dev)
{
- device_printf(dev, "Need to write this code: modem rid is %d\n", rid);
+ struct ed_softc *sc = device_get_softc(dev);
+
+ device_printf(dev, "Need to write this code: modem rid is %d\n",
+ sc->modem_rid);
return 0;
}
@@ -265,12 +266,29 @@ ed_pccard_attach(device_t dev)
const struct ed_product *pp;
int error, i;
struct ed_softc *sc = device_get_softc(dev);
+ u_long size;
if ((pp = (const struct ed_product *) pccard_product_lookup(dev,
(const struct pccard_product *) ed_pccard_products,
sizeof(ed_pccard_products[0]), NULL)) == NULL)
return (ENXIO);
- sc->port_rid = pp->edrid;
+ sc->modem_rid = -1;
+ if (pp->flags & NE2000DVF_MODEM) {
+ sc->port_rid = -1;
+ for (i = 0; i < 4; i++) {
+ size = bus_get_resource_count(dev, SYS_RES_IOPORT, i);
+ if (size == ED_NOVELL_IO_PORTS)
+ sc->port_rid = i;
+ else if (size == 8)
+ sc->modem_rid = i;
+ }
+ if (sc->port_rid == -1) {
+ device_printf(dev, "Cannot locate my ports!\n");
+ return (ENXIO);
+ }
+ } else {
+ sc->port_rid = 0;
+ }
if (pp->flags & NE2000DVF_DL100XX) {
error = ed_probe_Novell(dev, sc->port_rid, 0);
if (error == 0)
@@ -370,8 +388,8 @@ end2:
ed_ifmedia_sts);
}
#endif
- if (pp->flags & NE2000DVF_MODEM)
- ed_pccard_add_modem(dev, pp->siorid);
+ if (sc->modem_rid != -1)
+ ed_pccard_add_modem(dev);
return (0);
}
diff --git a/sys/dev/ed/if_edvar.h b/sys/dev/ed/if_edvar.h
index 09e8325..f125d38 100644
--- a/sys/dev/ed/if_edvar.h
+++ b/sys/dev/ed/if_edvar.h
@@ -60,6 +60,7 @@ struct ed_softc {
int irq_rid; /* resource id for irq */
struct resource* irq_res; /* resource for irq */
void* irq_handle; /* handle for irq handler */
+ int modem_rid; /* resource ID for modem part of device */
device_t miibus; /* MII bus for cards with MII. */
void (*mii_writebits)(struct ed_softc *, u_int, int);
u_int (*mii_readbits)(struct ed_softc *, int);
OpenPOWER on IntegriCloud