MIPS: avoid possible resource conflict in register_pci_controller
authorGabor Juhos <juhosg@openwrt.org>
Sat, 2 Feb 2013 13:18:54 +0000 (13:18 +0000)
committerJohn Crispin <blogic@openwrt.org>
Sun, 17 Feb 2013 00:25:37 +0000 (01:25 +0100)
The IO and memory resources of a PCI controller
might already have a parent resource set when
they are passed to 'register_pci_controller'.

If the parent resource is set, the request_resource
call will fail due to resource conflict and the
current code will not be able to register the
PCI controller.

Use the parent resource if it is available in the
request_resource call to avoid the isssue.

Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/4910/
Signed-off-by: John Crispin <blogic@openwrt.org>
arch/mips/pci/pci.c

index a1843448fad38de52d8a53316ade498a8a7bd5b8..eb653994a2f11ba4be0be3c38be76281be2ea686 100644 (file)
@@ -175,9 +175,20 @@ static DEFINE_MUTEX(pci_scan_mutex);
 
 void register_pci_controller(struct pci_controller *hose)
 {
-       if (request_resource(&iomem_resource, hose->mem_resource) < 0)
+       struct resource *parent;
+
+       parent = hose->mem_resource->parent;
+       if (!parent)
+               parent = &iomem_resource;
+
+       if (request_resource(parent, hose->mem_resource) < 0)
                goto out;
-       if (request_resource(&ioport_resource, hose->io_resource) < 0) {
+
+       parent = hose->io_resource->parent;
+       if (!parent)
+               parent = &ioport_resource;
+
+       if (request_resource(parent, hose->io_resource) < 0) {
                release_resource(hose->mem_resource);
                goto out;
        }