|
@@ -1027,13 +1027,15 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
- rc = pci_request_regions(pdev, DRV_NAME);
|
|
|
|
- if (rc) {
|
|
|
|
- disable_dev_on_err = 0;
|
|
|
|
- goto err_out;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (legacy_mode) {
|
|
|
|
|
|
+ if (!legacy_mode) {
|
|
|
|
+ rc = pci_request_regions(pdev, DRV_NAME);
|
|
|
|
+ if (rc) {
|
|
|
|
+ disable_dev_on_err = 0;
|
|
|
|
+ goto err_out;
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ /* Deal with combined mode hack. This side of the logic all
|
|
|
|
+ goes away once the combined mode hack is killed in 2.6.21 */
|
|
if (!request_region(ATA_PRIMARY_CMD, 8, "libata")) {
|
|
if (!request_region(ATA_PRIMARY_CMD, 8, "libata")) {
|
|
struct resource *conflict, res;
|
|
struct resource *conflict, res;
|
|
res.start = ATA_PRIMARY_CMD;
|
|
res.start = ATA_PRIMARY_CMD;
|
|
@@ -1071,6 +1073,13 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
|
|
}
|
|
}
|
|
} else
|
|
} else
|
|
legacy_mode |= ATA_PORT_SECONDARY;
|
|
legacy_mode |= ATA_PORT_SECONDARY;
|
|
|
|
+
|
|
|
|
+ if (legacy_mode & ATA_PORT_PRIMARY)
|
|
|
|
+ pci_request_region(pdev, 1, DRV_NAME);
|
|
|
|
+ if (legacy_mode & ATA_PORT_SECONDARY)
|
|
|
|
+ pci_request_region(pdev, 3, DRV_NAME);
|
|
|
|
+ /* If there is a DMA resource, allocate it */
|
|
|
|
+ pci_request_region(pdev, 4, DRV_NAME);
|
|
}
|
|
}
|
|
|
|
|
|
/* we have legacy mode, but all ports are unavailable */
|
|
/* we have legacy mode, but all ports are unavailable */
|
|
@@ -1114,11 +1123,20 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
|
|
err_out_ent:
|
|
err_out_ent:
|
|
kfree(probe_ent);
|
|
kfree(probe_ent);
|
|
err_out_regions:
|
|
err_out_regions:
|
|
- if (legacy_mode & ATA_PORT_PRIMARY)
|
|
|
|
- release_region(ATA_PRIMARY_CMD, 8);
|
|
|
|
- if (legacy_mode & ATA_PORT_SECONDARY)
|
|
|
|
- release_region(ATA_SECONDARY_CMD, 8);
|
|
|
|
- pci_release_regions(pdev);
|
|
|
|
|
|
+ /* All this conditional stuff is needed for the combined mode hack
|
|
|
|
+ until 2.6.21 when it can go */
|
|
|
|
+ if (legacy_mode) {
|
|
|
|
+ pci_release_region(pdev, 4);
|
|
|
|
+ if (legacy_mode & ATA_PORT_PRIMARY) {
|
|
|
|
+ release_region(ATA_PRIMARY_CMD, 8);
|
|
|
|
+ pci_release_region(pdev, 1);
|
|
|
|
+ }
|
|
|
|
+ if (legacy_mode & ATA_PORT_SECONDARY) {
|
|
|
|
+ release_region(ATA_SECONDARY_CMD, 8);
|
|
|
|
+ pci_release_region(pdev, 3);
|
|
|
|
+ }
|
|
|
|
+ } else
|
|
|
|
+ pci_release_regions(pdev);
|
|
err_out:
|
|
err_out:
|
|
if (disable_dev_on_err)
|
|
if (disable_dev_on_err)
|
|
pci_disable_device(pdev);
|
|
pci_disable_device(pdev);
|