Implement and use DMA mask configuration helper.

Signed-off-by: Tejun Heo <[EMAIL PROTECTED]>
---
This function probably belongs to pci layer.  Put it in libata with
pci_test_bits() for the time being.

 drivers/ata/ahci.c          |   36 +++++----------------
 drivers/ata/libata-core.c   |   70 +++++++++++++++++++++++++++++++++++++++++++
 drivers/ata/libata-sff.c    |    5 +--
 drivers/ata/pata_cs5520.c   |   14 +++-----
 drivers/ata/pata_pdc2027x.c |    6 +---
 drivers/ata/pata_scc.c      |    5 +--
 drivers/ata/pdc_adma.c      |   21 +------------
 drivers/ata/sata_inic162x.c |   14 +-------
 drivers/ata/sata_mv.c       |   36 +---------------------
 drivers/ata/sata_nv.c       |   17 +++-------
 drivers/ata/sata_promise.c  |    5 +--
 drivers/ata/sata_qstor.c    |   50 ++++---------------------------
 drivers/ata/sata_sil.c      |    5 +--
 drivers/ata/sata_sil24.c    |   27 ++---------------
 drivers/ata/sata_sis.c      |    5 +--
 drivers/ata/sata_svw.c      |    5 +--
 drivers/ata/sata_sx4.c      |    5 +--
 drivers/ata/sata_uli.c      |    5 +--
 drivers/ata/sata_via.c      |    5 +--
 drivers/ata/sata_vsc.c      |    5 +--
 include/linux/libata.h      |    2 +
 21 files changed, 115 insertions(+), 228 deletions(-)

diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 4242c70..fd9acf3 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -1559,39 +1559,21 @@ static int ahci_host_init(struct ata_probe_ent 
*probe_ent)
        struct ahci_host_priv *hpriv = probe_ent->private_data;
        struct pci_dev *pdev = to_pci_dev(probe_ent->dev);
        void __iomem *mmio = probe_ent->iomap[AHCI_PCI_BAR];
-       unsigned int i, using_dac;
+       unsigned int i;
+       u64 dma_mask;
        int rc;
 
        rc = ahci_reset_controller(mmio, pdev);
        if (rc)
                return rc;
 
-       using_dac = hpriv->cap & HOST_CAP_64;
-       if (using_dac &&
-           !pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
-               if (rc) {
-                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
-                       if (rc) {
-                               dev_printk(KERN_ERR, &pdev->dev,
-                                          "64-bit DMA enable failed\n");
-                               return rc;
-                       }
-               }
-       } else {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-               if (rc) {
-                       dev_printk(KERN_ERR, &pdev->dev,
-                                  "32-bit DMA enable failed\n");
-                       return rc;
-               }
-               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
-               if (rc) {
-                       dev_printk(KERN_ERR, &pdev->dev,
-                                  "32-bit consistent DMA enable failed\n");
-                       return rc;
-               }
-       }
+       dma_mask = DMA_32BIT_MASK;
+       if (hpriv->cap & HOST_CAP_64)
+               dma_mask = DMA_64BIT_MASK;
+
+       rc = pci_configure_dma_masks(pdev, dma_mask, NULL);
+       if (rc)
+               return rc;
 
        for (i = 0; i < probe_ent->n_ports; i++)
                ahci_setup_port(&probe_ent->port[i], mmio, i);
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 0520950..6e124bd 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -6094,6 +6094,75 @@ int pci_test_config_bits(struct pci_dev *pdev, const 
struct pci_bits *bits)
        return (tmp == bits->val) ? 1 : 0;
 }
 
