[SCSI] megaraid_sas: Use lowest memory bar for SR-IOV VF support
authoradam radford <aradford@gmail.com>
Wed, 15 Dec 2010 02:56:07 +0000 (18:56 -0800)
committerJames Bottomley <James.Bottomley@suse.de>
Thu, 23 Dec 2010 05:26:52 +0000 (23:26 -0600)
The following patch modifies the megaraid_sas driver to select the
lowest memory bar available so the driver will work in SR-IOV VF
environments where the memory bar mapping changes.

Signed-off-by: Adam Radford <aradford@gmail.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/megaraid/megaraid_sas.h
drivers/scsi/megaraid/megaraid_sas_base.c

index ff9845c..0e09a0f 100644 (file)
@@ -1338,6 +1338,7 @@ struct megasas_instance {
 
        u8      msi_flag;
        struct msix_entry msixentry;
+       unsigned long bar;
 };
 
 enum {
index 2318183..6e7bb7c 100644 (file)
@@ -3236,21 +3236,14 @@ static int megasas_init_mfi(struct megasas_instance *instance)
        u32 tmp_sectors;
        struct megasas_register_set __iomem *reg_set;
        struct megasas_ctrl_info *ctrl_info;
-       /*
-        * Map the message registers
-        */
-       if ((instance->pdev->device == PCI_DEVICE_ID_LSI_SAS1078GEN2) ||
-               (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0071SKINNY) ||
-               (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0073SKINNY) ||
-               (instance->pdev->device == PCI_DEVICE_ID_LSI_SAS0079GEN2)) {
-               instance->base_addr = pci_resource_start(instance->pdev, 1);
-       } else {
-               instance->base_addr = pci_resource_start(instance->pdev, 0);
-       }
-
-       if (pci_request_selected_regions(instance->pdev,
-               pci_select_bars(instance->pdev, IORESOURCE_MEM),
-               "megasas: LSI")) {
+       unsigned long bar_list;
+
+       /* Find first memory bar */
+       bar_list = pci_select_bars(instance->pdev, IORESOURCE_MEM);
+       instance->bar = find_first_bit(&bar_list, sizeof(unsigned long));
+       instance->base_addr = pci_resource_start(instance->pdev, instance->bar);
+       if (pci_request_selected_regions(instance->pdev, instance->bar,
+                                        "megasas: LSI")) {
                printk(KERN_DEBUG "megasas: IO memory region busy!\n");
                return -EBUSY;
        }
@@ -3411,8 +3404,7 @@ static int megasas_init_mfi(struct megasas_instance *instance)
        iounmap(instance->reg_set);
 
       fail_ioremap:
-       pci_release_selected_regions(instance->pdev,
-               pci_select_bars(instance->pdev, IORESOURCE_MEM));
+       pci_release_selected_regions(instance->pdev, instance->bar);
 
        return -EINVAL;
 }
@@ -3432,8 +3424,7 @@ static void megasas_release_mfi(struct megasas_instance *instance)
 
        iounmap(instance->reg_set);
 
-       pci_release_selected_regions(instance->pdev,
-               pci_select_bars(instance->pdev, IORESOURCE_MEM));
+       pci_release_selected_regions(instance->pdev, instance->bar);
 }
 
 /**