[PATCH 4/8] yenta: fix parent resource determination

Dominik Brodowski linux at dominikbrodowski.net
Mon Jul 11 18:20:50 EDT 2005


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 at dominikbrodowski.net>
---

 drivers/pcmcia/yenta_socket.c |   20 +++++++++-----------
 1 files changed, 9 insertions(+), 11 deletions(-)

Index: 2.6.13-rc2-git3/drivers/pcmcia/yenta_socket.c
===================================================================
--- 2.6.13-rc2-git3.orig/drivers/pcmcia/yenta_socket.c
+++ 2.6.13-rc2-git3/drivers/pcmcia/yenta_socket.c
@@ -551,7 +551,7 @@ static void yenta_allocate_res(struct ye
 	res = socket->dev->resource + PCI_BRIDGE_RESOURCES + nr;
 	/* Already allocated? */
 	if (res->parent)
-		return 0;
+		return;
 
 	/* The granularity of the memory limit is 4kB, on IO it's 4 bytes */
 	mask = ~0xfff;
@@ -562,25 +562,23 @@ static void yenta_allocate_res(struct ye
 	bus = socket->dev->subordinate;
 	res->name = bus->name;
 	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;
 	end = config_readl(socket, offset+4) | ~mask;
 	if (start && end > start && !override_bios) {
 		res->start = start;
 		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;
-		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);
-		res->start = res->end = 0;
 	}
 
+	res->start = 0;
+	res->end = 0;
+	root = pci_find_parent_resource(socket->dev, res);
+
 	if (type & IORESOURCE_IO) {
 		align = 1024;
 		size = BRIDGE_IO_MAX;
@@ -629,7 +627,7 @@ static void yenta_allocate_resources(str
 	yenta_allocate_res(socket, 0, IORESOURCE_MEM|IORESOURCE_PREFETCH);
 	yenta_allocate_res(socket, 1, IORESOURCE_MEM);
 	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);
 }
 
 



More information about the linux-pcmcia mailing list