Current code gives up when 32 bit DMA is not supported.
This patch tests 64 bit support before bailing out in
such conditions.

Signed-off-by: Sinan Kaya <ok...@codeaurora.org>
---
 drivers/scsi/mpt2sas/mpt2sas_base.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c 
b/drivers/scsi/mpt2sas/mpt2sas_base.c
index c167911..c61c82a 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_base.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_base.c
@@ -1217,8 +1217,27 @@ _base_config_dma_addressing(struct MPT2SAS_ADAPTER *ioc, 
struct pci_dev *pdev)
                ioc->base_add_sg_single = &_base_add_sg_single_32;
                ioc->sge_size = sizeof(Mpi2SGESimple32_t);
                ioc->dma_mask = 32;
-       } else
+       } else {
+               /* Try 64 bit, 32 bit failed */
+               consistent_dma_mask = DMA_BIT_MASK(64);
+
+               if (sizeof(dma_addr_t) > 4) {
+                       const uint64_t required_mask =
+                               dma_get_required_mask(&pdev->dev);
+                       if ((required_mask > DMA_BIT_MASK(32)) &&
+                               !pci_set_dma_mask(pdev, DMA_BIT_MASK(64)) &&
+                               !pci_set_consistent_dma_mask(pdev,
+                                                       consistent_dma_mask)) {
+                               ioc->base_add_sg_single =
+                                       &_base_add_sg_single_64;
+                               ioc->sge_size = sizeof(Mpi2SGESimple64_t);
+                               ioc->dma_mask = 64;
+                               goto out;
+                       }
+               }
+
                return -ENODEV;
+       }
 
  out:
        si_meminfo(&s);
-- 
Qualcomm Technologies, Inc. on behalf of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux 
Foundation Collaborative Project

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to