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

Commit 4ff43246 authored by James Smart's avatar James Smart Committed by James Bottomley
Browse files

[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: default avatarFrederic Temporelli <frederic.temporelli@ext.bull.net>
Signed-off-by: default avatarJames Smart <James.Smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent c7743956
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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;
+11 −0
Original line number Diff line number Diff line
@@ -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_attrs[] = {
	&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;
+10 −0
Original line number Diff line number Diff line
@@ -1653,6 +1653,14 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
	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 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
	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);