scsi: hisi_sas: set dma mask before allocate DMA memory
authorJohn Garry <john.garry@huawei.com>
Tue, 6 Sep 2016 15:36:19 +0000 (23:36 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 14 Sep 2016 16:54:18 +0000 (12:54 -0400)
The device DMA mask was being set after the bulk of the DMA allocations
in the driver init, so potentially DMA allocates fail.  To resolve,
relocate before allocating the DMA memory when initialising the driver.

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hisi_sas/hisi_sas_main.c

index d58e2234a665586ab4de9b578234d54b60d884b1..2f872f784e109e85b0e32af473f4920274aa953b 100644 (file)
@@ -1439,6 +1439,12 @@ static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
                                     &hisi_hba->queue_count))
                goto err_out;
 
+       if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)) &&
+           dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32))) {
+               dev_err(dev, "No usable DMA addressing method\n");
+               goto err_out;
+       }
+
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        hisi_hba->regs = devm_ioremap_resource(dev, res);
        if (IS_ERR(hisi_hba->regs))
@@ -1486,13 +1492,6 @@ int hisi_sas_probe(struct platform_device *pdev,
        hisi_hba = shost_priv(shost);
        platform_set_drvdata(pdev, sha);
 
-       if (dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64)) &&
-           dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32))) {
-               dev_err(dev, "No usable DMA addressing method\n");
-               rc = -EIO;
-               goto err_out_ha;
-       }
-
        phy_nr = port_nr = hisi_hba->n_phy;
 
        arr_phy = devm_kcalloc(dev, phy_nr, sizeof(void *), GFP_KERNEL);