For legacy SFF port, cmd ioport is claimed in legacy_dr while ctl
ioport is claimed using resource-managed pci_request_region().  Move
ctl port claiming into legacy_dr for consistency.  This also makes
legacy SFF code easier to use for non-PCI device.

Signed-off-by: Tejun Heo <[EMAIL PROTECTED]>
---
ctl ports *were* claimed - this is why my wrong kernel test looked
fine.  It was just done in a different place.

Thanks.

 drivers/ata/libata-sff.c |   32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index e35d134..36d5f38 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -712,6 +712,7 @@ int ata_pci_prepare_native_host(struct pci_dev *pdev,
 struct ata_legacy_devres {
        unsigned int    mask;
        unsigned long   cmd_port[2];
+       unsigned long   ctl_port[2];
        void __iomem *  cmd_addr[2];
        void __iomem *  ctl_addr[2];
        unsigned int    irq[2];
@@ -746,6 +747,8 @@ static void ata_legacy_release(struct device *gdev, void 
*res)
                        ioport_unmap(this->ctl_addr[i]);
                if (this->cmd_port[i])
                        release_region(this->cmd_port[i], 8);
+               if (this->ctl_port[i])
+                       release_region(this->ctl_port[i], 1);
        }
 }
 
@@ -764,7 +767,7 @@ static int ata_init_legacy_port(struct ata_port *ap,
                ctl_port = ATA_SECONDARY_CTL;
        }
 
-       /* request cmd_port */
+       /* request and map cmd/ctl ports */
        if (request_region(cmd_port, 8, "libata"))
                legacy_dr->cmd_port[port_no] = cmd_port;
        else {
@@ -773,15 +776,30 @@ static int ata_init_legacy_port(struct ata_port *ap,
                return -EBUSY;
        }
 
-       /* iomap cmd and ctl ports */
        legacy_dr->cmd_addr[port_no] = ioport_map(cmd_port, 8);
-       legacy_dr->ctl_addr[port_no] = ioport_map(ctl_port, 1);
-       if (!legacy_dr->cmd_addr[port_no] || !legacy_dr->ctl_addr[port_no]) {
+       if (!legacy_dr->cmd_addr[port_no]) {
                dev_printk(KERN_WARNING, host->dev,
-                          "failed to map cmd/ctl ports\n");
+                          "failed to map cmd port\n");
                return -ENOMEM;
        }
 
+       if (ctl_port) {
+               if (request_region(ctl_port, 1, "libata"))
+                       legacy_dr->ctl_port[port_no] = ctl_port;
+               else {
+                       dev_printk(KERN_WARNING, host->dev,
+                                  "0x%0lX IDE port busy\n", ctl_port);
+                       return -EBUSY;
+               }
+
+               legacy_dr->ctl_addr[port_no] = ioport_map(ctl_port, 1);
+               if (!legacy_dr->ctl_addr[port_no]) {
+                       dev_printk(KERN_WARNING, host->dev,
+                                  "failed to map ctl port\n");
+                       return -ENOMEM;
+               }
+       }
+
        /* init IO addresses */
        ap->ioaddr.cmd_addr = legacy_dr->cmd_addr[port_no];
        ap->ioaddr.altstatus_addr = legacy_dr->ctl_addr[port_no];
@@ -1029,10 +1047,6 @@ int ata_pci_init_one(struct pci_dev *pdev,
                        pcim_pin_device(pdev);
                if (rc)
                        goto err_out;
-
-               /* request respective PCI regions, may fail */
-               rc = pci_request_region(pdev, 1, DRV_NAME);
-               rc = pci_request_region(pdev, 3, DRV_NAME);
        }
 
        /* init BMDMA, may fail */
-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to