]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
[PATCH] libata-sff: Undo bug introduced with pci_iomap changes
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Tue, 1 May 2007 11:53:27 +0000 (12:53 +0100)
committerChris Wright <chrisw@sous-sol.org>
Wed, 23 May 2007 21:32:42 +0000 (14:32 -0700)
If you have a controller with one channel disabled and unmapped the new
iomap code blindly tries to iomap unconfigured BARs. Later on the code
does the right thing and checks for unmapped bars but it is done in the
wrong order

Reorder the checks and make the iomap conditional

Tejun: I think the code below is now correct but would appreciate you
giving it a review.

Signed-off-by: Alan Cox <alan@redhat.com>
Acked-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Chris Wright <chrisw@sous-sol.org>
drivers/ata/libata-sff.c

index 2ffcca063d80adc3405ab16c484ab7da8788a5d5..4d63974c36bd6a58af65fce62eab02659d90b663 100644 (file)
@@ -557,12 +557,30 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int
        int i, p = 0;
        void __iomem * const *iomap;
 
+       /* Discard disabled ports. Some controllers show their
+          unused channels this way */
+       if (ata_resources_present(pdev, 0) == 0)
+               ports &= ~ATA_PORT_PRIMARY;
+       if (ata_resources_present(pdev, 1) == 0)
+               ports &= ~ATA_PORT_SECONDARY;
+
        /* iomap BARs */
-       for (i = 0; i < 4; i++) {
-               if (pcim_iomap(pdev, i, 0) == NULL) {
-                       dev_printk(KERN_ERR, &pdev->dev,
-                                  "failed to iomap PCI BAR %d\n", i);
-                       return NULL;
+       if (ports & ATA_PORT_PRIMARY) {
+               for (i = 0; i <= 1; i++) {
+                       if (pcim_iomap(pdev, i, 0) == NULL) {
+                               dev_printk(KERN_ERR, &pdev->dev,
+                                          "failed to iomap PCI BAR %d\n", i);
+                               return NULL;
+                       }
+               }
+       }
+       if (ports & ATA_PORT_SECONDARY) {
+               for (i = 2; i <= 3; i++) {
+                       if (pcim_iomap(pdev, i, 0) == NULL) {
+                               dev_printk(KERN_ERR, &pdev->dev,
+                                          "failed to iomap PCI BAR %d\n", i);
+                               return NULL;
+                       }
                }
        }
 
@@ -577,13 +595,6 @@ ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, int
        probe_ent->irq = pdev->irq;
        probe_ent->irq_flags = IRQF_SHARED;
 
-       /* Discard disabled ports. Some controllers show their
-          unused channels this way */
-       if (ata_resources_present(pdev, 0) == 0)
-               ports &= ~ATA_PORT_PRIMARY;
-       if (ata_resources_present(pdev, 1) == 0)
-               ports &= ~ATA_PORT_SECONDARY;
-
        if (ports & ATA_PORT_PRIMARY) {
                probe_ent->port[p].cmd_addr = iomap[0];
                probe_ent->port[p].altstatus_addr =