cxlflash: Simplify PCI registration
authorManoj N. Kumar <manoj@linux.vnet.ibm.com>
Fri, 4 Mar 2016 21:55:14 +0000 (15:55 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 9 Mar 2016 02:17:33 +0000 (21:17 -0500)
The calls to pci_request_regions(), pci_resource_start(),
pci_set_dma_mask(), pci_set_master() and pci_save_state() are all
unnecessary for the IBM CXL flash adapter since data buffers
are not required to be mapped to the device's memory.

The use of services such as pci_set_dma_mask() are problematic on
hypervisor managed systems as the IBM CXL flash adapter is operating
under a virtual PCI Host Bridge (virtual PHB) which does not support
these services.

cxlflash 0001:00:00.0: init_pci: Failed to set PCI DMA mask rc=-5

The resolution is to simplify init_pci(), to a point where it does the
bare minimum (pci_enable_device). Similarly, remove the call the
pci_release_regions() from cxlflash_remove().

Signed-off-by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>
Acked-by: Matthew R. Ochs <mrochs@linux.vnet.ibm.com>
Reviewed-by: Uma Krishnan <ukrishn@linux.vnet.ibm.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/cxlflash/main.c

index f6d90ce8f3b7eaa64b09e03aa515333323d1870e..3dbb9fa3019e5ca81c2195892b2bd2de791daf68 100644 (file)
@@ -767,7 +767,6 @@ static void cxlflash_remove(struct pci_dev *pdev)
                cancel_work_sync(&cfg->work_q);
                term_afu(cfg);
        case INIT_STATE_PCI:
-               pci_release_regions(cfg->dev);
                pci_disable_device(pdev);
        case INIT_STATE_NONE:
                free_mem(cfg);
@@ -840,15 +839,6 @@ static int init_pci(struct cxlflash_cfg *cfg)
        struct pci_dev *pdev = cfg->dev;
        int rc = 0;
 
-       cfg->cxlflash_regs_pci = pci_resource_start(pdev, 0);
-       rc = pci_request_regions(pdev, CXLFLASH_NAME);
-       if (rc < 0) {
-               dev_err(&pdev->dev,
-                       "%s: Couldn't register memory range of registers\n",
-                       __func__);
-               goto out;
-       }
-
        rc = pci_enable_device(pdev);
        if (rc || pci_channel_offline(pdev)) {
                if (pci_channel_offline(pdev)) {
@@ -860,55 +850,13 @@ static int init_pci(struct cxlflash_cfg *cfg)
                        dev_err(&pdev->dev, "%s: Cannot enable adapter\n",
                                __func__);
                        cxlflash_wait_for_pci_err_recovery(cfg);
-                       goto out_release_regions;
-               }
-       }
-
-       rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
-       if (rc < 0) {
-               dev_dbg(&pdev->dev, "%s: Failed to set 64 bit PCI DMA mask\n",
-                       __func__);
-               rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
-       }
-
-       if (rc < 0) {
-               dev_err(&pdev->dev, "%s: Failed to set PCI DMA mask\n",
-                       __func__);
-               goto out_disable;
-       }
-
-       pci_set_master(pdev);
-
-       if (pci_channel_offline(pdev)) {
-               cxlflash_wait_for_pci_err_recovery(cfg);
-               if (pci_channel_offline(pdev)) {
-                       rc = -EIO;
-                       goto out_msi_disable;
+                       goto out;
                }
        }
 
-       rc = pci_save_state(pdev);
-
-       if (rc != PCIBIOS_SUCCESSFUL) {
-               dev_err(&pdev->dev, "%s: Failed to save PCI config space\n",
-                       __func__);
-               rc = -EIO;
-               goto cleanup_nolog;
-       }
-
 out:
        pr_debug("%s: returning rc=%d\n", __func__, rc);
        return rc;
-
-cleanup_nolog:
-out_msi_disable:
-       cxlflash_wait_for_pci_err_recovery(cfg);
-out_disable:
-       pci_disable_device(pdev);
-out_release_regions:
-       pci_release_regions(pdev);
-       goto out;
-
 }
 
 /**