lpfc 8.1.11 : Add MSI (Message Signalled Interrupts) support
Subsystems (2)
PATCH 5/9 lpfc 8.1.11 : Add MSI (Message Signalled Interrupts) support
Add MSI (Message Signalled Interrupts) support
Actual use must be enabled via the new module parameter "lpfc_use_msi" Defaults to no use
Many thanks to Frederic Temporelli who implemented the initial patch.
Signed-off-by Frederic Temporelli <[email protected]>
Signed-off-by James Smart <[email protected]>
drivers/scsi/lpfc/lpfc_attr.c +11 -0
@@ -961,6 +961,15 @@ LPFC_ATTR_R(max_luns, 255, 0, 65535,LPFC_ATTR_RW (poll_tmo,10 ,1 ,255 ,"Milliseconds driver will wait between polling FCP ring" ); +/* +# lpfc_use_msi: Use MSI (Message Signaled Interrupts) in systems that +# support this feature +# 0 = MSI disabled (default) +# 1 = MSI enabled +# Value range is [0,1]. Default value is 0. +*/ +LPFC_ATTR_R (use_msi,0 ,0 ,1 ,"Use Message Signaled Interrupts, if possible" ); +struct class_device_attribute *lpfc_host_attrs[] = { &class_device_attr_info,
@@ -999,6 +1008,7 @@ struct class_device_attribute *lpfc_host &class_device_attr_issue_reset, &class_device_attr_lpfc_poll, &class_device_attr_lpfc_poll_tmo, + &class_device_attr_lpfc_use_msi, &class_device_attr_lpfc_soft_wwpn, &class_device_attr_lpfc_soft_wwpn_enable, NULL,
@@ -1801,6 +1811,7 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)lpfc_discovery_threads_init (phba, lpfc_discovery_threads);lpfc_max_luns_init (phba, lpfc_max_luns);lpfc_poll_tmo_init (phba, lpfc_poll_tmo); +lpfc_use_msi_init (phba, lpfc_use_msi);lpfc_devloss_tmo_init (phba, lpfc_devloss_tmo);lpfc_nodev_tmo_init (phba, lpfc_nodev_tmo); phba->cfg_poll = lpfc_poll;
drivers/scsi/lpfc/lpfc.h +1 -0
@@ -303,6 +303,7 @@ struct lpfc_hba {uint32_t cfg_max_luns;uint32_t cfg_poll;uint32_t cfg_poll_tmo; +uint32_t cfg_use_msi;uint32_t cfg_sg_seg_cnt;uint32_t cfg_sg_dma_buf_size;uint64_t cfg_soft_wwpn;
drivers/scsi/lpfc/lpfc_init.c +10 -0
@@ -1653,6 +1653,14 @@ lpfc_pci_probe_one(struct pci_dev *pdev,if (error) goto out_remove_host; +if (phba->cfg_use_msi) { + error =pci_enable_msi (phba->pcidev); +if (error) +lpfc_printf_log (phba,KERN_INFO ,LOG_INIT ,"%d:0452 " +"Enable MSI failed, continuing with " +"IRQ\n" , phba->brd_no); + } + error =request_irq (phba->pcidev->irq, lpfc_intr_handler,IRQF_SHARED ,LPFC_DRIVER_NAME , phba);if (error) {
@@ -1732,6 +1740,7 @@ out_free_irq:lpfc_stop_timer (phba); phba->work_hba_events =0 ;free_irq (phba->pcidev->irq, phba); +pci_disable_msi (phba->pcidev); out_free_sysfs_attr:lpfc_free_sysfs_attr (phba); out_remove_host:
@@ -1798,6 +1807,7 @@ lpfc_pci_remove_one(struct pci_dev *pdev/* Release the irq reservation */ free_irq (phba->pcidev->irq, phba); +pci_disable_msi (phba->pcidev);lpfc_cleanup (phba,0 );lpfc_stop_timer (phba);