PCI legacy I/O port free driver - Making Emulex lpfc driver legacy I/O port free
Subsystems (2)
PATCH 1/1 PCI legacy I/O port free driver - Making Emulex lpfc driver legacy I/O port free
Hi
As you can see in the "10. pci_enable_device_bars() and Legacy I/O Port space" of the Documentation/pci.txt, the latest kernel has interfaces for PCI device drivers to tell the kernel which resource the driver want to use, ex. I/O port or MMIO.
I've made a patch which makes Emulex lpfc driver legacy I/O port free by using the PCI core changes I mentioned above. The Emulex lpfc driver can handle some of its devices without using I/O port. So this patch changes the driver not to enable/request I/O port region.
As a result, the driver can handle its device even when there are huge number of PCI devices being used on the system and no I/O port region assigned to the device.
Tomohiro Kusumi
--- lpfc_init.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)
drivers/scsi/lpfc/lpfc_init.c +6 -4
@@ -1419,10 +1419,11 @@ lpfc_pci_probe_one(struct pci_dev *pdev,int error = -ENODEV , retval;int i;uint16_t iotag; +int bars =pci_select_bars (pdev,IORESOURCE_MEM ); -if (pci_enable_device (pdev)) +if (pci_enable_device_bars (pdev, bars)) goto out; -if (pci_request_regions (pdev,LPFC_DRIVER_NAME )) +if (pci_request_selected_regions (pdev, bars,LPFC_DRIVER_NAME )) goto out_disable_device; host =scsi_host_alloc (&lpfc_template,sizeof (struct lpfc_hba ));
@@ -1734,7 +1735,7 @@ out_put_host: phba->host =NULL ;scsi_host_put (host); out_release_regions: -pci_release_regions (pdev); +pci_release_selected_regions (pdev, bars); out_disable_device:pci_disable_device (pdev); out:
@@ -1748,6 +1749,7 @@ lpfc_pci_remove_one(struct pci_dev *pdevstruct Scsi_Host *host =pci_get_drvdata (pdev);struct lpfc_hba *phba = (struct lpfc_hba *)host->hostdata;unsigned long iflag; +int bars =pci_select_bars (pdev,IORESOURCE_MEM );lpfc_free_sysfs_attr (phba);
@@ -1792,7 +1794,7 @@ lpfc_pci_remove_one(struct pci_dev *pdeviounmap (phba->ctrl_regs_memmap_p);iounmap (phba->slim_memmap_p); -pci_release_regions (phba->pcidev); +pci_release_selected_regions (phba->pcidev, bars);pci_disable_device (phba->pcidev);idr_remove (&lpfc_hba_index, phba->brd_no);