+/**
+ *     pci_configure_dma_masks - PCI DMA mask configuration helper
+ *     @pdev: target PCI device
+ *     @dma_mask: target DMA mask
+ *     @configured_mask: out parameter for configured DMA mask (can be NULL)
+ *
+ *     Helper to configure PCI DMA mask.
+ *
+ *     LOCKING:
+ *     Inherited from calling layer (may sleep).
+ *
+ *     RETURNS:
+ *     0 on success, -errno otherwise.
+ */
+/* move to PCI layer */
+int pci_configure_dma_masks(struct pci_dev *pdev, u64 dma_mask,
+                           u64 *configured_mask)
+{
+       char *reason;
+       int rc = 0;
+
+       if (dma_mask == DMA_64BIT_MASK) {
+               if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) == 0) {
+                       rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
+                       if (rc) {
+                               rc = pci_set_consistent_dma_mask(pdev,
+                                                       DMA_32BIT_MASK);
+                               if (rc) {
+                                       reason = "64-bit DMA enable failed";
+                                       goto err;
+                               }
+                       }
+               } else {
+                       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
+                       if (rc) {
+                               reason = "32-bit DMA enable failed";
+                               goto err;
+                       }
+                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+                       if (rc) {
+                               reason = "32-bit consistent DMA enable failed";
+                               goto err;
+                       }
+
+                       dma_mask = DMA_32BIT_MASK;
+               }
+       } else if (dma_mask) {
+               rc = pci_set_dma_mask(pdev, dma_mask);
+               if (rc) {
+                       reason = "failed to set DMA mask";
+                       goto err;
+               }
+               rc = pci_set_consistent_dma_mask(pdev, dma_mask);
+               if (rc) {
+                       reason = "failed to set consistent DMA mask";
+                       goto err;
+               }
+       }
+
+       if (configured_mask)
+               *configured_mask = dma_mask;
+
+       return rc;
+
+ err:
+       dev_printk(KERN_ERR, &pdev->dev, "%s (errno=%d)\n", reason, rc);
+       return rc;
+}
+
 #ifdef CONFIG_PM
 void ata_pci_device_do_suspend(struct pci_dev *pdev, pm_message_t mesg)
 {
@@ -6373,6 +6442,7 @@ EXPORT_SYMBOL_GPL(ata_timing_merge);
 
 #ifdef CONFIG_PCI
 EXPORT_SYMBOL_GPL(pci_test_config_bits);
+EXPORT_SYMBOL_GPL(pci_configure_dma_masks);
 EXPORT_SYMBOL_GPL(ata_pci_init_native_mode);
 EXPORT_SYMBOL_GPL(ata_pci_init_one);
 EXPORT_SYMBOL_GPL(ata_pci_remove_one);
diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index df9c83b..dfd906c 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -839,10 +839,7 @@ int ata_pci_init_one (struct pci_dev *pdev, struct 
ata_port_info **port_info,
        }
 
        /* TODO: If we get no DMA mask we should fall back to PIO */
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-               goto err_out;
-       rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+       rc = pci_configure_dma_masks(pdev, ATA_DMA_MASK, NULL);
        if (rc)
                goto err_out;
 
diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c
index 7ef8342..6bddae5 100644
--- a/drivers/ata/pata_cs5520.c
+++ b/drivers/ata/pata_cs5520.c
@@ -210,7 +210,7 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, 
const struct pci_devic
        u8 pcicfg;
        void *iomap[5];
        static struct ata_probe_ent probe[2];
-       int ports = 0;
+       int ports = 0, rc;
 
        /* IDE port enable bits */
        pci_read_config_byte(dev, 0x60, &pcicfg);
@@ -230,14 +230,10 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, 
const struct pci_devic
                return -ENODEV;
        }
        pci_set_master(dev);
