Commit 7f985231 authored by Bhanu Prakash Gollapudi's avatar Bhanu Prakash Gollapudi Committed by James Bottomley

[SCSI] libfc: Add retry logic to lport state machine when receiving LS_RJT

Call fc_lport_error to retry upto max retry count when
FLOGI/SCR/NS gets rejected.
Signed-off-by: default avatarBhanu Prakash Gollapudi <bprakash@broadcom.com>
Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent cf4aebca
...@@ -1012,38 +1012,24 @@ static void fc_lport_error(struct fc_lport *lport, struct fc_frame *fp) ...@@ -1012,38 +1012,24 @@ static void fc_lport_error(struct fc_lport *lport, struct fc_frame *fp)
PTR_ERR(fp), fc_lport_state(lport), PTR_ERR(fp), fc_lport_state(lport),
lport->retry_count); lport->retry_count);
if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) { if (PTR_ERR(fp) == -FC_EX_CLOSED)
/* return;
* Memory allocation failure, or the exchange timed out.
* Retry after delay /*
*/ * Memory allocation failure, or the exchange timed out
if (lport->retry_count < lport->max_retry_count) { * or we received LS_RJT.
lport->retry_count++; * Retry after delay
if (!fp) */
delay = msecs_to_jiffies(500); if (lport->retry_count < lport->max_retry_count) {
else lport->retry_count++;
delay = msecs_to_jiffies(lport->e_d_tov); if (!fp)
delay = msecs_to_jiffies(500);
schedule_delayed_work(&lport->retry_work, delay); else
} else { delay = msecs_to_jiffies(lport->e_d_tov);
switch (lport->state) {
case LPORT_ST_DISABLED: schedule_delayed_work(&lport->retry_work, delay);
case LPORT_ST_READY: } else
case LPORT_ST_RESET: fc_lport_enter_reset(lport);
case LPORT_ST_RNN_ID:
case LPORT_ST_RSNN_NN:
case LPORT_ST_RSPN_ID:
case LPORT_ST_RFT_ID:
case LPORT_ST_RFF_ID:
case LPORT_ST_SCR:
case LPORT_ST_DNS:
case LPORT_ST_FLOGI:
case LPORT_ST_LOGO:
fc_lport_enter_reset(lport);
break;
}
}
}
} }
/** /**
...@@ -1461,7 +1447,13 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp, ...@@ -1461,7 +1447,13 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp,
} }
did = fc_frame_did(fp); did = fc_frame_did(fp);
if (fc_frame_payload_op(fp) == ELS_LS_ACC && did != 0) {
if (!did) {
FC_LPORT_DBG(lport, "Bad FLOGI response\n");
goto out;
}
if (fc_frame_payload_op(fp) == ELS_LS_ACC) {
flp = fc_frame_payload_get(fp, sizeof(*flp)); flp = fc_frame_payload_get(fp, sizeof(*flp));
if (flp) { if (flp) {
mfs = ntohs(flp->fl_csp.sp_bb_data) & mfs = ntohs(flp->fl_csp.sp_bb_data) &
...@@ -1500,9 +1492,8 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp, ...@@ -1500,9 +1492,8 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp,
fc_lport_enter_dns(lport); fc_lport_enter_dns(lport);
} }
} }
} else { } else
FC_LPORT_DBG(lport, "Bad FLOGI response\n"); fc_lport_error(lport, fp);
}
out: out:
fc_frame_free(fp); fc_frame_free(fp);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment