Lines Matching refs:fip

86 static void fcoe_ctlr_set_state(struct fcoe_ctlr *fip, enum fip_state state)  in fcoe_ctlr_set_state()  argument
88 if (state == fip->state) in fcoe_ctlr_set_state()
90 if (fip->lp) in fcoe_ctlr_set_state()
91 LIBFCOE_FIP_DBG(fip, "state %s -> %s\n", in fcoe_ctlr_set_state()
92 fcoe_ctlr_state(fip->state), fcoe_ctlr_state(state)); in fcoe_ctlr_set_state()
93 fip->state = state; in fcoe_ctlr_set_state()
124 static void fcoe_ctlr_map_dest(struct fcoe_ctlr *fip) in fcoe_ctlr_map_dest() argument
126 if (fip->mode == FIP_MODE_VN2VN) in fcoe_ctlr_map_dest()
127 hton24(fip->dest_addr, FIP_VN_FC_MAP); in fcoe_ctlr_map_dest()
129 hton24(fip->dest_addr, FIP_DEF_FC_MAP); in fcoe_ctlr_map_dest()
130 hton24(fip->dest_addr + 3, 0); in fcoe_ctlr_map_dest()
131 fip->map_dest = 1; in fcoe_ctlr_map_dest()
138 void fcoe_ctlr_init(struct fcoe_ctlr *fip, enum fip_mode mode) in fcoe_ctlr_init() argument
140 fcoe_ctlr_set_state(fip, FIP_ST_LINK_WAIT); in fcoe_ctlr_init()
141 fip->mode = mode; in fcoe_ctlr_init()
142 fip->fip_resp = false; in fcoe_ctlr_init()
143 INIT_LIST_HEAD(&fip->fcfs); in fcoe_ctlr_init()
144 mutex_init(&fip->ctlr_mutex); in fcoe_ctlr_init()
145 spin_lock_init(&fip->ctlr_lock); in fcoe_ctlr_init()
146 fip->flogi_oxid = FC_XID_UNKNOWN; in fcoe_ctlr_init()
147 timer_setup(&fip->timer, fcoe_ctlr_timeout, 0); in fcoe_ctlr_init()
148 INIT_WORK(&fip->timer_work, fcoe_ctlr_timer_work); in fcoe_ctlr_init()
149 INIT_WORK(&fip->recv_work, fcoe_ctlr_recv_work); in fcoe_ctlr_init()
150 skb_queue_head_init(&fip->fip_recv_list); in fcoe_ctlr_init()
162 struct fcoe_ctlr *fip = new->fip; in fcoe_sysfs_fcf_add() local
167 LIBFCOE_FIP_DBG(fip, "New FCF fab %16.16llx mac %pM\n", in fcoe_sysfs_fcf_add()
191 ctlr_dev = fcoe_ctlr_to_ctlr_dev(fip); in fcoe_sysfs_fcf_add()
218 list_add(&new->list, &fip->fcfs); in fcoe_sysfs_fcf_add()
219 fip->fcf_count++; in fcoe_sysfs_fcf_add()
235 struct fcoe_ctlr *fip = new->fip; in fcoe_sysfs_fcf_del() local
240 fip->fcf_count--; in fcoe_sysfs_fcf_del()
251 cdev = fcoe_ctlr_to_ctlr_dev(fip); in fcoe_sysfs_fcf_del()
269 static void fcoe_ctlr_reset_fcfs(struct fcoe_ctlr *fip) in fcoe_ctlr_reset_fcfs() argument
274 fip->sel_fcf = NULL; in fcoe_ctlr_reset_fcfs()
275 list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { in fcoe_ctlr_reset_fcfs()
278 WARN_ON(fip->fcf_count); in fcoe_ctlr_reset_fcfs()
280 fip->sel_time = 0; in fcoe_ctlr_reset_fcfs()
295 void fcoe_ctlr_destroy(struct fcoe_ctlr *fip) in fcoe_ctlr_destroy() argument
297 cancel_work_sync(&fip->recv_work); in fcoe_ctlr_destroy()
298 skb_queue_purge(&fip->fip_recv_list); in fcoe_ctlr_destroy()
300 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_destroy()
301 fcoe_ctlr_set_state(fip, FIP_ST_DISABLED); in fcoe_ctlr_destroy()
302 fcoe_ctlr_reset_fcfs(fip); in fcoe_ctlr_destroy()
303 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_destroy()
304 del_timer_sync(&fip->timer); in fcoe_ctlr_destroy()
305 cancel_work_sync(&fip->timer_work); in fcoe_ctlr_destroy()
317 static void fcoe_ctlr_announce(struct fcoe_ctlr *fip) in fcoe_ctlr_announce() argument
322 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_announce()
323 spin_lock_bh(&fip->ctlr_lock); in fcoe_ctlr_announce()
325 kfree_skb(fip->flogi_req); in fcoe_ctlr_announce()
326 fip->flogi_req = NULL; in fcoe_ctlr_announce()
327 list_for_each_entry(fcf, &fip->fcfs, list) in fcoe_ctlr_announce()
330 spin_unlock_bh(&fip->ctlr_lock); in fcoe_ctlr_announce()
331 sel = fip->sel_fcf; in fcoe_ctlr_announce()
333 if (sel && ether_addr_equal(sel->fcf_mac, fip->dest_addr)) in fcoe_ctlr_announce()
335 if (!is_zero_ether_addr(fip->dest_addr)) { in fcoe_ctlr_announce()
338 fip->lp->host->host_no, fip->dest_addr); in fcoe_ctlr_announce()
339 memset(fip->dest_addr, 0, ETH_ALEN); in fcoe_ctlr_announce()
344 fip->lp->host->host_no, sel->fcf_mac); in fcoe_ctlr_announce()
345 memcpy(fip->dest_addr, sel->fcoe_mac, ETH_ALEN); in fcoe_ctlr_announce()
346 fip->map_dest = 0; in fcoe_ctlr_announce()
349 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_announce()
359 static inline u32 fcoe_ctlr_fcoe_size(struct fcoe_ctlr *fip) in fcoe_ctlr_fcoe_size() argument
366 return fip->lp->mfs + sizeof(struct fc_frame_header) + in fcoe_ctlr_fcoe_size()
375 static void fcoe_ctlr_solicit(struct fcoe_ctlr *fip, struct fcoe_fcf *fcf) in fcoe_ctlr_solicit() argument
380 struct fip_header fip; in fcoe_ctlr_solicit() member
397 memcpy(sol->eth.h_source, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_solicit()
400 sol->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); in fcoe_ctlr_solicit()
401 sol->fip.fip_op = htons(FIP_OP_DISC); in fcoe_ctlr_solicit()
402 sol->fip.fip_subcode = FIP_SC_SOL; in fcoe_ctlr_solicit()
403 sol->fip.fip_dl_len = htons(sizeof(sol->desc) / FIP_BPW); in fcoe_ctlr_solicit()
404 sol->fip.fip_flags = htons(FIP_FL_FPMA); in fcoe_ctlr_solicit()
405 if (fip->spma) in fcoe_ctlr_solicit()
406 sol->fip.fip_flags |= htons(FIP_FL_SPMA); in fcoe_ctlr_solicit()
410 memcpy(sol->desc.mac.fd_mac, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_solicit()
414 put_unaligned_be64(fip->lp->wwnn, &sol->desc.wwnn.fd_wwn); in fcoe_ctlr_solicit()
416 fcoe_size = fcoe_ctlr_fcoe_size(fip); in fcoe_ctlr_solicit()
423 skb->priority = fip->priority; in fcoe_ctlr_solicit()
426 fip->send(fip, skb); in fcoe_ctlr_solicit()
429 fip->sol_time = jiffies; in fcoe_ctlr_solicit()
438 void fcoe_ctlr_link_up(struct fcoe_ctlr *fip) in fcoe_ctlr_link_up() argument
440 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_link_up()
441 if (fip->state == FIP_ST_NON_FIP || fip->state == FIP_ST_AUTO) { in fcoe_ctlr_link_up()
442 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_link_up()
443 fc_linkup(fip->lp); in fcoe_ctlr_link_up()
444 } else if (fip->state == FIP_ST_LINK_WAIT) { in fcoe_ctlr_link_up()
445 if (fip->mode == FIP_MODE_NON_FIP) in fcoe_ctlr_link_up()
446 fcoe_ctlr_set_state(fip, FIP_ST_NON_FIP); in fcoe_ctlr_link_up()
448 fcoe_ctlr_set_state(fip, FIP_ST_AUTO); in fcoe_ctlr_link_up()
449 switch (fip->mode) { in fcoe_ctlr_link_up()
451 LIBFCOE_FIP_DBG(fip, "invalid mode %d\n", fip->mode); in fcoe_ctlr_link_up()
454 LIBFCOE_FIP_DBG(fip, "%s", "setting AUTO mode.\n"); in fcoe_ctlr_link_up()
458 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_link_up()
459 fc_linkup(fip->lp); in fcoe_ctlr_link_up()
460 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_link_up()
463 fcoe_ctlr_vn_start(fip); in fcoe_ctlr_link_up()
464 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_link_up()
465 fc_linkup(fip->lp); in fcoe_ctlr_link_up()
469 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_link_up()
477 static void fcoe_ctlr_reset(struct fcoe_ctlr *fip) in fcoe_ctlr_reset() argument
479 fcoe_ctlr_reset_fcfs(fip); in fcoe_ctlr_reset()
480 del_timer(&fip->timer); in fcoe_ctlr_reset()
481 fip->ctlr_ka_time = 0; in fcoe_ctlr_reset()
482 fip->port_ka_time = 0; in fcoe_ctlr_reset()
483 fip->sol_time = 0; in fcoe_ctlr_reset()
484 fip->flogi_oxid = FC_XID_UNKNOWN; in fcoe_ctlr_reset()
485 fcoe_ctlr_map_dest(fip); in fcoe_ctlr_reset()
497 int fcoe_ctlr_link_down(struct fcoe_ctlr *fip) in fcoe_ctlr_link_down() argument
501 LIBFCOE_FIP_DBG(fip, "link down.\n"); in fcoe_ctlr_link_down()
502 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_link_down()
503 fcoe_ctlr_reset(fip); in fcoe_ctlr_link_down()
504 link_dropped = fip->state != FIP_ST_LINK_WAIT; in fcoe_ctlr_link_down()
505 fcoe_ctlr_set_state(fip, FIP_ST_LINK_WAIT); in fcoe_ctlr_link_down()
506 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_link_down()
509 fc_linkdown(fip->lp); in fcoe_ctlr_link_down()
528 static void fcoe_ctlr_send_keep_alive(struct fcoe_ctlr *fip, in fcoe_ctlr_send_keep_alive() argument
535 struct fip_header fip; in fcoe_ctlr_send_keep_alive() member
543 fcf = fip->sel_fcf; in fcoe_ctlr_send_keep_alive()
544 lp = fip->lp; in fcoe_ctlr_send_keep_alive()
559 kal->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); in fcoe_ctlr_send_keep_alive()
560 kal->fip.fip_op = htons(FIP_OP_CTRL); in fcoe_ctlr_send_keep_alive()
561 kal->fip.fip_subcode = FIP_SC_KEEP_ALIVE; in fcoe_ctlr_send_keep_alive()
562 kal->fip.fip_dl_len = htons((sizeof(kal->mac) + in fcoe_ctlr_send_keep_alive()
564 kal->fip.fip_flags = htons(FIP_FL_FPMA); in fcoe_ctlr_send_keep_alive()
565 if (fip->spma) in fcoe_ctlr_send_keep_alive()
566 kal->fip.fip_flags |= htons(FIP_FL_SPMA); in fcoe_ctlr_send_keep_alive()
570 memcpy(kal->mac.fd_mac, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_send_keep_alive()
575 memcpy(vn->fd_mac, fip->get_src_addr(lport), ETH_ALEN); in fcoe_ctlr_send_keep_alive()
581 skb->priority = fip->priority; in fcoe_ctlr_send_keep_alive()
584 fip->send(fip, skb); in fcoe_ctlr_send_keep_alive()
602 static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip, struct fc_lport *lport, in fcoe_ctlr_encaps() argument
607 struct fip_header fip; in fcoe_ctlr_encaps() member
624 if (fcoe_ctlr_vn_lookup(fip, d_id, cap->eth.h_dest)) in fcoe_ctlr_encaps()
628 fcf = fip->sel_fcf; in fcoe_ctlr_encaps()
632 fip_flags &= fip->spma ? FIP_FL_SPMA | FIP_FL_FPMA : in fcoe_ctlr_encaps()
638 memcpy(cap->eth.h_source, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_encaps()
641 cap->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); in fcoe_ctlr_encaps()
642 cap->fip.fip_op = htons(FIP_OP_LS); in fcoe_ctlr_encaps()
644 cap->fip.fip_subcode = FIP_SC_REP; in fcoe_ctlr_encaps()
646 cap->fip.fip_subcode = FIP_SC_REQ; in fcoe_ctlr_encaps()
647 cap->fip.fip_flags = htons(fip_flags); in fcoe_ctlr_encaps()
658 memcpy(mac->fd_mac, fip->get_src_addr(lport), ETH_ALEN); in fcoe_ctlr_encaps()
659 } else if (fip->mode == FIP_MODE_VN2VN) { in fcoe_ctlr_encaps()
661 hton24(mac->fd_mac + 3, fip->port_id); in fcoe_ctlr_encaps()
663 LIBFCOE_FIP_DBG(fip, "FLOGI/FDISC sent with SPMA\n"); in fcoe_ctlr_encaps()
664 memcpy(mac->fd_mac, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_encaps()
666 LIBFCOE_FIP_DBG(fip, "FLOGI/FDISC sent with FPMA\n"); in fcoe_ctlr_encaps()
670 cap->fip.fip_dl_len = htons(dlen / FIP_BPW); in fcoe_ctlr_encaps()
673 skb->priority = fip->priority; in fcoe_ctlr_encaps()
695 int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport, in fcoe_ctlr_els_send() argument
708 if (op == ELS_FLOGI && fip->mode != FIP_MODE_VN2VN) { in fcoe_ctlr_els_send()
709 old_xid = fip->flogi_oxid; in fcoe_ctlr_els_send()
710 fip->flogi_oxid = ntohs(fh->fh_ox_id); in fcoe_ctlr_els_send()
711 if (fip->state == FIP_ST_AUTO) { in fcoe_ctlr_els_send()
713 fip->flogi_count = 0; in fcoe_ctlr_els_send()
714 fip->flogi_count++; in fcoe_ctlr_els_send()
715 if (fip->flogi_count < 3) in fcoe_ctlr_els_send()
717 fcoe_ctlr_map_dest(fip); in fcoe_ctlr_els_send()
720 if (fip->state == FIP_ST_NON_FIP) in fcoe_ctlr_els_send()
721 fcoe_ctlr_map_dest(fip); in fcoe_ctlr_els_send()
724 if (fip->state == FIP_ST_NON_FIP) in fcoe_ctlr_els_send()
726 if (!fip->sel_fcf && fip->mode != FIP_MODE_VN2VN) in fcoe_ctlr_els_send()
731 if (fip->mode == FIP_MODE_VN2VN) in fcoe_ctlr_els_send()
733 spin_lock_bh(&fip->ctlr_lock); in fcoe_ctlr_els_send()
734 kfree_skb(fip->flogi_req); in fcoe_ctlr_els_send()
735 fip->flogi_req = skb; in fcoe_ctlr_els_send()
736 fip->flogi_req_send = 1; in fcoe_ctlr_els_send()
737 spin_unlock_bh(&fip->ctlr_lock); in fcoe_ctlr_els_send()
738 schedule_work(&fip->timer_work); in fcoe_ctlr_els_send()
746 if (fip->mode == FIP_MODE_VN2VN) { in fcoe_ctlr_els_send()
747 if (fip->state != FIP_ST_VNMP_UP) in fcoe_ctlr_els_send()
752 if (fip->state != FIP_ST_ENABLED) in fcoe_ctlr_els_send()
767 if (fip->state == FIP_ST_NON_FIP) { in fcoe_ctlr_els_send()
768 if (fip->flogi_oxid == FC_XID_UNKNOWN) in fcoe_ctlr_els_send()
770 fip->flogi_oxid = FC_XID_UNKNOWN; in fcoe_ctlr_els_send()
772 fip->update_mac(lport, mac); in fcoe_ctlr_els_send()
781 if (fip->state != FIP_ST_ENABLED && in fcoe_ctlr_els_send()
782 fip->state != FIP_ST_VNMP_UP) in fcoe_ctlr_els_send()
786 LIBFCOE_FIP_DBG(fip, "els_send op %u d_id %x\n", in fcoe_ctlr_els_send()
788 if (fcoe_ctlr_encaps(fip, lport, op, skb, ntoh24(fh->fh_d_id))) in fcoe_ctlr_els_send()
790 fip->send(fip, skb); in fcoe_ctlr_els_send()
793 LIBFCOE_FIP_DBG(fip, "drop els_send op %u d_id %x\n", in fcoe_ctlr_els_send()
817 static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip) in fcoe_ctlr_age_fcfs() argument
829 stats = per_cpu_ptr(fip->lp->stats, get_cpu()); in fcoe_ctlr_age_fcfs()
831 list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { in fcoe_ctlr_age_fcfs()
833 if (fip->sel_fcf == fcf) { in fcoe_ctlr_age_fcfs()
839 fip->lp->host->host_no, fcf->fabric_name, in fcoe_ctlr_age_fcfs()
847 if (fip->sel_fcf == fcf) in fcoe_ctlr_age_fcfs()
848 fip->sel_fcf = NULL; in fcoe_ctlr_age_fcfs()
872 if (sel_time && !fip->sel_fcf && !fip->sel_time) { in fcoe_ctlr_age_fcfs()
874 fip->sel_time = sel_time; in fcoe_ctlr_age_fcfs()
889 static int fcoe_ctlr_parse_adv(struct fcoe_ctlr *fip, in fcoe_ctlr_parse_adv() argument
926 LIBFCOE_FIP_DBG(fip, "Duplicate Critical " in fcoe_ctlr_parse_adv()
945 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_parse_adv()
986 LIBFCOE_FIP_DBG(fip, "unexpected descriptor type %x " in fcoe_ctlr_parse_adv()
1001 LIBFCOE_FIP_DBG(fip, "adv missing descriptors mask %x\n", in fcoe_ctlr_parse_adv()
1008 LIBFCOE_FIP_DBG(fip, "FIP length error in descriptor type %x len %zu\n", in fcoe_ctlr_parse_adv()
1018 static void fcoe_ctlr_recv_adv(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_recv_adv() argument
1028 if (fcoe_ctlr_parse_adv(fip, skb, &new)) in fcoe_ctlr_recv_adv()
1031 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_adv()
1032 first = list_empty(&fip->fcfs); in fcoe_ctlr_recv_adv()
1033 list_for_each_entry(fcf, &fip->fcfs, list) { in fcoe_ctlr_recv_adv()
1043 if (fip->fcf_count >= FCOE_CTLR_FCF_LIMIT) in fcoe_ctlr_recv_adv()
1051 fcf->fip = fip; in fcoe_ctlr_recv_adv()
1071 if (fcf == fip->sel_fcf && !fcf->fd_flags) { in fcoe_ctlr_recv_adv()
1072 fip->ctlr_ka_time -= fcf->fka_period; in fcoe_ctlr_recv_adv()
1073 fip->ctlr_ka_time += new.fka_period; in fcoe_ctlr_recv_adv()
1074 if (time_before(fip->ctlr_ka_time, fip->timer.expires)) in fcoe_ctlr_recv_adv()
1075 mod_timer(&fip->timer, fip->ctlr_ka_time); in fcoe_ctlr_recv_adv()
1084 LIBFCOE_FIP_DBG(fip, "New FCF fab %16.16llx mac %pM\n", in fcoe_ctlr_recv_adv()
1092 fcoe_ctlr_solicit(fip, fcf); in fcoe_ctlr_recv_adv()
1100 if (first && time_after(jiffies, fip->sol_time + sol_tov)) in fcoe_ctlr_recv_adv()
1101 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_recv_adv()
1110 list_move(&fcf->list, &fip->fcfs); in fcoe_ctlr_recv_adv()
1116 if (mtu_valid && !fip->sel_fcf && !fip->sel_time && in fcoe_ctlr_recv_adv()
1118 fip->sel_time = jiffies + in fcoe_ctlr_recv_adv()
1120 if (!timer_pending(&fip->timer) || in fcoe_ctlr_recv_adv()
1121 time_before(fip->sel_time, fip->timer.expires)) in fcoe_ctlr_recv_adv()
1122 mod_timer(&fip->timer, fip->sel_time); in fcoe_ctlr_recv_adv()
1126 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_adv()
1134 static void fcoe_ctlr_recv_els(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_recv_els() argument
1136 struct fc_lport *lport = fip->lp; in fcoe_ctlr_recv_els()
1173 LIBFCOE_FIP_DBG(fip, "Duplicate Critical " in fcoe_ctlr_recv_els()
1181 sel = fip->sel_fcf; in fcoe_ctlr_recv_els()
1183 LIBFCOE_FIP_DBG(fip, "FIP descriptors " in fcoe_ctlr_recv_els()
1213 LIBFCOE_FIP_DBG(fip, "FIP descriptors " in fcoe_ctlr_recv_els()
1227 LIBFCOE_FIP_DBG(fip, "unexpected descriptor type %x " in fcoe_ctlr_recv_els()
1233 LIBFCOE_FIP_DBG(fip, "FIP descriptors " in fcoe_ctlr_recv_els()
1248 sub == FIP_SC_REP && fip->mode != FIP_MODE_VN2VN) { in fcoe_ctlr_recv_els()
1251 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_recv_els()
1258 if (fip->flogi_oxid == ntohs(fh->fh_ox_id)) { in fcoe_ctlr_recv_els()
1259 fip->flogi_oxid = FC_XID_UNKNOWN; in fcoe_ctlr_recv_els()
1261 fcoe_ctlr_announce(fip); in fcoe_ctlr_recv_els()
1264 !fcoe_ctlr_flogi_retry(fip)) in fcoe_ctlr_recv_els()
1270 LIBFCOE_FIP_DBG(fip, "Missing critical descriptors " in fcoe_ctlr_recv_els()
1296 LIBFCOE_FIP_DBG(fip, "FIP length error in descriptor type %x len %zu\n", in fcoe_ctlr_recv_els()
1310 static void fcoe_ctlr_recv_clr_vlink(struct fcoe_ctlr *fip, in fcoe_ctlr_recv_clr_vlink() argument
1319 struct fcoe_fcf *fcf = fip->sel_fcf; in fcoe_ctlr_recv_clr_vlink()
1320 struct fc_lport *lport = fip->lp; in fcoe_ctlr_recv_clr_vlink()
1329 LIBFCOE_FIP_DBG(fip, "Clear Virtual Link received\n"); in fcoe_ctlr_recv_clr_vlink()
1336 LIBFCOE_FIP_DBG(fip, "Resetting fcoe_ctlr as FCF has not been " in fcoe_ctlr_recv_clr_vlink()
1338 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1339 fcoe_ctlr_reset(fip); in fcoe_ctlr_recv_clr_vlink()
1340 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1350 LIBFCOE_FIP_DBG(fip, "Dropping CVL due to source address " in fcoe_ctlr_recv_clr_vlink()
1360 LIBFCOE_FIP_DBG(fip, "lport not logged in, resoliciting\n"); in fcoe_ctlr_recv_clr_vlink()
1361 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1362 fcoe_ctlr_reset(fip); in fcoe_ctlr_recv_clr_vlink()
1363 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1364 fc_lport_reset(fip->lp); in fcoe_ctlr_recv_clr_vlink()
1365 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_recv_clr_vlink()
1398 LIBFCOE_FIP_DBG(fip, "Duplicate Critical " in fcoe_ctlr_recv_clr_vlink()
1427 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1431 fcoe_ctlr_reset(fip); in fcoe_ctlr_recv_clr_vlink()
1432 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1449 LIBFCOE_FIP_DBG(fip, "missing descriptors mask %x\n", in fcoe_ctlr_recv_clr_vlink()
1452 LIBFCOE_FIP_DBG(fip, "CVL: no Vx_Port descriptor found\n"); in fcoe_ctlr_recv_clr_vlink()
1457 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1460 fcoe_ctlr_reset(fip); in fcoe_ctlr_recv_clr_vlink()
1461 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1468 fc_lport_reset(fip->lp); in fcoe_ctlr_recv_clr_vlink()
1469 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_recv_clr_vlink()
1473 LIBFCOE_FIP_DBG(fip, "performing Clear Virtual Link\n"); in fcoe_ctlr_recv_clr_vlink()
1485 if (!ether_addr_equal(fip->get_src_addr(vn_port), in fcoe_ctlr_recv_clr_vlink()
1502 fc_lport_reset(fip->lp); in fcoe_ctlr_recv_clr_vlink()
1503 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_recv_clr_vlink()
1518 void fcoe_ctlr_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_recv() argument
1523 skb_queue_tail(&fip->fip_recv_list, skb); in fcoe_ctlr_recv()
1524 schedule_work(&fip->recv_work); in fcoe_ctlr_recv()
1535 static int fcoe_ctlr_recv_handler(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_recv_handler() argument
1549 if (fip->mode == FIP_MODE_VN2VN) { in fcoe_ctlr_recv_handler()
1550 if (!ether_addr_equal(eh->h_dest, fip->ctl_src_addr) && in fcoe_ctlr_recv_handler()
1554 } else if (!ether_addr_equal(eh->h_dest, fip->ctl_src_addr) && in fcoe_ctlr_recv_handler()
1566 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_handler()
1567 state = fip->state; in fcoe_ctlr_recv_handler()
1569 fip->map_dest = 0; in fcoe_ctlr_recv_handler()
1570 fcoe_ctlr_set_state(fip, FIP_ST_ENABLED); in fcoe_ctlr_recv_handler()
1572 LIBFCOE_FIP_DBG(fip, "Using FIP mode\n"); in fcoe_ctlr_recv_handler()
1574 fip_vlan_resp = fip->fip_resp; in fcoe_ctlr_recv_handler()
1575 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_handler()
1577 if (fip->mode == FIP_MODE_VN2VN && op == FIP_OP_VN2VN) in fcoe_ctlr_recv_handler()
1578 return fcoe_ctlr_vn_recv(fip, skb); in fcoe_ctlr_recv_handler()
1581 LIBFCOE_FIP_DBG(fip, "fip vlan discovery\n"); in fcoe_ctlr_recv_handler()
1582 return fcoe_ctlr_vlan_recv(fip, skb); in fcoe_ctlr_recv_handler()
1590 fcoe_ctlr_recv_els(fip, skb); /* consumes skb */ in fcoe_ctlr_recv_handler()
1598 fcoe_ctlr_recv_adv(fip, skb); in fcoe_ctlr_recv_handler()
1600 fcoe_ctlr_recv_clr_vlink(fip, skb); in fcoe_ctlr_recv_handler()
1621 static struct fcoe_fcf *fcoe_ctlr_select(struct fcoe_ctlr *fip) in fcoe_ctlr_select() argument
1624 struct fcoe_fcf *best = fip->sel_fcf; in fcoe_ctlr_select()
1626 list_for_each_entry(fcf, &fip->fcfs, list) { in fcoe_ctlr_select()
1627 LIBFCOE_FIP_DBG(fip, "consider FCF fab %16.16llx " in fcoe_ctlr_select()
1634 LIBFCOE_FIP_DBG(fip, "FCF for fab %16.16llx " in fcoe_ctlr_select()
1647 LIBFCOE_FIP_DBG(fip, "Conflicting fabric, VFID, " in fcoe_ctlr_select()
1652 fip->sel_fcf = best; in fcoe_ctlr_select()
1654 LIBFCOE_FIP_DBG(fip, "using FCF mac %pM\n", best->fcf_mac); in fcoe_ctlr_select()
1655 fip->port_ka_time = jiffies + in fcoe_ctlr_select()
1657 fip->ctlr_ka_time = jiffies + best->fka_period; in fcoe_ctlr_select()
1658 if (time_before(fip->ctlr_ka_time, fip->timer.expires)) in fcoe_ctlr_select()
1659 mod_timer(&fip->timer, fip->ctlr_ka_time); in fcoe_ctlr_select()
1673 static int fcoe_ctlr_flogi_send_locked(struct fcoe_ctlr *fip) in fcoe_ctlr_flogi_send_locked() argument
1680 skb_orig = fip->flogi_req; in fcoe_ctlr_flogi_send_locked()
1690 fip->flogi_req = NULL; in fcoe_ctlr_flogi_send_locked()
1693 error = fcoe_ctlr_encaps(fip, fip->lp, FIP_DT_FLOGI, skb, in fcoe_ctlr_flogi_send_locked()
1699 fip->send(fip, skb); in fcoe_ctlr_flogi_send_locked()
1700 fip->sel_fcf->flogi_sent = 1; in fcoe_ctlr_flogi_send_locked()
1711 static int fcoe_ctlr_flogi_retry(struct fcoe_ctlr *fip) in fcoe_ctlr_flogi_retry() argument
1716 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_flogi_retry()
1717 spin_lock_bh(&fip->ctlr_lock); in fcoe_ctlr_flogi_retry()
1718 LIBFCOE_FIP_DBG(fip, "re-sending FLOGI - reselect\n"); in fcoe_ctlr_flogi_retry()
1719 fcf = fcoe_ctlr_select(fip); in fcoe_ctlr_flogi_retry()
1721 kfree_skb(fip->flogi_req); in fcoe_ctlr_flogi_retry()
1722 fip->flogi_req = NULL; in fcoe_ctlr_flogi_retry()
1725 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_flogi_retry()
1726 error = fcoe_ctlr_flogi_send_locked(fip); in fcoe_ctlr_flogi_retry()
1728 spin_unlock_bh(&fip->ctlr_lock); in fcoe_ctlr_flogi_retry()
1729 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_flogi_retry()
1742 static void fcoe_ctlr_flogi_send(struct fcoe_ctlr *fip) in fcoe_ctlr_flogi_send() argument
1746 spin_lock_bh(&fip->ctlr_lock); in fcoe_ctlr_flogi_send()
1747 fcf = fip->sel_fcf; in fcoe_ctlr_flogi_send()
1748 if (!fcf || !fip->flogi_req_send) in fcoe_ctlr_flogi_send()
1751 LIBFCOE_FIP_DBG(fip, "sending FLOGI\n"); in fcoe_ctlr_flogi_send()
1758 LIBFCOE_FIP_DBG(fip, "sending FLOGI - reselect\n"); in fcoe_ctlr_flogi_send()
1759 fcf = fcoe_ctlr_select(fip); in fcoe_ctlr_flogi_send()
1761 LIBFCOE_FIP_DBG(fip, "sending FLOGI - clearing\n"); in fcoe_ctlr_flogi_send()
1762 list_for_each_entry(fcf, &fip->fcfs, list) in fcoe_ctlr_flogi_send()
1764 fcf = fcoe_ctlr_select(fip); in fcoe_ctlr_flogi_send()
1768 fcoe_ctlr_flogi_send_locked(fip); in fcoe_ctlr_flogi_send()
1769 fip->flogi_req_send = 0; in fcoe_ctlr_flogi_send()
1771 LIBFCOE_FIP_DBG(fip, "No FCF selected - defer send\n"); in fcoe_ctlr_flogi_send()
1773 spin_unlock_bh(&fip->ctlr_lock); in fcoe_ctlr_flogi_send()
1782 struct fcoe_ctlr *fip = from_timer(fip, t, timer); in fcoe_ctlr_timeout() local
1784 schedule_work(&fip->timer_work); in fcoe_ctlr_timeout()
1796 struct fcoe_ctlr *fip; in fcoe_ctlr_timer_work() local
1806 fip = container_of(work, struct fcoe_ctlr, timer_work); in fcoe_ctlr_timer_work()
1807 if (fip->mode == FIP_MODE_VN2VN) in fcoe_ctlr_timer_work()
1808 return fcoe_ctlr_vn_timeout(fip); in fcoe_ctlr_timer_work()
1809 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_timer_work()
1810 if (fip->state == FIP_ST_DISABLED) { in fcoe_ctlr_timer_work()
1811 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_timer_work()
1815 fcf = fip->sel_fcf; in fcoe_ctlr_timer_work()
1816 next_timer = fcoe_ctlr_age_fcfs(fip); in fcoe_ctlr_timer_work()
1818 sel = fip->sel_fcf; in fcoe_ctlr_timer_work()
1819 if (!sel && fip->sel_time) { in fcoe_ctlr_timer_work()
1820 if (time_after_eq(jiffies, fip->sel_time)) { in fcoe_ctlr_timer_work()
1821 sel = fcoe_ctlr_select(fip); in fcoe_ctlr_timer_work()
1822 fip->sel_time = 0; in fcoe_ctlr_timer_work()
1823 } else if (time_after(next_timer, fip->sel_time)) in fcoe_ctlr_timer_work()
1824 next_timer = fip->sel_time; in fcoe_ctlr_timer_work()
1827 if (sel && fip->flogi_req_send) in fcoe_ctlr_timer_work()
1828 fcoe_ctlr_flogi_send(fip); in fcoe_ctlr_timer_work()
1833 if (time_after_eq(jiffies, fip->ctlr_ka_time)) { in fcoe_ctlr_timer_work()
1834 fip->ctlr_ka_time = jiffies + sel->fka_period; in fcoe_ctlr_timer_work()
1837 if (time_after(next_timer, fip->ctlr_ka_time)) in fcoe_ctlr_timer_work()
1838 next_timer = fip->ctlr_ka_time; in fcoe_ctlr_timer_work()
1840 if (time_after_eq(jiffies, fip->port_ka_time)) { in fcoe_ctlr_timer_work()
1841 fip->port_ka_time = jiffies + in fcoe_ctlr_timer_work()
1845 if (time_after(next_timer, fip->port_ka_time)) in fcoe_ctlr_timer_work()
1846 next_timer = fip->port_ka_time; in fcoe_ctlr_timer_work()
1848 if (!list_empty(&fip->fcfs)) in fcoe_ctlr_timer_work()
1849 mod_timer(&fip->timer, next_timer); in fcoe_ctlr_timer_work()
1850 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_timer_work()
1853 fc_lport_reset(fip->lp); in fcoe_ctlr_timer_work()
1855 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_timer_work()
1859 fcoe_ctlr_send_keep_alive(fip, NULL, 0, fip->ctl_src_addr); in fcoe_ctlr_timer_work()
1862 mutex_lock(&fip->lp->lp_mutex); in fcoe_ctlr_timer_work()
1863 mac = fip->get_src_addr(fip->lp); in fcoe_ctlr_timer_work()
1864 fcoe_ctlr_send_keep_alive(fip, fip->lp, 1, mac); in fcoe_ctlr_timer_work()
1865 list_for_each_entry(vport, &fip->lp->vports, list) { in fcoe_ctlr_timer_work()
1866 mac = fip->get_src_addr(vport); in fcoe_ctlr_timer_work()
1867 fcoe_ctlr_send_keep_alive(fip, vport, 1, mac); in fcoe_ctlr_timer_work()
1869 mutex_unlock(&fip->lp->lp_mutex); in fcoe_ctlr_timer_work()
1879 struct fcoe_ctlr *fip; in fcoe_ctlr_recv_work() local
1882 fip = container_of(recv_work, struct fcoe_ctlr, recv_work); in fcoe_ctlr_recv_work()
1883 while ((skb = skb_dequeue(&fip->fip_recv_list))) in fcoe_ctlr_recv_work()
1884 fcoe_ctlr_recv_handler(fip, skb); in fcoe_ctlr_recv_work()
1902 int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *fip, struct fc_lport *lport, in fcoe_ctlr_recv_flogi() argument
1916 fip->flogi_oxid == ntohs(fh->fh_ox_id)) { in fcoe_ctlr_recv_flogi()
1918 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_flogi()
1919 if (fip->state != FIP_ST_AUTO && fip->state != FIP_ST_NON_FIP) { in fcoe_ctlr_recv_flogi()
1920 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_flogi()
1923 fcoe_ctlr_set_state(fip, FIP_ST_NON_FIP); in fcoe_ctlr_recv_flogi()
1924 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_recv_flogi()
1934 fcoe_ctlr_map_dest(fip); in fcoe_ctlr_recv_flogi()
1936 memcpy(fip->dest_addr, sa, ETH_ALEN); in fcoe_ctlr_recv_flogi()
1937 fip->map_dest = 0; in fcoe_ctlr_recv_flogi()
1939 fip->flogi_oxid = FC_XID_UNKNOWN; in fcoe_ctlr_recv_flogi()
1940 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_flogi()
1946 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_flogi()
1947 if (fip->state == FIP_ST_AUTO || fip->state == FIP_ST_NON_FIP) { in fcoe_ctlr_recv_flogi()
1948 memcpy(fip->dest_addr, sa, ETH_ALEN); in fcoe_ctlr_recv_flogi()
1949 fip->map_dest = 0; in fcoe_ctlr_recv_flogi()
1950 if (fip->state == FIP_ST_AUTO) in fcoe_ctlr_recv_flogi()
1951 LIBFCOE_FIP_DBG(fip, "received non-FIP FLOGI. " in fcoe_ctlr_recv_flogi()
1953 fcoe_ctlr_set_state(fip, FIP_ST_NON_FIP); in fcoe_ctlr_recv_flogi()
1955 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_flogi()
2018 static void fcoe_ctlr_vn_send(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_send() argument
2025 struct fip_header fip; in fcoe_ctlr_vn_send() member
2056 hton24(frame->eth.h_source + 3, fip->port_id); in fcoe_ctlr_vn_send()
2058 memcpy(frame->eth.h_source, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_vn_send()
2062 frame->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); in fcoe_ctlr_vn_send()
2063 frame->fip.fip_op = htons(FIP_OP_VN2VN); in fcoe_ctlr_vn_send()
2064 frame->fip.fip_subcode = sub; in fcoe_ctlr_vn_send()
2065 frame->fip.fip_dl_len = htons(dlen / FIP_BPW); in fcoe_ctlr_vn_send()
2069 memcpy(frame->mac.fd_mac, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_vn_send()
2073 put_unaligned_be64(fip->lp->wwnn, &frame->wwnn.fd_wwn); in fcoe_ctlr_vn_send()
2078 hton24(frame->vn.fd_mac + 3, fip->port_id); in fcoe_ctlr_vn_send()
2079 hton24(frame->vn.fd_fc_id, fip->port_id); in fcoe_ctlr_vn_send()
2080 put_unaligned_be64(fip->lp->wwpn, &frame->vn.fd_wwpn); in fcoe_ctlr_vn_send()
2090 ff->fd_fts = fip->lp->fcts; in fcoe_ctlr_vn_send()
2093 if (fip->lp->service_params & FCP_SPPF_INIT_FCN) in fcoe_ctlr_vn_send()
2095 if (fip->lp->service_params & FCP_SPPF_TARG_FCN) in fcoe_ctlr_vn_send()
2103 size->fd_size = htons(fcoe_ctlr_fcoe_size(fip)); in fcoe_ctlr_vn_send()
2108 skb->priority = fip->priority; in fcoe_ctlr_vn_send()
2112 fip->send(fip, skb); in fcoe_ctlr_vn_send()
2127 struct fcoe_ctlr *fip = lport->disc.priv; in fcoe_ctlr_vn_rport_callback() local
2130 LIBFCOE_FIP_DBG(fip, "vn_rport_callback %x event %d\n", in fcoe_ctlr_vn_rport_callback()
2133 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_vn_rport_callback()
2143 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_vn_rport_callback()
2152 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_vn_rport_callback()
2189 struct fcoe_ctlr *fip = lport->disc.priv; in fcoe_ctlr_disc_stop() local
2191 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_disc_stop()
2193 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_disc_stop()
2216 static void fcoe_ctlr_vn_restart(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_restart() argument
2221 fcoe_ctlr_disc_stop_locked(fip->lp); in fcoe_ctlr_vn_restart()
2230 port_id = fip->port_id; in fcoe_ctlr_vn_restart()
2231 if (fip->probe_tries) in fcoe_ctlr_vn_restart()
2232 port_id = prandom_u32_state(&fip->rnd_state) & 0xffff; in fcoe_ctlr_vn_restart()
2234 port_id = fip->lp->wwpn & 0xffff; in fcoe_ctlr_vn_restart()
2237 fip->port_id = port_id; in fcoe_ctlr_vn_restart()
2239 if (fip->probe_tries < FIP_VN_RLIM_COUNT) { in fcoe_ctlr_vn_restart()
2240 fip->probe_tries++; in fcoe_ctlr_vn_restart()
2244 mod_timer(&fip->timer, jiffies + msecs_to_jiffies(wait)); in fcoe_ctlr_vn_restart()
2245 fcoe_ctlr_set_state(fip, FIP_ST_VNMP_START); in fcoe_ctlr_vn_restart()
2254 static void fcoe_ctlr_vn_start(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_start() argument
2256 fip->probe_tries = 0; in fcoe_ctlr_vn_start()
2257 prandom_seed_state(&fip->rnd_state, fip->lp->wwpn); in fcoe_ctlr_vn_start()
2258 fcoe_ctlr_vn_restart(fip); in fcoe_ctlr_vn_start()
2270 static int fcoe_ctlr_vn_parse(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_parse() argument
2304 LIBFCOE_FIP_DBG(fip, "vn_parse unknown subcode %u\n", sub); in fcoe_ctlr_vn_parse()
2321 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_vn_parse()
2337 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_vn_parse()
2371 LIBFCOE_FIP_DBG(fip, "unexpected descriptor type %x " in fcoe_ctlr_vn_parse()
2384 LIBFCOE_FIP_DBG(fip, "FIP length error in descriptor type %x len %zu\n", in fcoe_ctlr_vn_parse()
2395 static void fcoe_ctlr_vn_send_claim(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_send_claim() argument
2397 fcoe_ctlr_vn_send(fip, FIP_SC_VN_CLAIM_NOTIFY, fcoe_all_vn2vn, 0); in fcoe_ctlr_vn_send_claim()
2398 fip->sol_time = jiffies; in fcoe_ctlr_vn_send_claim()
2408 static void fcoe_ctlr_vn_probe_req(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_probe_req() argument
2411 if (frport->rdata.ids.port_id != fip->port_id) in fcoe_ctlr_vn_probe_req()
2414 switch (fip->state) { in fcoe_ctlr_vn_probe_req()
2417 LIBFCOE_FIP_DBG(fip, "vn_probe_req: send reply, state %x\n", in fcoe_ctlr_vn_probe_req()
2418 fip->state); in fcoe_ctlr_vn_probe_req()
2419 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REP, in fcoe_ctlr_vn_probe_req()
2431 if (fip->lp->wwpn > frport->rdata.ids.port_name && in fcoe_ctlr_vn_probe_req()
2433 LIBFCOE_FIP_DBG(fip, "vn_probe_req: " in fcoe_ctlr_vn_probe_req()
2435 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REP, in fcoe_ctlr_vn_probe_req()
2441 LIBFCOE_FIP_DBG(fip, "vn_probe_req: " in fcoe_ctlr_vn_probe_req()
2443 fcoe_ctlr_vn_restart(fip); in fcoe_ctlr_vn_probe_req()
2446 LIBFCOE_FIP_DBG(fip, "vn_probe_req: ignore state %x\n", in fcoe_ctlr_vn_probe_req()
2447 fip->state); in fcoe_ctlr_vn_probe_req()
2459 static void fcoe_ctlr_vn_probe_reply(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_probe_reply() argument
2462 if (frport->rdata.ids.port_id != fip->port_id) in fcoe_ctlr_vn_probe_reply()
2464 switch (fip->state) { in fcoe_ctlr_vn_probe_reply()
2469 LIBFCOE_FIP_DBG(fip, "vn_probe_reply: restart state %x\n", in fcoe_ctlr_vn_probe_reply()
2470 fip->state); in fcoe_ctlr_vn_probe_reply()
2471 fcoe_ctlr_vn_restart(fip); in fcoe_ctlr_vn_probe_reply()
2474 LIBFCOE_FIP_DBG(fip, "vn_probe_reply: send claim notify\n"); in fcoe_ctlr_vn_probe_reply()
2475 fcoe_ctlr_vn_send_claim(fip); in fcoe_ctlr_vn_probe_reply()
2489 static void fcoe_ctlr_vn_add(struct fcoe_ctlr *fip, struct fcoe_rport *new) in fcoe_ctlr_vn_add() argument
2491 struct fc_lport *lport = fip->lp; in fcoe_ctlr_vn_add()
2498 if (port_id == fip->port_id) in fcoe_ctlr_vn_add()
2519 LIBFCOE_FIP_DBG(fip, "vn_add rport logoff %6.6x\n", port_id); in fcoe_ctlr_vn_add()
2528 LIBFCOE_FIP_DBG(fip, "vn_add rport %6.6x %s state %d\n", in fcoe_ctlr_vn_add()
2547 static int fcoe_ctlr_vn_lookup(struct fcoe_ctlr *fip, u32 port_id, u8 *mac) in fcoe_ctlr_vn_lookup() argument
2549 struct fc_lport *lport = fip->lp; in fcoe_ctlr_vn_lookup()
2571 static void fcoe_ctlr_vn_claim_notify(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_claim_notify() argument
2575 LIBFCOE_FIP_DBG(fip, "send probe req for P2P/REC\n"); in fcoe_ctlr_vn_claim_notify()
2576 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REQ, fcoe_all_vn2vn, 0); in fcoe_ctlr_vn_claim_notify()
2579 switch (fip->state) { in fcoe_ctlr_vn_claim_notify()
2583 if (new->rdata.ids.port_id == fip->port_id) { in fcoe_ctlr_vn_claim_notify()
2584 LIBFCOE_FIP_DBG(fip, "vn_claim_notify: " in fcoe_ctlr_vn_claim_notify()
2586 fip->state); in fcoe_ctlr_vn_claim_notify()
2587 fcoe_ctlr_vn_restart(fip); in fcoe_ctlr_vn_claim_notify()
2592 if (new->rdata.ids.port_id == fip->port_id) { in fcoe_ctlr_vn_claim_notify()
2593 if (new->rdata.ids.port_name > fip->lp->wwpn) { in fcoe_ctlr_vn_claim_notify()
2594 LIBFCOE_FIP_DBG(fip, "vn_claim_notify: " in fcoe_ctlr_vn_claim_notify()
2596 fcoe_ctlr_vn_restart(fip); in fcoe_ctlr_vn_claim_notify()
2599 LIBFCOE_FIP_DBG(fip, "vn_claim_notify: " in fcoe_ctlr_vn_claim_notify()
2601 fcoe_ctlr_vn_send_claim(fip); in fcoe_ctlr_vn_claim_notify()
2604 LIBFCOE_FIP_DBG(fip, "vn_claim_notify: send reply to %x\n", in fcoe_ctlr_vn_claim_notify()
2606 fcoe_ctlr_vn_send(fip, FIP_SC_VN_CLAIM_REP, new->enode_mac, in fcoe_ctlr_vn_claim_notify()
2608 fcoe_ctlr_fcoe_size(fip))); in fcoe_ctlr_vn_claim_notify()
2609 fcoe_ctlr_vn_add(fip, new); in fcoe_ctlr_vn_claim_notify()
2612 LIBFCOE_FIP_DBG(fip, "vn_claim_notify: " in fcoe_ctlr_vn_claim_notify()
2626 static void fcoe_ctlr_vn_claim_resp(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_claim_resp() argument
2629 LIBFCOE_FIP_DBG(fip, "claim resp from from rport %x - state %s\n", in fcoe_ctlr_vn_claim_resp()
2630 new->rdata.ids.port_id, fcoe_ctlr_state(fip->state)); in fcoe_ctlr_vn_claim_resp()
2631 if (fip->state == FIP_ST_VNMP_UP || fip->state == FIP_ST_VNMP_CLAIM) in fcoe_ctlr_vn_claim_resp()
2632 fcoe_ctlr_vn_add(fip, new); in fcoe_ctlr_vn_claim_resp()
2642 static void fcoe_ctlr_vn_beacon(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_beacon() argument
2645 struct fc_lport *lport = fip->lp; in fcoe_ctlr_vn_beacon()
2650 LIBFCOE_FIP_DBG(fip, "p2p beacon while in vn2vn mode\n"); in fcoe_ctlr_vn_beacon()
2651 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REQ, fcoe_all_vn2vn, 0); in fcoe_ctlr_vn_beacon()
2660 LIBFCOE_FIP_DBG(fip, "beacon from rport %x\n", in fcoe_ctlr_vn_beacon()
2662 if (!frport->time && fip->state == FIP_ST_VNMP_UP) { in fcoe_ctlr_vn_beacon()
2663 LIBFCOE_FIP_DBG(fip, "beacon expired " in fcoe_ctlr_vn_beacon()
2673 if (fip->state != FIP_ST_VNMP_UP) in fcoe_ctlr_vn_beacon()
2681 LIBFCOE_FIP_DBG(fip, "beacon from new rport %x. sending claim notify\n", in fcoe_ctlr_vn_beacon()
2684 fip->sol_time + msecs_to_jiffies(FIP_VN_ANN_WAIT))) in fcoe_ctlr_vn_beacon()
2685 fcoe_ctlr_vn_send_claim(fip); in fcoe_ctlr_vn_beacon()
2696 static unsigned long fcoe_ctlr_vn_age(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_age() argument
2698 struct fc_lport *lport = fip->lp; in fcoe_ctlr_vn_age()
2718 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_vn_age()
2738 static int fcoe_ctlr_vn_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_vn_recv() argument
2748 if (fip->lp->vlan) in fcoe_ctlr_vn_recv()
2751 if (vlan_id && vlan_id != fip->lp->vlan) { in fcoe_ctlr_vn_recv()
2752 LIBFCOE_FIP_DBG(fip, "vn_recv drop frame sub %x vlan %d\n", in fcoe_ctlr_vn_recv()
2758 rc = fcoe_ctlr_vn_parse(fip, skb, &frport); in fcoe_ctlr_vn_recv()
2760 LIBFCOE_FIP_DBG(fip, "vn_recv vn_parse error %d\n", rc); in fcoe_ctlr_vn_recv()
2764 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_vn_recv()
2767 fcoe_ctlr_vn_probe_req(fip, &frport); in fcoe_ctlr_vn_recv()
2770 fcoe_ctlr_vn_probe_reply(fip, &frport); in fcoe_ctlr_vn_recv()
2773 fcoe_ctlr_vn_claim_notify(fip, &frport); in fcoe_ctlr_vn_recv()
2776 fcoe_ctlr_vn_claim_resp(fip, &frport); in fcoe_ctlr_vn_recv()
2779 fcoe_ctlr_vn_beacon(fip, &frport); in fcoe_ctlr_vn_recv()
2782 LIBFCOE_FIP_DBG(fip, "vn_recv unknown subcode %d\n", sub); in fcoe_ctlr_vn_recv()
2786 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_vn_recv()
2801 static int fcoe_ctlr_vlan_parse(struct fcoe_ctlr *fip, in fcoe_ctlr_vlan_parse() argument
2824 LIBFCOE_FIP_DBG(fip, "vn_parse unknown subcode %u\n", sub); in fcoe_ctlr_vlan_parse()
2841 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_vlan_parse()
2857 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_vlan_parse()
2872 LIBFCOE_FIP_DBG(fip, "unexpected descriptor type %x " in fcoe_ctlr_vlan_parse()
2885 LIBFCOE_FIP_DBG(fip, "FIP length error in descriptor type %x len %zu\n", in fcoe_ctlr_vlan_parse()
2897 static void fcoe_ctlr_vlan_send(struct fcoe_ctlr *fip, in fcoe_ctlr_vlan_send() argument
2904 struct fip_header fip; in fcoe_ctlr_vlan_send() member
2919 LIBFCOE_FIP_DBG(fip, "fip %s vlan notification, vlan %d\n", in fcoe_ctlr_vlan_send()
2920 fip->mode == FIP_MODE_VN2VN ? "vn2vn" : "fcf", in fcoe_ctlr_vlan_send()
2921 fip->lp->vlan); in fcoe_ctlr_vlan_send()
2927 memcpy(frame->eth.h_source, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_vlan_send()
2930 frame->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); in fcoe_ctlr_vlan_send()
2931 frame->fip.fip_op = htons(FIP_OP_VLAN); in fcoe_ctlr_vlan_send()
2932 frame->fip.fip_subcode = sub; in fcoe_ctlr_vlan_send()
2933 frame->fip.fip_dl_len = htons(dlen / FIP_BPW); in fcoe_ctlr_vlan_send()
2937 memcpy(frame->mac.fd_mac, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_vlan_send()
2941 put_unaligned_be16(fip->lp->vlan, &frame->vlan.fd_vlan); in fcoe_ctlr_vlan_send()
2945 skb->priority = fip->priority; in fcoe_ctlr_vlan_send()
2949 fip->send(fip, skb); in fcoe_ctlr_vlan_send()
2959 static void fcoe_ctlr_vlan_disc_reply(struct fcoe_ctlr *fip, in fcoe_ctlr_vlan_disc_reply() argument
2964 if (fip->mode == FIP_MODE_VN2VN) in fcoe_ctlr_vlan_disc_reply()
2967 fcoe_ctlr_vlan_send(fip, sub, frport->enode_mac); in fcoe_ctlr_vlan_disc_reply()
2976 static int fcoe_ctlr_vlan_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_vlan_recv() argument
2985 rc = fcoe_ctlr_vlan_parse(fip, skb, &frport); in fcoe_ctlr_vlan_recv()
2987 LIBFCOE_FIP_DBG(fip, "vlan_recv vlan_parse error %d\n", rc); in fcoe_ctlr_vlan_recv()
2990 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_vlan_recv()
2992 fcoe_ctlr_vlan_disc_reply(fip, &frport); in fcoe_ctlr_vlan_recv()
2993 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_vlan_recv()
3035 struct fcoe_ctlr *fip = disc->priv; in fcoe_ctlr_disc_start() local
3041 schedule_work(&fip->timer_work); in fcoe_ctlr_disc_start()
3053 static void fcoe_ctlr_vn_disc(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_disc() argument
3055 struct fc_lport *lport = fip->lp; in fcoe_ctlr_vn_disc()
3081 static void fcoe_ctlr_vn_timeout(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_timeout() argument
3087 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_vn_timeout()
3088 switch (fip->state) { in fcoe_ctlr_vn_timeout()
3090 fcoe_ctlr_set_state(fip, FIP_ST_VNMP_PROBE1); in fcoe_ctlr_vn_timeout()
3091 LIBFCOE_FIP_DBG(fip, "vn_timeout: send 1st probe request\n"); in fcoe_ctlr_vn_timeout()
3092 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REQ, fcoe_all_vn2vn, 0); in fcoe_ctlr_vn_timeout()
3096 fcoe_ctlr_set_state(fip, FIP_ST_VNMP_PROBE2); in fcoe_ctlr_vn_timeout()
3097 LIBFCOE_FIP_DBG(fip, "vn_timeout: send 2nd probe request\n"); in fcoe_ctlr_vn_timeout()
3098 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REQ, fcoe_all_vn2vn, 0); in fcoe_ctlr_vn_timeout()
3102 fcoe_ctlr_set_state(fip, FIP_ST_VNMP_CLAIM); in fcoe_ctlr_vn_timeout()
3103 new_port_id = fip->port_id; in fcoe_ctlr_vn_timeout()
3106 fcoe_ctlr_map_dest(fip); in fcoe_ctlr_vn_timeout()
3107 fip->update_mac(fip->lp, mac); in fcoe_ctlr_vn_timeout()
3108 LIBFCOE_FIP_DBG(fip, "vn_timeout: send claim notify\n"); in fcoe_ctlr_vn_timeout()
3109 fcoe_ctlr_vn_send_claim(fip); in fcoe_ctlr_vn_timeout()
3117 next_time = fip->sol_time + msecs_to_jiffies(FIP_VN_ANN_WAIT); in fcoe_ctlr_vn_timeout()
3119 fcoe_ctlr_set_state(fip, FIP_ST_VNMP_UP); in fcoe_ctlr_vn_timeout()
3120 LIBFCOE_FIP_DBG(fip, "vn_timeout: send vn2vn beacon\n"); in fcoe_ctlr_vn_timeout()
3121 fcoe_ctlr_vn_send(fip, FIP_SC_VN_BEACON, in fcoe_ctlr_vn_timeout()
3124 fip->port_ka_time = next_time; in fcoe_ctlr_vn_timeout()
3126 fcoe_ctlr_vn_disc(fip); in fcoe_ctlr_vn_timeout()
3129 next_time = fcoe_ctlr_vn_age(fip); in fcoe_ctlr_vn_timeout()
3130 if (time_after_eq(jiffies, fip->port_ka_time)) { in fcoe_ctlr_vn_timeout()
3131 LIBFCOE_FIP_DBG(fip, "vn_timeout: send vn2vn beacon\n"); in fcoe_ctlr_vn_timeout()
3132 fcoe_ctlr_vn_send(fip, FIP_SC_VN_BEACON, in fcoe_ctlr_vn_timeout()
3134 fip->port_ka_time = jiffies + in fcoe_ctlr_vn_timeout()
3138 if (time_before(fip->port_ka_time, next_time)) in fcoe_ctlr_vn_timeout()
3139 next_time = fip->port_ka_time; in fcoe_ctlr_vn_timeout()
3144 WARN(1, "unexpected state %d\n", fip->state); in fcoe_ctlr_vn_timeout()
3147 mod_timer(&fip->timer, next_time); in fcoe_ctlr_vn_timeout()
3149 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_vn_timeout()
3153 fc_lport_set_local_id(fip->lp, new_port_id); in fcoe_ctlr_vn_timeout()
3168 static void fcoe_ctlr_mode_set(struct fc_lport *lport, struct fcoe_ctlr *fip, in fcoe_ctlr_mode_set() argument
3183 priv = fip; in fcoe_ctlr_mode_set()
3206 int fcoe_libfc_config(struct fc_lport *lport, struct fcoe_ctlr *fip, in fcoe_libfc_config() argument
3217 fcoe_ctlr_mode_set(lport, fip, fip->mode); in fcoe_libfc_config()
3225 struct fcoe_ctlr *fip = fcoe_ctlr_device_priv(ctlr_dev); in fcoe_fcf_get_selected() local
3228 mutex_lock(&fip->ctlr_mutex); in fcoe_fcf_get_selected()
3233 fcf_dev->selected = (fcf == fip->sel_fcf) ? 1 : 0; in fcoe_fcf_get_selected()
3238 mutex_unlock(&fip->ctlr_mutex); in fcoe_fcf_get_selected()