[PATCH] pcmcia: resource handling fixes

- properly bail out in set_cis_map if call to socket driver's set_mem_map
failed
- don't abort do_mem_probe cycle if one entry failed (!CONFIG_PCMCIA_PROBE)
- don't do iomem probing in chunks larger than 0x800000 (1 << 23) as
yenta_socket and vrc4173_cardu.c fail to set_mem_map for windows equal to
or larger than (1 << 24).

Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Dominik Brodowski and committed by Linus Torvalds 2ad0a0a7 f861bd23

+12 -3
+8 -1
drivers/pcmcia/cistpl.c
··· 89 89 set_cis_map(struct pcmcia_socket *s, unsigned int card_offset, unsigned int flags) 90 90 { 91 91 pccard_mem_map *mem = &s->cis_mem; 92 + int ret; 93 + 92 94 if (!(s->features & SS_CAP_STATIC_MAP) && mem->res == NULL) { 93 95 mem->res = pcmcia_find_mem_region(0, s->map_size, s->map_size, 0, s); 94 96 if (mem->res == NULL) { ··· 101 99 } 102 100 mem->card_start = card_offset; 103 101 mem->flags = flags; 104 - s->ops->set_mem_map(s, mem); 102 + ret = s->ops->set_mem_map(s, mem); 103 + if (ret) { 104 + iounmap(s->cis_virt); 105 + return NULL; 106 + } 107 + 105 108 if (s->features & SS_CAP_STATIC_MAP) { 106 109 if (s->cis_virt) 107 110 iounmap(s->cis_virt);
+4 -2
drivers/pcmcia/rsrc_nonstatic.c
··· 372 372 base, base+num-1); 373 373 bad = fail = 0; 374 374 step = (num < 0x20000) ? 0x2000 : ((num>>4) & ~0x1fff); 375 + /* don't allow too large steps */ 376 + if (step > 0x800000) 377 + step = 0x800000; 375 378 /* cis_readable wants to map 2x map_size */ 376 379 if (step < 2 * s->map_size) 377 380 step = 2 * s->map_size; ··· 468 465 469 466 for (m = s_data->mem_db.next; m != &s_data->mem_db; m = mm.next) { 470 467 mm = *m; 471 - if (do_mem_probe(mm.base, mm.num, s)) 472 - break; 468 + do_mem_probe(mm.base, mm.num, s); 473 469 } 474 470 } 475 471