Lines Matching refs:fip
96 static void fcoe_ctlr_set_state(struct fcoe_ctlr *fip, enum fip_state state) in fcoe_ctlr_set_state() argument
98 if (state == fip->state) in fcoe_ctlr_set_state()
100 if (fip->lp) in fcoe_ctlr_set_state()
101 LIBFCOE_FIP_DBG(fip, "state %s -> %s\n", in fcoe_ctlr_set_state()
102 fcoe_ctlr_state(fip->state), fcoe_ctlr_state(state)); in fcoe_ctlr_set_state()
103 fip->state = state; in fcoe_ctlr_set_state()
134 static void fcoe_ctlr_map_dest(struct fcoe_ctlr *fip) in fcoe_ctlr_map_dest() argument
136 if (fip->mode == FIP_MODE_VN2VN) in fcoe_ctlr_map_dest()
137 hton24(fip->dest_addr, FIP_VN_FC_MAP); in fcoe_ctlr_map_dest()
139 hton24(fip->dest_addr, FIP_DEF_FC_MAP); in fcoe_ctlr_map_dest()
140 hton24(fip->dest_addr + 3, 0); in fcoe_ctlr_map_dest()
141 fip->map_dest = 1; in fcoe_ctlr_map_dest()
148 void fcoe_ctlr_init(struct fcoe_ctlr *fip, enum fip_state mode) in fcoe_ctlr_init() argument
150 fcoe_ctlr_set_state(fip, FIP_ST_LINK_WAIT); in fcoe_ctlr_init()
151 fip->mode = mode; in fcoe_ctlr_init()
152 INIT_LIST_HEAD(&fip->fcfs); in fcoe_ctlr_init()
153 mutex_init(&fip->ctlr_mutex); in fcoe_ctlr_init()
154 spin_lock_init(&fip->ctlr_lock); in fcoe_ctlr_init()
155 fip->flogi_oxid = FC_XID_UNKNOWN; in fcoe_ctlr_init()
156 setup_timer(&fip->timer, fcoe_ctlr_timeout, (unsigned long)fip); in fcoe_ctlr_init()
157 INIT_WORK(&fip->timer_work, fcoe_ctlr_timer_work); in fcoe_ctlr_init()
158 INIT_WORK(&fip->recv_work, fcoe_ctlr_recv_work); in fcoe_ctlr_init()
159 skb_queue_head_init(&fip->fip_recv_list); in fcoe_ctlr_init()
171 struct fcoe_ctlr *fip = new->fip; in fcoe_sysfs_fcf_add() local
176 LIBFCOE_FIP_DBG(fip, "New FCF fab %16.16llx mac %pM\n", in fcoe_sysfs_fcf_add()
200 ctlr_dev = fcoe_ctlr_to_ctlr_dev(fip); in fcoe_sysfs_fcf_add()
227 list_add(&new->list, &fip->fcfs); in fcoe_sysfs_fcf_add()
228 fip->fcf_count++; in fcoe_sysfs_fcf_add()
244 struct fcoe_ctlr *fip = new->fip; in fcoe_sysfs_fcf_del() local
249 fip->fcf_count--; in fcoe_sysfs_fcf_del()
260 cdev = fcoe_ctlr_to_ctlr_dev(fip); in fcoe_sysfs_fcf_del()
278 static void fcoe_ctlr_reset_fcfs(struct fcoe_ctlr *fip) in fcoe_ctlr_reset_fcfs() argument
283 fip->sel_fcf = NULL; in fcoe_ctlr_reset_fcfs()
284 list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { in fcoe_ctlr_reset_fcfs()
287 WARN_ON(fip->fcf_count); in fcoe_ctlr_reset_fcfs()
289 fip->sel_time = 0; in fcoe_ctlr_reset_fcfs()
304 void fcoe_ctlr_destroy(struct fcoe_ctlr *fip) in fcoe_ctlr_destroy() argument
306 cancel_work_sync(&fip->recv_work); in fcoe_ctlr_destroy()
307 skb_queue_purge(&fip->fip_recv_list); in fcoe_ctlr_destroy()
309 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_destroy()
310 fcoe_ctlr_set_state(fip, FIP_ST_DISABLED); in fcoe_ctlr_destroy()
311 fcoe_ctlr_reset_fcfs(fip); in fcoe_ctlr_destroy()
312 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_destroy()
313 del_timer_sync(&fip->timer); in fcoe_ctlr_destroy()
314 cancel_work_sync(&fip->timer_work); in fcoe_ctlr_destroy()
326 static void fcoe_ctlr_announce(struct fcoe_ctlr *fip) in fcoe_ctlr_announce() argument
331 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_announce()
332 spin_lock_bh(&fip->ctlr_lock); in fcoe_ctlr_announce()
334 kfree_skb(fip->flogi_req); in fcoe_ctlr_announce()
335 fip->flogi_req = NULL; in fcoe_ctlr_announce()
336 list_for_each_entry(fcf, &fip->fcfs, list) in fcoe_ctlr_announce()
339 spin_unlock_bh(&fip->ctlr_lock); in fcoe_ctlr_announce()
340 sel = fip->sel_fcf; in fcoe_ctlr_announce()
342 if (sel && ether_addr_equal(sel->fcf_mac, fip->dest_addr)) in fcoe_ctlr_announce()
344 if (!is_zero_ether_addr(fip->dest_addr)) { in fcoe_ctlr_announce()
347 fip->lp->host->host_no, fip->dest_addr); in fcoe_ctlr_announce()
348 memset(fip->dest_addr, 0, ETH_ALEN); in fcoe_ctlr_announce()
353 fip->lp->host->host_no, sel->fcf_mac); in fcoe_ctlr_announce()
354 memcpy(fip->dest_addr, sel->fcoe_mac, ETH_ALEN); in fcoe_ctlr_announce()
355 fip->map_dest = 0; in fcoe_ctlr_announce()
358 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_announce()
368 static inline u32 fcoe_ctlr_fcoe_size(struct fcoe_ctlr *fip) in fcoe_ctlr_fcoe_size() argument
375 return fip->lp->mfs + sizeof(struct fc_frame_header) + in fcoe_ctlr_fcoe_size()
384 static void fcoe_ctlr_solicit(struct fcoe_ctlr *fip, struct fcoe_fcf *fcf) in fcoe_ctlr_solicit() argument
389 struct fip_header fip; in fcoe_ctlr_solicit() member
406 memcpy(sol->eth.h_source, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_solicit()
409 sol->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); in fcoe_ctlr_solicit()
410 sol->fip.fip_op = htons(FIP_OP_DISC); in fcoe_ctlr_solicit()
411 sol->fip.fip_subcode = FIP_SC_SOL; in fcoe_ctlr_solicit()
412 sol->fip.fip_dl_len = htons(sizeof(sol->desc) / FIP_BPW); in fcoe_ctlr_solicit()
413 sol->fip.fip_flags = htons(FIP_FL_FPMA); in fcoe_ctlr_solicit()
414 if (fip->spma) in fcoe_ctlr_solicit()
415 sol->fip.fip_flags |= htons(FIP_FL_SPMA); in fcoe_ctlr_solicit()
419 memcpy(sol->desc.mac.fd_mac, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_solicit()
423 put_unaligned_be64(fip->lp->wwnn, &sol->desc.wwnn.fd_wwn); in fcoe_ctlr_solicit()
425 fcoe_size = fcoe_ctlr_fcoe_size(fip); in fcoe_ctlr_solicit()
432 skb->priority = fip->priority; in fcoe_ctlr_solicit()
435 fip->send(fip, skb); in fcoe_ctlr_solicit()
438 fip->sol_time = jiffies; in fcoe_ctlr_solicit()
447 void fcoe_ctlr_link_up(struct fcoe_ctlr *fip) in fcoe_ctlr_link_up() argument
449 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_link_up()
450 if (fip->state == FIP_ST_NON_FIP || fip->state == FIP_ST_AUTO) { in fcoe_ctlr_link_up()
451 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_link_up()
452 fc_linkup(fip->lp); in fcoe_ctlr_link_up()
453 } else if (fip->state == FIP_ST_LINK_WAIT) { in fcoe_ctlr_link_up()
454 fcoe_ctlr_set_state(fip, fip->mode); in fcoe_ctlr_link_up()
455 switch (fip->mode) { in fcoe_ctlr_link_up()
457 LIBFCOE_FIP_DBG(fip, "invalid mode %d\n", fip->mode); in fcoe_ctlr_link_up()
460 LIBFCOE_FIP_DBG(fip, "%s", "setting AUTO mode.\n"); 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()
466 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_link_up()
469 fcoe_ctlr_vn_start(fip); in fcoe_ctlr_link_up()
470 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_link_up()
471 fc_linkup(fip->lp); in fcoe_ctlr_link_up()
475 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_link_up()
483 static void fcoe_ctlr_reset(struct fcoe_ctlr *fip) in fcoe_ctlr_reset() argument
485 fcoe_ctlr_reset_fcfs(fip); in fcoe_ctlr_reset()
486 del_timer(&fip->timer); in fcoe_ctlr_reset()
487 fip->ctlr_ka_time = 0; in fcoe_ctlr_reset()
488 fip->port_ka_time = 0; in fcoe_ctlr_reset()
489 fip->sol_time = 0; in fcoe_ctlr_reset()
490 fip->flogi_oxid = FC_XID_UNKNOWN; in fcoe_ctlr_reset()
491 fcoe_ctlr_map_dest(fip); in fcoe_ctlr_reset()
503 int fcoe_ctlr_link_down(struct fcoe_ctlr *fip) in fcoe_ctlr_link_down() argument
507 LIBFCOE_FIP_DBG(fip, "link down.\n"); in fcoe_ctlr_link_down()
508 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_link_down()
509 fcoe_ctlr_reset(fip); in fcoe_ctlr_link_down()
510 link_dropped = fip->state != FIP_ST_LINK_WAIT; in fcoe_ctlr_link_down()
511 fcoe_ctlr_set_state(fip, FIP_ST_LINK_WAIT); in fcoe_ctlr_link_down()
512 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_link_down()
515 fc_linkdown(fip->lp); in fcoe_ctlr_link_down()
534 static void fcoe_ctlr_send_keep_alive(struct fcoe_ctlr *fip, in fcoe_ctlr_send_keep_alive() argument
541 struct fip_header fip; in fcoe_ctlr_send_keep_alive() member
549 fcf = fip->sel_fcf; in fcoe_ctlr_send_keep_alive()
550 lp = fip->lp; in fcoe_ctlr_send_keep_alive()
565 kal->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); in fcoe_ctlr_send_keep_alive()
566 kal->fip.fip_op = htons(FIP_OP_CTRL); in fcoe_ctlr_send_keep_alive()
567 kal->fip.fip_subcode = FIP_SC_KEEP_ALIVE; in fcoe_ctlr_send_keep_alive()
568 kal->fip.fip_dl_len = htons((sizeof(kal->mac) + in fcoe_ctlr_send_keep_alive()
570 kal->fip.fip_flags = htons(FIP_FL_FPMA); in fcoe_ctlr_send_keep_alive()
571 if (fip->spma) in fcoe_ctlr_send_keep_alive()
572 kal->fip.fip_flags |= htons(FIP_FL_SPMA); in fcoe_ctlr_send_keep_alive()
576 memcpy(kal->mac.fd_mac, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_send_keep_alive()
581 memcpy(vn->fd_mac, fip->get_src_addr(lport), ETH_ALEN); in fcoe_ctlr_send_keep_alive()
587 skb->priority = fip->priority; in fcoe_ctlr_send_keep_alive()
590 fip->send(fip, skb); in fcoe_ctlr_send_keep_alive()
608 static int fcoe_ctlr_encaps(struct fcoe_ctlr *fip, struct fc_lport *lport, in fcoe_ctlr_encaps() argument
613 struct fip_header fip; in fcoe_ctlr_encaps() member
630 if (fcoe_ctlr_vn_lookup(fip, d_id, cap->eth.h_dest)) in fcoe_ctlr_encaps()
634 fcf = fip->sel_fcf; in fcoe_ctlr_encaps()
638 fip_flags &= fip->spma ? FIP_FL_SPMA | FIP_FL_FPMA : in fcoe_ctlr_encaps()
644 memcpy(cap->eth.h_source, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_encaps()
647 cap->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); in fcoe_ctlr_encaps()
648 cap->fip.fip_op = htons(FIP_OP_LS); in fcoe_ctlr_encaps()
650 cap->fip.fip_subcode = FIP_SC_REP; in fcoe_ctlr_encaps()
652 cap->fip.fip_subcode = FIP_SC_REQ; in fcoe_ctlr_encaps()
653 cap->fip.fip_flags = htons(fip_flags); in fcoe_ctlr_encaps()
665 memcpy(mac->fd_mac, fip->get_src_addr(lport), ETH_ALEN); in fcoe_ctlr_encaps()
666 } else if (fip->mode == FIP_MODE_VN2VN) { in fcoe_ctlr_encaps()
668 hton24(mac->fd_mac + 3, fip->port_id); in fcoe_ctlr_encaps()
670 LIBFCOE_FIP_DBG(fip, "FLOGI/FDISC sent with SPMA\n"); in fcoe_ctlr_encaps()
671 memcpy(mac->fd_mac, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_encaps()
673 LIBFCOE_FIP_DBG(fip, "FLOGI/FDISC sent with FPMA\n"); in fcoe_ctlr_encaps()
677 cap->fip.fip_dl_len = htons(dlen / FIP_BPW); in fcoe_ctlr_encaps()
680 skb->priority = fip->priority; in fcoe_ctlr_encaps()
702 int fcoe_ctlr_els_send(struct fcoe_ctlr *fip, struct fc_lport *lport, in fcoe_ctlr_els_send() argument
715 if (op == ELS_FLOGI && fip->mode != FIP_MODE_VN2VN) { in fcoe_ctlr_els_send()
716 old_xid = fip->flogi_oxid; in fcoe_ctlr_els_send()
717 fip->flogi_oxid = ntohs(fh->fh_ox_id); in fcoe_ctlr_els_send()
718 if (fip->state == FIP_ST_AUTO) { in fcoe_ctlr_els_send()
720 fip->flogi_count = 0; in fcoe_ctlr_els_send()
721 fip->flogi_count++; in fcoe_ctlr_els_send()
722 if (fip->flogi_count < 3) in fcoe_ctlr_els_send()
724 fcoe_ctlr_map_dest(fip); in fcoe_ctlr_els_send()
727 if (fip->state == FIP_ST_NON_FIP) in fcoe_ctlr_els_send()
728 fcoe_ctlr_map_dest(fip); in fcoe_ctlr_els_send()
731 if (fip->state == FIP_ST_NON_FIP) in fcoe_ctlr_els_send()
733 if (!fip->sel_fcf && fip->mode != FIP_MODE_VN2VN) in fcoe_ctlr_els_send()
738 if (fip->mode == FIP_MODE_VN2VN) in fcoe_ctlr_els_send()
740 spin_lock_bh(&fip->ctlr_lock); in fcoe_ctlr_els_send()
741 kfree_skb(fip->flogi_req); in fcoe_ctlr_els_send()
742 fip->flogi_req = skb; in fcoe_ctlr_els_send()
743 fip->flogi_req_send = 1; in fcoe_ctlr_els_send()
744 spin_unlock_bh(&fip->ctlr_lock); in fcoe_ctlr_els_send()
745 schedule_work(&fip->timer_work); in fcoe_ctlr_els_send()
753 if (fip->mode == FIP_MODE_VN2VN) { in fcoe_ctlr_els_send()
754 if (fip->state != FIP_ST_VNMP_UP) in fcoe_ctlr_els_send()
759 if (fip->state != FIP_ST_ENABLED) in fcoe_ctlr_els_send()
774 if (fip->state == FIP_ST_NON_FIP) { in fcoe_ctlr_els_send()
775 if (fip->flogi_oxid == FC_XID_UNKNOWN) in fcoe_ctlr_els_send()
777 fip->flogi_oxid = FC_XID_UNKNOWN; in fcoe_ctlr_els_send()
779 fip->update_mac(lport, mac); in fcoe_ctlr_els_send()
788 if (fip->state != FIP_ST_ENABLED && in fcoe_ctlr_els_send()
789 fip->state != FIP_ST_VNMP_UP) in fcoe_ctlr_els_send()
793 LIBFCOE_FIP_DBG(fip, "els_send op %u d_id %x\n", in fcoe_ctlr_els_send()
795 if (fcoe_ctlr_encaps(fip, lport, op, skb, ntoh24(fh->fh_d_id))) in fcoe_ctlr_els_send()
797 fip->send(fip, skb); in fcoe_ctlr_els_send()
822 static unsigned long fcoe_ctlr_age_fcfs(struct fcoe_ctlr *fip) in fcoe_ctlr_age_fcfs() argument
834 stats = per_cpu_ptr(fip->lp->stats, get_cpu()); in fcoe_ctlr_age_fcfs()
836 list_for_each_entry_safe(fcf, next, &fip->fcfs, list) { in fcoe_ctlr_age_fcfs()
838 if (fip->sel_fcf == fcf) { in fcoe_ctlr_age_fcfs()
844 fip->lp->host->host_no, fcf->fabric_name, in fcoe_ctlr_age_fcfs()
852 if (fip->sel_fcf == fcf) in fcoe_ctlr_age_fcfs()
853 fip->sel_fcf = NULL; in fcoe_ctlr_age_fcfs()
877 if (sel_time && !fip->sel_fcf && !fip->sel_time) { in fcoe_ctlr_age_fcfs()
879 fip->sel_time = sel_time; in fcoe_ctlr_age_fcfs()
894 static int fcoe_ctlr_parse_adv(struct fcoe_ctlr *fip, in fcoe_ctlr_parse_adv() argument
931 LIBFCOE_FIP_DBG(fip, "Duplicate Critical " in fcoe_ctlr_parse_adv()
950 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_parse_adv()
991 LIBFCOE_FIP_DBG(fip, "unexpected descriptor type %x " in fcoe_ctlr_parse_adv()
1006 LIBFCOE_FIP_DBG(fip, "adv missing descriptors mask %x\n", in fcoe_ctlr_parse_adv()
1013 LIBFCOE_FIP_DBG(fip, "FIP length error in descriptor type %x len %zu\n", in fcoe_ctlr_parse_adv()
1023 static void fcoe_ctlr_recv_adv(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_recv_adv() argument
1033 if (fcoe_ctlr_parse_adv(fip, skb, &new)) in fcoe_ctlr_recv_adv()
1036 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_adv()
1037 first = list_empty(&fip->fcfs); in fcoe_ctlr_recv_adv()
1038 list_for_each_entry(fcf, &fip->fcfs, list) { in fcoe_ctlr_recv_adv()
1048 if (fip->fcf_count >= FCOE_CTLR_FCF_LIMIT) in fcoe_ctlr_recv_adv()
1056 fcf->fip = fip; in fcoe_ctlr_recv_adv()
1076 if (fcf == fip->sel_fcf && !fcf->fd_flags) { in fcoe_ctlr_recv_adv()
1077 fip->ctlr_ka_time -= fcf->fka_period; in fcoe_ctlr_recv_adv()
1078 fip->ctlr_ka_time += new.fka_period; in fcoe_ctlr_recv_adv()
1079 if (time_before(fip->ctlr_ka_time, fip->timer.expires)) in fcoe_ctlr_recv_adv()
1080 mod_timer(&fip->timer, fip->ctlr_ka_time); in fcoe_ctlr_recv_adv()
1089 LIBFCOE_FIP_DBG(fip, "New FCF fab %16.16llx mac %pM\n", in fcoe_ctlr_recv_adv()
1097 fcoe_ctlr_solicit(fip, fcf); in fcoe_ctlr_recv_adv()
1105 if (first && time_after(jiffies, fip->sol_time + sol_tov)) in fcoe_ctlr_recv_adv()
1106 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_recv_adv()
1115 list_move(&fcf->list, &fip->fcfs); in fcoe_ctlr_recv_adv()
1121 if (mtu_valid && !fip->sel_fcf && fcoe_ctlr_fcf_usable(fcf)) { in fcoe_ctlr_recv_adv()
1122 fip->sel_time = jiffies + in fcoe_ctlr_recv_adv()
1124 if (!timer_pending(&fip->timer) || in fcoe_ctlr_recv_adv()
1125 time_before(fip->sel_time, fip->timer.expires)) in fcoe_ctlr_recv_adv()
1126 mod_timer(&fip->timer, fip->sel_time); in fcoe_ctlr_recv_adv()
1130 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_adv()
1138 static void fcoe_ctlr_recv_els(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_recv_els() argument
1140 struct fc_lport *lport = fip->lp; in fcoe_ctlr_recv_els()
1177 LIBFCOE_FIP_DBG(fip, "Duplicate Critical " in fcoe_ctlr_recv_els()
1185 sel = fip->sel_fcf; in fcoe_ctlr_recv_els()
1187 LIBFCOE_FIP_DBG(fip, "FIP descriptors " in fcoe_ctlr_recv_els()
1217 LIBFCOE_FIP_DBG(fip, "FIP descriptors " in fcoe_ctlr_recv_els()
1231 LIBFCOE_FIP_DBG(fip, "unexpected descriptor type %x " in fcoe_ctlr_recv_els()
1237 LIBFCOE_FIP_DBG(fip, "FIP descriptors " in fcoe_ctlr_recv_els()
1252 sub == FIP_SC_REP && fip->mode != FIP_MODE_VN2VN) { in fcoe_ctlr_recv_els()
1255 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_recv_els()
1262 if (fip->flogi_oxid == ntohs(fh->fh_ox_id)) { in fcoe_ctlr_recv_els()
1263 fip->flogi_oxid = FC_XID_UNKNOWN; in fcoe_ctlr_recv_els()
1265 fcoe_ctlr_announce(fip); in fcoe_ctlr_recv_els()
1268 !fcoe_ctlr_flogi_retry(fip)) in fcoe_ctlr_recv_els()
1274 LIBFCOE_FIP_DBG(fip, "Missing critical descriptors " in fcoe_ctlr_recv_els()
1300 LIBFCOE_FIP_DBG(fip, "FIP length error in descriptor type %x len %zu\n", in fcoe_ctlr_recv_els()
1314 static void fcoe_ctlr_recv_clr_vlink(struct fcoe_ctlr *fip, in fcoe_ctlr_recv_clr_vlink() argument
1323 struct fcoe_fcf *fcf = fip->sel_fcf; in fcoe_ctlr_recv_clr_vlink()
1324 struct fc_lport *lport = fip->lp; in fcoe_ctlr_recv_clr_vlink()
1331 LIBFCOE_FIP_DBG(fip, "Clear Virtual Link received\n"); 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()
1373 LIBFCOE_FIP_DBG(fip, "Duplicate Critical " in fcoe_ctlr_recv_clr_vlink()
1402 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1406 fcoe_ctlr_reset(fip); in fcoe_ctlr_recv_clr_vlink()
1407 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1424 LIBFCOE_FIP_DBG(fip, "missing descriptors mask %x\n", in fcoe_ctlr_recv_clr_vlink()
1427 LIBFCOE_FIP_DBG(fip, "CVL: no Vx_Port descriptor found\n"); in fcoe_ctlr_recv_clr_vlink()
1432 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1435 fcoe_ctlr_reset(fip); in fcoe_ctlr_recv_clr_vlink()
1436 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_clr_vlink()
1443 fc_lport_reset(fip->lp); in fcoe_ctlr_recv_clr_vlink()
1444 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_recv_clr_vlink()
1448 LIBFCOE_FIP_DBG(fip, "performing Clear Virtual Link\n"); in fcoe_ctlr_recv_clr_vlink()
1460 if (!ether_addr_equal(fip->get_src_addr(vn_port), in fcoe_ctlr_recv_clr_vlink()
1477 fc_lport_reset(fip->lp); in fcoe_ctlr_recv_clr_vlink()
1478 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_recv_clr_vlink()
1493 void fcoe_ctlr_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_recv() argument
1498 skb_queue_tail(&fip->fip_recv_list, skb); in fcoe_ctlr_recv()
1499 schedule_work(&fip->recv_work); in fcoe_ctlr_recv()
1510 static int fcoe_ctlr_recv_handler(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_recv_handler() argument
1523 if (fip->mode == FIP_MODE_VN2VN) { in fcoe_ctlr_recv_handler()
1524 if (!ether_addr_equal(eh->h_dest, fip->ctl_src_addr) && in fcoe_ctlr_recv_handler()
1528 } else if (!ether_addr_equal(eh->h_dest, fip->ctl_src_addr) && in fcoe_ctlr_recv_handler()
1540 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_handler()
1541 state = fip->state; in fcoe_ctlr_recv_handler()
1543 fip->map_dest = 0; in fcoe_ctlr_recv_handler()
1544 fcoe_ctlr_set_state(fip, FIP_ST_ENABLED); in fcoe_ctlr_recv_handler()
1546 LIBFCOE_FIP_DBG(fip, "Using FIP mode\n"); in fcoe_ctlr_recv_handler()
1548 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_handler()
1550 if (fip->mode == FIP_MODE_VN2VN && op == FIP_OP_VN2VN) in fcoe_ctlr_recv_handler()
1551 return fcoe_ctlr_vn_recv(fip, skb); in fcoe_ctlr_recv_handler()
1558 fcoe_ctlr_recv_els(fip, skb); /* consumes skb */ in fcoe_ctlr_recv_handler()
1566 fcoe_ctlr_recv_adv(fip, skb); in fcoe_ctlr_recv_handler()
1568 fcoe_ctlr_recv_clr_vlink(fip, fiph); in fcoe_ctlr_recv_handler()
1589 static struct fcoe_fcf *fcoe_ctlr_select(struct fcoe_ctlr *fip) in fcoe_ctlr_select() argument
1592 struct fcoe_fcf *best = fip->sel_fcf; in fcoe_ctlr_select()
1594 list_for_each_entry(fcf, &fip->fcfs, list) { in fcoe_ctlr_select()
1595 LIBFCOE_FIP_DBG(fip, "consider FCF fab %16.16llx " in fcoe_ctlr_select()
1602 LIBFCOE_FIP_DBG(fip, "FCF for fab %16.16llx " in fcoe_ctlr_select()
1615 LIBFCOE_FIP_DBG(fip, "Conflicting fabric, VFID, " in fcoe_ctlr_select()
1620 fip->sel_fcf = best; in fcoe_ctlr_select()
1622 LIBFCOE_FIP_DBG(fip, "using FCF mac %pM\n", best->fcf_mac); in fcoe_ctlr_select()
1623 fip->port_ka_time = jiffies + in fcoe_ctlr_select()
1625 fip->ctlr_ka_time = jiffies + best->fka_period; in fcoe_ctlr_select()
1626 if (time_before(fip->ctlr_ka_time, fip->timer.expires)) in fcoe_ctlr_select()
1627 mod_timer(&fip->timer, fip->ctlr_ka_time); in fcoe_ctlr_select()
1641 static int fcoe_ctlr_flogi_send_locked(struct fcoe_ctlr *fip) in fcoe_ctlr_flogi_send_locked() argument
1648 skb_orig = fip->flogi_req; in fcoe_ctlr_flogi_send_locked()
1658 fip->flogi_req = NULL; in fcoe_ctlr_flogi_send_locked()
1661 error = fcoe_ctlr_encaps(fip, fip->lp, FIP_DT_FLOGI, skb, in fcoe_ctlr_flogi_send_locked()
1667 fip->send(fip, skb); in fcoe_ctlr_flogi_send_locked()
1668 fip->sel_fcf->flogi_sent = 1; in fcoe_ctlr_flogi_send_locked()
1679 static int fcoe_ctlr_flogi_retry(struct fcoe_ctlr *fip) in fcoe_ctlr_flogi_retry() argument
1684 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_flogi_retry()
1685 spin_lock_bh(&fip->ctlr_lock); in fcoe_ctlr_flogi_retry()
1686 LIBFCOE_FIP_DBG(fip, "re-sending FLOGI - reselect\n"); in fcoe_ctlr_flogi_retry()
1687 fcf = fcoe_ctlr_select(fip); in fcoe_ctlr_flogi_retry()
1689 kfree_skb(fip->flogi_req); in fcoe_ctlr_flogi_retry()
1690 fip->flogi_req = NULL; in fcoe_ctlr_flogi_retry()
1693 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_flogi_retry()
1694 error = fcoe_ctlr_flogi_send_locked(fip); in fcoe_ctlr_flogi_retry()
1696 spin_unlock_bh(&fip->ctlr_lock); in fcoe_ctlr_flogi_retry()
1697 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_flogi_retry()
1710 static void fcoe_ctlr_flogi_send(struct fcoe_ctlr *fip) in fcoe_ctlr_flogi_send() argument
1714 spin_lock_bh(&fip->ctlr_lock); in fcoe_ctlr_flogi_send()
1715 fcf = fip->sel_fcf; in fcoe_ctlr_flogi_send()
1716 if (!fcf || !fip->flogi_req_send) in fcoe_ctlr_flogi_send()
1719 LIBFCOE_FIP_DBG(fip, "sending FLOGI\n"); in fcoe_ctlr_flogi_send()
1726 LIBFCOE_FIP_DBG(fip, "sending FLOGI - reselect\n"); in fcoe_ctlr_flogi_send()
1727 fcf = fcoe_ctlr_select(fip); in fcoe_ctlr_flogi_send()
1729 LIBFCOE_FIP_DBG(fip, "sending FLOGI - clearing\n"); in fcoe_ctlr_flogi_send()
1730 list_for_each_entry(fcf, &fip->fcfs, list) in fcoe_ctlr_flogi_send()
1732 fcf = fcoe_ctlr_select(fip); in fcoe_ctlr_flogi_send()
1736 fcoe_ctlr_flogi_send_locked(fip); in fcoe_ctlr_flogi_send()
1737 fip->flogi_req_send = 0; in fcoe_ctlr_flogi_send()
1739 LIBFCOE_FIP_DBG(fip, "No FCF selected - defer send\n"); in fcoe_ctlr_flogi_send()
1741 spin_unlock_bh(&fip->ctlr_lock); in fcoe_ctlr_flogi_send()
1750 struct fcoe_ctlr *fip = (struct fcoe_ctlr *)arg; in fcoe_ctlr_timeout() local
1752 schedule_work(&fip->timer_work); in fcoe_ctlr_timeout()
1764 struct fcoe_ctlr *fip; in fcoe_ctlr_timer_work() local
1774 fip = container_of(work, struct fcoe_ctlr, timer_work); in fcoe_ctlr_timer_work()
1775 if (fip->mode == FIP_MODE_VN2VN) in fcoe_ctlr_timer_work()
1776 return fcoe_ctlr_vn_timeout(fip); in fcoe_ctlr_timer_work()
1777 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_timer_work()
1778 if (fip->state == FIP_ST_DISABLED) { in fcoe_ctlr_timer_work()
1779 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_timer_work()
1783 fcf = fip->sel_fcf; in fcoe_ctlr_timer_work()
1784 next_timer = fcoe_ctlr_age_fcfs(fip); in fcoe_ctlr_timer_work()
1786 sel = fip->sel_fcf; in fcoe_ctlr_timer_work()
1787 if (!sel && fip->sel_time) { in fcoe_ctlr_timer_work()
1788 if (time_after_eq(jiffies, fip->sel_time)) { in fcoe_ctlr_timer_work()
1789 sel = fcoe_ctlr_select(fip); in fcoe_ctlr_timer_work()
1790 fip->sel_time = 0; in fcoe_ctlr_timer_work()
1791 } else if (time_after(next_timer, fip->sel_time)) in fcoe_ctlr_timer_work()
1792 next_timer = fip->sel_time; in fcoe_ctlr_timer_work()
1795 if (sel && fip->flogi_req_send) in fcoe_ctlr_timer_work()
1796 fcoe_ctlr_flogi_send(fip); in fcoe_ctlr_timer_work()
1801 if (time_after_eq(jiffies, fip->ctlr_ka_time)) { in fcoe_ctlr_timer_work()
1802 fip->ctlr_ka_time = jiffies + sel->fka_period; in fcoe_ctlr_timer_work()
1805 if (time_after(next_timer, fip->ctlr_ka_time)) in fcoe_ctlr_timer_work()
1806 next_timer = fip->ctlr_ka_time; in fcoe_ctlr_timer_work()
1808 if (time_after_eq(jiffies, fip->port_ka_time)) { in fcoe_ctlr_timer_work()
1809 fip->port_ka_time = jiffies + in fcoe_ctlr_timer_work()
1813 if (time_after(next_timer, fip->port_ka_time)) in fcoe_ctlr_timer_work()
1814 next_timer = fip->port_ka_time; in fcoe_ctlr_timer_work()
1816 if (!list_empty(&fip->fcfs)) in fcoe_ctlr_timer_work()
1817 mod_timer(&fip->timer, next_timer); in fcoe_ctlr_timer_work()
1818 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_timer_work()
1821 fc_lport_reset(fip->lp); in fcoe_ctlr_timer_work()
1823 fcoe_ctlr_solicit(fip, NULL); in fcoe_ctlr_timer_work()
1827 fcoe_ctlr_send_keep_alive(fip, NULL, 0, fip->ctl_src_addr); in fcoe_ctlr_timer_work()
1830 mutex_lock(&fip->lp->lp_mutex); in fcoe_ctlr_timer_work()
1831 mac = fip->get_src_addr(fip->lp); in fcoe_ctlr_timer_work()
1832 fcoe_ctlr_send_keep_alive(fip, fip->lp, 1, mac); in fcoe_ctlr_timer_work()
1833 list_for_each_entry(vport, &fip->lp->vports, list) { in fcoe_ctlr_timer_work()
1834 mac = fip->get_src_addr(vport); in fcoe_ctlr_timer_work()
1835 fcoe_ctlr_send_keep_alive(fip, vport, 1, mac); in fcoe_ctlr_timer_work()
1837 mutex_unlock(&fip->lp->lp_mutex); in fcoe_ctlr_timer_work()
1847 struct fcoe_ctlr *fip; in fcoe_ctlr_recv_work() local
1850 fip = container_of(recv_work, struct fcoe_ctlr, recv_work); in fcoe_ctlr_recv_work()
1851 while ((skb = skb_dequeue(&fip->fip_recv_list))) in fcoe_ctlr_recv_work()
1852 fcoe_ctlr_recv_handler(fip, skb); in fcoe_ctlr_recv_work()
1870 int fcoe_ctlr_recv_flogi(struct fcoe_ctlr *fip, struct fc_lport *lport, in fcoe_ctlr_recv_flogi() argument
1884 fip->flogi_oxid == ntohs(fh->fh_ox_id)) { in fcoe_ctlr_recv_flogi()
1886 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_flogi()
1887 if (fip->state != FIP_ST_AUTO && fip->state != FIP_ST_NON_FIP) { in fcoe_ctlr_recv_flogi()
1888 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_flogi()
1891 fcoe_ctlr_set_state(fip, FIP_ST_NON_FIP); in fcoe_ctlr_recv_flogi()
1892 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_recv_flogi()
1902 fcoe_ctlr_map_dest(fip); in fcoe_ctlr_recv_flogi()
1904 memcpy(fip->dest_addr, sa, ETH_ALEN); in fcoe_ctlr_recv_flogi()
1905 fip->map_dest = 0; in fcoe_ctlr_recv_flogi()
1907 fip->flogi_oxid = FC_XID_UNKNOWN; in fcoe_ctlr_recv_flogi()
1908 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_flogi()
1914 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_recv_flogi()
1915 if (fip->state == FIP_ST_AUTO || fip->state == FIP_ST_NON_FIP) { in fcoe_ctlr_recv_flogi()
1916 memcpy(fip->dest_addr, sa, ETH_ALEN); in fcoe_ctlr_recv_flogi()
1917 fip->map_dest = 0; in fcoe_ctlr_recv_flogi()
1918 if (fip->state == FIP_ST_AUTO) in fcoe_ctlr_recv_flogi()
1919 LIBFCOE_FIP_DBG(fip, "received non-FIP FLOGI. " in fcoe_ctlr_recv_flogi()
1921 fcoe_ctlr_set_state(fip, FIP_ST_NON_FIP); in fcoe_ctlr_recv_flogi()
1923 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_recv_flogi()
1986 static void fcoe_ctlr_vn_send(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_send() argument
1993 struct fip_header fip; in fcoe_ctlr_vn_send() member
2024 hton24(frame->eth.h_source + 3, fip->port_id); in fcoe_ctlr_vn_send()
2026 memcpy(frame->eth.h_source, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_vn_send()
2030 frame->fip.fip_ver = FIP_VER_ENCAPS(FIP_VER); in fcoe_ctlr_vn_send()
2031 frame->fip.fip_op = htons(FIP_OP_VN2VN); in fcoe_ctlr_vn_send()
2032 frame->fip.fip_subcode = sub; in fcoe_ctlr_vn_send()
2033 frame->fip.fip_dl_len = htons(dlen / FIP_BPW); in fcoe_ctlr_vn_send()
2037 memcpy(frame->mac.fd_mac, fip->ctl_src_addr, ETH_ALEN); in fcoe_ctlr_vn_send()
2041 put_unaligned_be64(fip->lp->wwnn, &frame->wwnn.fd_wwn); in fcoe_ctlr_vn_send()
2046 hton24(frame->vn.fd_mac + 3, fip->port_id); in fcoe_ctlr_vn_send()
2047 hton24(frame->vn.fd_fc_id, fip->port_id); in fcoe_ctlr_vn_send()
2048 put_unaligned_be64(fip->lp->wwpn, &frame->vn.fd_wwpn); in fcoe_ctlr_vn_send()
2058 ff->fd_fts = fip->lp->fcts; in fcoe_ctlr_vn_send()
2061 if (fip->lp->service_params & FCP_SPPF_INIT_FCN) in fcoe_ctlr_vn_send()
2063 if (fip->lp->service_params & FCP_SPPF_TARG_FCN) in fcoe_ctlr_vn_send()
2071 size->fd_size = htons(fcoe_ctlr_fcoe_size(fip)); in fcoe_ctlr_vn_send()
2076 skb->priority = fip->priority; in fcoe_ctlr_vn_send()
2080 fip->send(fip, skb); in fcoe_ctlr_vn_send()
2095 struct fcoe_ctlr *fip = lport->disc.priv; in fcoe_ctlr_vn_rport_callback() local
2098 LIBFCOE_FIP_DBG(fip, "vn_rport_callback %x event %d\n", in fcoe_ctlr_vn_rport_callback()
2101 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_vn_rport_callback()
2111 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_vn_rport_callback()
2120 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_vn_rport_callback()
2153 struct fcoe_ctlr *fip = lport->disc.priv; in fcoe_ctlr_disc_stop() local
2155 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_disc_stop()
2157 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_disc_stop()
2180 static void fcoe_ctlr_vn_restart(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_restart() argument
2185 fcoe_ctlr_disc_stop_locked(fip->lp); in fcoe_ctlr_vn_restart()
2194 port_id = fip->port_id; in fcoe_ctlr_vn_restart()
2195 if (fip->probe_tries) in fcoe_ctlr_vn_restart()
2196 port_id = prandom_u32_state(&fip->rnd_state) & 0xffff; in fcoe_ctlr_vn_restart()
2198 port_id = fip->lp->wwpn & 0xffff; in fcoe_ctlr_vn_restart()
2201 fip->port_id = port_id; in fcoe_ctlr_vn_restart()
2203 if (fip->probe_tries < FIP_VN_RLIM_COUNT) { in fcoe_ctlr_vn_restart()
2204 fip->probe_tries++; in fcoe_ctlr_vn_restart()
2208 mod_timer(&fip->timer, jiffies + msecs_to_jiffies(wait)); in fcoe_ctlr_vn_restart()
2209 fcoe_ctlr_set_state(fip, FIP_ST_VNMP_START); in fcoe_ctlr_vn_restart()
2218 static void fcoe_ctlr_vn_start(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_start() argument
2220 fip->probe_tries = 0; in fcoe_ctlr_vn_start()
2221 prandom_seed_state(&fip->rnd_state, fip->lp->wwpn); in fcoe_ctlr_vn_start()
2222 fcoe_ctlr_vn_restart(fip); in fcoe_ctlr_vn_start()
2234 static int fcoe_ctlr_vn_parse(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_parse() argument
2272 LIBFCOE_FIP_DBG(fip, "vn_parse unknown subcode %u\n", sub); in fcoe_ctlr_vn_parse()
2289 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_vn_parse()
2305 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_vn_parse()
2337 LIBFCOE_FIP_DBG(fip, "unexpected descriptor type %x " in fcoe_ctlr_vn_parse()
2350 LIBFCOE_FIP_DBG(fip, "FIP length error in descriptor type %x len %zu\n", in fcoe_ctlr_vn_parse()
2361 static void fcoe_ctlr_vn_send_claim(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_send_claim() argument
2363 fcoe_ctlr_vn_send(fip, FIP_SC_VN_CLAIM_NOTIFY, fcoe_all_vn2vn, 0); in fcoe_ctlr_vn_send_claim()
2364 fip->sol_time = jiffies; in fcoe_ctlr_vn_send_claim()
2374 static void fcoe_ctlr_vn_probe_req(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_probe_req() argument
2379 if (rdata->ids.port_id != fip->port_id) in fcoe_ctlr_vn_probe_req()
2382 switch (fip->state) { in fcoe_ctlr_vn_probe_req()
2385 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REP, in fcoe_ctlr_vn_probe_req()
2397 if (fip->lp->wwpn > rdata->ids.port_name && in fcoe_ctlr_vn_probe_req()
2399 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REP, in fcoe_ctlr_vn_probe_req()
2405 fcoe_ctlr_vn_restart(fip); in fcoe_ctlr_vn_probe_req()
2419 static void fcoe_ctlr_vn_probe_reply(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_probe_reply() argument
2422 if (rdata->ids.port_id != fip->port_id) in fcoe_ctlr_vn_probe_reply()
2424 switch (fip->state) { in fcoe_ctlr_vn_probe_reply()
2429 fcoe_ctlr_vn_restart(fip); in fcoe_ctlr_vn_probe_reply()
2432 fcoe_ctlr_vn_send_claim(fip); in fcoe_ctlr_vn_probe_reply()
2446 static void fcoe_ctlr_vn_add(struct fcoe_ctlr *fip, struct fc_rport_priv *new) in fcoe_ctlr_vn_add() argument
2448 struct fc_lport *lport = fip->lp; in fcoe_ctlr_vn_add()
2455 if (port_id == fip->port_id) in fcoe_ctlr_vn_add()
2477 LIBFCOE_FIP_DBG(fip, "vn_add rport %6.6x %s\n", in fcoe_ctlr_vn_add()
2491 static int fcoe_ctlr_vn_lookup(struct fcoe_ctlr *fip, u32 port_id, u8 *mac) in fcoe_ctlr_vn_lookup() argument
2493 struct fc_lport *lport = fip->lp; in fcoe_ctlr_vn_lookup()
2516 static void fcoe_ctlr_vn_claim_notify(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_claim_notify() argument
2522 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REQ, fcoe_all_vn2vn, 0); in fcoe_ctlr_vn_claim_notify()
2525 switch (fip->state) { in fcoe_ctlr_vn_claim_notify()
2529 if (new->ids.port_id == fip->port_id) in fcoe_ctlr_vn_claim_notify()
2530 fcoe_ctlr_vn_restart(fip); in fcoe_ctlr_vn_claim_notify()
2534 if (new->ids.port_id == fip->port_id) { in fcoe_ctlr_vn_claim_notify()
2535 if (new->ids.port_name > fip->lp->wwpn) { in fcoe_ctlr_vn_claim_notify()
2536 fcoe_ctlr_vn_restart(fip); in fcoe_ctlr_vn_claim_notify()
2539 fcoe_ctlr_vn_send_claim(fip); in fcoe_ctlr_vn_claim_notify()
2542 fcoe_ctlr_vn_send(fip, FIP_SC_VN_CLAIM_REP, frport->enode_mac, in fcoe_ctlr_vn_claim_notify()
2544 fcoe_ctlr_fcoe_size(fip))); in fcoe_ctlr_vn_claim_notify()
2545 fcoe_ctlr_vn_add(fip, new); in fcoe_ctlr_vn_claim_notify()
2559 static void fcoe_ctlr_vn_claim_resp(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_claim_resp() argument
2562 LIBFCOE_FIP_DBG(fip, "claim resp from from rport %x - state %s\n", in fcoe_ctlr_vn_claim_resp()
2563 new->ids.port_id, fcoe_ctlr_state(fip->state)); in fcoe_ctlr_vn_claim_resp()
2564 if (fip->state == FIP_ST_VNMP_UP || fip->state == FIP_ST_VNMP_CLAIM) in fcoe_ctlr_vn_claim_resp()
2565 fcoe_ctlr_vn_add(fip, new); in fcoe_ctlr_vn_claim_resp()
2575 static void fcoe_ctlr_vn_beacon(struct fcoe_ctlr *fip, in fcoe_ctlr_vn_beacon() argument
2578 struct fc_lport *lport = fip->lp; in fcoe_ctlr_vn_beacon()
2584 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REQ, fcoe_all_vn2vn, 0); in fcoe_ctlr_vn_beacon()
2596 if (!frport->time && fip->state == FIP_ST_VNMP_UP) in fcoe_ctlr_vn_beacon()
2603 if (fip->state != FIP_ST_VNMP_UP) in fcoe_ctlr_vn_beacon()
2611 LIBFCOE_FIP_DBG(fip, "beacon from new rport %x. sending claim notify\n", in fcoe_ctlr_vn_beacon()
2614 fip->sol_time + msecs_to_jiffies(FIP_VN_ANN_WAIT))) in fcoe_ctlr_vn_beacon()
2615 fcoe_ctlr_vn_send_claim(fip); in fcoe_ctlr_vn_beacon()
2626 static unsigned long fcoe_ctlr_vn_age(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_age() argument
2628 struct fc_lport *lport = fip->lp; in fcoe_ctlr_vn_age()
2644 LIBFCOE_FIP_DBG(fip, in fcoe_ctlr_vn_age()
2663 static int fcoe_ctlr_vn_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) in fcoe_ctlr_vn_recv() argument
2676 rc = fcoe_ctlr_vn_parse(fip, skb, &buf.rdata); in fcoe_ctlr_vn_recv()
2678 LIBFCOE_FIP_DBG(fip, "vn_recv vn_parse error %d\n", rc); in fcoe_ctlr_vn_recv()
2682 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_vn_recv()
2685 fcoe_ctlr_vn_probe_req(fip, &buf.rdata); in fcoe_ctlr_vn_recv()
2688 fcoe_ctlr_vn_probe_reply(fip, &buf.rdata); in fcoe_ctlr_vn_recv()
2691 fcoe_ctlr_vn_claim_notify(fip, &buf.rdata); in fcoe_ctlr_vn_recv()
2694 fcoe_ctlr_vn_claim_resp(fip, &buf.rdata); in fcoe_ctlr_vn_recv()
2697 fcoe_ctlr_vn_beacon(fip, &buf.rdata); in fcoe_ctlr_vn_recv()
2700 LIBFCOE_FIP_DBG(fip, "vn_recv unknown subcode %d\n", sub); in fcoe_ctlr_vn_recv()
2704 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_vn_recv()
2745 struct fcoe_ctlr *fip = disc->priv; in fcoe_ctlr_disc_start() local
2751 schedule_work(&fip->timer_work); in fcoe_ctlr_disc_start()
2763 static void fcoe_ctlr_vn_disc(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_disc() argument
2765 struct fc_lport *lport = fip->lp; in fcoe_ctlr_vn_disc()
2788 static void fcoe_ctlr_vn_timeout(struct fcoe_ctlr *fip) in fcoe_ctlr_vn_timeout() argument
2794 mutex_lock(&fip->ctlr_mutex); in fcoe_ctlr_vn_timeout()
2795 switch (fip->state) { in fcoe_ctlr_vn_timeout()
2797 fcoe_ctlr_set_state(fip, FIP_ST_VNMP_PROBE1); in fcoe_ctlr_vn_timeout()
2798 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REQ, fcoe_all_vn2vn, 0); in fcoe_ctlr_vn_timeout()
2802 fcoe_ctlr_set_state(fip, FIP_ST_VNMP_PROBE2); in fcoe_ctlr_vn_timeout()
2803 fcoe_ctlr_vn_send(fip, FIP_SC_VN_PROBE_REQ, fcoe_all_vn2vn, 0); in fcoe_ctlr_vn_timeout()
2807 fcoe_ctlr_set_state(fip, FIP_ST_VNMP_CLAIM); in fcoe_ctlr_vn_timeout()
2808 new_port_id = fip->port_id; in fcoe_ctlr_vn_timeout()
2811 fcoe_ctlr_map_dest(fip); in fcoe_ctlr_vn_timeout()
2812 fip->update_mac(fip->lp, mac); in fcoe_ctlr_vn_timeout()
2813 fcoe_ctlr_vn_send_claim(fip); in fcoe_ctlr_vn_timeout()
2821 next_time = fip->sol_time + msecs_to_jiffies(FIP_VN_ANN_WAIT); in fcoe_ctlr_vn_timeout()
2823 fcoe_ctlr_set_state(fip, FIP_ST_VNMP_UP); in fcoe_ctlr_vn_timeout()
2824 fcoe_ctlr_vn_send(fip, FIP_SC_VN_BEACON, in fcoe_ctlr_vn_timeout()
2827 fip->port_ka_time = next_time; in fcoe_ctlr_vn_timeout()
2829 fcoe_ctlr_vn_disc(fip); in fcoe_ctlr_vn_timeout()
2832 next_time = fcoe_ctlr_vn_age(fip); in fcoe_ctlr_vn_timeout()
2833 if (time_after_eq(jiffies, fip->port_ka_time)) { in fcoe_ctlr_vn_timeout()
2834 fcoe_ctlr_vn_send(fip, FIP_SC_VN_BEACON, in fcoe_ctlr_vn_timeout()
2836 fip->port_ka_time = jiffies + in fcoe_ctlr_vn_timeout()
2840 if (time_before(fip->port_ka_time, next_time)) in fcoe_ctlr_vn_timeout()
2841 next_time = fip->port_ka_time; in fcoe_ctlr_vn_timeout()
2846 WARN(1, "unexpected state %d\n", fip->state); in fcoe_ctlr_vn_timeout()
2849 mod_timer(&fip->timer, next_time); in fcoe_ctlr_vn_timeout()
2851 mutex_unlock(&fip->ctlr_mutex); in fcoe_ctlr_vn_timeout()
2855 fc_lport_set_local_id(fip->lp, new_port_id); in fcoe_ctlr_vn_timeout()
2870 static void fcoe_ctlr_mode_set(struct fc_lport *lport, struct fcoe_ctlr *fip, in fcoe_ctlr_mode_set() argument
2885 priv = fip; in fcoe_ctlr_mode_set()
2908 int fcoe_libfc_config(struct fc_lport *lport, struct fcoe_ctlr *fip, in fcoe_libfc_config() argument
2920 fcoe_ctlr_mode_set(lport, fip, fip->mode); in fcoe_libfc_config()
2928 struct fcoe_ctlr *fip = fcoe_ctlr_device_priv(ctlr_dev); in fcoe_fcf_get_selected() local
2931 mutex_lock(&fip->ctlr_mutex); in fcoe_fcf_get_selected()
2936 fcf_dev->selected = (fcf == fip->sel_fcf) ? 1 : 0; in fcoe_fcf_get_selected()
2941 mutex_unlock(&fip->ctlr_mutex); in fcoe_fcf_get_selected()