[SCSI] 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 <frederic.temporelli@ext.bull.net> Signed-off-by: James Smart <James.Smart@emulex.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
committed by
James Bottomley
parent
c7743956f8
commit
4ff43246e4
@@ -303,6 +303,7 @@ struct lpfc_hba {
|
|||||||
uint32_t cfg_max_luns;
|
uint32_t cfg_max_luns;
|
||||||
uint32_t cfg_poll;
|
uint32_t cfg_poll;
|
||||||
uint32_t cfg_poll_tmo;
|
uint32_t cfg_poll_tmo;
|
||||||
|
uint32_t cfg_use_msi;
|
||||||
uint32_t cfg_sg_seg_cnt;
|
uint32_t cfg_sg_seg_cnt;
|
||||||
uint32_t cfg_sg_dma_buf_size;
|
uint32_t cfg_sg_dma_buf_size;
|
||||||
uint64_t cfg_soft_wwpn;
|
uint64_t cfg_soft_wwpn;
|
||||||
|
@@ -961,6 +961,15 @@ LPFC_ATTR_R(max_luns, 255, 0, 65535,
|
|||||||
LPFC_ATTR_RW(poll_tmo, 10, 1, 255,
|
LPFC_ATTR_RW(poll_tmo, 10, 1, 255,
|
||||||
"Milliseconds driver will wait between polling FCP ring");
|
"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[] = {
|
struct class_device_attribute *lpfc_host_attrs[] = {
|
||||||
&class_device_attr_info,
|
&class_device_attr_info,
|
||||||
@@ -999,6 +1008,7 @@ struct class_device_attribute *lpfc_host_attrs[] = {
|
|||||||
&class_device_attr_issue_reset,
|
&class_device_attr_issue_reset,
|
||||||
&class_device_attr_lpfc_poll,
|
&class_device_attr_lpfc_poll,
|
||||||
&class_device_attr_lpfc_poll_tmo,
|
&class_device_attr_lpfc_poll_tmo,
|
||||||
|
&class_device_attr_lpfc_use_msi,
|
||||||
&class_device_attr_lpfc_soft_wwpn,
|
&class_device_attr_lpfc_soft_wwpn,
|
||||||
&class_device_attr_lpfc_soft_wwpn_enable,
|
&class_device_attr_lpfc_soft_wwpn_enable,
|
||||||
NULL,
|
NULL,
|
||||||
@@ -1801,6 +1811,7 @@ lpfc_get_cfgparam(struct lpfc_hba *phba)
|
|||||||
lpfc_discovery_threads_init(phba, lpfc_discovery_threads);
|
lpfc_discovery_threads_init(phba, lpfc_discovery_threads);
|
||||||
lpfc_max_luns_init(phba, lpfc_max_luns);
|
lpfc_max_luns_init(phba, lpfc_max_luns);
|
||||||
lpfc_poll_tmo_init(phba, lpfc_poll_tmo);
|
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_devloss_tmo_init(phba, lpfc_devloss_tmo);
|
||||||
lpfc_nodev_tmo_init(phba, lpfc_nodev_tmo);
|
lpfc_nodev_tmo_init(phba, lpfc_nodev_tmo);
|
||||||
phba->cfg_poll = lpfc_poll;
|
phba->cfg_poll = lpfc_poll;
|
||||||
|
@@ -1653,6 +1653,14 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
|
|||||||
if (error)
|
if (error)
|
||||||
goto out_remove_host;
|
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,
|
error = request_irq(phba->pcidev->irq, lpfc_intr_handler, IRQF_SHARED,
|
||||||
LPFC_DRIVER_NAME, phba);
|
LPFC_DRIVER_NAME, phba);
|
||||||
if (error) {
|
if (error) {
|
||||||
@@ -1732,6 +1740,7 @@ out_free_irq:
|
|||||||
lpfc_stop_timer(phba);
|
lpfc_stop_timer(phba);
|
||||||
phba->work_hba_events = 0;
|
phba->work_hba_events = 0;
|
||||||
free_irq(phba->pcidev->irq, phba);
|
free_irq(phba->pcidev->irq, phba);
|
||||||
|
pci_disable_msi(phba->pcidev);
|
||||||
out_free_sysfs_attr:
|
out_free_sysfs_attr:
|
||||||
lpfc_free_sysfs_attr(phba);
|
lpfc_free_sysfs_attr(phba);
|
||||||
out_remove_host:
|
out_remove_host:
|
||||||
@@ -1798,6 +1807,7 @@ lpfc_pci_remove_one(struct pci_dev *pdev)
|
|||||||
|
|
||||||
/* Release the irq reservation */
|
/* Release the irq reservation */
|
||||||
free_irq(phba->pcidev->irq, phba);
|
free_irq(phba->pcidev->irq, phba);
|
||||||
|
pci_disable_msi(phba->pcidev);
|
||||||
|
|
||||||
lpfc_cleanup(phba, 0);
|
lpfc_cleanup(phba, 0);
|
||||||
lpfc_stop_timer(phba);
|
lpfc_stop_timer(phba);
|
||||||
|
Reference in New Issue
Block a user