scsi: 3w-9xxx: fix calls to dma_set_mask_and_coherent() [Linux 5.0]

This Linux kernel change "scsi: 3w-9xxx: 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:20 2019 +0100. The commit for this change in Linux stable tree is 33d6667 (patch).

scsi: 3w-9xxx: 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.

Fixes: b000bced5739 ("scsi: 3w-9xxx: fully convert to the generic DMA API")
Cc: <[email protected]>
Signed-off-by: Hannes Reinecke <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
Reviewed-by: Ewan D. Milne <[email protected]>
Signed-off-by: Martin K. Petersen <[email protected]>

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

 drivers/scsi/3w-9xxx.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c
index a3c20e3..3337b1e 100644
--- a/drivers/scsi/3w-9xxx.c
+++ b/drivers/scsi/3w-9xxx.c
@@ -2009,7 +2009,7 @@ static int twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
    struct Scsi_Host *host = NULL;
    TW_Device_Extension *tw_dev;
    unsigned long mem_addr, mem_len;
-   int retval = -ENODEV;
+   int retval;

    retval = pci_enable_device(pdev);
    if (retval) {
@@ -2020,8 +2020,10 @@ static int twa_probe(struct pci_dev *pdev, const struct pci_device_id *dev_id)
    pci_set_master(pdev);
    pci_try_set_mwi(pdev);

-   if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) ||
-       dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) {
+   retval = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
+   if (retval)
+       retval = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+   if (retval) {
        TW_PRINTK(host, TW_DRIVER, 0x23, "Failed to set dma mask");
        retval = -ENODEV;
        goto out_disable_device;
@@ -2240,8 +2242,10 @@ static int twa_resume(struct pci_dev *pdev)
    pci_set_master(pdev);
    pci_try_set_mwi(pdev);

-   if (dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)) ||
-       dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32))) {
+   retval = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
+   if (retval)
+       retval = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
+   if (retval) {
        TW_PRINTK(host, TW_DRIVER, 0x40, "Failed to set dma mask during resume");
        retval = -ENODEV;
        goto out_disable_device;

Leave a Reply

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