scsi: hisi_sas: fix calls to dma_set_mask_and_coherent() [Linux 5.0]

scsi: hisi_sas: fix calls to dma_set_mask_and_coherent() [Linux 5.0]

This Linux kernel change "scsi: hisi_sas: fix calls to dma_set_mask_and_coherent()" is included in the Linux 5.0 release. This change is authored by Hannes Reinecke <hare [at] suse.de> on Mon Feb 18 08:34:25 2019 +0100. The commit for this change in Linux stable tree is d9a0045 (patch).

scsi: hisi_sas: 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.

[mkp: fixed commit message]

Fixes: e4db40e7a1a2 ("scsi: hisi_sas: use dma_set_mask_and_coherent")
Cc: <[email protected]>
Suggested-by: Ewan D. Milne <[email protected]>
Signed-off-by: Hannes Reinecke <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Signed-off-by: Hannes Reinecke <[email protected]>
Signed-off-by: Martin K. Petersen <[email protected]>

There are 16 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 drivers/scsi/hisi_sas/hisi_sas_main.c  | 8 ++++++--
 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 8 +++++---
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index eed7fc5..bc17fa0 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -2323,6 +2323,7 @@ static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
    struct Scsi_Host *shost;
    struct hisi_hba *hisi_hba;
    struct device *dev = &pdev->dev;
+   int error;

    shost = scsi_host_alloc(hw->sht, sizeof(*hisi_hba));
    if (!shost) {
@@ -2343,8 +2344,11 @@ static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
    if (hisi_sas_get_fw_info(hisi_hba) < 0)
        goto err_out;

-   if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)) &&
-       dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32))) {
+   error = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
+   if (error)
+       error = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32));
+
+   if (error) {
        dev_err(dev, "No usable DMA addressing method\n");
        goto err_out;
    }
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index c92b3822..e0570fd 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -2447,10 +2447,12 @@ static ssize_t intr_coal_count_v3_hw_store(struct device *dev,
    if (rc)
        goto err_out_disable_device;

-   if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) ||
-       dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) {
+   rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
+   if (rc)
+       rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+   if (rc) {
        dev_err(dev, "No usable DMA addressing method\n");
-       rc = -EIO;
+       rc = -ENODEV;
        goto err_out_regions;
    }

Leave a Reply

Your email address will not be published. Required fields are marked *