Moving fc_ns_enter_reg_pn, fc_ns_enter_reg_ft and
fc_ns_enter_scr to fc_lport.c. This also removes
fc_ns_retry and fc_ns_error from fc_ns.c.

This is part of an initiative to move all of the lport's
state transitions back into the lport block.

Signed-off-by: Robert Love <[EMAIL PROTECTED]>
---

 drivers/scsi/libfc/fc_lport.c |  252 +++++++++++++++++++++++++++++++--
 drivers/scsi/libfc/fc_ns.c    |  311 -----------------------------------------
 drivers/scsi/libfc/fc_rport.c |   22 ++-
 include/scsi/libfc/libfc.h    |    1 
 4 files changed, 247 insertions(+), 339 deletions(-)

diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index 113a4df..5e3a0e5 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -37,8 +37,12 @@
 static int fc_lport_debug;
 
 static void fc_lport_enter_flogi(struct fc_lport *);
-static void fc_lport_enter_logo(struct fc_lport *);
 static void fc_lport_enter_dns(struct fc_lport *);
+static void fc_lport_enter_reg_pn(struct fc_lport *);
+static void fc_lport_enter_reg_ft(struct fc_lport *);
+static void fc_lport_enter_scr(struct fc_lport *);
+
+static void fc_lport_enter_logo(struct fc_lport *);
 
 static const char *fc_lport_state_names[] = {
        [LPORT_ST_NONE] =     "none",
@@ -62,9 +66,8 @@ static int fc_frame_drop(struct fc_lport *lp, struct fc_frame 
*fp)
 static int fc_lport_event_callback(struct fc_lport *lp, struct fc_rport *rp,
                                   enum fc_lport_event event)
 {
-       if (rp == lp->dns_rp && event == LPORT_EV_RPORT_SUCCESS) {
-               lp->tt.dns_register(lp);
-       }
+       if (rp == lp->dns_rp && event == LPORT_EV_RPORT_SUCCESS)
+               fc_lport_enter_reg_pn(lp);
 
        return 0;
 }
@@ -116,11 +119,23 @@ static void fc_lport_ptp_clear(struct fc_lport *lp)
 }
 
 /*
+ * Fill in dNS request header.
+ */
+static void fc_lport_fill_dns_hdr(struct fc_lport *lp, struct fc_ct_hdr *ct,
+                                 unsigned int op, unsigned int req_size)
+{
+       memset(ct, 0, sizeof(*ct) + req_size);
+       ct->ct_rev = FC_CT_REV;
+       ct->ct_fs_type = FC_FST_DIR;
+       ct->ct_fs_subtype = FC_NS_SUBTYPE;
+       ct->ct_cmd = htons(op);
+}
+
+/*
  * Fill in FLOGI command for request.
  */
-static void
-fc_lport_flogi_fill(struct fc_lport *lp,
-                   struct fc_els_flogi *flogi, unsigned int op)
+static void fc_lport_flogi_fill(struct fc_lport *lp,
+                               struct fc_els_flogi *flogi, unsigned int op)
 {
        struct fc_els_csp *sp;
        struct fc_els_cssp *cp;
@@ -436,16 +451,22 @@ static void fc_lport_enter_retry(struct fc_lport *lp)
        case LPORT_ST_READY:
        case LPORT_ST_RESET:
        case LPORT_ST_DNS_STOP:
-       case LPORT_ST_REG_PN:
-       case LPORT_ST_REG_FT:
-       case LPORT_ST_SCR:
                WARN_ON(1);
                break;
+       case LPORT_ST_FLOGI:
+               fc_lport_enter_flogi(lp);
+               break;
        case LPORT_ST_DNS:
                fc_lport_enter_dns(lp);
                break;
-       case LPORT_ST_FLOGI:
-               fc_lport_enter_flogi(lp);
+       case LPORT_ST_REG_PN:
+               fc_lport_enter_reg_pn(lp);
+               break;
+       case LPORT_ST_REG_FT:
+               fc_lport_enter_reg_ft(lp);
+               break;
+       case LPORT_ST_SCR:
+               fc_lport_enter_scr(lp);
                break;
        case LPORT_ST_LOGO:
                fc_lport_enter_logo(lp);
@@ -463,17 +484,23 @@ static void fc_lport_enter_reject(struct fc_lport *lp)
        case LPORT_ST_NONE:
        case LPORT_ST_READY:
        case LPORT_ST_RESET:
-       case LPORT_ST_REG_PN:
-       case LPORT_ST_REG_FT:
-       case LPORT_ST_SCR:
        case LPORT_ST_DNS_STOP:
                WARN_ON(1);
                break;
+       case LPORT_ST_FLOGI:
+               fc_lport_enter_flogi(lp);
+               break;
        case LPORT_ST_DNS:
                lp->tt.lport_reset(lp);
                break;
-       case LPORT_ST_FLOGI:
-               fc_lport_enter_flogi(lp);
+       case LPORT_ST_REG_PN:
+               fc_lport_enter_reg_ft(lp);
+               break;
+       case LPORT_ST_REG_FT:
+               fc_lport_enter_scr(lp);
+               break;
+       case LPORT_ST_SCR:
+               lp->tt.disc_stop(lp);
                break;
        case LPORT_ST_LOGO:
                fc_lport_enter_reset(lp);
@@ -546,7 +573,7 @@ static void fc_lport_enter_dns(struct fc_lport *lp)
                lp->tt.rport_login(rport);
        } else {
                del_timer(&lp->state_timer);
-               lp->tt.dns_register(lp);
+               fc_lport_enter_reg_pn(lp);
        }
        return;
 
