aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/lpfc/lpfc_init.c
diff options
context:
space:
mode:
authorJames.Smart@Emulex.Com <James.Smart@Emulex.Com>2005-11-29 16:32:13 -0500
committerJames Bottomley <jejb@mulgrave.(none)>2005-12-13 20:34:14 -0500
commit875fbdfe9b1b4c8f12622a8d8d81428ff0984875 (patch)
tree63c787cb9a7d4a92eaedcc9f8a89a00d5d8f6603 /drivers/scsi/lpfc/lpfc_init.c
parent5cc36b3cd0e3610ad7c7e2514160998276798fc0 (diff)
[SCSI] lpfc 8.1.1 : Add polled-mode support
- Add functionality to run in polled mode only. Includes run time attribute to enable mode. - Enable runtime writable hba settings for coallescing and delay parameters Customers have requested a mode in the driver to run strictly polled. This is generally to support an environment where the server is extremely loaded and is looking to reclaim some cpu cycles from adapter interrupt handling. This patch adds a new "poll" attribute, and the following behavior: if value is 0 (default): The driver uses the normal method for i/o completion. It uses the firmware feature of interrupt coalesing. The firmware allows a minimum number of i/o completions before an interrupt, or a maximum time delay between interrupts. By default, the driver sets these to no delay (disabled) or 1 i/o - meaning coalescing is disabled. Attributes were provided to change the coalescing values, but it was a module-load time only and global across all adapters. This patch allows them to be writable on a per-adapter basis. if value is 1 : Interrupts are left enabled, expecting that the user has tuned the interrupt coalescing values. When this setting is enabled, the driver will attempt to service completed i/o whenever new i/o is submitted to the adapter. If the coalescing values are large, and the i/o generation rate steady, an interrupt will be avoided by servicing completed i/o prior to the coalescing thresholds kicking in. However, if the i/o completion load is high enough or i/o generation slow, the coalescion values will ensure that completed i/o is serviced in a timely fashion. if value is 3 : Turns off FCP i/o interrupts altogether. The coalescing values now have no effect. A new attribute "poll_tmo" (default 10ms) exists to set the polling interval for i/o completion. When this setting is enabled, the driver will attempt to service completed i/o and restart the interval timer whenever new i/o is submitted. This behavior allows for servicing of completed i/o sooner than the interval timer, but ensures that if no i/o is being issued, then the interval timer will kick in to service the outstanding i/o. Signed-off-by: James Smart <James.Smart@emulex.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_init.c')
-rw-r--r--drivers/scsi/lpfc/lpfc_init.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index 766dac230a6c..db3c2ad4e941 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -370,6 +370,10 @@ lpfc_config_port_post(struct lpfc_hba * phba)
370 if (psli->num_rings > 3) 370 if (psli->num_rings > 3)
371 status |= HC_R3INT_ENA; 371 status |= HC_R3INT_ENA;
372 372
373 if ((phba->cfg_poll & ENABLE_FCP_RING_POLLING) &&
374 (phba->cfg_poll & DISABLE_FCP_RING_INT))
375 status &= ~(HC_R0INT_ENA << LPFC_FCP_RING);
376
373 writel(status, phba->HCregaddr); 377 writel(status, phba->HCregaddr);
374 readl(phba->HCregaddr); /* flush */ 378 readl(phba->HCregaddr); /* flush */
375 spin_unlock_irq(phba->host->host_lock); 379 spin_unlock_irq(phba->host->host_lock);
@@ -1237,6 +1241,7 @@ lpfc_stop_timer(struct lpfc_hba * phba)
1237 } 1241 }
1238 } 1242 }
1239 1243
1244 del_timer_sync(&phba->fcp_poll_timer);
1240 del_timer_sync(&phba->fc_estabtmo); 1245 del_timer_sync(&phba->fc_estabtmo);
1241 del_timer_sync(&phba->fc_disctmo); 1246 del_timer_sync(&phba->fc_disctmo);
1242 del_timer_sync(&phba->fc_fdmitmo); 1247 del_timer_sync(&phba->fc_fdmitmo);
@@ -1416,6 +1421,10 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
1416 psli->mbox_tmo.function = lpfc_mbox_timeout; 1421 psli->mbox_tmo.function = lpfc_mbox_timeout;
1417 psli->mbox_tmo.data = (unsigned long)phba; 1422 psli->mbox_tmo.data = (unsigned long)phba;
1418 1423
1424 init_timer(&phba->fcp_poll_timer);
1425 phba->fcp_poll_timer.function = lpfc_poll_timeout;
1426 phba->fcp_poll_timer.data = (unsigned long)phba;
1427
1419 /* 1428 /*
1420 * Get all the module params for configuring this host and then 1429 * Get all the module params for configuring this host and then
1421 * establish the host parameters. 1430 * establish the host parameters.
@@ -1530,6 +1539,7 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
1530 host->max_cmd_len = 16; 1539 host->max_cmd_len = 16;
1531 1540
1532 /* Initialize the list of scsi buffers used by driver for scsi IO. */ 1541 /* Initialize the list of scsi buffers used by driver for scsi IO. */
1542 spin_lock_init(&phba->scsi_buf_list_lock);
1533 INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list); 1543 INIT_LIST_HEAD(&phba->lpfc_scsi_buf_list);
1534 1544
1535 host->transportt = lpfc_transport_template; 1545 host->transportt = lpfc_transport_template;
@@ -1561,6 +1571,12 @@ lpfc_pci_probe_one(struct pci_dev *pdev, const struct pci_device_id *pid)
1561 if (error) 1571 if (error)
1562 goto out_free_irq; 1572 goto out_free_irq;
1563 1573
1574 if (phba->cfg_poll & DISABLE_FCP_RING_INT) {
1575 spin_lock_irq(phba->host->host_lock);
1576 lpfc_poll_start_timer(phba);
1577 spin_unlock_irq(phba->host->host_lock);
1578 }
1579
1564 /* 1580 /*
1565 * set fixed host attributes 1581 * set fixed host attributes
1566 * Must done after lpfc_sli_hba_setup() 1582 * Must done after lpfc_sli_hba_setup()