Lines Matching full:link
5 * Link Layer Control (LLC)
142 u8 num_rkeys; /* first rtoken byte of CONFIRM LINK msg */
144 /* rtoken is always for the current link */
145 u8 link_id; /* link id of the rtoken */
202 struct smc_link *link; member
206 static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc);
258 struct smc_link_group *lgr = qentry->link->lgr; in smc_llc_flow_start()
334 /* lnk is optional and used for early wakeup when link goes down, useful in
335 * cases where we wait for a response on the link after we sent a request
382 struct smc_link *link, in smc_llc_tx_handler() argument
390 * @link: Pointer to SMC link used for sending LLC control message.
401 static int smc_llc_add_pending_send(struct smc_link *link, in smc_llc_add_pending_send() argument
407 rc = smc_wr_tx_get_free_slot(link, smc_llc_tx_handler, wr_buf, NULL, in smc_llc_add_pending_send()
416 …per layer protocols use the same message size any more, must start to set link->wr_tx_sges[i].leng… in smc_llc_add_pending_send()
423 static int smc_llc_add_pending_send_v2(struct smc_link *link, in smc_llc_add_pending_send_v2() argument
429 rc = smc_wr_tx_get_v2_slot(link, smc_llc_tx_handler, wr_buf, pend); in smc_llc_add_pending_send_v2()
447 /* high-level API to send LLC confirm link */
448 int smc_llc_send_confirm_link(struct smc_link *link, in smc_llc_send_confirm_link() argument
456 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_confirm_link()
458 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_confirm_link()
464 smc_llc_init_msg_hdr(&confllc->hd, link->lgr, sizeof(*confllc)); in smc_llc_send_confirm_link()
468 memcpy(confllc->sender_mac, link->smcibdev->mac[link->ibport - 1], in smc_llc_send_confirm_link()
470 memcpy(confllc->sender_gid, link->gid, SMC_GID_SIZE); in smc_llc_send_confirm_link()
471 hton24(confllc->sender_qp_num, link->roce_qp->qp_num); in smc_llc_send_confirm_link()
472 confllc->link_num = link->link_id; in smc_llc_send_confirm_link()
473 memcpy(confllc->link_uid, link->link_uid, SMC_LGR_ID_SIZE); in smc_llc_send_confirm_link()
476 rc = smc_wr_tx_send(link, pend); in smc_llc_send_confirm_link()
478 smc_wr_tx_link_put(link); in smc_llc_send_confirm_link()
489 struct smc_link *link; in smc_llc_send_confirm_rkey() local
504 link = &send_link->lgr->lnk[i]; in smc_llc_send_confirm_rkey()
505 if (smc_link_active(link) && link != send_link) { in smc_llc_send_confirm_rkey()
506 rkeyllc->rtoken[rtok_ix].link_id = link->link_id; in smc_llc_send_confirm_rkey()
508 htonl(rmb_desc->mr[link->link_idx]->rkey); in smc_llc_send_confirm_rkey()
512 (rmb_desc->sgt[link->link_idx].sgl)); in smc_llc_send_confirm_rkey()
532 static int smc_llc_send_delete_rkey(struct smc_link *link, in smc_llc_send_delete_rkey() argument
540 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_delete_rkey()
542 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_delete_rkey()
548 smc_llc_init_msg_hdr(&rkeyllc->hd, link->lgr, sizeof(*rkeyllc)); in smc_llc_send_delete_rkey()
550 rkeyllc->rkey[0] = htonl(rmb_desc->mr[link->link_idx]->rkey); in smc_llc_send_delete_rkey()
552 rc = smc_wr_tx_send(link, pend); in smc_llc_send_delete_rkey()
554 smc_wr_tx_link_put(link); in smc_llc_send_delete_rkey()
597 struct smc_link *link, struct smc_link *link_new) in smc_llc_fill_ext_v2() argument
599 struct smc_link_group *lgr = link->lgr; in smc_llc_fill_ext_v2()
609 prim_lnk_idx = link->link_idx; in smc_llc_fill_ext_v2()
635 /* send ADD LINK request or response */
636 int smc_llc_send_add_link(struct smc_link *link, u8 mac[], u8 gid[], in smc_llc_send_add_link() argument
646 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_add_link()
648 if (link->lgr->smc_version == SMC_V2) { in smc_llc_send_add_link()
651 rc = smc_llc_add_pending_send_v2(link, &wr_buf, &pend); in smc_llc_send_add_link()
661 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_add_link()
684 len += smc_llc_fill_ext_v2(ext, link, link_new); in smc_llc_send_add_link()
685 smc_llc_init_msg_hdr(&addllc->hd, link->lgr, len); in smc_llc_send_add_link()
687 if (link->lgr->smc_version == SMC_V2) in smc_llc_send_add_link()
688 rc = smc_wr_tx_v2_send(link, pend, len); in smc_llc_send_add_link()
690 rc = smc_wr_tx_send(link, pend); in smc_llc_send_add_link()
692 smc_wr_tx_link_put(link); in smc_llc_send_add_link()
696 /* send DELETE LINK request or response */
697 int smc_llc_send_delete_link(struct smc_link *link, u8 link_del_id, in smc_llc_send_delete_link() argument
706 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_delete_link()
708 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_delete_link()
715 smc_llc_init_msg_hdr(&delllc->hd, link->lgr, sizeof(*delllc)); in smc_llc_send_delete_link()
726 rc = smc_wr_tx_send(link, pend); in smc_llc_send_delete_link()
728 smc_wr_tx_link_put(link); in smc_llc_send_delete_link()
732 /* send LLC test link request */
733 static int smc_llc_send_test_link(struct smc_link *link, u8 user_data[16]) in smc_llc_send_test_link() argument
740 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_test_link()
742 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_test_link()
748 smc_llc_init_msg_hdr(&testllc->hd, link->lgr, sizeof(*testllc)); in smc_llc_send_test_link()
751 rc = smc_wr_tx_send(link, pend); in smc_llc_send_test_link()
753 smc_wr_tx_link_put(link); in smc_llc_send_test_link()
757 /* schedule an llc send on link, may wait for buffers */
758 static int smc_llc_send_message(struct smc_link *link, void *llcbuf) in smc_llc_send_message() argument
764 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_message()
766 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_message()
770 rc = smc_wr_tx_send(link, pend); in smc_llc_send_message()
772 smc_wr_tx_link_put(link); in smc_llc_send_message()
776 /* schedule an llc send on link, may wait for buffers,
780 static int smc_llc_send_message_wait(struct smc_link *link, void *llcbuf) in smc_llc_send_message_wait() argument
786 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_message_wait()
788 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_message_wait()
792 rc = smc_wr_tx_send_wait(link, pend, SMC_LLC_WAIT_TIME); in smc_llc_send_message_wait()
794 smc_wr_tx_link_put(link); in smc_llc_send_message_wait()
825 static int smc_llc_add_link_cont(struct smc_link *link, in smc_llc_add_link_cont() argument
830 struct smc_link_group *lgr = link->lgr; in smc_llc_add_link_cont()
837 if (!smc_wr_tx_link_hold(link)) in smc_llc_add_link_cont()
839 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_add_link_cont()
845 prim_lnk_idx = link->link_idx; in smc_llc_add_link_cont()
874 rc = smc_wr_tx_send(link, pend); in smc_llc_add_link_cont()
876 smc_wr_tx_link_put(link); in smc_llc_add_link_cont()
880 static int smc_llc_cli_rkey_exchange(struct smc_link *link, in smc_llc_cli_rkey_exchange() argument
884 struct smc_link_group *lgr = link->lgr; in smc_llc_cli_rkey_exchange()
906 smc_rtoken_set(lgr, link->link_idx, link_new->link_idx, in smc_llc_cli_rkey_exchange()
913 rc = smc_llc_add_link_cont(link, link_new, &num_rkeys_send, in smc_llc_cli_rkey_exchange()
923 /* prepare and send an add link reject response */
929 smc_llc_init_msg_hdr(&qentry->msg.raw.hdr, qentry->link->lgr, in smc_llc_cli_add_link_reject()
931 return smc_llc_send_message(qentry->link, &qentry->msg); in smc_llc_cli_add_link_reject()
934 static int smc_llc_cli_conf_link(struct smc_link *link, in smc_llc_cli_conf_link() argument
939 struct smc_link_group *lgr = link->lgr; in smc_llc_cli_conf_link()
943 /* receive CONFIRM LINK request over RoCE fabric */ in smc_llc_cli_conf_link()
946 rc = smc_llc_send_delete_link(link, link_new->link_id, in smc_llc_cli_conf_link()
954 smc_llc_send_message(link, &qentry->msg); in smc_llc_cli_conf_link()
963 smc_llc_send_delete_link(link, link_new->link_id, SMC_LLC_REQ, in smc_llc_cli_conf_link()
971 smc_llc_send_delete_link(link, link_new->link_id, SMC_LLC_REQ, in smc_llc_cli_conf_link()
976 /* send CONFIRM LINK response over RoCE fabric */ in smc_llc_cli_conf_link()
979 smc_llc_send_delete_link(link, link_new->link_id, SMC_LLC_REQ, in smc_llc_cli_conf_link()
992 static void smc_llc_save_add_link_rkeys(struct smc_link *link, in smc_llc_save_add_link_rkeys() argument
996 struct smc_link_group *lgr = link->lgr; in smc_llc_save_add_link_rkeys()
1004 smc_rtoken_set(lgr, link->link_idx, link_new->link_idx, in smc_llc_save_add_link_rkeys()
1012 static void smc_llc_save_add_link_info(struct smc_link *link, in smc_llc_save_add_link_info() argument
1015 link->peer_qpn = ntoh24(add_llc->sender_qp_num); in smc_llc_save_add_link_info()
1016 memcpy(link->peer_gid, add_llc->sender_gid, SMC_GID_SIZE); in smc_llc_save_add_link_info()
1017 memcpy(link->peer_mac, add_llc->sender_mac, ETH_ALEN); in smc_llc_save_add_link_info()
1018 link->peer_psn = ntoh24(add_llc->initial_psn); in smc_llc_save_add_link_info()
1019 link->peer_mtu = add_llc->qp_mtu; in smc_llc_save_add_link_info()
1022 /* as an SMC client, process an add link request */
1023 int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry) in smc_llc_cli_add_link() argument
1027 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_cli_add_link()
1047 smc_pnet_find_alt_roce(lgr, ini, link->smcibdev); in smc_llc_cli_add_link()
1048 if (!memcmp(llc->sender_gid, link->peer_gid, SMC_GID_SIZE) && in smc_llc_cli_add_link()
1050 !memcmp(llc->sender_mac, link->peer_mac, ETH_ALEN))) { in smc_llc_cli_add_link()
1057 ini->smcrv2.ib_dev_v2 = link->smcibdev; in smc_llc_cli_add_link()
1058 ini->smcrv2.ib_port_v2 = link->ibport; in smc_llc_cli_add_link()
1061 ini->ib_dev = link->smcibdev; in smc_llc_cli_add_link()
1062 ini->ib_port = link->ibport; in smc_llc_cli_add_link()
1072 lnk_new->link_id = llc->link_num; /* SMC server assigns link id */ in smc_llc_cli_add_link()
1083 rc = smc_llc_send_add_link(link, in smc_llc_cli_add_link()
1089 smc_llc_save_add_link_rkeys(link, lnk_new); in smc_llc_cli_add_link()
1091 rc = smc_llc_cli_rkey_exchange(link, lnk_new); in smc_llc_cli_add_link()
1097 rc = smc_llc_cli_conf_link(link, ini, lnk_new, lgr_new_t); in smc_llc_cli_add_link()
1111 static void smc_llc_send_request_add_link(struct smc_link *link) in smc_llc_send_request_add_link() argument
1119 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_request_add_link()
1121 if (link->lgr->type == SMC_LGR_SYMMETRIC || in smc_llc_send_request_add_link()
1122 link->lgr->type == SMC_LGR_ASYMMETRIC_PEER) in smc_llc_send_request_add_link()
1125 smc_fill_gid_list(link->lgr, &gidlist, link->smcibdev, link->gid); in smc_llc_send_request_add_link()
1129 rc = smc_llc_add_pending_send_v2(link, &wr_buf, &pend); in smc_llc_send_request_add_link()
1140 smc_llc_init_msg_hdr(&llc->hd, link->lgr, len); in smc_llc_send_request_add_link()
1141 rc = smc_wr_tx_v2_send(link, pend, len); in smc_llc_send_request_add_link()
1144 link->lgr->llc_flow_lcl.type = SMC_LLC_FLOW_REQ_ADD_LINK; in smc_llc_send_request_add_link()
1146 smc_wr_tx_link_put(link); in smc_llc_send_request_add_link()
1150 static void smc_llc_cli_add_link_invite(struct smc_link *link, in smc_llc_cli_add_link_invite() argument
1153 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_cli_add_link_invite()
1157 smc_llc_send_request_add_link(link); in smc_llc_cli_add_link_invite()
1170 smc_pnet_find_alt_roce(lgr, ini, link->smcibdev); in smc_llc_cli_add_link_invite()
1174 smc_llc_send_add_link(link, ini->ib_dev->mac[ini->ib_port - 1], in smc_llc_cli_add_link_invite()
1207 smc_llc_cli_add_link_invite(qentry->link, qentry); in smc_llc_process_cli_add_link()
1209 smc_llc_cli_add_link(qentry->link, qentry); in smc_llc_process_cli_add_link()
1225 /* find the asymmetric link when 3 links are established */
1232 /* determine asymmetric link */ in smc_llc_find_asym_link()
1249 goto out; /* no asymmetric link */ in smc_llc_find_asym_link()
1278 return; /* no asymmetric link */ in smc_llc_delete_asym_link()
1304 static int smc_llc_srv_rkey_exchange(struct smc_link *link, in smc_llc_srv_rkey_exchange() argument
1308 struct smc_link_group *lgr = link->lgr; in smc_llc_srv_rkey_exchange()
1320 smc_llc_add_link_cont(link, link_new, &num_rkeys_send, in smc_llc_srv_rkey_exchange()
1322 qentry = smc_llc_wait(lgr, link, SMC_LLC_WAIT_TIME, in smc_llc_srv_rkey_exchange()
1332 smc_rtoken_set(lgr, link->link_idx, link_new->link_idx, in smc_llc_srv_rkey_exchange()
1345 static int smc_llc_srv_conf_link(struct smc_link *link, in smc_llc_srv_conf_link() argument
1349 struct smc_link_group *lgr = link->lgr; in smc_llc_srv_conf_link()
1353 /* send CONFIRM LINK request over the RoCE fabric */ in smc_llc_srv_conf_link()
1357 /* receive CONFIRM LINK response over the RoCE fabric */ in smc_llc_srv_conf_link()
1358 qentry = smc_llc_wait(lgr, link, SMC_LLC_WAIT_FIRST_TIME, 0); in smc_llc_srv_conf_link()
1361 /* send DELETE LINK */ in smc_llc_srv_conf_link()
1362 smc_llc_send_delete_link(link, link_new->link_id, SMC_LLC_REQ, in smc_llc_srv_conf_link()
1382 smc_llc_init_msg_hdr(&qentry->msg.raw.hdr, qentry->link->lgr, in smc_llc_send_req_add_link_response()
1385 smc_llc_send_message(qentry->link, &qentry->msg); in smc_llc_send_req_add_link_response()
1388 int smc_llc_srv_add_link(struct smc_link *link, in smc_llc_srv_add_link() argument
1392 struct smc_link_group *lgr = link->lgr; in smc_llc_srv_add_link()
1410 /* ignore client add link recommendation, start new flow */ in smc_llc_srv_add_link()
1422 smc_pnet_find_alt_roce(lgr, ini, link->smcibdev); in smc_llc_srv_add_link()
1425 ini->smcrv2.ib_dev_v2 = link->smcibdev; in smc_llc_srv_add_link()
1426 ini->smcrv2.ib_port_v2 = link->ibport; in smc_llc_srv_add_link()
1429 ini->ib_dev = link->smcibdev; in smc_llc_srv_add_link()
1430 ini->ib_port = link->ibport; in smc_llc_srv_add_link()
1447 rc = smc_llc_send_add_link(link, in smc_llc_srv_add_link()
1453 /* receive ADD LINK response over the RoCE fabric */ in smc_llc_srv_add_link()
1454 qentry = smc_llc_wait(lgr, link, SMC_LLC_WAIT_TIME, SMC_LLC_ADD_LINK); in smc_llc_srv_add_link()
1466 (!memcmp(add_llc->sender_gid, link->peer_gid, SMC_GID_SIZE) && in smc_llc_srv_add_link()
1468 !memcmp(add_llc->sender_mac, link->peer_mac, ETH_ALEN)))) { in smc_llc_srv_add_link()
1481 smc_llc_save_add_link_rkeys(link, link_new); in smc_llc_srv_add_link()
1483 rc = smc_llc_srv_rkey_exchange(link, link_new); in smc_llc_srv_add_link()
1487 rc = smc_llc_srv_conf_link(link, link_new, lgr_new_t); in smc_llc_srv_add_link()
1506 struct smc_link *link = lgr->llc_flow_lcl.qentry->link; in smc_llc_process_srv_add_link() local
1513 rc = smc_llc_srv_add_link(link, qentry); in smc_llc_process_srv_add_link()
1515 /* delete any asymmetric link */ in smc_llc_process_srv_add_link()
1523 void smc_llc_add_link_local(struct smc_link *link) in smc_llc_add_link_local() argument
1528 smc_llc_init_msg_hdr(&add_llc.hd, link->lgr, sizeof(add_llc)); in smc_llc_add_link_local()
1530 smc_llc_enqueue(link, (union smc_llc_msg *)&add_llc); in smc_llc_add_link_local()
1533 /* worker to process an add link message */
1540 /* link group is terminating */ in smc_llc_add_link_work()
1557 void smc_llc_srv_delete_link_local(struct smc_link *link, u8 del_link_id) in smc_llc_srv_delete_link_local() argument
1562 smc_llc_init_msg_hdr(&del_llc.hd, link->lgr, sizeof(del_llc)); in smc_llc_srv_delete_link_local()
1566 smc_llc_enqueue(link, (union smc_llc_msg *)&del_llc); in smc_llc_srv_delete_link_local()
1578 lnk = qentry->link; in smc_llc_process_cli_delete_link()
1586 /* delete single link */ in smc_llc_process_cli_delete_link()
1595 /* link was not found */ in smc_llc_process_cli_delete_link()
1611 /* expected deletion of asym link, don't change lgr state */ in smc_llc_process_cli_delete_link()
1624 /* try to send a DELETE LINK ALL request on any active link,
1657 lnk = qentry->link; in smc_llc_process_srv_delete_link()
1667 /* delete single link */ in smc_llc_process_srv_delete_link()
1676 goto out; /* asymmetric link already deleted */ in smc_llc_process_srv_delete_link()
1707 /* trigger setup of asymm alt link */ in smc_llc_process_srv_delete_link()
1721 /* link group is terminating */ in smc_llc_delete_link_work()
1739 struct smc_link *link; in smc_llc_rmt_conf_rkey() local
1746 link = qentry->link; in smc_llc_rmt_conf_rkey()
1751 /* first rkey entry is for receiving link */ in smc_llc_rmt_conf_rkey()
1752 rk_idx = smc_rtoken_add(link, in smc_llc_rmt_conf_rkey()
1769 smc_llc_init_msg_hdr(&llc->hd, link->lgr, sizeof(*llc)); in smc_llc_rmt_conf_rkey()
1770 smc_llc_send_message(link, &qentry->msg); in smc_llc_rmt_conf_rkey()
1779 struct smc_link *link; in smc_llc_rmt_delete_rkey() local
1785 link = qentry->link; in smc_llc_rmt_delete_rkey()
1796 if (smc_rtoken_delete(link, llcv2->rkey[i])) in smc_llc_rmt_delete_rkey()
1801 smc_llc_init_msg_hdr(&llc->hd, link->lgr, sizeof(*llc)); in smc_llc_rmt_delete_rkey()
1811 if (smc_rtoken_delete(link, llc->rkey[i])) in smc_llc_rmt_delete_rkey()
1820 smc_llc_send_message(link, &qentry->msg); in smc_llc_rmt_delete_rkey()
1849 struct smc_link *link = qentry->link; in smc_llc_event_handler() local
1850 struct smc_link_group *lgr = link->lgr; in smc_llc_event_handler()
1852 if (!smc_link_usable(link)) in smc_llc_event_handler()
1858 smc_llc_send_message(link, llc); in smc_llc_event_handler()
1911 /* DEL LINK REQ during ADD LINK SEQ */ in smc_llc_event_handler()
1946 smc_llc_flow_stop(link->lgr, &lgr->llc_flow_lcl); in smc_llc_event_handler()
1974 if (smc_link_usable(qentry->link)) in smc_llc_event_work()
1994 static void smc_llc_rx_response(struct smc_link *link, in smc_llc_rx_response() argument
1997 enum smc_llc_flowtype flowtype = link->lgr->llc_flow_lcl.type; in smc_llc_rx_response()
1998 struct smc_llc_flow *flow = &link->lgr->llc_flow_lcl; in smc_llc_rx_response()
2003 if (smc_link_active(link)) in smc_llc_rx_response()
2004 complete(&link->llc_testlink_resp); in smc_llc_rx_response()
2025 smc_llc_protocol_violation(link->lgr, in smc_llc_rx_response()
2033 smc_llc_flow_qentry_set(&link->lgr->llc_flow_lcl, qentry); in smc_llc_rx_response()
2034 wake_up(&link->lgr->llc_msg_waiter); in smc_llc_rx_response()
2037 static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc) in smc_llc_enqueue() argument
2039 struct smc_link_group *lgr = link->lgr; in smc_llc_enqueue()
2046 qentry->link = link; in smc_llc_enqueue()
2053 smc_llc_rx_response(link, qentry); in smc_llc_enqueue()
2067 struct smc_link *link = (struct smc_link *)wc->qp->qp_context; in smc_llc_rx_handler() local
2080 smc_llc_enqueue(link, llc); in smc_llc_rx_handler()
2087 struct smc_link *link = container_of(to_delayed_work(work), in smc_llc_testlink_work() local
2094 if (!smc_link_active(link)) in smc_llc_testlink_work()
2096 expire_time = link->wr_rx_tstamp + link->llc_testlink_time; in smc_llc_testlink_work()
2101 reinit_completion(&link->llc_testlink_resp); in smc_llc_testlink_work()
2102 smc_llc_send_test_link(link, user_data); in smc_llc_testlink_work()
2103 /* receive TEST LINK response over RoCE fabric */ in smc_llc_testlink_work()
2104 rc = wait_for_completion_interruptible_timeout(&link->llc_testlink_resp, in smc_llc_testlink_work()
2106 if (!smc_link_active(link)) in smc_llc_testlink_work()
2107 return; /* link state changed */ in smc_llc_testlink_work()
2109 smcr_link_down_cond_sched(link); in smc_llc_testlink_work()
2112 next_interval = link->llc_testlink_time; in smc_llc_testlink_work()
2114 schedule_delayed_work(&link->llc_testlink_wrk, next_interval); in smc_llc_testlink_work()
2148 int smc_llc_link_init(struct smc_link *link) in smc_llc_link_init() argument
2150 init_completion(&link->llc_testlink_resp); in smc_llc_link_init()
2151 INIT_DELAYED_WORK(&link->llc_testlink_wrk, smc_llc_testlink_work); in smc_llc_link_init()
2155 void smc_llc_link_active(struct smc_link *link) in smc_llc_link_active() argument
2157 pr_warn_ratelimited("smc: SMC-R lg %*phN net %llu link added: id %*phN, " in smc_llc_link_active()
2159 SMC_LGR_ID_SIZE, &link->lgr->id, in smc_llc_link_active()
2160 link->lgr->net->net_cookie, in smc_llc_link_active()
2161 SMC_LGR_ID_SIZE, &link->link_uid, in smc_llc_link_active()
2162 SMC_LGR_ID_SIZE, &link->peer_link_uid, in smc_llc_link_active()
2163 link->smcibdev->ibdev->name, link->ibport); in smc_llc_link_active()
2164 link->state = SMC_LNK_ACTIVE; in smc_llc_link_active()
2165 if (link->lgr->llc_testlink_time) { in smc_llc_link_active()
2166 link->llc_testlink_time = link->lgr->llc_testlink_time; in smc_llc_link_active()
2167 schedule_delayed_work(&link->llc_testlink_wrk, in smc_llc_link_active()
2168 link->llc_testlink_time); in smc_llc_link_active()
2173 void smc_llc_link_clear(struct smc_link *link, bool log) in smc_llc_link_clear() argument
2176 pr_warn_ratelimited("smc: SMC-R lg %*phN net %llu link removed: id %*phN" in smc_llc_link_clear()
2178 SMC_LGR_ID_SIZE, &link->lgr->id, in smc_llc_link_clear()
2179 link->lgr->net->net_cookie, in smc_llc_link_clear()
2180 SMC_LGR_ID_SIZE, &link->link_uid, in smc_llc_link_clear()
2181 SMC_LGR_ID_SIZE, &link->peer_link_uid, in smc_llc_link_clear()
2182 link->smcibdev->ibdev->name, link->ibport); in smc_llc_link_clear()
2183 complete(&link->llc_testlink_resp); in smc_llc_link_clear()
2184 cancel_delayed_work_sync(&link->llc_testlink_wrk); in smc_llc_link_clear()
2236 void smc_llc_link_set_uid(struct smc_link *link) in smc_llc_link_set_uid() argument
2240 link_uid = htonl(*((u32 *)link->lgr->id) + link->link_id); in smc_llc_link_set_uid()
2241 memcpy(link->link_uid, &link_uid, SMC_LGR_ID_SIZE); in smc_llc_link_set_uid()
2244 /* save peers link user id, used for debug purposes */
2247 memcpy(qentry->link->peer_link_uid, qentry->msg.confirm_link.link_uid, in smc_llc_save_peer_uid()
2251 /* evaluate confirm link request or response */
2256 qentry->link->link_id = qentry->msg.confirm_link.link_num; in smc_llc_eval_conf_link()
2257 smc_llc_link_set_uid(qentry->link); in smc_llc_eval_conf_link()