mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-26 06:04:14 +08:00
PCI: designware: Free bridge resource list on failure
of_pci_get_host_bridge_resources() allocates a list of resources for host bridge windows. If we fail after allocating that list, free it before we return error. Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
parent
950334bcf1
commit
27d9cb7ed2
@ -493,7 +493,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||||||
resource_size(pp->cfg));
|
resource_size(pp->cfg));
|
||||||
if (!pp->dbi_base) {
|
if (!pp->dbi_base) {
|
||||||
dev_err(pp->dev, "error with ioremap\n");
|
dev_err(pp->dev, "error with ioremap\n");
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,7 +505,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||||||
pp->cfg0_size);
|
pp->cfg0_size);
|
||||||
if (!pp->va_cfg0_base) {
|
if (!pp->va_cfg0_base) {
|
||||||
dev_err(pp->dev, "error with ioremap in function\n");
|
dev_err(pp->dev, "error with ioremap in function\n");
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,7 +515,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||||||
pp->cfg1_size);
|
pp->cfg1_size);
|
||||||
if (!pp->va_cfg1_base) {
|
if (!pp->va_cfg1_base) {
|
||||||
dev_err(pp->dev, "error with ioremap\n");
|
dev_err(pp->dev, "error with ioremap\n");
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -528,7 +531,8 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||||||
&dw_pcie_msi_chip);
|
&dw_pcie_msi_chip);
|
||||||
if (!pp->irq_domain) {
|
if (!pp->irq_domain) {
|
||||||
dev_err(pp->dev, "irq domain init failed\n");
|
dev_err(pp->dev, "irq domain init failed\n");
|
||||||
return -ENXIO;
|
ret = -ENXIO;
|
||||||
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < MAX_MSI_IRQS; i++)
|
for (i = 0; i < MAX_MSI_IRQS; i++)
|
||||||
@ -536,7 +540,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||||||
} else {
|
} else {
|
||||||
ret = pp->ops->msi_host_init(pp, &dw_pcie_msi_chip);
|
ret = pp->ops->msi_host_init(pp, &dw_pcie_msi_chip);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -552,8 +556,10 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||||||
} else
|
} else
|
||||||
bus = pci_scan_root_bus(pp->dev, pp->root_bus_nr, &dw_pcie_ops,
|
bus = pci_scan_root_bus(pp->dev, pp->root_bus_nr, &dw_pcie_ops,
|
||||||
pp, &res);
|
pp, &res);
|
||||||
if (!bus)
|
if (!bus) {
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
if (pp->ops->scan_bus)
|
if (pp->ops->scan_bus)
|
||||||
pp->ops->scan_bus(pp);
|
pp->ops->scan_bus(pp);
|
||||||
@ -571,6 +577,10 @@ int dw_pcie_host_init(struct pcie_port *pp)
|
|||||||
|
|
||||||
pci_bus_add_devices(bus);
|
pci_bus_add_devices(bus);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
error:
|
||||||
|
pci_free_resource_list(&res);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus,
|
static int dw_pcie_rd_other_conf(struct pcie_port *pp, struct pci_bus *bus,
|
||||||
|
Loading…
Reference in New Issue
Block a user