@@ -947,6 +974,195 @@ void fc_lport_enter_flogi(struct fc_lport *lp)
        fc_lport_flogi_send(lp);
 }
 
+/*
+ * Test for dNS accept in response payload.
+ */
+static int fc_lport_dns_acc(struct fc_frame *fp)
+{
+       struct fc_frame_header *fh;
+       struct fc_ct_hdr *ct;
+       int rc = 0;
+
+       fh = fc_frame_header_get(fp);
+       ct = fc_frame_payload_get(fp, sizeof(*ct));
+       if (fh && ct && fh->fh_type == FC_TYPE_CT &&
+           ct->ct_fs_type == FC_FST_DIR &&
+           ct->ct_fs_subtype == FC_NS_SUBTYPE &&
+           ntohs(ct->ct_cmd) == FC_FS_ACC) {
+               rc = 1;
+       }
+       return rc;
+}
+
+/*
+ * Handle response from name server.
+ */
+static void fc_lport_ns_resp(struct fc_seq *sp, struct fc_frame *fp,
+                            void *lp_arg)
+{
+       struct fc_lport *lp = lp_arg;
+
+       if (!IS_ERR(fp)) {
+               fc_lport_lock(lp);
+               del_timer(&lp->state_timer);
+               if (fc_lport_dns_acc(fp)) {
+                       if (lp->state == LPORT_ST_REG_PN)
+                               fc_lport_enter_reg_ft(lp);
+                       else
+                               fc_lport_enter_scr(lp);
+
+               } else {
+                       fc_lport_retry(lp);
+               }
+               fc_lport_unlock(lp);
+               fc_frame_free(fp);
+       } else
+               fc_lport_error(lp, fp);
+}
+
+/**
+ * fc_lport_ns_scr_resp - Handle response to State Change Register (SCR) 
request
+ * @sp: current sequence in SCR exchange
+ * @fp: response frame
+ * @lp_arg: Fibre Channel host port instance
+ */
+static void fc_lport_ns_scr_resp(struct fc_seq *sp, struct fc_frame *fp,
+                                void *lp_arg)
+{
+       struct fc_lport *lp = lp_arg;
+       int err;
+
+       if (IS_ERR(fp))
+               fc_lport_error(lp, fp);
+       else {
+               fc_lport_lock(lp);
+               fc_lport_state_enter(lp, LPORT_ST_READY);
+               fc_lport_unlock(lp);
+               err = lp->tt.disc_start(lp);
+               if (err)
+                       FC_DBG("target discovery start error\n");
+               fc_frame_free(fp);
+       }
+}
+
+/*
+ * Register port name with name server.
+ */
+static void fc_lport_enter_reg_pn(struct fc_lport *lp)
+{
+       struct fc_frame *fp;
+       struct req {
+               struct fc_ct_hdr ct;
+               struct fc_ns_rn_id rn;
+       } *req;
+
+       if (fc_lport_debug)
+               FC_DBG("Processing REG_PN state");
+
+       fc_lport_state_enter(lp, LPORT_ST_REG_PN);
+       fp = fc_frame_alloc(lp, sizeof(*req));
+       if (!fp) {
+               fc_lport_retry(lp);
+               return;
+       }
+       req = fc_frame_payload_get(fp, sizeof(*req));
+       memset(req, 0, sizeof(*req));
+       fc_lport_fill_dns_hdr(lp, &req->ct, FC_NS_RPN_ID, sizeof(req->rn));
+       hton24(req->rn.fr_fid.fp_fid, lp->fid);
+       put_unaligned_be64(lp->wwpn, &req->rn.fr_wwn);
+       fc_frame_setup(fp, FC_RCTL_DD_UNSOL_CTL, FC_TYPE_CT);
+       if (!lp->tt.exch_seq_send(lp, fp,
+                                 fc_lport_ns_resp, lp,
+                                 lp->e_d_tov,
+                                 lp->fid,
+                                 lp->dns_rp->port_id,
+                                 FC_FC_SEQ_INIT | FC_FC_END_SEQ))
+               fc_lport_retry(lp);
+}
+
+/**
+ * fc_lport_enter_reg_ft - Register FC4-types with the name server
+ * @lp: Fibre Channel host port instance
+ */
+static void fc_lport_enter_reg_ft(struct fc_lport *lp)
+{
+       struct fc_frame *fp;
+       struct req {
+               struct fc_ct_hdr ct;
+               struct fc_ns_fid fid;   /* port ID object */
+               struct fc_ns_fts fts;   /* FC4-types object */
+       } *req;
+       struct fc_ns_fts *lps;
+       int i;
+
+       if (fc_lport_debug)
+               FC_DBG("Processing REG_FT state");
+
+       fc_lport_state_enter(lp, LPORT_ST_REG_FT);
+
+       lps = &lp->fcts;
+       i = sizeof(lps->ff_type_map) / sizeof(lps->ff_type_map[0]);
+       while (--i >= 0)
+               if (ntohl(lps->ff_type_map[i]) != 0)
+                       break;
+       if (i >= 0) {
+               fp = fc_frame_alloc(lp, sizeof(*req));
+               if (fp) {
+                       req = fc_frame_payload_get(fp, sizeof(*req));
+                       fc_lport_fill_dns_hdr(lp, &req->ct,
+                                             FC_NS_RFT_ID,
+                                             sizeof(*req) -
+                                             sizeof(struct fc_ct_hdr));
+                       hton24(req->fid.fp_fid, lp->fid);
+                       req->fts = *lps;
+                       fc_frame_setup(fp, FC_RCTL_DD_UNSOL_CTL, FC_TYPE_CT);
+                       if (!lp->tt.exch_seq_send(lp, fp,
+                                                 fc_lport_ns_resp, lp,
+                                                 lp->e_d_tov,
+                                                 lp->fid,
+                                                 lp->dns_rp->port_id,
+                                                 FC_FC_SEQ_INIT |
+                                                 FC_FC_END_SEQ))
+                               fc_lport_retry(lp);
+               } else {
+                       fc_lport_retry(lp);
+               }
+       } else {
+               fc_lport_enter_scr(lp);
+       }
+}
+
+/**
+ * fc_lport_enter scr - Send a State Change Register (SCR) request
+ * @lp: Fibre Channel host port instance
+ */
+static void fc_lport_enter_scr(struct fc_lport *lp)
+{
+       struct fc_frame *fp;
+       struct fc_els_scr *scr;
+
+       if (fc_lport_debug)
+               FC_DBG("Processing SCR state");
+
+       fc_lport_state_enter(lp, LPORT_ST_SCR);
+
+       fp = fc_frame_alloc(lp, sizeof(*scr));
+       if (fp) {
+               scr = fc_frame_payload_get(fp, sizeof(*scr));
+               memset(scr, 0, sizeof(*scr));
+               scr->scr_cmd = ELS_SCR;
+               scr->scr_reg_func = ELS_SCRF_FULL;
+       }
+       fc_frame_setup(fp, FC_RCTL_ELS_REQ, FC_TYPE_ELS);
+       fc_frame_set_offset(fp, 0);
+
+       lp->tt.exch_seq_send(lp, fp,
+                            fc_lport_ns_scr_resp,
+                            lp, lp->e_d_tov,
+                            lp->fid, FC_FID_FCTRL,
+                            FC_FC_SEQ_INIT | FC_FC_END_SEQ);
+}
+
 /* Configure a fc_lport */
 int fc_lport_config(struct fc_lport *lp)
 {
diff --git a/drivers/scsi/libfc/fc_ns.c b/drivers/scsi/libfc/fc_ns.c
index 4edf561..32ac764 100644
--- a/drivers/scsi/libfc/fc_ns.c
+++ b/drivers/scsi/libfc/fc_ns.c
@@ -51,13 +51,6 @@ static void fc_ns_gpn_id_error(struct fc_ns_port *rp, struct 
fc_frame *fp);
 static void fc_ns_gnn_id_req(struct work_struct *work);
 static void fc_ns_gnn_id_resp(struct fc_seq *, struct fc_frame *, void *);
 static void fc_ns_gnn_id_error(struct fc_ns_port *, struct fc_frame *);
-static void fc_ns_enter_reg_pn(struct fc_lport *lp);
-static void fc_ns_error(struct fc_lport *lp, struct fc_frame *fp);
-static void fc_lport_fill_dns_hdr(struct fc_lport *lp, struct fc_ct_hdr *ct,
-                                 unsigned int op, unsigned int req_size);
-static void fc_ns_resp(struct fc_seq *sp, struct fc_frame *fp,
-                      void *lp_arg);
-static void fc_ns_retry(struct fc_lport *lp);
 static void fc_ns_single(struct fc_lport *, struct fc_ns_port *);
 static int fc_ns_restart(struct fc_lport *);
 
@@ -164,168 +157,6 @@ static void fc_ns_recv_req(struct fc_seq *sp, struct 
fc_frame *fp,
        }
 }
 
