Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6d5d880 authored by Adam Radford's avatar Adam Radford Committed by James Bottomley
Browse files

[SCSI] megaraid_sas: Use lowest memory bar for SR-IOV VF support



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: default avatarAdam Radford <aradford@gmail.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 80d9da98
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1338,6 +1338,7 @@ struct megasas_instance {

	u8	msi_flag;
	struct msix_entry msixentry;
	unsigned long bar;
};

enum {
+10 −19
Original line number Diff line number Diff line
@@ -3236,20 +3236,13 @@ 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);
	}
	unsigned long bar_list;

	if (pci_request_selected_regions(instance->pdev,
		pci_select_bars(instance->pdev, IORESOURCE_MEM),
	/* 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);
}

/**