]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/pci/host/pci-host-common.c
PCI: generic: Fix pci_remap_iospace() failure path
[karo-tx-linux.git] / drivers / pci / host / pci-host-common.c
index 9d9d34e959b6a253814c6e7d931f6532e4f7887e..61eb4d46eb50b0116f1f043ccdd1ae1a712d69b0 100644 (file)
@@ -29,7 +29,7 @@ static int gen_pci_parse_request_of_pci_ranges(struct device *dev,
        int err, res_valid = 0;
        struct device_node *np = dev->of_node;
        resource_size_t iobase;
-       struct resource_entry *win;
+       struct resource_entry *win, *tmp;
 
        err = of_pci_get_host_bridge_resources(np, 0, 0xff, resources, &iobase);
        if (err)
@@ -39,15 +39,17 @@ static int gen_pci_parse_request_of_pci_ranges(struct device *dev,
        if (err)
                return err;
 
-       resource_list_for_each_entry(win, resources) {
+       resource_list_for_each_entry_safe(win, tmp, resources) {
                struct resource *res = win->res;
 
                switch (resource_type(res)) {
                case IORESOURCE_IO:
                        err = pci_remap_iospace(res, iobase);
-                       if (err)
+                       if (err) {
                                dev_warn(dev, "error %d: failed to map resource %pR\n",
                                         err, res);
+                               resource_list_destroy_entry(win);
+                       }
                        break;
                case IORESOURCE_MEM:
                        res_valid |= !(res->flags & IORESOURCE_PREFETCH);