Call fc_lport_error to retry upto max retry count when 
FLOGI/SCR/NS gets rejected.

Signed-off-by: Bhanu Prakash Gollapudi <[email protected]>
---
 drivers/scsi/libfc/fc_lport.c |   70 ++++++++++++++++++++++------------------
 1 files changed, 38 insertions(+), 32 deletions(-)

diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index 6ef7b94..ba081ca 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -1032,36 +1032,37 @@ static void fc_lport_error(struct fc_lport *lport, 
struct fc_frame *fp)
                     PTR_ERR(fp), fc_lport_state(lport),
                     lport->retry_count);
 
-       if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) {
-               /*
-                * Memory allocation failure, or the exchange timed out.
-                *  Retry after delay
-                */
-               if (lport->retry_count < lport->max_retry_count) {
-                       lport->retry_count++;
-                       if (!fp)
-                               delay = msecs_to_jiffies(500);
-                       else
-                               delay = msecs_to_jiffies(lport->e_d_tov);
-
-                       schedule_delayed_work(&lport->retry_work, delay);
-               } else {
-                       switch (lport->state) {
-                       case LPORT_ST_DISABLED:
-                       case LPORT_ST_READY:
-                       case LPORT_ST_RESET:
-                       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;
-                       }
+       if (PTR_ERR(fp) == -FC_EX_CLOSED)
+               return;
+
+       /*
+        * Memory allocation failure, or the exchange timed out.
+        *  Retry after delay
+        */
+       if (lport->retry_count < lport->max_retry_count) {
+               lport->retry_count++;
+               if (!fp)
+                       delay = msecs_to_jiffies(500);
+               else
+                       delay = msecs_to_jiffies(lport->e_d_tov);
+
+               schedule_delayed_work(&lport->retry_work, delay);
+       } else {
+               switch (lport->state) {
+               case LPORT_ST_DISABLED:
+               case LPORT_ST_READY:
+               case LPORT_ST_RESET:
+               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;
                }
        }
 }
@@ -1478,7 +1479,12 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct 
fc_frame *fp,
 
        fh = fc_frame_header_get(fp);
        did = ntoh24(fh->fh_d_id);
-       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));
                if (flp) {
                        mfs = ntohs(flp->fl_csp.sp_bb_data) &
@@ -1518,7 +1524,7 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct 
fc_frame *fp,
                        }
                }
        } else {
-               FC_LPORT_DBG(lport, "Bad FLOGI response\n");
+               fc_lport_error(lport, fp);
        }
 
 out:
-- 
1.7.0.6




_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel

Reply via email to