It turns out that the Toshiba LANCT00A PC Card is really like the
Toshiba PCETC ISA card, and even has the same board type code in the card ID (0x14). So, for this card, call ed_probe_WD80x3_generic after setting things up apropriately. This makes the card attach and kinda work (I'm seeing panics in sbdrop). Since history has shown that the WD80x3 probe routine is dangerous, only do it for this card. Also, disable the memory range check to make sure it is an valid ISA memory. I think that it is bogus, but I'm not 100% sure, for these cards. I removed probing for the WD80x3 in 2005 when I added support for the AX88x90 and DL100xx cards since none of my cards had ever matched it and PAO3 removed it and none of the cards in their database died. It is possible there are other quirks about this card too, since no other open source OS supports it, or even claims to support it. But it was a fun half hour hack...
This commit is contained in:
parent
c9f30aaaf7
commit
669697b4ea
@ -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, ":");
|
||||
|
@ -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
|
||||
|
@ -266,6 +266,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.
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user