aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bfa/fcpim.c
diff options
context:
space:
mode:
authorJing Huang <huangj@brocade.com>2010-07-08 22:55:41 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-07-27 13:04:16 -0400
commit4b5e759dca9fb26d921c1267283350004dbf197b (patch)
treeef814001eb92a30b79d5a828c0f056ed61e13b26 /drivers/scsi/bfa/fcpim.c
parentdf2a52a6c8c4995e0bec0b739ddb2f51664837dd (diff)
[SCSI] bfa: fix uf post and rport fcpim state machine
BFA UF module did not hold lock when seding uf post buffer message to firmware causing CPE-Q corruption. Fix is to check present of FCS and if FCS present hold lock while posting UF buffers. Handle PRLO with sending acc to it and relogin with rport. Discard fcxp before any state change. Signed-off-by: Jing Huang <huangj@brocade.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/bfa/fcpim.c')
-rw-r--r--drivers/scsi/bfa/fcpim.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/drivers/scsi/bfa/fcpim.c b/drivers/scsi/bfa/fcpim.c
index d090f7a6368a..6b8976ad22fa 100644
--- a/drivers/scsi/bfa/fcpim.c
+++ b/drivers/scsi/bfa/fcpim.c
@@ -175,8 +175,12 @@ bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
175 175
176 switch (event) { 176 switch (event) {
177 case BFA_FCS_ITNIM_SM_RSP_OK: 177 case BFA_FCS_ITNIM_SM_RSP_OK:
178 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_online); 178 if (itnim->rport->scsi_function == BFA_RPORT_INITIATOR) {
179 bfa_itnim_online(itnim->bfa_itnim, itnim->seq_rec); 179 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
180 } else {
181 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_hcb_online);
182 bfa_itnim_online(itnim->bfa_itnim, itnim->seq_rec);
183 }
180 break; 184 break;
181 185
182 case BFA_FCS_ITNIM_SM_RSP_ERROR: 186 case BFA_FCS_ITNIM_SM_RSP_ERROR:
@@ -194,9 +198,7 @@ bfa_fcs_itnim_sm_prli(struct bfa_fcs_itnim_s *itnim,
194 198
195 case BFA_FCS_ITNIM_SM_INITIATOR: 199 case BFA_FCS_ITNIM_SM_INITIATOR:
196 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator); 200 bfa_sm_set_state(itnim, bfa_fcs_itnim_sm_initiator);
197 /* 201 bfa_fcxp_discard(itnim->fcxp);
198 * dont discard fcxp. accept will reach same state
199 */
200 break; 202 break;
201 203
202 case BFA_FCS_ITNIM_SM_DELETE: 204 case BFA_FCS_ITNIM_SM_DELETE:
@@ -476,7 +478,7 @@ bfa_fcs_itnim_prli_response(void *fcsarg, struct bfa_fcxp_s *fcxp, void *cbarg,
476 BFA_RPORT_INITIATOR; 478 BFA_RPORT_INITIATOR;
477 itnim->stats.prli_rsp_acc++; 479 itnim->stats.prli_rsp_acc++;
478 bfa_sm_send_event(itnim, 480 bfa_sm_send_event(itnim,
479 BFA_FCS_ITNIM_SM_INITIATOR); 481 BFA_FCS_ITNIM_SM_RSP_OK);
480 return; 482 return;
481 } 483 }
482 484
@@ -803,7 +805,7 @@ bfa_fcs_fcpim_uf_recv(struct bfa_fcs_itnim_s *itnim, struct fchs_s *fchs,
803 805
804 switch (els_cmd->els_code) { 806 switch (els_cmd->els_code) {
805 case FC_ELS_PRLO: 807 case FC_ELS_PRLO:
806 /* bfa_sm_send_event(itnim, BFA_FCS_ITNIM_SM_PRLO); */ 808 bfa_fcs_rport_prlo(itnim->rport, fchs->ox_id);
807 break; 809 break;
808 810
809 default: 811 default: