|
@@ -548,8 +548,7 @@ int ide_pci_init_one(struct pci_dev *dev, const struct ide_port_info *d,
|
|
|
|
|
|
host->host_priv = priv;
|
|
host->host_priv = priv;
|
|
|
|
|
|
- if (priv)
|
|
|
|
- pci_set_drvdata(dev, host);
|
|
|
|
|
|
+ pci_set_drvdata(dev, host);
|
|
|
|
|
|
ret = do_ide_setup_pci_device(dev, d, 1);
|
|
ret = do_ide_setup_pci_device(dev, d, 1);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
@@ -593,10 +592,8 @@ int ide_pci_init_two(struct pci_dev *dev1, struct pci_dev *dev2,
|
|
|
|
|
|
host->host_priv = priv;
|
|
host->host_priv = priv;
|
|
|
|
|
|
- if (priv) {
|
|
|
|
- pci_set_drvdata(pdev[0], host);
|
|
|
|
- pci_set_drvdata(pdev[1], host);
|
|
|
|
- }
|
|
|
|
|
|
+ pci_set_drvdata(pdev[0], host);
|
|
|
|
+ pci_set_drvdata(pdev[1], host);
|
|
|
|
|
|
for (i = 0; i < 2; i++) {
|
|
for (i = 0; i < 2; i++) {
|
|
ret = do_ide_setup_pci_device(pdev[i], d, !i);
|
|
ret = do_ide_setup_pci_device(pdev[i], d, !i);
|
|
@@ -619,3 +616,33 @@ out:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(ide_pci_init_two);
|
|
EXPORT_SYMBOL_GPL(ide_pci_init_two);
|
|
|
|
+
|
|
|
|
+void ide_pci_remove(struct pci_dev *dev)
|
|
|
|
+{
|
|
|
|
+ struct ide_host *host = pci_get_drvdata(dev);
|
|
|
|
+ struct pci_dev *dev2 = host->dev[1] ? to_pci_dev(host->dev[1]) : NULL;
|
|
|
|
+ int bars;
|
|
|
|
+
|
|
|
|
+ if (host->host_flags & IDE_HFLAG_SINGLE)
|
|
|
|
+ bars = (1 << 2) - 1;
|
|
|
|
+ else
|
|
|
|
+ bars = (1 << 4) - 1;
|
|
|
|
+
|
|
|
|
+ if ((host->host_flags & IDE_HFLAG_NO_DMA) == 0) {
|
|
|
|
+ if (host->host_flags & IDE_HFLAG_CS5520)
|
|
|
|
+ bars |= (1 << 2);
|
|
|
|
+ else
|
|
|
|
+ bars |= (1 << 4);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ide_host_remove(host);
|
|
|
|
+
|
|
|
|
+ if (dev2)
|
|
|
|
+ pci_release_selected_regions(dev2, bars);
|
|
|
|
+ pci_release_selected_regions(dev, bars);
|
|
|
|
+
|
|
|
|
+ if (dev2)
|
|
|
|
+ pci_disable_device(dev2);
|
|
|
|
+ pci_disable_device(dev);
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL_GPL(ide_pci_remove);
|