-/**
- * fc_ns_scr_resp - Handle response to State Change Register (SCR) request
- * @sp: current sequence in SCR exchange
- * @fp: response frame
- * @lp_arg: Fibre Channel host port instance
- */
-static void fc_ns_scr_resp(struct fc_seq *sp, struct fc_frame *fp,
-                          void *lp_arg)
-{
-       struct fc_lport *lp = lp_arg;
-       int err;
-
-       if (IS_ERR(fp))
-               fc_ns_error(lp, fp);
-       else {
-               fc_lport_lock(lp);
-               fc_lport_state_enter(lp, LPORT_ST_READY);
-               fc_lport_unlock(lp);
-               err = lp->tt.disc_start(lp);
-               if (err)
-                       FC_DBG("target discovery start error\n");
-               fc_frame_free(fp);
-       }
-}
-
-/**
- * fc_ns_enter scr - Send a State Change Register (SCR) request
- * @lp: Fibre Channel host port instance
- */
-static void fc_ns_enter_scr(struct fc_lport *lp)
-{
-       struct fc_frame *fp;
-       struct fc_els_scr *scr;
-
-       if (fc_ns_debug)
-               FC_DBG("Processing SCR state");
-
-       fc_lport_state_enter(lp, LPORT_ST_SCR);
-
-       fp = fc_frame_alloc(lp, sizeof(*scr));
-       if (fp) {
-               scr = fc_frame_payload_get(fp, sizeof(*scr));
-               memset(scr, 0, sizeof(*scr));
-               scr->scr_cmd = ELS_SCR;
-               scr->scr_reg_func = ELS_SCRF_FULL;
-       }
-       fc_frame_setup(fp, FC_RCTL_ELS_REQ, FC_TYPE_ELS);
-       fc_frame_set_offset(fp, 0);
-
-       lp->tt.exch_seq_send(lp, fp,
-                            fc_ns_scr_resp,
-                            lp, lp->e_d_tov,
-                            lp->fid, FC_FID_FCTRL,
-                            FC_FC_SEQ_INIT | FC_FC_END_SEQ);
-}
-
-/**
- * fc_ns_enter_reg_ft - Register FC4-types with the name server
- * @lp: Fibre Channel host port instance
- */
-static void fc_ns_enter_reg_ft(struct fc_lport *lp)
-{
-       struct fc_frame *fp;
-       struct req {
-               struct fc_ct_hdr ct;
-               struct fc_ns_fid fid;   /* port ID object */
-               struct fc_ns_fts fts;   /* FC4-types object */
-       } *req;
-       struct fc_ns_fts *lps;
-       int i;
-
-       if (fc_ns_debug)
-               FC_DBG("Processing REG_FT state");
-
-       fc_lport_state_enter(lp, LPORT_ST_REG_FT);
-
-       lps = &lp->fcts;
-       i = sizeof(lps->ff_type_map) / sizeof(lps->ff_type_map[0]);
-       while (--i >= 0)
-               if (ntohl(lps->ff_type_map[i]) != 0)
-                       break;
-       if (i >= 0) {
-               fp = fc_frame_alloc(lp, sizeof(*req));
-               if (fp) {
-                       req = fc_frame_payload_get(fp, sizeof(*req));
-                       fc_lport_fill_dns_hdr(lp, &req->ct,
-                                             FC_NS_RFT_ID,
-                                             sizeof(*req) -
-                                             sizeof(struct fc_ct_hdr));
-                       hton24(req->fid.fp_fid, lp->fid);
-                       req->fts = *lps;
-                       fc_frame_setup(fp, FC_RCTL_DD_UNSOL_CTL, FC_TYPE_CT);
-                       if (!lp->tt.exch_seq_send(lp, fp,
-                                                 fc_ns_resp, lp,
-                                                 lp->e_d_tov,
-                                                 lp->fid,
-                                                 lp->dns_rp->port_id,
-                                                 FC_FC_SEQ_INIT |
-                                                 FC_FC_END_SEQ))
-                               fc_ns_retry(lp);
-               } else {
-                       fc_ns_retry(lp);
-               }
-       } else {
-               fc_ns_enter_scr(lp);
-       }
-}
-
-/*
- * enter next state for handling an exchange reject or retry exhaustion
- * in the current state.
- */
-static void fc_ns_enter_reject(struct fc_lport *lp)
-{
-       switch (lp->state) {
-       case LPORT_ST_NONE:
-       case LPORT_ST_READY:
-       case LPORT_ST_RESET:
-       case LPORT_ST_FLOGI:
-       case LPORT_ST_LOGO:
-       case LPORT_ST_DNS:
-               WARN_ON(1);
-               break;
-       case LPORT_ST_REG_PN:
-               fc_ns_enter_reg_ft(lp);
-               break;
-       case LPORT_ST_REG_FT:
-               fc_ns_enter_scr(lp);
-               break;
-       case LPORT_ST_SCR:
-       case LPORT_ST_DNS_STOP:
-               lp->tt.disc_stop(lp);
-               break;
-       }
-}
-
-static void fc_ns_enter_retry(struct fc_lport *lp)
-{
-       switch (lp->state) {
-       case LPORT_ST_NONE:
-       case LPORT_ST_RESET:
-       case LPORT_ST_READY:
-       case LPORT_ST_FLOGI:
-       case LPORT_ST_LOGO:
-       case LPORT_ST_DNS:
-               WARN_ON(1);
-               break;
-       case LPORT_ST_DNS_STOP:
-               lp->tt.disc_stop(lp);
-               break;
-       case LPORT_ST_REG_PN:
-               fc_ns_enter_reg_pn(lp);
-               break;
-       case LPORT_ST_REG_FT:
-               fc_ns_enter_reg_ft(lp);
-               break;
-       case LPORT_ST_SCR:
-               fc_ns_enter_scr(lp);
-               break;
-       }
-}
-
 /*
  * Refresh target discovery, perhaps due to an RSCN.
  * A configurable delay is introduced to collect any subsequent RSCNs.
@@ -444,50 +275,6 @@ int fc_ns_disc_start(struct fc_lport *lp)
 }
 
 /*
- * Handle resource allocation problem by retrying in a bit.
- */
-static void fc_ns_retry(struct fc_lport *lp)
-{
-       if (lp->retry_count == 0)
-               FC_DBG("local port %6x alloc failure "
-                      "- will retry\n", lp->fid);
-       if (lp->retry_count < lp->max_retry_count) {
-               lp->retry_count++;
-               mod_timer(&lp->state_timer,
-                         jiffies + msecs_to_jiffies(lp->e_d_tov));
-       } else {
-               FC_DBG("local port %6x alloc failure "
-                      "- retries exhausted\n", lp->fid);
-               fc_ns_enter_reject(lp);
-       }
-}
-
-/*
- * Handle errors on local port requests.
- * Don't get locks if in RESET state.
- * The only possible errors so far are exchange TIMEOUT and CLOSED (reset).
- */
-static void fc_ns_error(struct fc_lport *lp, struct fc_frame *fp)
-{
-       if (lp->state == LPORT_ST_RESET)
-               return;
-
-       fc_lport_lock(lp);
-       if (PTR_ERR(fp) == -FC_EX_TIMEOUT) {
-               if (lp->retry_count < lp->max_retry_count) {
-                       lp->retry_count++;
-                       fc_ns_enter_retry(lp);
-               } else {
-                       fc_ns_enter_reject(lp);
-               }
-       }
-       if (fc_ns_debug)
-               FC_DBG("error %ld retries %d limit %d",
-                      PTR_ERR(fp), lp->retry_count, lp->max_retry_count);
-       fc_lport_unlock(lp);
-}
-
-/*
  * Restart discovery after a delay due to resource shortages.
  * If the error persists, the discovery will be abandoned.
  */
