Commit 862104e5 authored by Dominik Brodowski's avatar Dominik Brodowski Committed by Linus Torvalds

[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: default avatarDominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 8e2f3b70
...@@ -551,7 +551,7 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ ...@@ -551,7 +551,7 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr; res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr;
/* Already allocated? */ /* Already allocated? */
if (res->parent) if (res->parent)
return 0; return;
/* The granularity of the memory limit is 4kB, on IO it's 4 bytes */ /* The granularity of the memory limit is 4kB, on IO it's 4 bytes */
mask = ~0xfff; mask = ~0xfff;
...@@ -562,25 +562,23 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ ...@@ -562,25 +562,23 @@ static void yenta_allocate_res(struct yenta_socket *socket, int nr, unsigned typ
bus = socket->dev->subordinate; bus = socket->dev->subordinate;
res->name = bus->name; res->name = bus->name;
res->flags = type; res->flags = type;
res->start = 0;
res->end = 0;
root = pci_find_parent_resource(socket->dev, res);
if (!root)
return;
start = config_readl(socket, offset) & mask; start = config_readl(socket, offset) & mask;
end = config_readl(socket, offset+4) | ~mask; end = config_readl(socket, offset+4) | ~mask;
if (start && end > start && !override_bios) { if (start && end > start && !override_bios) {
res->start = start; res->start = start;
res->end = end; res->end = end;
if (request_resource(root, res) == 0) root = pci_find_parent_resource(socket->dev, res);
if (root && (request_resource(root, res) == 0))
return; return;
printk(KERN_INFO "yenta %s: Preassigned resource %d busy, reconfiguring...\n", printk(KERN_INFO "yenta %s: Preassigned resource %d busy or not available, reconfiguring...\n",
pci_name(socket->dev), nr); pci_name(socket->dev), nr);
res->start = res->end = 0;
} }
res->start = 0;
res->end = 0;
root = pci_find_parent_resource(socket->dev, res);
if (type & IORESOURCE_IO) { if (type & IORESOURCE_IO) {
align = 1024; align = 1024;
size = BRIDGE_IO_MAX; size = BRIDGE_IO_MAX;
...@@ -629,7 +627,7 @@ static void yenta_allocate_resources(struct yenta_socket *socket) ...@@ -629,7 +627,7 @@ static void yenta_allocate_resources(struct yenta_socket *socket)
yenta_allocate_res(socket, 0, IORESOURCE_MEM|IORESOURCE_PREFETCH); yenta_allocate_res(socket, 0, IORESOURCE_MEM|IORESOURCE_PREFETCH);
yenta_allocate_res(socket, 1, IORESOURCE_MEM); yenta_allocate_res(socket, 1, IORESOURCE_MEM);
yenta_allocate_res(socket, 2, IORESOURCE_IO); yenta_allocate_res(socket, 2, IORESOURCE_IO);
yenta_allocate_res(socket, 3, IORESOURCE_IO); /* PCI isn't clever enough to use this one yet */ yenta_allocate_res(socket, 3, IORESOURCE_IO);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment