|
@@ -1154,6 +1154,18 @@ static void pci_release_capabilities(struct pci_dev *dev)
|
|
|
pci_free_cap_save_buffers(dev);
|
|
|
}
|
|
|
|
|
|
+static void pci_free_resources(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ pci_cleanup_rom(dev);
|
|
|
+ for (i = 0; i < PCI_NUM_RESOURCES; i++) {
|
|
|
+ struct resource *res = dev->resource + i;
|
|
|
+ if (res->parent)
|
|
|
+ release_resource(res);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* pci_release_dev - free a pci device structure when all users of it are finished.
|
|
|
* @dev: device that's been disconnected
|
|
@@ -1163,9 +1175,14 @@ static void pci_release_capabilities(struct pci_dev *dev)
|
|
|
*/
|
|
|
static void pci_release_dev(struct device *dev)
|
|
|
{
|
|
|
- struct pci_dev *pci_dev;
|
|
|
+ struct pci_dev *pci_dev = to_pci_dev(dev);
|
|
|
+
|
|
|
+ down_write(&pci_bus_sem);
|
|
|
+ list_del(&pci_dev->bus_list);
|
|
|
+ up_write(&pci_bus_sem);
|
|
|
+
|
|
|
+ pci_free_resources(pci_dev);
|
|
|
|
|
|
- pci_dev = to_pci_dev(dev);
|
|
|
pci_release_capabilities(pci_dev);
|
|
|
pci_release_of_node(pci_dev);
|
|
|
pcibios_release_device(pci_dev);
|