|
@@ -565,7 +565,21 @@ static void zpci_map_resources(struct zpci_dev *zdev)
|
|
|
pr_debug("BAR%i: -> start: %Lx end: %Lx\n",
|
|
|
i, pdev->resource[i].start, pdev->resource[i].end);
|
|
|
}
|
|
|
-};
|
|
|
+}
|
|
|
+
|
|
|
+static void zpci_unmap_resources(struct zpci_dev *zdev)
|
|
|
+{
|
|
|
+ struct pci_dev *pdev = zdev->pdev;
|
|
|
+ resource_size_t len;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < PCI_BAR_COUNT; i++) {
|
|
|
+ len = pci_resource_len(pdev, i);
|
|
|
+ if (!len)
|
|
|
+ continue;
|
|
|
+ pci_iounmap(pdev, (void *) pdev->resource[i].start);
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
struct zpci_dev *zpci_alloc_device(void)
|
|
|
{
|
|
@@ -810,6 +824,16 @@ int pcibios_add_device(struct pci_dev *pdev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+void pcibios_release_device(struct pci_dev *pdev)
|
|
|
+{
|
|
|
+ struct zpci_dev *zdev = get_zdev(pdev);
|
|
|
+
|
|
|
+ zpci_unmap_resources(zdev);
|
|
|
+ zpci_fmb_disable_device(zdev);
|
|
|
+ zpci_debug_exit_device(zdev);
|
|
|
+ zdev->pdev = NULL;
|
|
|
+}
|
|
|
+
|
|
|
static int zpci_scan_bus(struct zpci_dev *zdev)
|
|
|
{
|
|
|
struct resource *res;
|