scsi: mpt3sas: Don't change DMA mask while reallocating pools
authorSreekanth Reddy <sreekanth.reddy@broadcom.com>
Thu, 25 Aug 2022 07:54:54 +0000 (13:24 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 1 Sep 2022 04:15:46 +0000 (00:15 -0400)
When a pool crosses the 4GB boundary region then before reallocating pools
change the coherent DMA mask to 32 bits and keep the normal DMA mask set to
63/64 bits.

Link: https://lore.kernel.org/r/20220825075457.16422-2-sreekanth.reddy@broadcom.com
Signed-off-by: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpt3sas/mpt3sas_base.c

index eeebe80..f8a3b0d 100644 (file)
@@ -2990,19 +2990,26 @@ static int
 _base_config_dma_addressing(struct MPT3SAS_ADAPTER *ioc, struct pci_dev *pdev)
 {
        struct sysinfo s;
+       u64 coherent_dma_mask, dma_mask;
 
-       if (ioc->is_mcpu_endpoint ||
-           sizeof(dma_addr_t) == 4 || ioc->use_32bit_dma ||
-           dma_get_required_mask(&pdev->dev) <= 32)
+       if (ioc->is_mcpu_endpoint || sizeof(dma_addr_t) == 4 ||
+           dma_get_required_mask(&pdev->dev) <= 32) {
                ioc->dma_mask = 32;
+               coherent_dma_mask = dma_mask = DMA_BIT_MASK(32);
        /* Set 63 bit DMA mask for all SAS3 and SAS35 controllers */
-       else if (ioc->hba_mpi_version_belonged > MPI2_VERSION)
+       } else if (ioc->hba_mpi_version_belonged > MPI2_VERSION) {
                ioc->dma_mask = 63;
-       else
+               coherent_dma_mask = dma_mask = DMA_BIT_MASK(63);
+       } else {
                ioc->dma_mask = 64;
+               coherent_dma_mask = dma_mask = DMA_BIT_MASK(64);
+       }
+
+       if (ioc->use_32bit_dma)
+               coherent_dma_mask = DMA_BIT_MASK(32);
 
-       if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(ioc->dma_mask)) ||
-           dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(ioc->dma_mask)))
+       if (dma_set_mask(&pdev->dev, dma_mask) ||
+           dma_set_coherent_mask(&pdev->dev, coherent_dma_mask))
                return -ENODEV;
 
        if (ioc->dma_mask > 32) {