Hey, On Thu, Jan 14, 2010 at 08:39:17PM +0900, Komuro wrote: > Hi, > > >- Is it just a buggy card if it works at 0x300 but not 0xc300 > > (or is it maybe a problem with Linux assigning the io area)? > >- Why is IOAddrLines forced to 16 (and thus alignment to 0x10000), but only > > if BasePort1 is 0? > > Some pcmcia-card decodes only lower 10bits (0x0000-0x03FF). > Such card does not work on higher ports (0x0400-0xFFFF) > > So your card is not a buggy card.
Quick'n'Dirty patch -- or should we handle this generically, Komuro? Any way to reliably detect these cards? Best, Dominik diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c index 776cad2..8f03bd0 100644 --- a/drivers/net/pcmcia/pcnet_cs.c +++ b/drivers/net/pcmcia/pcnet_cs.c @@ -89,6 +89,7 @@ INT_MODULE_PARM(delay_output, 0); /* pause after xmit? */ INT_MODULE_PARM(delay_time, 4); /* in usec */ INT_MODULE_PARM(use_shmem, -1); /* use shared memory? */ INT_MODULE_PARM(full_duplex, 0); /* full duplex? */ +INT_MODULE_PARM(lowport, 0); /* full duplex? */ /* Ugh! Let the user hardwire the hardware address for queer cards */ static int hw_addr[6] = { 0, /* ... */ }; @@ -497,11 +498,15 @@ static int try_io_port(struct pcmcia_device *link) link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; link->io.Attributes2 = IO_DATA_PATH_WIDTH_16; } + if (lowport && link->io.BasePort1 >= 0x0400) + return -EINVAL; if (link->io.BasePort1 == 0) { link->io.IOAddrLines = 16; for (j = 0; j < 0x400; j += 0x20) { link->io.BasePort1 = j ^ 0x300; link->io.BasePort2 = (j ^ 0x300) + 0x10; + if (lowport && link->io.BasePort1 >= 0x0400) + continue; ret = pcmcia_request_io(link, &link->io); if (ret == 0) return ret; _______________________________________________ Linux PCMCIA reimplementation list http://lists.infradead.org/mailman/listinfo/linux-pcmcia