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

Reply via email to