Lines Matching refs:lport

119 static void fc_lport_enter_fdmi(struct fc_lport *lport);
153 struct fc_lport *lport; member
165 static int fc_frame_drop(struct fc_lport *lport, struct fc_frame *fp) in fc_frame_drop() argument
180 static void fc_lport_rport_callback(struct fc_lport *lport, in fc_lport_rport_callback() argument
184 FC_LPORT_DBG(lport, "Received a %d event for port (%6.6x)\n", event, in fc_lport_rport_callback()
187 mutex_lock(&lport->lp_mutex); in fc_lport_rport_callback()
190 if (lport->state == LPORT_ST_DNS) { in fc_lport_rport_callback()
191 lport->dns_rdata = rdata; in fc_lport_rport_callback()
192 fc_lport_enter_ns(lport, LPORT_ST_RNN_ID); in fc_lport_rport_callback()
193 } else if (lport->state == LPORT_ST_FDMI) { in fc_lport_rport_callback()
194 lport->ms_rdata = rdata; in fc_lport_rport_callback()
195 fc_lport_enter_ms(lport, LPORT_ST_DHBA); in fc_lport_rport_callback()
197 FC_LPORT_DBG(lport, "Received an READY event " in fc_lport_rport_callback()
202 lport->state); in fc_lport_rport_callback()
203 lport->tt.rport_logoff(rdata); in fc_lport_rport_callback()
210 lport->dns_rdata = NULL; in fc_lport_rport_callback()
212 lport->ms_rdata = NULL; in fc_lport_rport_callback()
217 mutex_unlock(&lport->lp_mutex); in fc_lport_rport_callback()
224 static const char *fc_lport_state(struct fc_lport *lport) in fc_lport_state() argument
228 cp = fc_lport_state_names[lport->state]; in fc_lport_state()
241 static void fc_lport_ptp_setup(struct fc_lport *lport, in fc_lport_ptp_setup() argument
245 mutex_lock(&lport->disc.disc_mutex); in fc_lport_ptp_setup()
246 if (lport->ptp_rdata) { in fc_lport_ptp_setup()
247 lport->tt.rport_logoff(lport->ptp_rdata); in fc_lport_ptp_setup()
248 kref_put(&lport->ptp_rdata->kref, lport->tt.rport_destroy); in fc_lport_ptp_setup()
250 lport->ptp_rdata = lport->tt.rport_create(lport, remote_fid); in fc_lport_ptp_setup()
251 kref_get(&lport->ptp_rdata->kref); in fc_lport_ptp_setup()
252 lport->ptp_rdata->ids.port_name = remote_wwpn; in fc_lport_ptp_setup()
253 lport->ptp_rdata->ids.node_name = remote_wwnn; in fc_lport_ptp_setup()
254 mutex_unlock(&lport->disc.disc_mutex); in fc_lport_ptp_setup()
256 lport->tt.rport_login(lport->ptp_rdata); in fc_lport_ptp_setup()
258 fc_lport_enter_ready(lport); in fc_lport_ptp_setup()
267 struct fc_lport *lport = shost_priv(shost); in fc_get_host_port_state() local
269 mutex_lock(&lport->lp_mutex); in fc_get_host_port_state()
270 if (!lport->link_up) in fc_get_host_port_state()
273 switch (lport->state) { in fc_get_host_port_state()
280 mutex_unlock(&lport->lp_mutex); in fc_get_host_port_state()
290 struct fc_lport *lport = shost_priv(shost); in fc_get_host_speed() local
292 fc_host_speed(shost) = lport->link_speed; in fc_get_host_speed()
303 struct fc_lport *lport = shost_priv(shost); in fc_get_host_stats() local
309 fc_stats = &lport->host_stats; in fc_get_host_stats()
313 jiffies_to_timespec(lport->boot_time, &v1); in fc_get_host_stats()
319 stats = per_cpu_ptr(lport->stats, cpu); in fc_get_host_stats()
347 fc_exch_update_stats(lport); in fc_get_host_stats()
359 static void fc_lport_flogi_fill(struct fc_lport *lport, in fc_lport_flogi_fill() argument
368 put_unaligned_be64(lport->wwpn, &flogi->fl_wwpn); in fc_lport_flogi_fill()
369 put_unaligned_be64(lport->wwnn, &flogi->fl_wwnn); in fc_lport_flogi_fill()
374 sp->sp_bb_data = htons((u16) lport->mfs); in fc_lport_flogi_fill()
381 sp->sp_e_d_tov = htonl(lport->e_d_tov); in fc_lport_flogi_fill()
383 cp->cp_rdfs = htons((u16) lport->mfs); in fc_lport_flogi_fill()
394 static void fc_lport_add_fc4_type(struct fc_lport *lport, enum fc_fh_type type) in fc_lport_add_fc4_type() argument
398 mp = &lport->fcts.ff_type_map[type / FC_NS_BPW]; in fc_lport_add_fc4_type()
410 static void fc_lport_recv_rlir_req(struct fc_lport *lport, struct fc_frame *fp) in fc_lport_recv_rlir_req() argument
412 FC_LPORT_DBG(lport, "Received RLIR request while in state %s\n", in fc_lport_recv_rlir_req()
413 fc_lport_state(lport)); in fc_lport_recv_rlir_req()
415 lport->tt.seq_els_rsp_send(fp, ELS_LS_ACC, NULL); in fc_lport_recv_rlir_req()
427 static void fc_lport_recv_echo_req(struct fc_lport *lport, in fc_lport_recv_echo_req() argument
435 FC_LPORT_DBG(lport, "Received ECHO request while in state %s\n", in fc_lport_recv_echo_req()
436 fc_lport_state(lport)); in fc_lport_recv_echo_req()
444 fp = fc_frame_alloc(lport, len); in fc_lport_recv_echo_req()
450 lport->tt.frame_send(lport, fp); in fc_lport_recv_echo_req()
463 static void fc_lport_recv_rnid_req(struct fc_lport *lport, in fc_lport_recv_rnid_req() argument
477 FC_LPORT_DBG(lport, "Received RNID request while in state %s\n", in fc_lport_recv_rnid_req()
478 fc_lport_state(lport)); in fc_lport_recv_rnid_req()
484 lport->tt.seq_els_rsp_send(in_fp, ELS_LS_RJT, &rjt_data); in fc_lport_recv_rnid_req()
489 ntohl(lport->rnid_gen.rnid_atype) == 0) { in fc_lport_recv_rnid_req()
493 fp = fc_frame_alloc(lport, len); in fc_lport_recv_rnid_req()
500 rp->cid.rnid_wwpn = htonll(lport->wwpn); in fc_lport_recv_rnid_req()
501 rp->cid.rnid_wwnn = htonll(lport->wwnn); in fc_lport_recv_rnid_req()
504 memcpy(&rp->gen, &lport->rnid_gen, in fc_lport_recv_rnid_req()
508 lport->tt.frame_send(lport, fp); in fc_lport_recv_rnid_req()
522 static void fc_lport_recv_logo_req(struct fc_lport *lport, struct fc_frame *fp) in fc_lport_recv_logo_req() argument
524 lport->tt.seq_els_rsp_send(fp, ELS_LS_ACC, NULL); in fc_lport_recv_logo_req()
525 fc_lport_enter_reset(lport); in fc_lport_recv_logo_req()
536 int fc_fabric_login(struct fc_lport *lport) in fc_fabric_login() argument
540 mutex_lock(&lport->lp_mutex); in fc_fabric_login()
541 if (lport->state == LPORT_ST_DISABLED || in fc_fabric_login()
542 lport->state == LPORT_ST_LOGO) { in fc_fabric_login()
543 fc_lport_state_enter(lport, LPORT_ST_RESET); in fc_fabric_login()
544 fc_lport_enter_reset(lport); in fc_fabric_login()
547 mutex_unlock(&lport->lp_mutex); in fc_fabric_login()
559 void __fc_linkup(struct fc_lport *lport) in __fc_linkup() argument
561 if (!lport->link_up) { in __fc_linkup()
562 lport->link_up = 1; in __fc_linkup()
564 if (lport->state == LPORT_ST_RESET) in __fc_linkup()
565 fc_lport_enter_flogi(lport); in __fc_linkup()
573 void fc_linkup(struct fc_lport *lport) in fc_linkup() argument
576 lport->host->host_no, lport->port_id); in fc_linkup()
578 mutex_lock(&lport->lp_mutex); in fc_linkup()
579 __fc_linkup(lport); in fc_linkup()
580 mutex_unlock(&lport->lp_mutex); in fc_linkup()
590 void __fc_linkdown(struct fc_lport *lport) in __fc_linkdown() argument
592 if (lport->link_up) { in __fc_linkdown()
593 lport->link_up = 0; in __fc_linkdown()
594 fc_lport_enter_reset(lport); in __fc_linkdown()
595 lport->tt.fcp_cleanup(lport); in __fc_linkdown()
603 void fc_linkdown(struct fc_lport *lport) in fc_linkdown() argument
606 lport->host->host_no, lport->port_id); in fc_linkdown()
608 mutex_lock(&lport->lp_mutex); in fc_linkdown()
609 __fc_linkdown(lport); in fc_linkdown()
610 mutex_unlock(&lport->lp_mutex); in fc_linkdown()
621 int fc_fabric_logoff(struct fc_lport *lport) in fc_fabric_logoff() argument
623 lport->tt.disc_stop_final(lport); in fc_fabric_logoff()
624 mutex_lock(&lport->lp_mutex); in fc_fabric_logoff()
625 if (lport->dns_rdata) in fc_fabric_logoff()
626 lport->tt.rport_logoff(lport->dns_rdata); in fc_fabric_logoff()
627 mutex_unlock(&lport->lp_mutex); in fc_fabric_logoff()
628 lport->tt.rport_flush_queue(); in fc_fabric_logoff()
629 mutex_lock(&lport->lp_mutex); in fc_fabric_logoff()
630 fc_lport_enter_logo(lport); in fc_fabric_logoff()
631 mutex_unlock(&lport->lp_mutex); in fc_fabric_logoff()
632 cancel_delayed_work_sync(&lport->retry_work); in fc_fabric_logoff()
647 int fc_lport_destroy(struct fc_lport *lport) in fc_lport_destroy() argument
649 mutex_lock(&lport->lp_mutex); in fc_lport_destroy()
650 lport->state = LPORT_ST_DISABLED; in fc_lport_destroy()
651 lport->link_up = 0; in fc_lport_destroy()
652 lport->tt.frame_send = fc_frame_drop; in fc_lport_destroy()
653 mutex_unlock(&lport->lp_mutex); in fc_lport_destroy()
655 lport->tt.fcp_abort_io(lport); in fc_lport_destroy()
656 lport->tt.disc_stop_final(lport); in fc_lport_destroy()
657 lport->tt.exch_mgr_reset(lport, 0, 0); in fc_lport_destroy()
658 cancel_delayed_work_sync(&lport->retry_work); in fc_lport_destroy()
659 fc_fc4_del_lport(lport); in fc_lport_destroy()
669 int fc_set_mfs(struct fc_lport *lport, u32 mfs) in fc_set_mfs() argument
674 mutex_lock(&lport->lp_mutex); in fc_set_mfs()
676 old_mfs = lport->mfs; in fc_set_mfs()
683 lport->mfs = mfs; in fc_set_mfs()
688 fc_lport_enter_reset(lport); in fc_set_mfs()
690 mutex_unlock(&lport->lp_mutex); in fc_set_mfs()
701 static void fc_lport_disc_callback(struct fc_lport *lport, in fc_lport_disc_callback() argument
706 FC_LPORT_DBG(lport, "Discovery succeeded\n"); in fc_lport_disc_callback()
711 lport->host->host_no, lport->port_id); in fc_lport_disc_callback()
712 mutex_lock(&lport->lp_mutex); in fc_lport_disc_callback()
713 fc_lport_enter_reset(lport); in fc_lport_disc_callback()
714 mutex_unlock(&lport->lp_mutex); in fc_lport_disc_callback()
729 static void fc_lport_enter_ready(struct fc_lport *lport) in fc_lport_enter_ready() argument
731 FC_LPORT_DBG(lport, "Entered READY from state %s\n", in fc_lport_enter_ready()
732 fc_lport_state(lport)); in fc_lport_enter_ready()
734 fc_lport_state_enter(lport, LPORT_ST_READY); in fc_lport_enter_ready()
735 if (lport->vport) in fc_lport_enter_ready()
736 fc_vport_set_state(lport->vport, FC_VPORT_ACTIVE); in fc_lport_enter_ready()
737 fc_vports_linkchange(lport); in fc_lport_enter_ready()
739 if (!lport->ptp_rdata) in fc_lport_enter_ready()
740 lport->tt.disc_start(fc_lport_disc_callback, lport); in fc_lport_enter_ready()
752 static void fc_lport_set_port_id(struct fc_lport *lport, u32 port_id, in fc_lport_set_port_id() argument
757 lport->host->host_no, port_id); in fc_lport_set_port_id()
759 lport->port_id = port_id; in fc_lport_set_port_id()
762 fc_host_port_id(lport->host) = port_id; in fc_lport_set_port_id()
764 if (lport->tt.lport_set_port_id) in fc_lport_set_port_id()
765 lport->tt.lport_set_port_id(lport, port_id, fp); in fc_lport_set_port_id()
777 void fc_lport_set_local_id(struct fc_lport *lport, u32 port_id) in fc_lport_set_local_id() argument
779 mutex_lock(&lport->lp_mutex); in fc_lport_set_local_id()
781 fc_lport_set_port_id(lport, port_id, NULL); in fc_lport_set_local_id()
783 switch (lport->state) { in fc_lport_set_local_id()
787 fc_lport_enter_ready(lport); in fc_lport_set_local_id()
792 mutex_unlock(&lport->lp_mutex); in fc_lport_set_local_id()
808 static void fc_lport_recv_flogi_req(struct fc_lport *lport, in fc_lport_recv_flogi_req() argument
819 FC_LPORT_DBG(lport, "Received FLOGI request while in state %s\n", in fc_lport_recv_flogi_req()
820 fc_lport_state(lport)); in fc_lport_recv_flogi_req()
827 if (remote_wwpn == lport->wwpn) { in fc_lport_recv_flogi_req()
830 lport->host->host_no, remote_wwpn); in fc_lport_recv_flogi_req()
833 FC_LPORT_DBG(lport, "FLOGI from port WWPN %16.16llx\n", remote_wwpn); in fc_lport_recv_flogi_req()
841 if (remote_wwpn < lport->wwpn) { in fc_lport_recv_flogi_req()
849 fc_lport_set_port_id(lport, local_fid, rx_fp); in fc_lport_recv_flogi_req()
851 fp = fc_frame_alloc(lport, sizeof(*flp)); in fc_lport_recv_flogi_req()
854 fc_lport_flogi_fill(lport, new_flp, ELS_FLOGI); in fc_lport_recv_flogi_req()
865 lport->tt.frame_send(lport, fp); in fc_lport_recv_flogi_req()
868 fc_lport_error(lport, fp); in fc_lport_recv_flogi_req()
870 fc_lport_ptp_setup(lport, remote_fid, remote_wwpn, in fc_lport_recv_flogi_req()
887 static void fc_lport_recv_els_req(struct fc_lport *lport, in fc_lport_recv_els_req() argument
892 mutex_lock(&lport->lp_mutex); in fc_lport_recv_els_req()
899 if (!lport->link_up) in fc_lport_recv_els_req()
905 recv = lport->tt.rport_recv_req; in fc_lport_recv_els_req()
908 if (!lport->point_to_multipoint) in fc_lport_recv_els_req()
916 recv = lport->tt.disc_recv_req; in fc_lport_recv_els_req()
929 recv(lport, fp); in fc_lport_recv_els_req()
931 mutex_unlock(&lport->lp_mutex); in fc_lport_recv_els_req()
954 static void fc_lport_recv_req(struct fc_lport *lport, in fc_lport_recv_req() argument
976 prov->recv(lport, fp); in fc_lport_recv_req()
981 FC_LPORT_DBG(lport, "dropping unexpected frame type %x\n", fh->fh_type); in fc_lport_recv_req()
984 lport->tt.exch_done(sp); in fc_lport_recv_req()
994 int fc_lport_reset(struct fc_lport *lport) in fc_lport_reset() argument
996 cancel_delayed_work_sync(&lport->retry_work); in fc_lport_reset()
997 mutex_lock(&lport->lp_mutex); in fc_lport_reset()
998 fc_lport_enter_reset(lport); in fc_lport_reset()
999 mutex_unlock(&lport->lp_mutex); in fc_lport_reset()
1011 static void fc_lport_reset_locked(struct fc_lport *lport) in fc_lport_reset_locked() argument
1013 if (lport->dns_rdata) in fc_lport_reset_locked()
1014 lport->tt.rport_logoff(lport->dns_rdata); in fc_lport_reset_locked()
1016 if (lport->ptp_rdata) { in fc_lport_reset_locked()
1017 lport->tt.rport_logoff(lport->ptp_rdata); in fc_lport_reset_locked()
1018 kref_put(&lport->ptp_rdata->kref, lport->tt.rport_destroy); in fc_lport_reset_locked()
1019 lport->ptp_rdata = NULL; in fc_lport_reset_locked()
1022 lport->tt.disc_stop(lport); in fc_lport_reset_locked()
1024 lport->tt.exch_mgr_reset(lport, 0, 0); in fc_lport_reset_locked()
1025 fc_host_fabric_name(lport->host) = 0; in fc_lport_reset_locked()
1027 if (lport->port_id && (!lport->point_to_multipoint || !lport->link_up)) in fc_lport_reset_locked()
1028 fc_lport_set_port_id(lport, 0, NULL); in fc_lport_reset_locked()
1038 static void fc_lport_enter_reset(struct fc_lport *lport) in fc_lport_enter_reset() argument
1040 FC_LPORT_DBG(lport, "Entered RESET state from %s state\n", in fc_lport_enter_reset()
1041 fc_lport_state(lport)); in fc_lport_enter_reset()
1043 if (lport->state == LPORT_ST_DISABLED || lport->state == LPORT_ST_LOGO) in fc_lport_enter_reset()
1046 if (lport->vport) { in fc_lport_enter_reset()
1047 if (lport->link_up) in fc_lport_enter_reset()
1048 fc_vport_set_state(lport->vport, FC_VPORT_INITIALIZING); in fc_lport_enter_reset()
1050 fc_vport_set_state(lport->vport, FC_VPORT_LINKDOWN); in fc_lport_enter_reset()
1052 fc_lport_state_enter(lport, LPORT_ST_RESET); in fc_lport_enter_reset()
1053 fc_host_post_event(lport->host, fc_get_event_number(), in fc_lport_enter_reset()
1055 fc_vports_linkchange(lport); in fc_lport_enter_reset()
1056 fc_lport_reset_locked(lport); in fc_lport_enter_reset()
1057 if (lport->link_up) in fc_lport_enter_reset()
1058 fc_lport_enter_flogi(lport); in fc_lport_enter_reset()
1068 static void fc_lport_enter_disabled(struct fc_lport *lport) in fc_lport_enter_disabled() argument
1070 FC_LPORT_DBG(lport, "Entered disabled state from %s state\n", in fc_lport_enter_disabled()
1071 fc_lport_state(lport)); in fc_lport_enter_disabled()
1073 fc_lport_state_enter(lport, LPORT_ST_DISABLED); in fc_lport_enter_disabled()
1074 fc_vports_linkchange(lport); in fc_lport_enter_disabled()
1075 fc_lport_reset_locked(lport); in fc_lport_enter_disabled()
1087 static void fc_lport_error(struct fc_lport *lport, struct fc_frame *fp) in fc_lport_error() argument
1090 FC_LPORT_DBG(lport, "Error %ld in state %s, retries %d\n", in fc_lport_error()
1091 IS_ERR(fp) ? -PTR_ERR(fp) : 0, fc_lport_state(lport), in fc_lport_error()
1092 lport->retry_count); in fc_lport_error()
1102 if (lport->retry_count < lport->max_retry_count) { in fc_lport_error()
1103 lport->retry_count++; in fc_lport_error()
1107 delay = msecs_to_jiffies(lport->e_d_tov); in fc_lport_error()
1109 schedule_delayed_work(&lport->retry_work, delay); in fc_lport_error()
1111 fc_lport_enter_reset(lport); in fc_lport_error()
1128 struct fc_lport *lport = lp_arg; in fc_lport_ns_resp() local
1132 FC_LPORT_DBG(lport, "Received a ns %s\n", fc_els_resp_type(fp)); in fc_lport_ns_resp()
1137 mutex_lock(&lport->lp_mutex); in fc_lport_ns_resp()
1139 if (lport->state < LPORT_ST_RNN_ID || lport->state > LPORT_ST_RFF_ID) { in fc_lport_ns_resp()
1140 FC_LPORT_DBG(lport, "Received a name server response, " in fc_lport_ns_resp()
1141 "but in state %s\n", fc_lport_state(lport)); in fc_lport_ns_resp()
1148 fc_lport_error(lport, fp); in fc_lport_ns_resp()
1159 switch (lport->state) { in fc_lport_ns_resp()
1161 fc_lport_enter_ns(lport, LPORT_ST_RSNN_NN); in fc_lport_ns_resp()
1164 fc_lport_enter_ns(lport, LPORT_ST_RSPN_ID); in fc_lport_ns_resp()
1167 fc_lport_enter_ns(lport, LPORT_ST_RFT_ID); in fc_lport_ns_resp()
1170 fc_lport_enter_ns(lport, LPORT_ST_RFF_ID); in fc_lport_ns_resp()
1173 if (lport->fdmi_enabled) in fc_lport_ns_resp()
1174 fc_lport_enter_fdmi(lport); in fc_lport_ns_resp()
1176 fc_lport_enter_scr(lport); in fc_lport_ns_resp()
1183 fc_lport_error(lport, fp); in fc_lport_ns_resp()
1187 mutex_unlock(&lport->lp_mutex); in fc_lport_ns_resp()
1204 struct fc_lport *lport = lp_arg; in fc_lport_ms_resp() local
1208 FC_LPORT_DBG(lport, "Received a ms %s\n", fc_els_resp_type(fp)); in fc_lport_ms_resp()
1213 mutex_lock(&lport->lp_mutex); in fc_lport_ms_resp()
1215 if (lport->state < LPORT_ST_RHBA || lport->state > LPORT_ST_DPRT) { in fc_lport_ms_resp()
1216 FC_LPORT_DBG(lport, "Received a management server response, " in fc_lport_ms_resp()
1217 "but in state %s\n", fc_lport_state(lport)); in fc_lport_ms_resp()
1224 fc_lport_error(lport, fp); in fc_lport_ms_resp()
1234 FC_LPORT_DBG(lport, "Received a management server response, " in fc_lport_ms_resp()
1239 switch (lport->state) { in fc_lport_ms_resp()
1242 fc_lport_enter_ms(lport, LPORT_ST_RPA); in fc_lport_ms_resp()
1244 fc_lport_enter_scr(lport); in fc_lport_ms_resp()
1247 fc_lport_enter_scr(lport); in fc_lport_ms_resp()
1250 fc_lport_enter_ms(lport, LPORT_ST_RHBA); in fc_lport_ms_resp()
1253 fc_lport_enter_ms(lport, LPORT_ST_DPRT); in fc_lport_ms_resp()
1261 fc_lport_error(lport, fp); in fc_lport_ms_resp()
1266 mutex_unlock(&lport->lp_mutex); in fc_lport_ms_resp()
1282 struct fc_lport *lport = lp_arg; in fc_lport_scr_resp() local
1285 FC_LPORT_DBG(lport, "Received a SCR %s\n", fc_els_resp_type(fp)); in fc_lport_scr_resp()
1290 mutex_lock(&lport->lp_mutex); in fc_lport_scr_resp()
1292 if (lport->state != LPORT_ST_SCR) { in fc_lport_scr_resp()
1293 FC_LPORT_DBG(lport, "Received a SCR response, but in state " in fc_lport_scr_resp()
1294 "%s\n", fc_lport_state(lport)); in fc_lport_scr_resp()
1301 fc_lport_error(lport, fp); in fc_lport_scr_resp()
1307 fc_lport_enter_ready(lport); in fc_lport_scr_resp()
1309 fc_lport_error(lport, fp); in fc_lport_scr_resp()
1314 mutex_unlock(&lport->lp_mutex); in fc_lport_scr_resp()
1324 static void fc_lport_enter_scr(struct fc_lport *lport) in fc_lport_enter_scr() argument
1328 FC_LPORT_DBG(lport, "Entered SCR state from %s state\n", in fc_lport_enter_scr()
1329 fc_lport_state(lport)); in fc_lport_enter_scr()
1331 fc_lport_state_enter(lport, LPORT_ST_SCR); in fc_lport_enter_scr()
1333 fp = fc_frame_alloc(lport, sizeof(struct fc_els_scr)); in fc_lport_enter_scr()
1335 fc_lport_error(lport, fp); in fc_lport_enter_scr()
1339 if (!lport->tt.elsct_send(lport, FC_FID_FCTRL, fp, ELS_SCR, in fc_lport_enter_scr()
1340 fc_lport_scr_resp, lport, in fc_lport_enter_scr()
1341 2 * lport->r_a_tov)) in fc_lport_enter_scr()
1342 fc_lport_error(lport, NULL); in fc_lport_enter_scr()
1352 static void fc_lport_enter_ns(struct fc_lport *lport, enum fc_lport_state state) in fc_lport_enter_ns() argument
1359 FC_LPORT_DBG(lport, "Entered %s state from %s state\n", in fc_lport_enter_ns()
1361 fc_lport_state(lport)); in fc_lport_enter_ns()
1363 fc_lport_state_enter(lport, state); in fc_lport_enter_ns()
1371 len = strnlen(fc_host_symbolic_name(lport->host), 255); in fc_lport_enter_ns()
1374 return fc_lport_enter_ns(lport, LPORT_ST_RFT_ID); in fc_lport_enter_ns()
1379 len = strnlen(fc_host_symbolic_name(lport->host), 255); in fc_lport_enter_ns()
1382 return fc_lport_enter_ns(lport, LPORT_ST_RFT_ID); in fc_lport_enter_ns()
1395 fc_lport_error(lport, NULL); in fc_lport_enter_ns()
1399 fp = fc_frame_alloc(lport, size); in fc_lport_enter_ns()
1401 fc_lport_error(lport, fp); in fc_lport_enter_ns()
1405 if (!lport->tt.elsct_send(lport, FC_FID_DIR_SERV, fp, cmd, in fc_lport_enter_ns()
1407 lport, 3 * lport->r_a_tov)) in fc_lport_enter_ns()
1408 fc_lport_error(lport, fp); in fc_lport_enter_ns()
1422 static void fc_lport_enter_dns(struct fc_lport *lport) in fc_lport_enter_dns() argument
1426 FC_LPORT_DBG(lport, "Entered DNS state from %s state\n", in fc_lport_enter_dns()
1427 fc_lport_state(lport)); in fc_lport_enter_dns()
1429 fc_lport_state_enter(lport, LPORT_ST_DNS); in fc_lport_enter_dns()
1431 mutex_lock(&lport->disc.disc_mutex); in fc_lport_enter_dns()
1432 rdata = lport->tt.rport_create(lport, FC_FID_DIR_SERV); in fc_lport_enter_dns()
1433 mutex_unlock(&lport->disc.disc_mutex); in fc_lport_enter_dns()
1438 lport->tt.rport_login(rdata); in fc_lport_enter_dns()
1442 fc_lport_error(lport, NULL); in fc_lport_enter_dns()
1452 static void fc_lport_enter_ms(struct fc_lport *lport, enum fc_lport_state state) in fc_lport_enter_ms() argument
1460 FC_LPORT_DBG(lport, "Entered %s state from %s state\n", in fc_lport_enter_ms()
1462 fc_lport_state(lport)); in fc_lport_enter_ms()
1464 fc_lport_state_enter(lport, state); in fc_lport_enter_ms()
1514 fc_lport_error(lport, NULL); in fc_lport_enter_ms()
1518 FC_LPORT_DBG(lport, "Cmd=0x%x Len %d size %d\n", in fc_lport_enter_ms()
1520 fp = fc_frame_alloc(lport, size); in fc_lport_enter_ms()
1522 fc_lport_error(lport, fp); in fc_lport_enter_ms()
1526 if (!lport->tt.elsct_send(lport, FC_FID_MGMT_SERV, fp, cmd, in fc_lport_enter_ms()
1528 lport, 3 * lport->r_a_tov)) in fc_lport_enter_ms()
1529 fc_lport_error(lport, fp); in fc_lport_enter_ms()
1539 static void fc_lport_enter_fdmi(struct fc_lport *lport) in fc_lport_enter_fdmi() argument
1543 FC_LPORT_DBG(lport, "Entered FDMI state from %s state\n", in fc_lport_enter_fdmi()
1544 fc_lport_state(lport)); in fc_lport_enter_fdmi()
1546 fc_lport_state_enter(lport, LPORT_ST_FDMI); in fc_lport_enter_fdmi()
1548 mutex_lock(&lport->disc.disc_mutex); in fc_lport_enter_fdmi()
1549 rdata = lport->tt.rport_create(lport, FC_FID_MGMT_SERV); in fc_lport_enter_fdmi()
1550 mutex_unlock(&lport->disc.disc_mutex); in fc_lport_enter_fdmi()
1555 lport->tt.rport_login(rdata); in fc_lport_enter_fdmi()
1559 fc_lport_error(lport, NULL); in fc_lport_enter_fdmi()
1568 struct fc_lport *lport = in fc_lport_timeout() local
1572 mutex_lock(&lport->lp_mutex); in fc_lport_timeout()
1574 switch (lport->state) { in fc_lport_timeout()
1582 fc_lport_enter_flogi(lport); in fc_lport_timeout()
1585 fc_lport_enter_dns(lport); in fc_lport_timeout()
1592 fc_lport_enter_ns(lport, lport->state); in fc_lport_timeout()
1595 fc_lport_enter_fdmi(lport); in fc_lport_timeout()
1601 FC_LPORT_DBG(lport, "Skipping lport state %s to SCR\n", in fc_lport_timeout()
1602 fc_lport_state(lport)); in fc_lport_timeout()
1605 fc_lport_enter_scr(lport); in fc_lport_timeout()
1608 fc_lport_enter_logo(lport); in fc_lport_timeout()
1612 mutex_unlock(&lport->lp_mutex); in fc_lport_timeout()
1628 struct fc_lport *lport = lp_arg; in fc_lport_logo_resp() local
1631 FC_LPORT_DBG(lport, "Received a LOGO %s\n", fc_els_resp_type(fp)); in fc_lport_logo_resp()
1636 mutex_lock(&lport->lp_mutex); in fc_lport_logo_resp()
1638 if (lport->state != LPORT_ST_LOGO) { in fc_lport_logo_resp()
1639 FC_LPORT_DBG(lport, "Received a LOGO response, but in state " in fc_lport_logo_resp()
1640 "%s\n", fc_lport_state(lport)); in fc_lport_logo_resp()
1647 fc_lport_error(lport, fp); in fc_lport_logo_resp()
1653 fc_lport_enter_disabled(lport); in fc_lport_logo_resp()
1655 fc_lport_error(lport, fp); in fc_lport_logo_resp()
1660 mutex_unlock(&lport->lp_mutex); in fc_lport_logo_resp()
1671 static void fc_lport_enter_logo(struct fc_lport *lport) in fc_lport_enter_logo() argument
1676 FC_LPORT_DBG(lport, "Entered LOGO state from %s state\n", in fc_lport_enter_logo()
1677 fc_lport_state(lport)); in fc_lport_enter_logo()
1679 fc_lport_state_enter(lport, LPORT_ST_LOGO); in fc_lport_enter_logo()
1680 fc_vports_linkchange(lport); in fc_lport_enter_logo()
1682 fp = fc_frame_alloc(lport, sizeof(*logo)); in fc_lport_enter_logo()
1684 fc_lport_error(lport, fp); in fc_lport_enter_logo()
1688 if (!lport->tt.elsct_send(lport, FC_FID_FLOGI, fp, ELS_LOGO, in fc_lport_enter_logo()
1689 fc_lport_logo_resp, lport, in fc_lport_enter_logo()
1690 2 * lport->r_a_tov)) in fc_lport_enter_logo()
1691 fc_lport_error(lport, NULL); in fc_lport_enter_logo()
1707 struct fc_lport *lport = lp_arg; in fc_lport_flogi_resp() local
1716 FC_LPORT_DBG(lport, "Received a FLOGI %s\n", fc_els_resp_type(fp)); in fc_lport_flogi_resp()
1721 mutex_lock(&lport->lp_mutex); in fc_lport_flogi_resp()
1723 if (lport->state != LPORT_ST_FLOGI) { in fc_lport_flogi_resp()
1724 FC_LPORT_DBG(lport, "Received a FLOGI response, but in state " in fc_lport_flogi_resp()
1725 "%s\n", fc_lport_state(lport)); in fc_lport_flogi_resp()
1732 fc_lport_error(lport, fp); in fc_lport_flogi_resp()
1740 FC_LPORT_DBG(lport, "FLOGI not accepted or bad response\n"); in fc_lport_flogi_resp()
1741 fc_lport_error(lport, fp); in fc_lport_flogi_resp()
1747 FC_LPORT_DBG(lport, "FLOGI bad response\n"); in fc_lport_flogi_resp()
1748 fc_lport_error(lport, fp); in fc_lport_flogi_resp()
1756 FC_LPORT_DBG(lport, "FLOGI bad mfs:%hu response, " in fc_lport_flogi_resp()
1757 "lport->mfs:%hu\n", mfs, lport->mfs); in fc_lport_flogi_resp()
1758 fc_lport_error(lport, fp); in fc_lport_flogi_resp()
1762 if (mfs <= lport->mfs) { in fc_lport_flogi_resp()
1763 lport->mfs = mfs; in fc_lport_flogi_resp()
1764 fc_host_maxframe_size(lport->host) = mfs; in fc_lport_flogi_resp()
1773 lport->npiv_enabled = !!(csp_flags & FC_SP_FT_NPIV_ACC); in fc_lport_flogi_resp()
1776 if (e_d_tov > lport->e_d_tov) in fc_lport_flogi_resp()
1777 lport->e_d_tov = e_d_tov; in fc_lport_flogi_resp()
1778 lport->r_a_tov = 2 * e_d_tov; in fc_lport_flogi_resp()
1779 fc_lport_set_port_id(lport, did, fp); in fc_lport_flogi_resp()
1783 lport->host->host_no, did); in fc_lport_flogi_resp()
1784 fc_lport_ptp_setup(lport, fc_frame_sid(fp), in fc_lport_flogi_resp()
1790 lport->e_d_tov = e_d_tov; in fc_lport_flogi_resp()
1791 lport->r_a_tov = r_a_tov; in fc_lport_flogi_resp()
1792 fc_host_fabric_name(lport->host) = in fc_lport_flogi_resp()
1794 fc_lport_set_port_id(lport, did, fp); in fc_lport_flogi_resp()
1795 fc_lport_enter_dns(lport); in fc_lport_flogi_resp()
1801 mutex_unlock(&lport->lp_mutex); in fc_lport_flogi_resp()
1812 static void fc_lport_enter_flogi(struct fc_lport *lport) in fc_lport_enter_flogi() argument
1816 FC_LPORT_DBG(lport, "Entered FLOGI state from %s state\n", in fc_lport_enter_flogi()
1817 fc_lport_state(lport)); in fc_lport_enter_flogi()
1819 fc_lport_state_enter(lport, LPORT_ST_FLOGI); in fc_lport_enter_flogi()
1821 if (lport->point_to_multipoint) { in fc_lport_enter_flogi()
1822 if (lport->port_id) in fc_lport_enter_flogi()
1823 fc_lport_enter_ready(lport); in fc_lport_enter_flogi()
1827 fp = fc_frame_alloc(lport, sizeof(struct fc_els_flogi)); in fc_lport_enter_flogi()
1829 return fc_lport_error(lport, fp); in fc_lport_enter_flogi()
1831 if (!lport->tt.elsct_send(lport, FC_FID_FLOGI, fp, in fc_lport_enter_flogi()
1832 lport->vport ? ELS_FDISC : ELS_FLOGI, in fc_lport_enter_flogi()
1833 fc_lport_flogi_resp, lport, in fc_lport_enter_flogi()
1834 lport->vport ? 2 * lport->r_a_tov : in fc_lport_enter_flogi()
1835 lport->e_d_tov)) in fc_lport_enter_flogi()
1836 fc_lport_error(lport, NULL); in fc_lport_enter_flogi()
1843 int fc_lport_config(struct fc_lport *lport) in fc_lport_config() argument
1845 INIT_DELAYED_WORK(&lport->retry_work, fc_lport_timeout); in fc_lport_config()
1846 mutex_init(&lport->lp_mutex); in fc_lport_config()
1848 fc_lport_state_enter(lport, LPORT_ST_DISABLED); in fc_lport_config()
1850 fc_lport_add_fc4_type(lport, FC_TYPE_FCP); in fc_lport_config()
1851 fc_lport_add_fc4_type(lport, FC_TYPE_CT); in fc_lport_config()
1852 fc_fc4_conf_lport_params(lport, FC_TYPE_FCP); in fc_lport_config()
1862 int fc_lport_init(struct fc_lport *lport) in fc_lport_init() argument
1864 if (!lport->tt.lport_recv) in fc_lport_init()
1865 lport->tt.lport_recv = fc_lport_recv_req; in fc_lport_init()
1867 if (!lport->tt.lport_reset) in fc_lport_init()
1868 lport->tt.lport_reset = fc_lport_reset; in fc_lport_init()
1870 fc_host_port_type(lport->host) = FC_PORTTYPE_NPORT; in fc_lport_init()
1871 fc_host_node_name(lport->host) = lport->wwnn; in fc_lport_init()
1872 fc_host_port_name(lport->host) = lport->wwpn; in fc_lport_init()
1873 fc_host_supported_classes(lport->host) = FC_COS_CLASS3; in fc_lport_init()
1874 memset(fc_host_supported_fc4s(lport->host), 0, in fc_lport_init()
1875 sizeof(fc_host_supported_fc4s(lport->host))); in fc_lport_init()
1876 fc_host_supported_fc4s(lport->host)[2] = 1; in fc_lport_init() local
1877 fc_host_supported_fc4s(lport->host)[7] = 1; in fc_lport_init() local
1880 memset(fc_host_active_fc4s(lport->host), 0, in fc_lport_init()
1881 sizeof(fc_host_active_fc4s(lport->host))); in fc_lport_init()
1882 fc_host_active_fc4s(lport->host)[2] = 1; in fc_lport_init() local
1883 fc_host_active_fc4s(lport->host)[7] = 1; in fc_lport_init() local
1884 fc_host_maxframe_size(lport->host) = lport->mfs; in fc_lport_init()
1885 fc_host_supported_speeds(lport->host) = 0; in fc_lport_init()
1886 if (lport->link_supported_speeds & FC_PORTSPEED_1GBIT) in fc_lport_init()
1887 fc_host_supported_speeds(lport->host) |= FC_PORTSPEED_1GBIT; in fc_lport_init()
1888 if (lport->link_supported_speeds & FC_PORTSPEED_10GBIT) in fc_lport_init()
1889 fc_host_supported_speeds(lport->host) |= FC_PORTSPEED_10GBIT; in fc_lport_init()
1890 fc_fc4_add_lport(lport); in fc_lport_init()
1907 struct fc_lport *lport = info->lport; in fc_lport_bsg_resp() local
1922 mutex_lock(&lport->lp_mutex); in fc_lport_bsg_resp()
1956 mutex_unlock(&lport->lp_mutex); in fc_lport_bsg_resp()
1969 struct fc_lport *lport, in fc_lport_els_request() argument
1978 fp = fc_frame_alloc(lport, job->request_payload.payload_len); in fc_lport_els_request()
1992 hton24(fh->fh_s_id, lport->port_id); in fc_lport_els_request()
2006 info->lport = lport; in fc_lport_els_request()
2011 if (!lport->tt.exch_seq_send(lport, fp, fc_lport_bsg_resp, in fc_lport_els_request()
2030 struct fc_lport *lport, u32 did, u32 tov) in fc_lport_ct_request() argument
2038 fp = fc_frame_alloc(lport, sizeof(struct fc_ct_hdr) + in fc_lport_ct_request()
2053 hton24(fh->fh_s_id, lport->port_id); in fc_lport_ct_request()
2067 info->lport = lport; in fc_lport_ct_request()
2072 if (!lport->tt.exch_seq_send(lport, fp, fc_lport_bsg_resp, in fc_lport_ct_request()
2089 struct fc_lport *lport = shost_priv(shost); in fc_lport_bsg_request() local
2099 mutex_lock(&lport->lp_mutex); in fc_lport_bsg_request()
2108 rc = fc_lport_els_request(job, lport, rport->port_id, in fc_lport_bsg_request()
2118 rc = fc_lport_ct_request(job, lport, rport->port_id, in fc_lport_bsg_request()
2125 rdata = lport->dns_rdata; in fc_lport_bsg_request()
2127 rdata = lport->tt.rport_lookup(lport, did); in fc_lport_bsg_request()
2132 rc = fc_lport_ct_request(job, lport, did, rdata->e_d_tov); in fc_lport_bsg_request()
2137 rc = fc_lport_els_request(job, lport, did, lport->e_d_tov); in fc_lport_bsg_request()
2141 mutex_unlock(&lport->lp_mutex); in fc_lport_bsg_request()