Lines Matching refs:rdata
103 struct fc_rport_priv *rdata; in fc_rport_lookup() local
105 list_for_each_entry_rcu(rdata, &lport->disc.rports, peers) in fc_rport_lookup()
106 if (rdata->ids.port_id == port_id) in fc_rport_lookup()
107 return rdata; in fc_rport_lookup()
123 struct fc_rport_priv *rdata; in fc_rport_create() local
125 rdata = lport->tt.rport_lookup(lport, port_id); in fc_rport_create()
126 if (rdata) in fc_rport_create()
127 return rdata; in fc_rport_create()
129 rdata = kzalloc(sizeof(*rdata) + lport->rport_priv_size, GFP_KERNEL); in fc_rport_create()
130 if (!rdata) in fc_rport_create()
133 rdata->ids.node_name = -1; in fc_rport_create()
134 rdata->ids.port_name = -1; in fc_rport_create()
135 rdata->ids.port_id = port_id; in fc_rport_create()
136 rdata->ids.roles = FC_RPORT_ROLE_UNKNOWN; in fc_rport_create()
138 kref_init(&rdata->kref); in fc_rport_create()
139 mutex_init(&rdata->rp_mutex); in fc_rport_create()
140 rdata->local_port = lport; in fc_rport_create()
141 rdata->rp_state = RPORT_ST_INIT; in fc_rport_create()
142 rdata->event = RPORT_EV_NONE; in fc_rport_create()
143 rdata->flags = FC_RP_FLAGS_REC_SUPPORTED; in fc_rport_create()
144 rdata->e_d_tov = lport->e_d_tov; in fc_rport_create()
145 rdata->r_a_tov = lport->r_a_tov; in fc_rport_create()
146 rdata->maxframe_size = FC_MIN_MAX_PAYLOAD; in fc_rport_create()
147 INIT_DELAYED_WORK(&rdata->retry_work, fc_rport_timeout); in fc_rport_create()
148 INIT_WORK(&rdata->event_work, fc_rport_work); in fc_rport_create()
150 rdata->lld_event_callback = lport->tt.rport_event_callback; in fc_rport_create()
151 list_add_rcu(&rdata->peers, &lport->disc.rports); in fc_rport_create()
153 return rdata; in fc_rport_create()
162 struct fc_rport_priv *rdata; in fc_rport_destroy() local
164 rdata = container_of(kref, struct fc_rport_priv, kref); in fc_rport_destroy()
165 kfree_rcu(rdata, rcu); in fc_rport_destroy()
172 static const char *fc_rport_state(struct fc_rport_priv *rdata) in fc_rport_state() argument
176 cp = fc_rport_state_names[rdata->rp_state]; in fc_rport_state()
228 static void fc_rport_state_enter(struct fc_rport_priv *rdata, in fc_rport_state_enter() argument
231 if (rdata->rp_state != new) in fc_rport_state_enter()
232 rdata->retries = 0; in fc_rport_state_enter()
233 rdata->rp_state = new; in fc_rport_state_enter()
243 struct fc_rport_priv *rdata = in fc_rport_work() local
247 struct fc_lport *lport = rdata->local_port; in fc_rport_work()
254 mutex_lock(&rdata->rp_mutex); in fc_rport_work()
255 event = rdata->event; in fc_rport_work()
256 rport_ops = rdata->ops; in fc_rport_work()
257 rport = rdata->rport; in fc_rport_work()
259 FC_RPORT_DBG(rdata, "work event %u\n", event); in fc_rport_work()
263 ids = rdata->ids; in fc_rport_work()
264 rdata->event = RPORT_EV_NONE; in fc_rport_work()
265 rdata->major_retries = 0; in fc_rport_work()
266 kref_get(&rdata->kref); in fc_rport_work()
267 mutex_unlock(&rdata->rp_mutex); in fc_rport_work()
272 FC_RPORT_DBG(rdata, "Failed to add the rport\n"); in fc_rport_work()
273 lport->tt.rport_logoff(rdata); in fc_rport_work()
274 kref_put(&rdata->kref, lport->tt.rport_destroy); in fc_rport_work()
277 mutex_lock(&rdata->rp_mutex); in fc_rport_work()
278 if (rdata->rport) in fc_rport_work()
279 FC_RPORT_DBG(rdata, "rport already allocated\n"); in fc_rport_work()
280 rdata->rport = rport; in fc_rport_work()
281 rport->maxframe_size = rdata->maxframe_size; in fc_rport_work()
282 rport->supported_classes = rdata->supported_classes; in fc_rport_work()
286 rpriv->rp_state = rdata->rp_state; in fc_rport_work()
287 rpriv->flags = rdata->flags; in fc_rport_work()
288 rpriv->e_d_tov = rdata->e_d_tov; in fc_rport_work()
289 rpriv->r_a_tov = rdata->r_a_tov; in fc_rport_work()
290 mutex_unlock(&rdata->rp_mutex); in fc_rport_work()
293 FC_RPORT_DBG(rdata, "callback ev %d\n", event); in fc_rport_work()
294 rport_ops->event_callback(lport, rdata, event); in fc_rport_work()
296 if (rdata->lld_event_callback) { in fc_rport_work()
297 FC_RPORT_DBG(rdata, "lld callback ev %d\n", event); in fc_rport_work()
298 rdata->lld_event_callback(lport, rdata, event); in fc_rport_work()
300 kref_put(&rdata->kref, lport->tt.rport_destroy); in fc_rport_work()
306 if (rdata->prli_count) { in fc_rport_work()
311 prov->prlo(rdata); in fc_rport_work()
315 port_id = rdata->ids.port_id; in fc_rport_work()
316 mutex_unlock(&rdata->rp_mutex); in fc_rport_work()
319 FC_RPORT_DBG(rdata, "callback ev %d\n", event); in fc_rport_work()
320 rport_ops->event_callback(lport, rdata, event); in fc_rport_work()
322 if (rdata->lld_event_callback) { in fc_rport_work()
323 FC_RPORT_DBG(rdata, "lld callback ev %d\n", event); in fc_rport_work()
324 rdata->lld_event_callback(lport, rdata, event); in fc_rport_work()
326 cancel_delayed_work_sync(&rdata->retry_work); in fc_rport_work()
337 mutex_lock(&rdata->rp_mutex); in fc_rport_work()
338 rdata->rport = NULL; in fc_rport_work()
339 mutex_unlock(&rdata->rp_mutex); in fc_rport_work()
344 mutex_lock(&rdata->rp_mutex); in fc_rport_work()
345 if (rdata->rp_state == RPORT_ST_DELETE) { in fc_rport_work()
347 rdata->event = RPORT_EV_NONE; in fc_rport_work()
348 mutex_unlock(&rdata->rp_mutex); in fc_rport_work()
349 kref_put(&rdata->kref, lport->tt.rport_destroy); in fc_rport_work()
350 } else if ((rdata->flags & FC_RP_STARTED) && in fc_rport_work()
351 rdata->major_retries < in fc_rport_work()
353 rdata->major_retries++; in fc_rport_work()
354 rdata->event = RPORT_EV_NONE; in fc_rport_work()
355 FC_RPORT_DBG(rdata, "work restart\n"); in fc_rport_work()
356 fc_rport_enter_flogi(rdata); in fc_rport_work()
357 mutex_unlock(&rdata->rp_mutex); in fc_rport_work()
359 FC_RPORT_DBG(rdata, "work delete\n"); in fc_rport_work()
360 list_del_rcu(&rdata->peers); in fc_rport_work()
361 mutex_unlock(&rdata->rp_mutex); in fc_rport_work()
362 kref_put(&rdata->kref, lport->tt.rport_destroy); in fc_rport_work()
368 rdata->event = RPORT_EV_NONE; in fc_rport_work()
369 if (rdata->rp_state == RPORT_ST_READY) in fc_rport_work()
370 fc_rport_enter_ready(rdata); in fc_rport_work()
371 mutex_unlock(&rdata->rp_mutex); in fc_rport_work()
377 mutex_unlock(&rdata->rp_mutex); in fc_rport_work()
394 static int fc_rport_login(struct fc_rport_priv *rdata) in fc_rport_login() argument
396 mutex_lock(&rdata->rp_mutex); in fc_rport_login()
398 rdata->flags |= FC_RP_STARTED; in fc_rport_login()
399 switch (rdata->rp_state) { in fc_rport_login()
401 FC_RPORT_DBG(rdata, "ADISC port\n"); in fc_rport_login()
402 fc_rport_enter_adisc(rdata); in fc_rport_login()
405 FC_RPORT_DBG(rdata, "Restart deleted port\n"); in fc_rport_login()
408 FC_RPORT_DBG(rdata, "Login to port\n"); in fc_rport_login()
409 fc_rport_enter_flogi(rdata); in fc_rport_login()
412 mutex_unlock(&rdata->rp_mutex); in fc_rport_login()
431 static void fc_rport_enter_delete(struct fc_rport_priv *rdata, in fc_rport_enter_delete() argument
434 if (rdata->rp_state == RPORT_ST_DELETE) in fc_rport_enter_delete()
437 FC_RPORT_DBG(rdata, "Delete port\n"); in fc_rport_enter_delete()
439 fc_rport_state_enter(rdata, RPORT_ST_DELETE); in fc_rport_enter_delete()
441 if (rdata->event == RPORT_EV_NONE) in fc_rport_enter_delete()
442 queue_work(rport_event_queue, &rdata->event_work); in fc_rport_enter_delete()
443 rdata->event = event; in fc_rport_enter_delete()
454 static int fc_rport_logoff(struct fc_rport_priv *rdata) in fc_rport_logoff() argument
456 mutex_lock(&rdata->rp_mutex); in fc_rport_logoff()
458 FC_RPORT_DBG(rdata, "Remove port\n"); in fc_rport_logoff()
460 rdata->flags &= ~FC_RP_STARTED; in fc_rport_logoff()
461 if (rdata->rp_state == RPORT_ST_DELETE) { in fc_rport_logoff()
462 FC_RPORT_DBG(rdata, "Port in Delete state, not removing\n"); in fc_rport_logoff()
465 fc_rport_enter_logo(rdata); in fc_rport_logoff()
471 fc_rport_enter_delete(rdata, RPORT_EV_STOP); in fc_rport_logoff()
473 mutex_unlock(&rdata->rp_mutex); in fc_rport_logoff()
484 static void fc_rport_enter_ready(struct fc_rport_priv *rdata) in fc_rport_enter_ready() argument
486 fc_rport_state_enter(rdata, RPORT_ST_READY); in fc_rport_enter_ready()
488 FC_RPORT_DBG(rdata, "Port is Ready\n"); in fc_rport_enter_ready()
490 if (rdata->event == RPORT_EV_NONE) in fc_rport_enter_ready()
491 queue_work(rport_event_queue, &rdata->event_work); in fc_rport_enter_ready()
492 rdata->event = RPORT_EV_READY; in fc_rport_enter_ready()
505 struct fc_rport_priv *rdata = in fc_rport_timeout() local
508 mutex_lock(&rdata->rp_mutex); in fc_rport_timeout()
510 switch (rdata->rp_state) { in fc_rport_timeout()
512 fc_rport_enter_flogi(rdata); in fc_rport_timeout()
515 fc_rport_enter_plogi(rdata); in fc_rport_timeout()
518 fc_rport_enter_prli(rdata); in fc_rport_timeout()
521 fc_rport_enter_rtv(rdata); in fc_rport_timeout()
524 fc_rport_enter_adisc(rdata); in fc_rport_timeout()
533 mutex_unlock(&rdata->rp_mutex); in fc_rport_timeout()
544 static void fc_rport_error(struct fc_rport_priv *rdata, struct fc_frame *fp) in fc_rport_error() argument
546 FC_RPORT_DBG(rdata, "Error %ld in state %s, retries %d\n", in fc_rport_error()
548 fc_rport_state(rdata), rdata->retries); in fc_rport_error()
550 switch (rdata->rp_state) { in fc_rport_error()
553 rdata->flags &= ~FC_RP_STARTED; in fc_rport_error()
554 fc_rport_enter_delete(rdata, RPORT_EV_FAILED); in fc_rport_error()
557 fc_rport_enter_ready(rdata); in fc_rport_error()
561 fc_rport_enter_logo(rdata); in fc_rport_error()
582 static void fc_rport_error_retry(struct fc_rport_priv *rdata, in fc_rport_error_retry() argument
591 if (rdata->retries < rdata->local_port->max_rport_retry_count) { in fc_rport_error_retry()
592 FC_RPORT_DBG(rdata, "Error %ld in state %s, retrying\n", in fc_rport_error_retry()
593 PTR_ERR(fp), fc_rport_state(rdata)); in fc_rport_error_retry()
594 rdata->retries++; in fc_rport_error_retry()
598 schedule_delayed_work(&rdata->retry_work, delay); in fc_rport_error_retry()
603 fc_rport_error(rdata, fp); in fc_rport_error_retry()
616 static int fc_rport_login_complete(struct fc_rport_priv *rdata, in fc_rport_login_complete() argument
619 struct fc_lport *lport = rdata->local_port; in fc_rport_login_complete()
632 FC_RPORT_DBG(rdata, "Fabric bit set in FLOGI\n"); in fc_rport_login_complete()
643 if (e_d_tov > rdata->e_d_tov) in fc_rport_login_complete()
644 rdata->e_d_tov = e_d_tov; in fc_rport_login_complete()
646 rdata->maxframe_size = fc_plogi_get_maxframe(flogi, lport->mfs); in fc_rport_login_complete()
659 struct fc_rport_priv *rdata = rp_arg; in fc_rport_flogi_resp() local
660 struct fc_lport *lport = rdata->local_port; in fc_rport_flogi_resp()
664 FC_RPORT_DBG(rdata, "Received a FLOGI %s\n", fc_els_resp_type(fp)); in fc_rport_flogi_resp()
669 mutex_lock(&rdata->rp_mutex); in fc_rport_flogi_resp()
671 if (rdata->rp_state != RPORT_ST_FLOGI) { in fc_rport_flogi_resp()
672 FC_RPORT_DBG(rdata, "Received a FLOGI response, but in state " in fc_rport_flogi_resp()
673 "%s\n", fc_rport_state(rdata)); in fc_rport_flogi_resp()
680 fc_rport_error(rdata, fp); in fc_rport_flogi_resp()
686 if (fc_rport_login_complete(rdata, fp)) in fc_rport_flogi_resp()
693 if (r_a_tov > rdata->r_a_tov) in fc_rport_flogi_resp()
694 rdata->r_a_tov = r_a_tov; in fc_rport_flogi_resp()
696 if (rdata->ids.port_name < lport->wwpn) in fc_rport_flogi_resp()
697 fc_rport_enter_plogi(rdata); in fc_rport_flogi_resp()
699 fc_rport_state_enter(rdata, RPORT_ST_PLOGI_WAIT); in fc_rport_flogi_resp()
703 mutex_unlock(&rdata->rp_mutex); in fc_rport_flogi_resp()
705 kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy); in fc_rport_flogi_resp()
708 FC_RPORT_DBG(rdata, "Bad FLOGI response\n"); in fc_rport_flogi_resp()
709 fc_rport_error_retry(rdata, fp); in fc_rport_flogi_resp()
720 static void fc_rport_enter_flogi(struct fc_rport_priv *rdata) in fc_rport_enter_flogi() argument
722 struct fc_lport *lport = rdata->local_port; in fc_rport_enter_flogi()
726 return fc_rport_enter_plogi(rdata); in fc_rport_enter_flogi()
728 FC_RPORT_DBG(rdata, "Entered FLOGI state from %s state\n", in fc_rport_enter_flogi()
729 fc_rport_state(rdata)); in fc_rport_enter_flogi()
731 fc_rport_state_enter(rdata, RPORT_ST_FLOGI); in fc_rport_enter_flogi()
735 return fc_rport_error_retry(rdata, fp); in fc_rport_enter_flogi()
737 if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_FLOGI, in fc_rport_enter_flogi()
738 fc_rport_flogi_resp, rdata, in fc_rport_enter_flogi()
740 fc_rport_error_retry(rdata, NULL); in fc_rport_enter_flogi()
742 kref_get(&rdata->kref); in fc_rport_enter_flogi()
755 struct fc_rport_priv *rdata; in fc_rport_recv_flogi_req() local
780 rdata = lport->tt.rport_lookup(lport, sid); in fc_rport_recv_flogi_req()
781 if (!rdata) { in fc_rport_recv_flogi_req()
786 mutex_lock(&rdata->rp_mutex); in fc_rport_recv_flogi_req()
788 FC_RPORT_DBG(rdata, "Received FLOGI in %s state\n", in fc_rport_recv_flogi_req()
789 fc_rport_state(rdata)); in fc_rport_recv_flogi_req()
791 switch (rdata->rp_state) { in fc_rport_recv_flogi_req()
808 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_flogi_req()
824 fc_rport_enter_delete(rdata, RPORT_EV_LOGO); in fc_rport_recv_flogi_req()
825 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_flogi_req()
830 if (fc_rport_login_complete(rdata, fp)) { in fc_rport_recv_flogi_req()
831 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_flogi_req()
848 if (rdata->ids.port_name < lport->wwpn) in fc_rport_recv_flogi_req()
849 fc_rport_enter_plogi(rdata); in fc_rport_recv_flogi_req()
851 fc_rport_state_enter(rdata, RPORT_ST_PLOGI_WAIT); in fc_rport_recv_flogi_req()
853 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_flogi_req()
877 struct fc_rport_priv *rdata = rdata_arg; in fc_rport_plogi_resp() local
878 struct fc_lport *lport = rdata->local_port; in fc_rport_plogi_resp()
884 mutex_lock(&rdata->rp_mutex); in fc_rport_plogi_resp()
886 FC_RPORT_DBG(rdata, "Received a PLOGI %s\n", fc_els_resp_type(fp)); in fc_rport_plogi_resp()
888 if (rdata->rp_state != RPORT_ST_PLOGI) { in fc_rport_plogi_resp()
889 FC_RPORT_DBG(rdata, "Received a PLOGI response, but in state " in fc_rport_plogi_resp()
890 "%s\n", fc_rport_state(rdata)); in fc_rport_plogi_resp()
897 fc_rport_error_retry(rdata, fp); in fc_rport_plogi_resp()
904 rdata->ids.port_name = get_unaligned_be64(&plp->fl_wwpn); in fc_rport_plogi_resp()
905 rdata->ids.node_name = get_unaligned_be64(&plp->fl_wwnn); in fc_rport_plogi_resp()
908 rdata->sp_features = ntohs(plp->fl_csp.sp_features); in fc_rport_plogi_resp()
911 fc_rport_login_complete(rdata, fp); in fc_rport_plogi_resp()
916 rdata->max_seq = csp_seq; in fc_rport_plogi_resp()
917 rdata->maxframe_size = fc_plogi_get_maxframe(plp, lport->mfs); in fc_rport_plogi_resp()
918 fc_rport_enter_prli(rdata); in fc_rport_plogi_resp()
920 fc_rport_error_retry(rdata, fp); in fc_rport_plogi_resp()
925 mutex_unlock(&rdata->rp_mutex); in fc_rport_plogi_resp()
926 kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy); in fc_rport_plogi_resp()
930 fc_rport_compatible_roles(struct fc_lport *lport, struct fc_rport_priv *rdata) in fc_rport_compatible_roles() argument
932 if (rdata->ids.roles == FC_PORT_ROLE_UNKNOWN) in fc_rport_compatible_roles()
934 if ((rdata->ids.roles & FC_PORT_ROLE_FCP_TARGET) && in fc_rport_compatible_roles()
937 if ((rdata->ids.roles & FC_PORT_ROLE_FCP_INITIATOR) && in fc_rport_compatible_roles()
950 static void fc_rport_enter_plogi(struct fc_rport_priv *rdata) in fc_rport_enter_plogi() argument
952 struct fc_lport *lport = rdata->local_port; in fc_rport_enter_plogi()
955 if (!fc_rport_compatible_roles(lport, rdata)) { in fc_rport_enter_plogi()
956 FC_RPORT_DBG(rdata, "PLOGI suppressed for incompatible role\n"); in fc_rport_enter_plogi()
957 fc_rport_state_enter(rdata, RPORT_ST_PLOGI_WAIT); in fc_rport_enter_plogi()
961 FC_RPORT_DBG(rdata, "Port entered PLOGI state from %s state\n", in fc_rport_enter_plogi()
962 fc_rport_state(rdata)); in fc_rport_enter_plogi()
964 fc_rport_state_enter(rdata, RPORT_ST_PLOGI); in fc_rport_enter_plogi()
966 rdata->maxframe_size = FC_MIN_MAX_PAYLOAD; in fc_rport_enter_plogi()
969 FC_RPORT_DBG(rdata, "%s frame alloc failed\n", __func__); in fc_rport_enter_plogi()
970 fc_rport_error_retry(rdata, fp); in fc_rport_enter_plogi()
973 rdata->e_d_tov = lport->e_d_tov; in fc_rport_enter_plogi()
975 if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_PLOGI, in fc_rport_enter_plogi()
976 fc_rport_plogi_resp, rdata, in fc_rport_enter_plogi()
978 fc_rport_error_retry(rdata, NULL); in fc_rport_enter_plogi()
980 kref_get(&rdata->kref); in fc_rport_enter_plogi()
996 struct fc_rport_priv *rdata = rdata_arg; in fc_rport_prli_resp() local
1008 mutex_lock(&rdata->rp_mutex); in fc_rport_prli_resp()
1010 FC_RPORT_DBG(rdata, "Received a PRLI %s\n", fc_els_resp_type(fp)); in fc_rport_prli_resp()
1012 if (rdata->rp_state != RPORT_ST_PRLI) { in fc_rport_prli_resp()
1013 FC_RPORT_DBG(rdata, "Received a PRLI response, but in state " in fc_rport_prli_resp()
1014 "%s\n", fc_rport_state(rdata)); in fc_rport_prli_resp()
1021 fc_rport_error_retry(rdata, fp); in fc_rport_prli_resp()
1026 rdata->ids.roles = FC_RPORT_ROLE_UNKNOWN; in fc_rport_prli_resp()
1035 FC_RPORT_DBG(rdata, "PRLI spp_flags = 0x%x\n", in fc_rport_prli_resp()
1037 rdata->spp_type = pp->spp.spp_type; in fc_rport_prli_resp()
1040 fc_rport_error(rdata, fp); in fc_rport_prli_resp()
1042 fc_rport_error_retry(rdata, fp); in fc_rport_prli_resp()
1050 rdata->flags |= FC_RP_FLAGS_RETRY; in fc_rport_prli_resp()
1052 rdata->flags |= FC_RP_FLAGS_CONF_REQ; in fc_rport_prli_resp()
1057 prov->prli(rdata, pp->prli.prli_spp_len, in fc_rport_prli_resp()
1061 rdata->supported_classes = FC_COS_CLASS3; in fc_rport_prli_resp()
1067 rdata->ids.roles = roles; in fc_rport_prli_resp()
1068 fc_rport_enter_rtv(rdata); in fc_rport_prli_resp()
1071 FC_RPORT_DBG(rdata, "Bad ELS response for PRLI command\n"); in fc_rport_prli_resp()
1072 fc_rport_error_retry(rdata, fp); in fc_rport_prli_resp()
1078 mutex_unlock(&rdata->rp_mutex); in fc_rport_prli_resp()
1079 kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy); in fc_rport_prli_resp()
1089 static void fc_rport_enter_prli(struct fc_rport_priv *rdata) in fc_rport_enter_prli() argument
1091 struct fc_lport *lport = rdata->local_port; in fc_rport_enter_prli()
1103 if (rdata->ids.port_id >= FC_FID_DOM_MGR) { in fc_rport_enter_prli()
1104 fc_rport_enter_ready(rdata); in fc_rport_enter_prli()
1108 FC_RPORT_DBG(rdata, "Port entered PRLI state from %s state\n", in fc_rport_enter_prli()
1109 fc_rport_state(rdata)); in fc_rport_enter_prli()
1111 fc_rport_state_enter(rdata, RPORT_ST_PRLI); in fc_rport_enter_prli()
1115 fc_rport_error_retry(rdata, fp); in fc_rport_enter_prli()
1124 prov->prli(rdata, sizeof(pp->spp), NULL, &pp->spp); in fc_rport_enter_prli()
1127 fc_fill_fc_hdr(fp, FC_RCTL_ELS_REQ, rdata->ids.port_id, in fc_rport_enter_prli()
1132 NULL, rdata, 2 * lport->r_a_tov)) in fc_rport_enter_prli()
1133 fc_rport_error_retry(rdata, NULL); in fc_rport_enter_prli()
1135 kref_get(&rdata->kref); in fc_rport_enter_prli()
1153 struct fc_rport_priv *rdata = rdata_arg; in fc_rport_rtv_resp() local
1156 mutex_lock(&rdata->rp_mutex); in fc_rport_rtv_resp()
1158 FC_RPORT_DBG(rdata, "Received a RTV %s\n", fc_els_resp_type(fp)); in fc_rport_rtv_resp()
1160 if (rdata->rp_state != RPORT_ST_RTV) { in fc_rport_rtv_resp()
1161 FC_RPORT_DBG(rdata, "Received a RTV response, but in state " in fc_rport_rtv_resp()
1162 "%s\n", fc_rport_state(rdata)); in fc_rport_rtv_resp()
1169 fc_rport_error(rdata, fp); in fc_rport_rtv_resp()
1185 rdata->r_a_tov = tov; in fc_rport_rtv_resp()
1191 rdata->e_d_tov = tov; in fc_rport_rtv_resp()
1195 fc_rport_enter_ready(rdata); in fc_rport_rtv_resp()
1200 mutex_unlock(&rdata->rp_mutex); in fc_rport_rtv_resp()
1201 kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy); in fc_rport_rtv_resp()
1211 static void fc_rport_enter_rtv(struct fc_rport_priv *rdata) in fc_rport_enter_rtv() argument
1214 struct fc_lport *lport = rdata->local_port; in fc_rport_enter_rtv()
1216 FC_RPORT_DBG(rdata, "Port entered RTV state from %s state\n", in fc_rport_enter_rtv()
1217 fc_rport_state(rdata)); in fc_rport_enter_rtv()
1219 fc_rport_state_enter(rdata, RPORT_ST_RTV); in fc_rport_enter_rtv()
1223 fc_rport_error_retry(rdata, fp); in fc_rport_enter_rtv()
1227 if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_RTV, in fc_rport_enter_rtv()
1228 fc_rport_rtv_resp, rdata, in fc_rport_enter_rtv()
1230 fc_rport_error_retry(rdata, NULL); in fc_rport_enter_rtv()
1232 kref_get(&rdata->kref); in fc_rport_enter_rtv()
1260 static void fc_rport_enter_logo(struct fc_rport_priv *rdata) in fc_rport_enter_logo() argument
1262 struct fc_lport *lport = rdata->local_port; in fc_rport_enter_logo()
1265 FC_RPORT_DBG(rdata, "Port sending LOGO from %s state\n", in fc_rport_enter_logo()
1266 fc_rport_state(rdata)); in fc_rport_enter_logo()
1271 (void)lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_LOGO, in fc_rport_enter_logo()
1288 struct fc_rport_priv *rdata = rdata_arg; in fc_rport_adisc_resp() local
1292 mutex_lock(&rdata->rp_mutex); in fc_rport_adisc_resp()
1294 FC_RPORT_DBG(rdata, "Received a ADISC response\n"); in fc_rport_adisc_resp()
1296 if (rdata->rp_state != RPORT_ST_ADISC) { in fc_rport_adisc_resp()
1297 FC_RPORT_DBG(rdata, "Received a ADISC resp but in state %s\n", in fc_rport_adisc_resp()
1298 fc_rport_state(rdata)); in fc_rport_adisc_resp()
1305 fc_rport_error(rdata, fp); in fc_rport_adisc_resp()
1317 ntoh24(adisc->adisc_port_id) != rdata->ids.port_id || in fc_rport_adisc_resp()
1318 get_unaligned_be64(&adisc->adisc_wwpn) != rdata->ids.port_name || in fc_rport_adisc_resp()
1319 get_unaligned_be64(&adisc->adisc_wwnn) != rdata->ids.node_name) { in fc_rport_adisc_resp()
1320 FC_RPORT_DBG(rdata, "ADISC error or mismatch\n"); in fc_rport_adisc_resp()
1321 fc_rport_enter_flogi(rdata); in fc_rport_adisc_resp()
1323 FC_RPORT_DBG(rdata, "ADISC OK\n"); in fc_rport_adisc_resp()
1324 fc_rport_enter_ready(rdata); in fc_rport_adisc_resp()
1329 mutex_unlock(&rdata->rp_mutex); in fc_rport_adisc_resp()
1330 kref_put(&rdata->kref, rdata->local_port->tt.rport_destroy); in fc_rport_adisc_resp()
1340 static void fc_rport_enter_adisc(struct fc_rport_priv *rdata) in fc_rport_enter_adisc() argument
1342 struct fc_lport *lport = rdata->local_port; in fc_rport_enter_adisc()
1345 FC_RPORT_DBG(rdata, "sending ADISC from %s state\n", in fc_rport_enter_adisc()
1346 fc_rport_state(rdata)); in fc_rport_enter_adisc()
1348 fc_rport_state_enter(rdata, RPORT_ST_ADISC); in fc_rport_enter_adisc()
1352 fc_rport_error_retry(rdata, fp); in fc_rport_enter_adisc()
1355 if (!lport->tt.elsct_send(lport, rdata->ids.port_id, fp, ELS_ADISC, in fc_rport_enter_adisc()
1356 fc_rport_adisc_resp, rdata, in fc_rport_enter_adisc()
1358 fc_rport_error_retry(rdata, NULL); in fc_rport_enter_adisc()
1360 kref_get(&rdata->kref); in fc_rport_enter_adisc()
1370 static void fc_rport_recv_adisc_req(struct fc_rport_priv *rdata, in fc_rport_recv_adisc_req() argument
1373 struct fc_lport *lport = rdata->local_port; in fc_rport_recv_adisc_req()
1378 FC_RPORT_DBG(rdata, "Received ADISC request\n"); in fc_rport_recv_adisc_req()
1408 static void fc_rport_recv_rls_req(struct fc_rport_priv *rdata, in fc_rport_recv_rls_req() argument
1412 struct fc_lport *lport = rdata->local_port; in fc_rport_recv_rls_req()
1420 FC_RPORT_DBG(rdata, "Received RLS request while in state %s\n", in fc_rport_recv_rls_req()
1421 fc_rport_state(rdata)); in fc_rport_recv_rls_req()
1477 struct fc_rport_priv *rdata; in fc_rport_recv_els_req() local
1481 rdata = lport->tt.rport_lookup(lport, fc_frame_sid(fp)); in fc_rport_recv_els_req()
1482 if (!rdata) { in fc_rport_recv_els_req()
1486 mutex_lock(&rdata->rp_mutex); in fc_rport_recv_els_req()
1489 switch (rdata->rp_state) { in fc_rport_recv_els_req()
1496 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_els_req()
1502 fc_rport_recv_prli_req(rdata, fp); in fc_rport_recv_els_req()
1505 fc_rport_recv_prlo_req(rdata, fp); in fc_rport_recv_els_req()
1508 fc_rport_recv_adisc_req(rdata, fp); in fc_rport_recv_els_req()
1519 fc_rport_recv_rls_req(rdata, fp); in fc_rport_recv_els_req()
1526 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_els_req()
1591 struct fc_rport_priv *rdata; in fc_rport_recv_plogi_req() local
1611 rdata = lport->tt.rport_create(lport, sid); in fc_rport_recv_plogi_req()
1612 if (!rdata) { in fc_rport_recv_plogi_req()
1619 mutex_lock(&rdata->rp_mutex); in fc_rport_recv_plogi_req()
1622 rdata->ids.port_name = get_unaligned_be64(&pl->fl_wwpn); in fc_rport_recv_plogi_req()
1623 rdata->ids.node_name = get_unaligned_be64(&pl->fl_wwnn); in fc_rport_recv_plogi_req()
1636 switch (rdata->rp_state) { in fc_rport_recv_plogi_req()
1638 FC_RPORT_DBG(rdata, "Received PLOGI in INIT state\n"); in fc_rport_recv_plogi_req()
1641 FC_RPORT_DBG(rdata, "Received PLOGI in PLOGI_WAIT state\n"); in fc_rport_recv_plogi_req()
1644 FC_RPORT_DBG(rdata, "Received PLOGI in PLOGI state\n"); in fc_rport_recv_plogi_req()
1645 if (rdata->ids.port_name < lport->wwpn) { in fc_rport_recv_plogi_req()
1646 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_plogi_req()
1656 FC_RPORT_DBG(rdata, "Received PLOGI in logged-in state %d " in fc_rport_recv_plogi_req()
1657 "- ignored for now\n", rdata->rp_state); in fc_rport_recv_plogi_req()
1662 FC_RPORT_DBG(rdata, "Received PLOGI in state %s - send busy\n", in fc_rport_recv_plogi_req()
1663 fc_rport_state(rdata)); in fc_rport_recv_plogi_req()
1664 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_plogi_req()
1669 if (!fc_rport_compatible_roles(lport, rdata)) { in fc_rport_recv_plogi_req()
1670 FC_RPORT_DBG(rdata, "Received PLOGI for incompatible role\n"); in fc_rport_recv_plogi_req()
1671 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_plogi_req()
1680 rdata->maxframe_size = fc_plogi_get_maxframe(pl, lport->mfs); in fc_rport_recv_plogi_req()
1692 fc_rport_enter_prli(rdata); in fc_rport_recv_plogi_req()
1694 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_plogi_req()
1711 static void fc_rport_recv_prli_req(struct fc_rport_priv *rdata, in fc_rport_recv_prli_req() argument
1714 struct fc_lport *lport = rdata->local_port; in fc_rport_recv_prli_req()
1729 FC_RPORT_DBG(rdata, "Received PRLI request while in state %s\n", in fc_rport_recv_prli_req()
1730 fc_rport_state(rdata)); in fc_rport_recv_prli_req()
1769 rdata->spp_type = rspp->spp_type; in fc_rport_recv_prli_req()
1777 resp = prov->prli(rdata, plen, rspp, spp); in fc_rport_recv_prli_req()
1780 passive = prov->prli(rdata, plen, rspp, spp); in fc_rport_recv_prli_req()
1804 switch (rdata->rp_state) { in fc_rport_recv_prli_req()
1806 fc_rport_enter_ready(rdata); in fc_rport_recv_prli_req()
1830 static void fc_rport_recv_prlo_req(struct fc_rport_priv *rdata, in fc_rport_recv_prlo_req() argument
1833 struct fc_lport *lport = rdata->local_port; in fc_rport_recv_prlo_req()
1845 FC_RPORT_DBG(rdata, "Received PRLO request while in state %s\n", in fc_rport_recv_prlo_req()
1846 fc_rport_state(rdata)); in fc_rport_recv_prlo_req()
1878 fc_rport_enter_delete(rdata, RPORT_EV_LOGO); in fc_rport_recv_prlo_req()
1903 struct fc_rport_priv *rdata; in fc_rport_recv_logo_req() local
1911 rdata = lport->tt.rport_lookup(lport, sid); in fc_rport_recv_logo_req()
1912 if (rdata) { in fc_rport_recv_logo_req()
1913 mutex_lock(&rdata->rp_mutex); in fc_rport_recv_logo_req()
1914 FC_RPORT_DBG(rdata, "Received LOGO request while in state %s\n", in fc_rport_recv_logo_req()
1915 fc_rport_state(rdata)); in fc_rport_recv_logo_req()
1917 fc_rport_enter_delete(rdata, RPORT_EV_LOGO); in fc_rport_recv_logo_req()
1918 mutex_unlock(&rdata->rp_mutex); in fc_rport_recv_logo_req()
1975 static int fc_rport_fcp_prli(struct fc_rport_priv *rdata, u32 spp_len, in fc_rport_fcp_prli() argument
1979 struct fc_lport *lport = rdata->local_port; in fc_rport_fcp_prli()
1983 rdata->ids.roles = FC_RPORT_ROLE_UNKNOWN; in fc_rport_fcp_prli()
1985 rdata->ids.roles |= FC_RPORT_ROLE_FCP_INITIATOR; in fc_rport_fcp_prli()
1987 rdata->ids.roles |= FC_RPORT_ROLE_FCP_TARGET; in fc_rport_fcp_prli()
1989 rdata->flags |= FC_RP_FLAGS_RETRY; in fc_rport_fcp_prli()
1990 rdata->supported_classes = FC_COS_CLASS3; in fc_rport_fcp_prli()
2019 static int fc_rport_t0_prli(struct fc_rport_priv *rdata, u32 spp_len, in fc_rport_t0_prli() argument