aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bfa
diff options
context:
space:
mode:
authorJing Huang <huangj@brocade.com>2010-07-08 22:52:00 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-07-27 13:04:11 -0400
commit41188cf5a60a24bf54df5be70142f0928f413788 (patch)
tree92a8ee6812b90188c238400c73306da14e58677c /drivers/scsi/bfa
parentc507341713114e2510ad7621088b359367adf1ce (diff)
[SCSI] bfa: fix prli retry issues
Add a max retry limit for PRLI retries. Max retry limit (5) is same as used in rport PLOGI. Once the retries are exhausted, invoke rport offline so that existing logic of rport re-discovery can kick-in. Also fixed a bug in rport.c where one less retry was happening. Signed-off-by: Jing Huang <huangj@brocade.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/bfa')
-rw-r--r--drivers/scsi/bfa/fcpim.c13
-rw-r--r--drivers/scsi/bfa/fcs_rport.h2
-rw-r--r--drivers/scsi/bfa/include/fcs/bfa_fcs_fcpim.h1
-rw-r--r--drivers/scsi/bfa/rport.c4
4 files changed, 15 insertions, 5 deletions
diff --git a/drivers/scsi/bfa/fcpim.c b/drivers/scsi/bfa/fcpim.c
index 7a0207e56693..d090f7a6368a 100644
--- a/drivers/scsi/bfa/fcpim.c
+++ b/drivers/scsi/bfa/fcpim.c
@@ -110,6 +110,7 @@ bfa_fcs_itnim_sm_offline(struct bfa_fcs_itnim_s *itnim,
110 switch (event) { 110 switch (event) {
111 case BFA_FCS_ITNIM_SM_ONLINE: 111 case BFA_FCS_ITNIM_SM_ONLINE:
112 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send); 112 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
113 itnim->prli_retries = 0;
113 bfa_fcs_itnim_send_prli(itnim, NULL); 114 bfa_fcs_itnim_send_prli(itnim, NULL);
114 break; 115 break;
115 116
@@ -218,8 +219,16 @@ bfa_fcs_itnim_sm_prli_retry(struct bfa_fcs_itnim_s *itnim,
218 219
219 switch (event) { 220 switch (event) {
220 case BFA_FCS_ITNIM_SM_TIMEOUT: 221 case BFA_FCS_ITNIM_SM_TIMEOUT:
221 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send); 222 if (itnim->prli_retries < BFA_FCS_RPORT_MAX_RETRIES) {
222 bfa_fcs_itnim_send_prli(itnim, NULL); 223 itnim->prli_retries++;
224 bfa_trc(itnim->fcs, itnim->prli_retries);
225 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_prli_send);
226 bfa_fcs_itnim_send_prli(itnim, NULL);
227 } else {
228 /* invoke target offline */
229 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_offline);
230 bfa_fcs_rport_logo_imp(itnim->rport);
231 }
223 break; 232 break;
224 233
225 case BFA_FCS_ITNIM_SM_OFFLINE: 234 case BFA_FCS_ITNIM_SM_OFFLINE:
diff --git a/drivers/scsi/bfa/fcs_rport.h b/drivers/scsi/bfa/fcs_rport.h
index 9c8d1d292380..5242ee0f03c6 100644
--- a/drivers/scsi/bfa/fcs_rport.h
+++ b/drivers/scsi/bfa/fcs_rport.h
@@ -24,6 +24,8 @@
24 24
25#include <fcs/bfa_fcs_rport.h> 25#include <fcs/bfa_fcs_rport.h>
26 26
27#define BFA_FCS_RPORT_MAX_RETRIES (5)
28
27void bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport, struct fchs_s *fchs, 29void bfa_fcs_rport_uf_recv(struct bfa_fcs_rport_s *rport, struct fchs_s *fchs,
28 u16 len); 30 u16 len);
29void bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport); 31void bfa_fcs_rport_scn(struct bfa_fcs_rport_s *rport);
diff --git a/drivers/scsi/bfa/include/fcs/bfa_fcs_fcpim.h b/drivers/scsi/bfa/include/fcs/bfa_fcs_fcpim.h
index e719f2c3eb35..9a35ecf5cdf0 100644
--- a/drivers/scsi/bfa/include/fcs/bfa_fcs_fcpim.h
+++ b/drivers/scsi/bfa/include/fcs/bfa_fcs_fcpim.h
@@ -41,6 +41,7 @@ struct bfa_fcs_itnim_s {
41 struct bfa_fcs_s *fcs; /* fcs instance */ 41 struct bfa_fcs_s *fcs; /* fcs instance */
42 struct bfa_timer_s timer; /* timer functions */ 42 struct bfa_timer_s timer; /* timer functions */
43 struct bfa_itnim_s *bfa_itnim; /* BFA itnim struct */ 43 struct bfa_itnim_s *bfa_itnim; /* BFA itnim struct */
44 u32 prli_retries; /* max prli retry attempts */
44 bfa_boolean_t seq_rec; /* seq recovery support */ 45 bfa_boolean_t seq_rec; /* seq recovery support */
45 bfa_boolean_t rec_support; /* REC supported */ 46 bfa_boolean_t rec_support; /* REC supported */
46 bfa_boolean_t conf_comp; /* FCP_CONF support */ 47 bfa_boolean_t conf_comp; /* FCP_CONF support */
diff --git a/drivers/scsi/bfa/rport.c b/drivers/scsi/bfa/rport.c
index 2796403222e1..4e1fff21a5bc 100644
--- a/drivers/scsi/bfa/rport.c
+++ b/drivers/scsi/bfa/rport.c
@@ -36,8 +36,6 @@
36 36
37BFA_TRC_FILE(FCS, RPORT); 37BFA_TRC_FILE(FCS, RPORT);
38 38
39#define BFA_FCS_RPORT_MAX_RETRIES (5)
40
41/* In millisecs */ 39/* In millisecs */
42static u32 bfa_fcs_rport_del_timeout = 40static u32 bfa_fcs_rport_del_timeout =
43 BFA_FCS_RPORT_DEF_DEL_TIMEOUT * 1000; 41 BFA_FCS_RPORT_DEF_DEL_TIMEOUT * 1000;
@@ -356,8 +354,8 @@ bfa_fcs_rport_sm_plogi_retry(struct bfa_fcs_rport_s *rport,
356 */ 354 */
357 355
358 case RPSM_EVENT_TIMEOUT: 356 case RPSM_EVENT_TIMEOUT:
359 rport->plogi_retries++;
360 if (rport->plogi_retries < BFA_FCS_RPORT_MAX_RETRIES) { 357 if (rport->plogi_retries < BFA_FCS_RPORT_MAX_RETRIES) {
358 rport->plogi_retries++;
361 bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_sending); 359 bfa_sm_set_state(rport, bfa_fcs_rport_sm_plogi_sending);
362 bfa_fcs_rport_send_plogi(rport, NULL); 360 bfa_fcs_rport_send_plogi(rport, NULL);
363 } else { 361 } else {