aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAlan <alan@lxorguk.ukuu.org.uk>2007-01-02 06:58:34 -0500
committerLinus Torvalds <torvalds@woody.osdl.org>2007-01-02 11:20:51 -0500
commitdc3c3377f03634d351fafdfe35b237b283586c04 (patch)
treee97c4a7dfeb45cd965c46cfa146fa426199104e8 /drivers
parente22a9a8b703d05f13366c3f2e7e1aa0550bb5ca6 (diff)
[PATCH] libata: fix combined mode
This is a slight variant on the patch I posted December 16th to fix libata combined mode handling. The only real change is that we now correctly also reserve BAR1,2,4. That is basically a neatness issue. Jeff was unhappy about two things 1. That it didn't work in the case of one channel native one channel legacy. This is a silly complaint because the SFF layer in libata doesn't handle this case yet anyway. 2. The case where combined mode is in use and IDE=n. In this case the libata quirk code reserves the resources in question correctly already. Once the combined mode stuff is redone properly (2.6.21) then the entire mess turns into a single pci_request_regions() for all cases and all the ugly resource hackery goes away. I'm sending this now rather than after running full test suites so that it can get the maximal testing in a short time. I'll be running tests on this after lunch. Signed-off-by: Alan Cox <alan@redhat.com> Cc: Jeff Garzik <jgarzik@pobox.com> Acked-by: Alessandro Suardi <alessandro.suardi@gmail.com> Acked-by: Theodore Tso <tytso@mit.edu> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/ata/libata-sff.c42
1 files changed, 30 insertions, 12 deletions
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index 10ee22ae5c15..623cec914c9b 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -1027,13 +1027,15 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
1027#endif 1027#endif
1028 } 1028 }
1029 1029
1030 rc = pci_request_regions(pdev, DRV_NAME); 1030 if (!legacy_mode) {
1031 if (rc) { 1031 rc = pci_request_regions(pdev, DRV_NAME);
1032 disable_dev_on_err = 0; 1032 if (rc) {
1033 goto err_out; 1033 disable_dev_on_err = 0;
1034 } 1034 goto err_out;
1035 1035 }
1036 if (legacy_mode) { 1036 } else {
1037 /* Deal with combined mode hack. This side of the logic all
1038 goes away once the combined mode hack is killed in 2.6.21 */
1037 if (!request_region(ATA_PRIMARY_CMD, 8, "libata")) { 1039 if (!request_region(ATA_PRIMARY_CMD, 8, "libata")) {
1038 struct resource *conflict, res; 1040 struct resource *conflict, res;
1039 res.start = ATA_PRIMARY_CMD; 1041 res.start = ATA_PRIMARY_CMD;
@@ -1071,6 +1073,13 @@ int ata_pci_init_one (struct pci_dev *pdev, struct ata_port_info **port_info,
1071 } 1073 }
1072 } else 1074 } else
1073 legacy_mode |= ATA_PORT_SECONDARY; 1075 legacy_mode |= ATA_PORT_SECONDARY;
1076
1077 if (legacy_mode & ATA_PORT_PRIMARY)
1078 pci_request_region(pdev, 1, DRV_NAME);
1079 if (legacy_mode & ATA_PORT_SECONDARY)
1080 pci_request_region(pdev, 3, DRV_NAME);
1081 /* If there is a DMA resource, allocate it */
1082 pci_request_region(pdev, 4, DRV_NAME);
1074 } 1083 }
1075 1084
1076 /* we have legacy mode, but all ports are unavailable */ 1085 /* 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,
1114err_out_ent: 1123err_out_ent:
1115 kfree(probe_ent); 1124 kfree(probe_ent);
1116err_out_regions: 1125err_out_regions:
1117 if (legacy_mode & ATA_PORT_PRIMARY) 1126 /* All this conditional stuff is needed for the combined mode hack
1118 release_region(ATA_PRIMARY_CMD, 8); 1127 until 2.6.21 when it can go */
1119 if (legacy_mode & ATA_PORT_SECONDARY) 1128 if (legacy_mode) {
1120 release_region(ATA_SECONDARY_CMD, 8); 1129 pci_release_region(pdev, 4);
1121 pci_release_regions(pdev); 1130 if (legacy_mode & ATA_PORT_PRIMARY) {
1131 release_region(ATA_PRIMARY_CMD, 8);
1132 pci_release_region(pdev, 1);
1133 }
1134 if (legacy_mode & ATA_PORT_SECONDARY) {
1135 release_region(ATA_SECONDARY_CMD, 8);
1136 pci_release_region(pdev, 3);
1137 }
1138 } else
1139 pci_release_regions(pdev);
1122err_out: 1140err_out:
1123 if (disable_dev_on_err) 1141 if (disable_dev_on_err)
1124 pci_disable_device(pdev); 1142 pci_disable_device(pdev);