@@ -506,52 +293,6 @@ static void fcdt_ns_retry(struct fc_lport *lp)
 }
 
 /*
- * Test for dNS accept in response payload.
- */
-static int fc_lport_dns_acc(struct fc_frame *fp)
-{
-       struct fc_frame_header *fh;
-       struct fc_ct_hdr *ct;
-       int rc = 0;
-
-       fh = fc_frame_header_get(fp);
-       ct = fc_frame_payload_get(fp, sizeof(*ct));
-       if (fh && ct && fh->fh_type == FC_TYPE_CT &&
-           ct->ct_fs_type == FC_FST_DIR &&
-           ct->ct_fs_subtype == FC_NS_SUBTYPE &&
-           ntohs(ct->ct_cmd) == FC_FS_ACC) {
-               rc = 1;
-       }
-       return rc;
-}
-
-/*
- * Handle response from name server.
- */
-static void
-fc_ns_resp(struct fc_seq *sp, struct fc_frame *fp, void *lp_arg)
-{
-       struct fc_lport *lp = lp_arg;
-
-       if (!IS_ERR(fp)) {
-               fc_lport_lock(lp);
-               del_timer(&lp->state_timer);
-               if (fc_lport_dns_acc(fp)) {
-                       if (lp->state == LPORT_ST_REG_PN)
-                               fc_ns_enter_reg_ft(lp);
-                       else
-                               fc_ns_enter_scr(lp);
-
-               } else {
-                       fc_ns_retry(lp);
-               }
-               fc_lport_unlock(lp);
-               fc_frame_free(fp);
-       } else
-               fc_ns_error(lp, fp);
-}
-
-/*
  * Handle new target found by discovery.
  * Create remote port and session if needed.
  * Ignore returns of our own FID & WWPN.
@@ -1033,55 +774,6 @@ static void fc_ns_enter_dns_stop(struct fc_lport *lp)
                lp->tt.lport_logout(lp);
 }
 
-/*
- * Fill in dNS request header.
- */
-static void
-fc_lport_fill_dns_hdr(struct fc_lport *lp, struct fc_ct_hdr *ct,
-                     unsigned int op, unsigned int req_size)
-{
-       memset(ct, 0, sizeof(*ct) + req_size);
-       ct->ct_rev = FC_CT_REV;
-       ct->ct_fs_type = FC_FST_DIR;
-       ct->ct_fs_subtype = FC_NS_SUBTYPE;
-       ct->ct_cmd = htons(op);
-}
-
-/*
- * Register port name with name server.
- */
-static void fc_ns_enter_reg_pn(struct fc_lport *lp)
-{
-       struct fc_frame *fp;
-       struct req {
-               struct fc_ct_hdr ct;
-               struct fc_ns_rn_id rn;
-       } *req;
-
-       if (fc_ns_debug)
-               FC_DBG("Processing REG_PN state");
-
-       fc_lport_state_enter(lp, LPORT_ST_REG_PN);
-       fp = fc_frame_alloc(lp, sizeof(*req));
-       if (!fp) {
-               fc_ns_retry(lp);
-               return;
-       }
-       req = fc_frame_payload_get(fp, sizeof(*req));
-       memset(req, 0, sizeof(*req));
-       fc_lport_fill_dns_hdr(lp, &req->ct, FC_NS_RPN_ID, sizeof(req->rn));
-       hton24(req->rn.fr_fid.fp_fid, lp->fid);
-       put_unaligned_be64(lp->wwpn, &req->rn.fr_wwn);
-       fc_frame_setup(fp, FC_RCTL_DD_UNSOL_CTL, FC_TYPE_CT);
-       if (!lp->tt.exch_seq_send(lp, fp,
-                                 fc_ns_resp, lp,
-                                 lp->e_d_tov,
-                                 lp->fid,
-                                 lp->dns_rp->port_id,
-                                 FC_FC_SEQ_INIT | FC_FC_END_SEQ))
-               fc_ns_retry(lp);
-}
-
 int fc_ns_init(struct fc_lport *lp)
 {
        INIT_DELAYED_WORK(&lp->ns_disc_work, fc_ns_timeout);
@@ -1092,9 +784,6 @@ int fc_ns_init(struct fc_lport *lp)
        if (!lp->tt.disc_recv_req)
                lp->tt.disc_recv_req = fc_ns_recv_req;
 
-       if (!lp->tt.dns_register)
-               lp->tt.dns_register = fc_ns_enter_reg_pn;
-
        if (!lp->tt.disc_stop)
                lp->tt.disc_stop = fc_ns_enter_dns_stop;
 
diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c
index 7666d40..0d4550f 100644
--- a/drivers/scsi/libfc/fc_rport.c
+++ b/drivers/scsi/libfc/fc_rport.c
@@ -371,14 +371,18 @@ static void fc_rport_reject(struct fc_rport *rport)
                }
                break;
        case RPORT_ST_RTV:
