Commit 56de8357 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen

scsi: lpfc: fix calls to dma_set_mask_and_coherent()

The change to use dma_set_mask_and_coherent() incorrectly made a second
call with the 32 bit DMA mask value when the call with the 64 bit DMA mask
value succeeded.  This resulted in NVMe/FC connections failing due to
corrupted data buffers, and various other SCSI/FCP I/O errors.

Fixes: f30e1bfd ("scsi: lpfc: use dma_set_mask_and_coherent")
Cc: <stable@vger.kernel.org>
Suggested-by: default avatarDon Dutile <ddutile@redhat.com>
Signed-off-by: default avatarEwan D. Milne <emilne@redhat.com>
Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarEwan D. Milne <emilne@redhat.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 4a067cf8
...@@ -7361,15 +7361,18 @@ lpfc_sli_pci_mem_setup(struct lpfc_hba *phba) ...@@ -7361,15 +7361,18 @@ lpfc_sli_pci_mem_setup(struct lpfc_hba *phba)
unsigned long bar0map_len, bar2map_len; unsigned long bar0map_len, bar2map_len;
int i, hbq_count; int i, hbq_count;
void *ptr; void *ptr;
int error = -ENODEV; int error;
if (!pdev) if (!pdev)
return error; return -ENODEV;
/* Set the device DMA mask size */ /* Set the device DMA mask size */
if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) || error = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) if (error)
error = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
if (error)
return error; return error;
error = -ENODEV;
/* Get the bus address of Bar0 and Bar2 and the number of bytes /* Get the bus address of Bar0 and Bar2 and the number of bytes
* required by each mapping. * required by each mapping.
...@@ -9742,11 +9745,13 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba) ...@@ -9742,11 +9745,13 @@ lpfc_sli4_pci_mem_setup(struct lpfc_hba *phba)
uint32_t if_type; uint32_t if_type;
if (!pdev) if (!pdev)
return error; return -ENODEV;
/* Set the device DMA mask size */ /* Set the device DMA mask size */
if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) || error = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) if (error)
error = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
if (error)
return error; return error;
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment