The driver currently uses pci_set_dma_mask despite otherwise using
the generic DMA API.  Also move the dma_get_required_mask check
before actually setting the dma mask, so that we don't end up with
inconsistent settings in corner cases.

Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 drivers/scsi/esas2r/esas2r_init.c | 49 +++++++++----------------------
 1 file changed, 14 insertions(+), 35 deletions(-)

diff --git a/drivers/scsi/esas2r/esas2r_init.c 
b/drivers/scsi/esas2r/esas2r_init.c
index bbe77db8938d..46b2c83ba21f 100644
--- a/drivers/scsi/esas2r/esas2r_init.c
+++ b/drivers/scsi/esas2r/esas2r_init.c
@@ -266,6 +266,7 @@ int esas2r_init_adapter(struct Scsi_Host *host, struct 
pci_dev *pcid,
        int i;
        void *next_uncached;
        struct esas2r_request *first_request, *last_request;
+       bool dma64 = false;
 
        if (index >= MAX_ADAPTERS) {
                esas2r_log(ESAS2R_LOG_CRIT,
@@ -286,42 +287,20 @@ int esas2r_init_adapter(struct Scsi_Host *host, struct 
pci_dev *pcid,
        a->pcid = pcid;
        a->host = host;
 
-       if (sizeof(dma_addr_t) > 4) {
-               const uint64_t required_mask = dma_get_required_mask
-                                                      (&pcid->dev);
-               if (required_mask > DMA_BIT_MASK(32)
-                   && !pci_set_dma_mask(pcid, DMA_BIT_MASK(64))
-                   && !pci_set_consistent_dma_mask(pcid,
-                                                   DMA_BIT_MASK(64))) {
-                       esas2r_log_dev(ESAS2R_LOG_INFO,
-                                      &(a->pcid->dev),
-                                      "64-bit PCI addressing enabled\n");
-               } else if (!pci_set_dma_mask(pcid, DMA_BIT_MASK(32))
-                          && !pci_set_consistent_dma_mask(pcid,
-                                                          DMA_BIT_MASK(32))) {
-                       esas2r_log_dev(ESAS2R_LOG_INFO,
-                                      &(a->pcid->dev),
-                                      "32-bit PCI addressing enabled\n");
-               } else {
-                       esas2r_log(ESAS2R_LOG_CRIT,
-                                  "failed to set DMA mask");
-                       esas2r_kill_adapter(index);
-                       return 0;
-               }
-       } else {
-               if (!pci_set_dma_mask(pcid, DMA_BIT_MASK(32))
-                   && !pci_set_consistent_dma_mask(pcid,
-                                                   DMA_BIT_MASK(32))) {
-                       esas2r_log_dev(ESAS2R_LOG_INFO,
-                                      &(a->pcid->dev),
-                                      "32-bit PCI addressing enabled\n");
-               } else {
-                       esas2r_log(ESAS2R_LOG_CRIT,
-                                  "failed to set DMA mask");
-                       esas2r_kill_adapter(index);
-                       return 0;
-               }
+       if (sizeof(dma_addr_t) > 4 &&
+           dma_get_required_mask(&pcid->dev) > DMA_BIT_MASK(32) &&
+           !dma_set_mask_and_coherent(&pcid->dev, DMA_BIT_MASK(64)))
+               dma64 = true;
+
+       if (!dma64 && dma_set_mask_and_coherent(&pcid->dev, DMA_BIT_MASK(32))) {
+               esas2r_log(ESAS2R_LOG_CRIT, "failed to set DMA mask");
+               esas2r_kill_adapter(index);
+               return 0;
        }
+
+       esas2r_log_dev(ESAS2R_LOG_INFO, &pcid->dev,
+                      "%s-bit PCI addressing enabled\n", dma64 ? "64" : "32");
+
        esas2r_adapters[index] = a;
        sprintf(a->name, ESAS2R_DRVR_NAME "_%02d", index);
        esas2r_debug("new adapter %p, name %s", a, a->name);
-- 
2.19.1

Reply via email to