aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Smart <james.smart@emulex.com>2012-10-31 14:44:42 -0400
committerJames Bottomley <JBottomley@Parallels.com>2012-11-26 23:59:44 -0500
commita6571c6ebad15d04e8312e71b0ed17675ea4f6b3 (patch)
tree77aaad614f3625c78bf483a0e80496162a1b4913
parentc71ab8616d62d8d857c438f058839d9a0282e64c (diff)
[SCSI] lpfc 8.3.36: Fix bug with Target Resets and FCP2 devices
Fix bug with Target Resets and FCP2 devices Create module parameter to disable Target Reset on FCP-Tape devices when a "bus reset" is requested. Default is to reset all devices on bus reset. Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r--drivers/scsi/lpfc/lpfc.h1
-rw-r--r--drivers/scsi/lpfc/lpfc_attr.c12
-rw-r--r--drivers/scsi/lpfc/lpfc_scsi.c3
3 files changed, 16 insertions, 0 deletions
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h
index d0ed6c19a9aa..df4c13a5534c 100644
--- a/drivers/scsi/lpfc/lpfc.h
+++ b/drivers/scsi/lpfc/lpfc.h
@@ -689,6 +689,7 @@ struct lpfc_hba {
689#define LPFC_FCF_PRIORITY 2 /* Priority fcf failover */ 689#define LPFC_FCF_PRIORITY 2 /* Priority fcf failover */
690 uint32_t cfg_fcf_failover_policy; 690 uint32_t cfg_fcf_failover_policy;
691 uint32_t cfg_fcp_io_sched; 691 uint32_t cfg_fcp_io_sched;
692 uint32_t cfg_fcp2_no_tgt_reset;
692 uint32_t cfg_cr_delay; 693 uint32_t cfg_cr_delay;
693 uint32_t cfg_cr_count; 694 uint32_t cfg_cr_count;
694 uint32_t cfg_multi_ring_support; 695 uint32_t cfg_multi_ring_support;
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c
index a71c7ebe7b74..a364cae9e984 100644
--- a/drivers/scsi/lpfc/lpfc_attr.c
+++ b/drivers/scsi/lpfc/lpfc_attr.c
@@ -3859,6 +3859,16 @@ LPFC_ATTR_RW(fcp_io_sched, 0, 0, 1, "Determine scheduling algrithmn for "
3859 "issuing commands [0] - Round Robin, [1] - Current CPU"); 3859 "issuing commands [0] - Round Robin, [1] - Current CPU");
3860 3860
3861/* 3861/*
3862# lpfc_fcp2_no_tgt_reset: Determine bus reset behavior
3863# range is [0,1]. Default value is 0.
3864# For [0], bus reset issues target reset to ALL devices
3865# For [1], bus reset issues target reset to non-FCP2 devices
3866*/
3867LPFC_ATTR_RW(fcp2_no_tgt_reset, 0, 0, 1, "Determine bus reset behavior for "
3868 "FCP2 devices [0] - issue tgt reset, [1] - no tgt reset");
3869
3870
3871/*
3862# lpfc_cr_delay & lpfc_cr_count: Default values for I/O colaesing 3872# lpfc_cr_delay & lpfc_cr_count: Default values for I/O colaesing
3863# cr_delay (msec) or cr_count outstanding commands. cr_delay can take 3873# cr_delay (msec) or cr_count outstanding commands. cr_delay can take
3864# value [0,63]. cr_count can take value [1,255]. Default value of cr_delay 3874# value [0,63]. cr_count can take value [1,255]. Default value of cr_delay
@@ -4100,6 +4110,7 @@ struct device_attribute *lpfc_hba_attrs[] = {
4100 &dev_attr_lpfc_scan_down, 4110 &dev_attr_lpfc_scan_down,
4101 &dev_attr_lpfc_link_speed, 4111 &dev_attr_lpfc_link_speed,
4102 &dev_attr_lpfc_fcp_io_sched, 4112 &dev_attr_lpfc_fcp_io_sched,
4113 &dev_attr_lpfc_fcp2_no_tgt_reset,
4103 &dev_attr_lpfc_cr_delay, 4114 &dev_attr_lpfc_cr_delay,
4104 &dev_attr_lpfc_cr_count, 4115 &dev_attr_lpfc_cr_count,
4105 &dev_attr_lpfc_multi_ring_support, 4116 &dev_attr_lpfc_multi_ring_support,
@@ -5091,6 +5102,7 @@ void
5091lpfc_get_cfgparam(struct lpfc_hba *phba) 5102lpfc_get_cfgparam(struct lpfc_hba *phba)
5092{ 5103{
5093 lpfc_fcp_io_sched_init(phba, lpfc_fcp_io_sched); 5104 lpfc_fcp_io_sched_init(phba, lpfc_fcp_io_sched);
5105 lpfc_fcp2_no_tgt_reset_init(phba, lpfc_fcp2_no_tgt_reset);
5094 lpfc_cr_delay_init(phba, lpfc_cr_delay); 5106 lpfc_cr_delay_init(phba, lpfc_cr_delay);
5095 lpfc_cr_count_init(phba, lpfc_cr_count); 5107 lpfc_cr_count_init(phba, lpfc_cr_count);
5096 lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support); 5108 lpfc_multi_ring_support_init(phba, lpfc_multi_ring_support);
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
index 7f45ac9964a9..fd2ff5a9e18c 100644
--- a/drivers/scsi/lpfc/lpfc_scsi.c
+++ b/drivers/scsi/lpfc/lpfc_scsi.c
@@ -4914,6 +4914,9 @@ lpfc_bus_reset_handler(struct scsi_cmnd *cmnd)
4914 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) { 4914 list_for_each_entry(ndlp, &vport->fc_nodes, nlp_listp) {
4915 if (!NLP_CHK_NODE_ACT(ndlp)) 4915 if (!NLP_CHK_NODE_ACT(ndlp))
4916 continue; 4916 continue;
4917 if (vport->phba->cfg_fcp2_no_tgt_reset &&
4918 (ndlp->nlp_fcp_info & NLP_FCP_2_DEVICE))
4919 continue;
4917 if (ndlp->nlp_state == NLP_STE_MAPPED_NODE && 4920 if (ndlp->nlp_state == NLP_STE_MAPPED_NODE &&
4918 ndlp->nlp_sid == i && 4921 ndlp->nlp_sid == i &&
4919 ndlp->rport) { 4922 ndlp->rport) {