As per FC-LS Rev 1.62 table 46, response codes are handled as follows:

1. If the Req executed is true, PRLI is accepted.
2. If Req executed is not set,  if resp code is 5,
   PRLI is not retried and port is logged out.
3. If resp code is anything apart from 1 or 5, PRLI is retired
   upto max retry count.

Signed-off-by: Bhanu Prakash Gollapudi <[email protected]>
---
 drivers/scsi/libfc/fc_rport.c |   26 ++++++++++++++++++++------
 1 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c
index 3156ea5..1ef266d 100644
--- a/drivers/scsi/libfc/fc_rport.c
+++ b/drivers/scsi/libfc/fc_rport.c
@@ -704,6 +704,7 @@ static void fc_rport_prli_resp(struct fc_seq *sp, struct 
fc_frame *fp,
        u32 roles = FC_RPORT_ROLE_UNKNOWN;
        u32 fcp_parm = 0;
        u8 op;
+       u8 resp_code = 0;
 
        mutex_lock(&rdata->rp_mutex);
 
@@ -728,12 +729,25 @@ static void fc_rport_prli_resp(struct fc_seq *sp, struct 
fc_frame *fp,
        op = fc_frame_payload_op(fp);
        if (op == ELS_LS_ACC) {
                pp = fc_frame_payload_get(fp, sizeof(*pp));
-               if (pp && pp->prli.prli_spp_len >= sizeof(pp->spp)) {
-                       fcp_parm = ntohl(pp->spp.spp_params);
-                       if (fcp_parm & FCP_SPPF_RETRY)
-                               rdata->flags |= FC_RP_FLAGS_RETRY;
+
+               if (pp) {
+                       resp_code = (pp->spp.spp_flags & FC_SPP_RESP_MASK);
+                       FC_RPORT_DBG(rdata, "PRLI spp_flags = 0x%x\n",
+                                    pp->spp.spp_flags);
+                       if (resp_code != FC_SPP_RESP_ACK) {
+                               if (resp_code == FC_SPP_RESP_CONF)
+                                       fc_rport_error(rdata, fp);
+                               else
+                                       fc_rport_error_retry(rdata, fp);
+                               goto err;
+                       }
+                       if (pp->prli.prli_spp_len >= sizeof(pp->spp)) {
+                               fcp_parm = ntohl(pp->spp.spp_params);
+                               if (fcp_parm & FCP_SPPF_RETRY)
+                                       rdata->flags |= FC_RP_FLAGS_RETRY;
+                       }
                }
 
                rdata->supported_classes = FC_COS_CLASS3;
-- 
1.7.0.6




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

Reply via email to