diff options
author | James Smart <james.smart@emulex.com> | 2012-10-31 14:44:42 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2012-11-26 23:59:44 -0500 |
commit | a6571c6ebad15d04e8312e71b0ed17675ea4f6b3 (patch) | |
tree | 77aaad614f3625c78bf483a0e80496162a1b4913 | |
parent | c71ab8616d62d8d857c438f058839d9a0282e64c (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.h | 1 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 12 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 3 |
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 | */ | ||
3867 | LPFC_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 | |||
5091 | lpfc_get_cfgparam(struct lpfc_hba *phba) | 5102 | lpfc_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) { |