diff options
| author | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-04-08 13:23:07 -0400 |
|---|---|---|
| committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-04-11 08:36:59 -0400 |
| commit | 509b0865fbd8ab6c820397706dde980c1c285538 (patch) | |
| tree | ab0b03f00b7e121e0beade45735ba44f00fd5f2d | |
| parent | d3e03f4ea81456d52810a03a17dd88f78a080818 (diff) | |
pcmcia: fix io_probe due to parent (PCI) resources
Similar to commit 7a96e87d, we need to be aware of any parent PCI
device when requesting IO regions, even only for testing
("probing").
Reported-by: Komuro <komurojun-mbn@nifty.com>
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
| -rw-r--r-- | drivers/pcmcia/rsrc_nonstatic.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/pcmcia/rsrc_nonstatic.c b/drivers/pcmcia/rsrc_nonstatic.c index 559069a80a3b..1178a823fbc6 100644 --- a/drivers/pcmcia/rsrc_nonstatic.c +++ b/drivers/pcmcia/rsrc_nonstatic.c | |||
| @@ -214,7 +214,7 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, | |||
| 214 | return; | 214 | return; |
| 215 | } | 215 | } |
| 216 | for (i = base, most = 0; i < base+num; i += 8) { | 216 | for (i = base, most = 0; i < base+num; i += 8) { |
| 217 | res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); | 217 | res = claim_region(s, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); |
| 218 | if (!res) | 218 | if (!res) |
| 219 | continue; | 219 | continue; |
| 220 | hole = inb(i); | 220 | hole = inb(i); |
| @@ -231,9 +231,14 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, | |||
| 231 | 231 | ||
| 232 | bad = any = 0; | 232 | bad = any = 0; |
| 233 | for (i = base; i < base+num; i += 8) { | 233 | for (i = base; i < base+num; i += 8) { |
| 234 | res = claim_region(NULL, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); | 234 | res = claim_region(s, i, 8, IORESOURCE_IO, "PCMCIA ioprobe"); |
| 235 | if (!res) | 235 | if (!res) { |
| 236 | if (!any) | ||
| 237 | printk(" excluding"); | ||
| 238 | if (!bad) | ||
| 239 | bad = any = i; | ||
| 236 | continue; | 240 | continue; |
| 241 | } | ||
| 237 | for (j = 0; j < 8; j++) | 242 | for (j = 0; j < 8; j++) |
| 238 | if (inb(i+j) != most) | 243 | if (inb(i+j) != most) |
| 239 | break; | 244 | break; |
| @@ -253,6 +258,7 @@ static void do_io_probe(struct pcmcia_socket *s, unsigned int base, | |||
| 253 | } | 258 | } |
| 254 | if (bad) { | 259 | if (bad) { |
| 255 | if ((num > 16) && (bad == base) && (i == base+num)) { | 260 | if ((num > 16) && (bad == base) && (i == base+num)) { |
| 261 | sub_interval(&s_data->io_db, bad, i-bad); | ||
| 256 | printk(" nothing: probe failed.\n"); | 262 | printk(" nothing: probe failed.\n"); |
| 257 | return; | 263 | return; |
| 258 | } else { | 264 | } else { |