+               /* 
+                * XXX- Does this case mean that the RTV failed, but
+                * we enter READY anyway?
+                */
                fc_rport_state_enter(rport, RPORT_ST_READY);
                if (fc_rp_debug)
                        FC_DBG("remote %6x ready", rport->port_id);
-               if (rport == lp->dns_rp &&
-                   lp->state == LPORT_ST_DNS) {
+
+               if (rport->port_id >= FC_FID_DOM_MGR) {
                        fc_lport_lock(lp);
                        del_timer(&lp->state_timer);
-                       lp->tt.dns_register(lp);
+                       lp->tt.lport_event_callback(lp, rport, 
LPORT_EV_RPORT_SUCCESS);
                        fc_lport_unlock(lp);
                }
                break;
@@ -795,11 +799,11 @@ static void fc_rport_rtv_resp(struct fc_seq *sp, struct 
fc_frame *fp,
        fc_rport_unlock(rport);
        if (fc_rp_debug)
                FC_DBG("remote %6x ready", rport->port_id);
-       if (rport == lp->dns_rp &&
-           lp->state == LPORT_ST_DNS) {
+
+       if (rport->port_id >= FC_FID_DOM_MGR) {
                fc_lport_lock(lp);
                del_timer(&lp->state_timer);
-               lp->tt.dns_register(lp);
+               lp->tt.lport_event_callback(lp, rport, LPORT_EV_RPORT_SUCCESS);
                fc_lport_unlock(lp);
        }
        fc_frame_free(fp);
@@ -1192,11 +1196,11 @@ static void fc_rport_recv_prli_req(struct fc_rport 
*rport,
                        fc_rport_state_enter(rport, RPORT_ST_READY);
                        if (fc_rp_debug)
                                FC_DBG("remote %6x ready", rport->port_id);
-                       if (rport == lp->dns_rp &&
-                           lp->state == LPORT_ST_DNS) {
+
+                       if (rport->port_id >= FC_FID_DOM_MGR) {
                                fc_lport_lock(lp);
                                del_timer(&lp->state_timer);
-                               lp->tt.dns_register(lp);
+                               lp->tt.lport_event_callback(lp, rport, 
LPORT_EV_RPORT_SUCCESS);
                                fc_lport_unlock(lp);
                        }
                        break;
diff --git a/include/scsi/libfc/libfc.h b/include/scsi/libfc/libfc.h
index 607a7f4..06553cd 100644
--- a/include/scsi/libfc/libfc.h
+++ b/include/scsi/libfc/libfc.h
@@ -394,7 +394,6 @@ struct libfc_function_template {
         */
        int (*disc_start)(struct fc_lport *);
 
-       void (*dns_register)(struct fc_lport *);
        void (*disc_stop)(struct fc_lport *);
 };
 

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

Reply via email to