]> err.no Git - linux-2.6/commitdiff
[SCSI] lpfc 8.1.11 : Add MSI (Message Signalled Interrupts) support
authorJames Smart <James.Smart@Emulex.Com>
Sat, 2 Dec 2006 18:34:56 +0000 (13:34 -0500)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Sun, 3 Dec 2006 15:31:04 +0000 (09:31 -0600)
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>
drivers/scsi/lpfc/lpfc.h
drivers/scsi/lpfc/lpfc_attr.c
drivers/scsi/lpfc/lpfc_init.c

index e94190e83fc3a339b4b8b1bbb280f967baee71b1..1ec9cf0e374abd4fcacbfe07ba80979272925cfb 100644 (file)
@@ -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;
index 73d3afc72de20c76e4389344555de122595d6709..e2ac7ba3d8ada0249517121f160c0d0e02ecf8bd 100644 (file)
@@ -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;
index 6b0718573ac5ee88845ba0424ce5b2d302508feb..71ee0cd3221619f888be0a4e5eed5599eb1e1efc 100644 (file)
@@ -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 @@ 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);