diff options
author | Ian Campbell <icampbell@arcom.com> | 2005-07-07 20:58:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-07 21:24:04 -0400 |
commit | 69a4d56bae492b1a5e74459d9d771d9bc7f9320f (patch) | |
tree | 62a8531c160d56b3761034cb9803bf2fbd1c1392 /drivers/pcmcia/i82365.c | |
parent | 08d805258f69bff5ba8268a969f140ef1f105c71 (diff) |
[PATCH] pcmcia: fix i82365 request_region double usage
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@arcom.com>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/pcmcia/i82365.c')
-rw-r--r-- | drivers/pcmcia/i82365.c | 8 |
1 files changed, 0 insertions, 8 deletions
diff --git a/drivers/pcmcia/i82365.c b/drivers/pcmcia/i82365.c index d72f9a35c8b..3546158ef77 100644 --- a/drivers/pcmcia/i82365.c +++ b/drivers/pcmcia/i82365.c | |||
@@ -698,14 +698,6 @@ static void __init add_pcic(int ns, int type) | |||
698 | struct i82365_socket *t = &socket[sockets-ns]; | 698 | struct i82365_socket *t = &socket[sockets-ns]; |
699 | 699 | ||
700 | base = sockets-ns; | 700 | base = sockets-ns; |
701 | if (t->ioaddr > 0) { | ||
702 | if (!request_region(t->ioaddr, 2, "i82365")) { | ||
703 | printk(KERN_ERR "i82365: IO region conflict at %#lx, not available\n", | ||
704 | t->ioaddr); | ||
705 | return; | ||
706 | } | ||
707 | } | ||
708 | |||
709 | if (base == 0) printk("\n"); | 701 | if (base == 0) printk("\n"); |
710 | printk(KERN_INFO " %s", pcic[type].name); | 702 | printk(KERN_INFO " %s", pcic[type].name); |
711 | printk(" ISA-to-PCMCIA at port %#lx ofs 0x%02x", | 703 | printk(" ISA-to-PCMCIA at port %#lx ofs 0x%02x", |