[PATCH 3/3] pcmcia: fix i82365 request_region double usage

Dominik Brodowski linux at dominikbrodowski.net
Thu Jun 30 04:41:14 EDT 2005


From: Ian Campbell <icampbell at arcom.com>

http://www.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f354942cb301fed273f423fb5c4f57bde3efc5b2
converted the check_region() calls in drivers/pcmcia/i82365.c into
request_regions. Unfortunately this seems to have broken things.

isa_probe() used to call check_region() and then call add_pcic() which
would request_region(). 

Now isa_probe() calls request_region() and then calls add_pcic() which
calls request_region() again, this fails and add_pcic() returns
immediately without doing all the setup etc.

On the face of it the patch below fixes the problem, by not doing the
second request region in add_pcic(). I think this is preferable to
remove the call in isa_probe() since identify() touches the I/O regions
and is called before add_pcic().

However I haven't fully grokked the meaning of the code which follows
the request_region() in isa_probe(), so I'm not sure that the handling
WRT multiple sockets and multiple bridge chips is correct. In particular
I'm not convinced that the regions for subsequent sockets and/or bridges
will be requested at all. I suspect a more thorough reworking by someone
who understands what is going on there might be in order.

I should mention that I'm actually messing about with this on an ARM
platform with wacky memory and i/o mapping offsets etc, it doesn't quite
work yet for other reasons which preclude full testing etc, but I think
the problem above is still present for more normal x86 stuff.

Signed-off-by: Ian Campbell <icampbell at arcom.com>
Signed-off-by: Dominik Brodowski <linux at dominikbrodowski.net>

---

 drivers/pcmcia/i82365.c |    8 --------
 1 files changed, 8 deletions(-)

Index: 2.6.12-git10/drivers/pcmcia/i82365.c
===================================================================
--- 2.6.12-git10.orig/drivers/pcmcia/i82365.c
+++ 2.6.12-git10/drivers/pcmcia/i82365.c
@@ -698,14 +698,6 @@ static void __init add_pcic(int ns, int 
     struct i82365_socket *t = &socket[sockets-ns];
 
     base = sockets-ns;
-    if (t->ioaddr > 0) {
-	if (!request_region(t->ioaddr, 2, "i82365")) {
-	    printk(KERN_ERR "i82365: IO region conflict at %#lx, not available\n",
-			t->ioaddr);
-	    return;
-	}
-    }
-    
     if (base == 0) printk("\n");
     printk(KERN_INFO "  %s", pcic[type].name);
     printk(" ISA-to-PCMCIA at port %#lx ofs 0x%02x",



More information about the linux-pcmcia mailing list