aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Brodowski <linux@dominikbrodowski.net>2005-07-12 16:58:15 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-12 19:00:59 -0400
commit862104e56329babf0b9571281e9516fe6259dd17 (patch)
tree2364a2bfb91961a806606b47b7b53ab65c9e5f54
parent8e2f3b70e60172f5ed7c0933b8d8a35654c1c031 (diff)
[PATCH] yenta: fix parent resource determination
If the CardBus windows were pre-configured and the CardBus bridge is behind a transparent PCI-PCI bridge, pci_find_parent_resource() might return a different resource than the real parent if it is called before the window is determined. Therefore, move that call around. Also fix return of value in void function. Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--drivers/pcmcia/yenta_socket.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
index 0e7aa8176692..5e0a9980d2fc 100644
--- a/drivers/pcmcia/yenta_socket.c
+++ b/drivers/pcmcia/yenta_socket.c
@@ -551,7 +551,7 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
551 res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr; 551 res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr;
552 /* Already allocated? */ 552 /* Already allocated? */
553 if (res->parent) 553 if (res->parent)
554 return 0; 554 return;
555 555
556 /* The granularity of the memory limit is 4kB, on IO it's 4 bytes */ 556 /* The granularity of the memory limit is 4kB, on IO it's 4 bytes */
557 mask = ~0xfff; 557 mask = ~0xfff;
@@ -562,25 +562,23 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
562 bus = socket->dev->subordinate; 562 bus = socket->dev->subordinate;
563 res->name = bus->name; 563 res->name = bus->name;
564 res->flags = type; 564 res->flags = type;
565 res->start = 0;
566 res->end = 0;
567 root = pci_find_parent_resource(socket->dev, res);
568
569 if (!root)
570 return;
571 565
572 start = config_readl(socket, offset) & mask; 566 start = config_readl(socket, offset) & mask;
573 end = config_readl(socket, offset+4) | ~mask; 567 end = config_readl(socket, offset+4) | ~mask;
574 if (start && end > start && !override_bios) { 568 if (start && end > start && !override_bios) {
575 res->start = start; 569 res->start = start;
576 res->end = end; 570 res->end = end;
577 if (request_resource(root, res) == 0) 571 root = pci_find_parent_resource(socket->dev, res);
572 if (root && (request_resource(root, res) == 0))
578 return; 573 return;
579 printk(KERN_INFO "yenta %s: Preassigned resource %d busy, reconfiguring...\n", 574 printk(KERN_INFO "yenta %s: Preassigned resource %d busy or not available, reconfiguring...\n",
580 pci_name(socket->dev), nr); 575 pci_name(socket->dev), nr);
581 res->start = res->end = 0;
582 } 576 }
583 577
578 res->start = 0;
579 res->end = 0;
580 root = pci_find_parent_resource(socket->dev, res);
581
584 if (type & IORESOURCE_IO) { 582 if (type & IORESOURCE_IO) {
585 align = 1024; 583 align = 1024;
586 size = BRIDGE_IO_MAX; 584 size = BRIDGE_IO_MAX;
@@ -629,7 +627,7 @@ static void yenta_allocate_resources(struct yenta_socket *socket)
629 yenta_allocate_res(socket, 0, IORESOURCE_MEM|IORESOURCE_PREFETCH); 627 yenta_allocate_res(socket, 0, IORESOURCE_MEM|IORESOURCE_PREFETCH);
630 yenta_allocate_res(socket, 1, IORESOURCE_MEM); 628 yenta_allocate_res(socket, 1, IORESOURCE_MEM);
631 yenta_allocate_res(socket, 2, IORESOURCE_IO); 629 yenta_allocate_res(socket, 2, IORESOURCE_IO);
632 yenta_allocate_res(socket, 3, IORESOURCE_IO); /* PCI isn't clever enough to use this one yet */ 630 yenta_allocate_res(socket, 3, IORESOURCE_IO);
633} 631}
634 632
635 633