-       if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) {
-               printk(KERN_ERR DRV_NAME ": unable to configure DMA mask.\n");
-               return -ENODEV;
-       }
-       if (pci_set_consistent_dma_mask(dev, DMA_32BIT_MASK)) {
-               printk(KERN_ERR DRV_NAME ": unable to configure consistent DMA 
mask.\n");
-               return -ENODEV;
-       }
+
+       rc = pci_configure_dma_masks(dev, DMA_32BIT_MASK, NULL);
+       if (rc)
+               return rc;
 
        /* Map IO ports */
        iomap[0] = devm_ioport_map(&dev->dev, 0x1F0, 8);
diff --git a/drivers/ata/pata_pdc2027x.c b/drivers/ata/pata_pdc2027x.c
index 93bcdad..3ab66fd 100644
--- a/drivers/ata/pata_pdc2027x.c
+++ b/drivers/ata/pata_pdc2027x.c
@@ -772,11 +772,7 @@ static int __devinit pdc2027x_init_one(struct pci_dev 
*pdev, const struct pci_de
        if (rc)
                return rc;
 
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-               return rc;
-
-       rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+       rc = pci_configure_dma_masks(pdev, ATA_DMA_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/pata_scc.c b/drivers/ata/pata_scc.c
index f3ed141..ee0c533 100644
--- a/drivers/ata/pata_scc.c
+++ b/drivers/ata/pata_scc.c
@@ -1115,10 +1115,7 @@ static int scc_host_init(struct ata_probe_ent *probe_ent)
 
        probe_ent->n_ports = 1;
 
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-               return rc;
-       rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+       rc = pci_configure_dma_masks(pdev, ATA_DMA_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/pdc_adma.c b/drivers/ata/pdc_adma.c
index 5dd3ca8..9448aab 100644
--- a/drivers/ata/pdc_adma.c
+++ b/drivers/ata/pdc_adma.c
@@ -600,25 +600,6 @@ static void adma_host_init(unsigned int chip_id,
                adma_reset_engine(ADMA_REGS(mmio_base, port_no));
 }
 
-static int adma_set_dma_masks(struct pci_dev *pdev, void __iomem *mmio_base)
-{
-       int rc;
-
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-       if (rc) {
-               dev_printk(KERN_ERR, &pdev->dev,
-                       "32-bit DMA enable failed\n");
-               return rc;
-       }
-       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
-       if (rc) {
-               dev_printk(KERN_ERR, &pdev->dev,
-                       "32-bit consistent DMA enable failed\n");
-               return rc;
-       }
-       return 0;
-}
-
 static int adma_ata_init_one(struct pci_dev *pdev,
                             const struct pci_device_id *ent)
 {
@@ -643,7 +624,7 @@ static int adma_ata_init_one(struct pci_dev *pdev,
                return rc;
        mmio_base = pcim_iomap_table(pdev)[ADMA_MMIO_BAR];
 
-       rc = adma_set_dma_masks(pdev, mmio_base);
+       rc = pci_configure_dma_masks(pdev, DMA_32BIT_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c
index 6686c22..733d1f4 100644
--- a/drivers/ata/sata_inic162x.c
+++ b/drivers/ata/sata_inic162x.c
@@ -682,19 +682,9 @@ static int inic_init_one(struct pci_dev *pdev, const 
struct pci_device_id *ent)
        iomap = pcim_iomap_table(pdev);
 
        /* Set dma_mask.  This devices doesn't support 64bit addressing. */
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-       if (rc) {
-               dev_printk(KERN_ERR, &pdev->dev,
-                          "32-bit DMA enable failed\n");
-               return rc;
-       }
-
-       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
-       if (rc) {
-               dev_printk(KERN_ERR, &pdev->dev,
-                          "32-bit consistent DMA enable failed\n");
+       rc = pci_configure_dma_masks(pdev, DMA_32BIT_MASK, NULL);
+       if (rc)
                return rc;
-       }
 
        probe_ent = devm_kzalloc(&pdev->dev, sizeof(*probe_ent), GFP_KERNEL);
        hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index 7b73c73..ed07f7a 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -581,40 +581,6 @@ static const struct mv_hw_ops mv6xxx_ops = {
  */
 static int msi;              /* Use PCI msi; either zero (off, default) or 
non-zero */
 
-
-/* move to PCI layer or libata core? */
-static int pci_go_64(struct pci_dev *pdev)
-{
-       int rc;
-
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
-               if (rc) {
-                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
-                       if (rc) {
-                               dev_printk(KERN_ERR, &pdev->dev,
-                                          "64-bit DMA enable failed\n");
-                               return rc;
-                       }
-               }
-       } else {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-               if (rc) {
-                       dev_printk(KERN_ERR, &pdev->dev,
-                                  "32-bit DMA enable failed\n");
-                       return rc;
-               }
-               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
-               if (rc) {
-                       dev_printk(KERN_ERR, &pdev->dev,
-                                  "32-bit consistent DMA enable failed\n");
-                       return rc;
-               }
-       }
-
-       return rc;
-}
-
 /*
  * Functions
  */
@@ -2349,7 +2315,7 @@ static int mv_init_one(struct pci_dev *pdev, const struct 
pci_device_id *ent)
        if (rc)
                return rc;
 
-       rc = pci_go_64(pdev);
+       rc = pci_configure_dma_masks(pdev, DMA_64BIT_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
index 388d07f..eb0f877 100644
--- a/drivers/ata/sata_nv.c
+++ b/drivers/ata/sata_nv.c
@@ -1474,7 +1474,7 @@ static int nv_init_one (struct pci_dev *pdev, const 
struct pci_device_id *ent)
        u32 bar;
        void __iomem *base;
        unsigned long type = ent->driver_data;
-       int mask_set = 0;
+       u64 dma_mask = ATA_DMA_MASK;
 
         // Make sure this is a SATA controller by counting the number of bars
         // (NVIDIA SATA controllers will always have six bars).  Otherwise,
@@ -1499,19 +1499,12 @@ static int nv_init_one (struct pci_dev *pdev, const 
struct pci_device_id *ent)
        if(type >= CK804 && adma_enabled) {
                dev_printk(KERN_NOTICE, &pdev->dev, "Using ADMA mode\n");
                type = ADMA;
-               if(!pci_set_dma_mask(pdev, DMA_64BIT_MASK) &&
-                  !pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK))
-                       mask_set = 1;
+               dma_mask = DMA_64BIT_MASK;
        }
 
-       if(!mask_set) {
-               rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-               if (rc)
-                       return rc;
-               rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
-               if (rc)
-                       return rc;
-       }
+       rc = pci_configure_dma_masks(pdev, dma_mask, NULL);
+       if (rc)
+               return rc;
 
        rc = -ENOMEM;
 
diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
index 2339813..71a05ad 100644
--- a/drivers/ata/sata_promise.c
+++ b/drivers/ata/sata_promise.c
@@ -873,10 +873,7 @@ static int pdc_ata_init_one (struct pci_dev *pdev, const 
struct pci_device_id *e
        if (rc)
                return rc;
 
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-               return rc;
-       rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+       rc = pci_configure_dma_masks(pdev, ATA_DMA_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/sata_qstor.c b/drivers/ata/sata_qstor.c
index 8786b45..b1faaaf 100644
--- a/drivers/ata/sata_qstor.c
+++ b/drivers/ata/sata_qstor.c
@@ -560,49 +560,6 @@ static void qs_host_init(unsigned int chip_id, struct 
ata_probe_ent *pe)
        writeb(1, mmio_base + QS_HCT_CTRL); /* enable host interrupts */
 }
 
-/*
- * The QStor understands 64-bit buses, and uses 64-bit fields
- * for DMA pointers regardless of bus width.  We just have to
- * make sure our DMA masks are set appropriately for whatever
- * bridge lies between us and the QStor, and then the DMA mapping
- * code will ensure we only ever "see" appropriate buffer addresses.
- * If we're 32-bit limited somewhere, then our 64-bit fields will
- * just end up with zeros in the upper 32-bits, without any special
- * logic required outside of this routine (below).
- */
-static int qs_set_dma_masks(struct pci_dev *pdev, void __iomem *mmio_base)
-{
-       u32 bus_info = readl(mmio_base + QS_HID_HPHY);
-       int rc, have_64bit_bus = (bus_info & QS_HPHY_64BIT);
-
-       if (have_64bit_bus &&
-           !pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
-               if (rc) {
-                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
-                       if (rc) {
-                               dev_printk(KERN_ERR, &pdev->dev,
-                                          "64-bit DMA enable failed\n");
-                               return rc;
-                       }
-               }
-       } else {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-               if (rc) {
-                       dev_printk(KERN_ERR, &pdev->dev,
-                               "32-bit DMA enable failed\n");
-                       return rc;
-               }
-               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
-               if (rc) {
-                       dev_printk(KERN_ERR, &pdev->dev,
-                               "32-bit consistent DMA enable failed\n");
-                       return rc;
-               }
-       }
-       return 0;
-}
-
 static int qs_ata_init_one(struct pci_dev *pdev,
                                const struct pci_device_id *ent)
 {
@@ -611,6 +568,7 @@ static int qs_ata_init_one(struct pci_dev *pdev,
        void __iomem * const *iomap;
        unsigned int board_idx = (unsigned int) ent->driver_data;
        int rc, port_no;
+       u64 dma_mask;
 
        if (!printed_version++)
                dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
@@ -627,7 +585,11 @@ static int qs_ata_init_one(struct pci_dev *pdev,
                return rc;
        iomap = pcim_iomap_table(pdev);
 
-       rc = qs_set_dma_masks(pdev, iomap[QS_MMIO_BAR]);
+       dma_mask = DMA_32BIT_MASK;
+       if (readl(iomap[QS_MMIO_BAR] + QS_HID_HPHY) & QS_HPHY_64BIT)
+               dma_mask = DMA_64BIT_MASK;
+
+       rc = pci_configure_dma_masks(pdev, dma_mask, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c
index 170d36e..10e3aea 100644
--- a/drivers/ata/sata_sil.c
+++ b/drivers/ata/sata_sil.c
@@ -651,10 +651,7 @@ static int sil_init_one (struct pci_dev *pdev, const 
struct pci_device_id *ent)
        if (rc)
                return rc;
 
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-               return rc;
-       rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+       rc = pci_configure_dma_masks(pdev, ATA_DMA_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c
index 7e3242e..ad5add7 100644
--- a/drivers/ata/sata_sil24.c
+++ b/drivers/ata/sata_sil24.c
@@ -1073,30 +1073,9 @@ static int sil24_init_one(struct pci_dev *pdev, const 
struct pci_device_id *ent)
        /*
         * Configure the device
         */
-       if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
-               rc = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
-               if (rc) {
-                       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
-                       if (rc) {
-                               dev_printk(KERN_ERR, &pdev->dev,
-                                          "64-bit DMA enable failed\n");
-                               return rc;
-                       }
-               }
-       } else {
-               rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-               if (rc) {
-                       dev_printk(KERN_ERR, &pdev->dev,
-                                  "32-bit DMA enable failed\n");
-                       return rc;
-               }
-               rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
-               if (rc) {
-                       dev_printk(KERN_ERR, &pdev->dev,
-                                  "32-bit consistent DMA enable failed\n");
-                       return rc;
-               }
-       }
+       rc = pci_configure_dma_masks(pdev, DMA_64BIT_MASK, NULL);
+       if (rc)
+               return rc;
 
        /* Apply workaround for completion IRQ loss on PCI-X errata */
        if (probe_ent->port_flags & SIL24_FLAG_PCIX_IRQ_WOC) {
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c
index 1879e0c..75c5683 100644
--- a/drivers/ata/sata_sis.c
+++ b/drivers/ata/sata_sis.c
@@ -276,10 +276,7 @@ static int sis_init_one (struct pci_dev *pdev, const 
struct pci_device_id *ent)
                return rc;
        }
 
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-               return rc;
-       rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+       rc = pci_configure_dma_masks(pdev, ATA_DMA_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c
index b121195..e83a608 100644
--- a/drivers/ata/sata_svw.c
+++ b/drivers/ata/sata_svw.c
@@ -418,10 +418,7 @@ static int k2_sata_init_one (struct pci_dev *pdev, const 
struct pci_device_id *e
        if (rc)
                return rc;
 
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-               return rc;
-       rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+       rc = pci_configure_dma_masks(pdev, ATA_DMA_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/sata_sx4.c b/drivers/ata/sata_sx4.c
index 1a081c3..29a68a7 100644
--- a/drivers/ata/sata_sx4.c
+++ b/drivers/ata/sata_sx4.c
@@ -1341,10 +1341,7 @@ static int pdc_sata_init_one (struct pci_dev *pdev, 
const struct pci_device_id *
        if (rc)
                return rc;
 
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-               return rc;
-       rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+       rc = pci_configure_dma_masks(pdev, ATA_DMA_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/sata_uli.c b/drivers/ata/sata_uli.c
index d659ace..bfdb73e 100644
--- a/drivers/ata/sata_uli.c
+++ b/drivers/ata/sata_uli.c
@@ -205,10 +205,7 @@ static int uli_init_one (struct pci_dev *pdev, const 
struct pci_device_id *ent)
                return rc;
        }
 
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-               return rc;
-       rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+       rc = pci_configure_dma_masks(pdev, ATA_DMA_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c
index 598e6a2..1b43062 100644
--- a/drivers/ata/sata_via.c
+++ b/drivers/ata/sata_via.c
@@ -565,10 +565,7 @@ static int svia_init_one (struct pci_dev *pdev, const 
struct pci_device_id *ent)
                        return -ENODEV;
                }
 
-       rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
-       if (rc)
-               return rc;
-       rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
+       rc = pci_configure_dma_masks(pdev, ATA_DMA_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/drivers/ata/sata_vsc.c b/drivers/ata/sata_vsc.c
index 170bad1..675508f 100644
--- a/drivers/ata/sata_vsc.c
+++ b/drivers/ata/sata_vsc.c
@@ -395,10 +395,7 @@ static int __devinit vsc_sata_init_one (struct pci_dev 
*pdev, const struct pci_d
        /*
         * Use 32 bit DMA mask, because 64 bit address support is poor.
         */
-       rc = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
-       if (rc)
-               return rc;
-       rc = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
+       rc = pci_configure_dma_masks(pdev, DMA_32BIT_MASK, NULL);
        if (rc)
                return rc;
 
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 065f494..911ac4e 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -872,6 +872,8 @@ struct pci_bits {
 extern struct ata_probe_ent *
 ata_pci_init_native_mode(struct pci_dev *pdev, struct ata_port_info **port, 
int portmask);
 extern int pci_test_config_bits(struct pci_dev *pdev, const struct pci_bits 
*bits);
+extern int pci_configure_dma_masks(struct pci_dev *pdev, u64 dma_mask,
+                                  u64 *configured_mask);
 extern unsigned long ata_pci_default_filter(const struct ata_port *, struct 
ata_device *, unsigned long);
 #endif /* CONFIG_PCI */
 
-- 
1.5.0.1

-
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