Lines Matching refs:link
158 struct smc_link *link; member
162 static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc);
213 struct smc_link_group *lgr = qentry->link->lgr; in smc_llc_flow_start()
336 struct smc_link *link, in smc_llc_tx_handler() argument
355 static int smc_llc_add_pending_send(struct smc_link *link, in smc_llc_add_pending_send() argument
361 rc = smc_wr_tx_get_free_slot(link, smc_llc_tx_handler, wr_buf, NULL, in smc_llc_add_pending_send()
378 int smc_llc_send_confirm_link(struct smc_link *link, in smc_llc_send_confirm_link() argument
386 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_confirm_link()
388 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_confirm_link()
398 memcpy(confllc->sender_mac, link->smcibdev->mac[link->ibport - 1], in smc_llc_send_confirm_link()
400 memcpy(confllc->sender_gid, link->gid, SMC_GID_SIZE); in smc_llc_send_confirm_link()
401 hton24(confllc->sender_qp_num, link->roce_qp->qp_num); in smc_llc_send_confirm_link()
402 confllc->link_num = link->link_id; in smc_llc_send_confirm_link()
403 memcpy(confllc->link_uid, link->link_uid, SMC_LGR_ID_SIZE); in smc_llc_send_confirm_link()
406 rc = smc_wr_tx_send(link, pend); in smc_llc_send_confirm_link()
408 smc_wr_tx_link_put(link); in smc_llc_send_confirm_link()
419 struct smc_link *link; in smc_llc_send_confirm_rkey() local
434 link = &send_link->lgr->lnk[i]; in smc_llc_send_confirm_rkey()
435 if (smc_link_active(link) && link != send_link) { in smc_llc_send_confirm_rkey()
436 rkeyllc->rtoken[rtok_ix].link_id = link->link_id; in smc_llc_send_confirm_rkey()
438 htonl(rmb_desc->mr_rx[link->link_idx]->rkey); in smc_llc_send_confirm_rkey()
441 rmb_desc->sgt[link->link_idx].sgl)); in smc_llc_send_confirm_rkey()
459 static int smc_llc_send_delete_rkey(struct smc_link *link, in smc_llc_send_delete_rkey() argument
467 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_delete_rkey()
469 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_delete_rkey()
477 rkeyllc->rkey[0] = htonl(rmb_desc->mr_rx[link->link_idx]->rkey); in smc_llc_send_delete_rkey()
479 rc = smc_wr_tx_send(link, pend); in smc_llc_send_delete_rkey()
481 smc_wr_tx_link_put(link); in smc_llc_send_delete_rkey()
486 int smc_llc_send_add_link(struct smc_link *link, u8 mac[], u8 gid[], in smc_llc_send_add_link() argument
495 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_add_link()
497 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_add_link()
520 rc = smc_wr_tx_send(link, pend); in smc_llc_send_add_link()
522 smc_wr_tx_link_put(link); in smc_llc_send_add_link()
527 int smc_llc_send_delete_link(struct smc_link *link, u8 link_del_id, in smc_llc_send_delete_link() argument
536 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_delete_link()
538 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_delete_link()
556 rc = smc_wr_tx_send(link, pend); in smc_llc_send_delete_link()
558 smc_wr_tx_link_put(link); in smc_llc_send_delete_link()
563 static int smc_llc_send_test_link(struct smc_link *link, u8 user_data[16]) in smc_llc_send_test_link() argument
570 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_test_link()
572 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_test_link()
581 rc = smc_wr_tx_send(link, pend); in smc_llc_send_test_link()
583 smc_wr_tx_link_put(link); in smc_llc_send_test_link()
588 static int smc_llc_send_message(struct smc_link *link, void *llcbuf) in smc_llc_send_message() argument
594 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_message()
596 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_message()
600 rc = smc_wr_tx_send(link, pend); in smc_llc_send_message()
602 smc_wr_tx_link_put(link); in smc_llc_send_message()
610 static int smc_llc_send_message_wait(struct smc_link *link, void *llcbuf) in smc_llc_send_message_wait() argument
616 if (!smc_wr_tx_link_hold(link)) in smc_llc_send_message_wait()
618 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_message_wait()
622 rc = smc_wr_tx_send_wait(link, pend, SMC_LLC_WAIT_TIME); in smc_llc_send_message_wait()
624 smc_wr_tx_link_put(link); in smc_llc_send_message_wait()
693 static int smc_llc_add_link_cont(struct smc_link *link, in smc_llc_add_link_cont() argument
698 struct smc_link_group *lgr = link->lgr; in smc_llc_add_link_cont()
705 if (!smc_wr_tx_link_hold(link)) in smc_llc_add_link_cont()
707 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_add_link_cont()
713 prim_lnk_idx = link->link_idx; in smc_llc_add_link_cont()
741 rc = smc_wr_tx_send(link, pend); in smc_llc_add_link_cont()
743 smc_wr_tx_link_put(link); in smc_llc_add_link_cont()
747 static int smc_llc_cli_rkey_exchange(struct smc_link *link, in smc_llc_cli_rkey_exchange() argument
751 struct smc_link_group *lgr = link->lgr; in smc_llc_cli_rkey_exchange()
773 smc_rtoken_set(lgr, link->link_idx, link_new->link_idx, in smc_llc_cli_rkey_exchange()
780 rc = smc_llc_add_link_cont(link, link_new, &num_rkeys_send, in smc_llc_cli_rkey_exchange()
796 return smc_llc_send_message(qentry->link, &qentry->msg); in smc_llc_cli_add_link_reject()
799 static int smc_llc_cli_conf_link(struct smc_link *link, in smc_llc_cli_conf_link() argument
804 struct smc_link_group *lgr = link->lgr; in smc_llc_cli_conf_link()
811 rc = smc_llc_send_delete_link(link, link_new->link_id, in smc_llc_cli_conf_link()
819 smc_llc_send_message(link, &qentry->msg); in smc_llc_cli_conf_link()
828 smc_llc_send_delete_link(link, link_new->link_id, SMC_LLC_REQ, in smc_llc_cli_conf_link()
836 smc_llc_send_delete_link(link, link_new->link_id, SMC_LLC_REQ, in smc_llc_cli_conf_link()
844 smc_llc_send_delete_link(link, link_new->link_id, SMC_LLC_REQ, in smc_llc_cli_conf_link()
857 static void smc_llc_save_add_link_info(struct smc_link *link, in smc_llc_save_add_link_info() argument
860 link->peer_qpn = ntoh24(add_llc->sender_qp_num); in smc_llc_save_add_link_info()
861 memcpy(link->peer_gid, add_llc->sender_gid, SMC_GID_SIZE); in smc_llc_save_add_link_info()
862 memcpy(link->peer_mac, add_llc->sender_mac, ETH_ALEN); in smc_llc_save_add_link_info()
863 link->peer_psn = ntoh24(add_llc->initial_psn); in smc_llc_save_add_link_info()
864 link->peer_mtu = add_llc->qp_mtu; in smc_llc_save_add_link_info()
868 int smc_llc_cli_add_link(struct smc_link *link, struct smc_llc_qentry *qentry) in smc_llc_cli_add_link() argument
872 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_cli_add_link()
881 smc_pnet_find_alt_roce(lgr, &ini, link->smcibdev); in smc_llc_cli_add_link()
882 if (!memcmp(llc->sender_gid, link->peer_gid, SMC_GID_SIZE) && in smc_llc_cli_add_link()
883 !memcmp(llc->sender_mac, link->peer_mac, ETH_ALEN)) { in smc_llc_cli_add_link()
890 ini.ib_dev = link->smcibdev; in smc_llc_cli_add_link()
891 ini.ib_port = link->ibport; in smc_llc_cli_add_link()
912 rc = smc_llc_send_add_link(link, in smc_llc_cli_add_link()
917 rc = smc_llc_cli_rkey_exchange(link, lnk_new); in smc_llc_cli_add_link()
922 rc = smc_llc_cli_conf_link(link, &ini, lnk_new, lgr_new_t); in smc_llc_cli_add_link()
936 static void smc_llc_cli_add_link_invite(struct smc_link *link, in smc_llc_cli_add_link_invite() argument
939 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_cli_add_link_invite()
947 smc_pnet_find_alt_roce(lgr, &ini, link->smcibdev); in smc_llc_cli_add_link_invite()
951 smc_llc_send_add_link(link, ini.ib_dev->mac[ini.ib_port - 1], in smc_llc_cli_add_link_invite()
983 smc_llc_cli_add_link_invite(qentry->link, qentry); in smc_llc_process_cli_add_link()
985 smc_llc_cli_add_link(qentry->link, qentry); in smc_llc_process_cli_add_link()
1080 static int smc_llc_srv_rkey_exchange(struct smc_link *link, in smc_llc_srv_rkey_exchange() argument
1084 struct smc_link_group *lgr = link->lgr; in smc_llc_srv_rkey_exchange()
1096 smc_llc_add_link_cont(link, link_new, &num_rkeys_send, in smc_llc_srv_rkey_exchange()
1098 qentry = smc_llc_wait(lgr, link, SMC_LLC_WAIT_TIME, in smc_llc_srv_rkey_exchange()
1108 smc_rtoken_set(lgr, link->link_idx, link_new->link_idx, in smc_llc_srv_rkey_exchange()
1121 static int smc_llc_srv_conf_link(struct smc_link *link, in smc_llc_srv_conf_link() argument
1125 struct smc_link_group *lgr = link->lgr; in smc_llc_srv_conf_link()
1134 qentry = smc_llc_wait(lgr, link, SMC_LLC_WAIT_FIRST_TIME, 0); in smc_llc_srv_conf_link()
1138 smc_llc_send_delete_link(link, link_new->link_id, SMC_LLC_REQ, in smc_llc_srv_conf_link()
1155 int smc_llc_srv_add_link(struct smc_link *link) in smc_llc_srv_add_link() argument
1158 struct smc_link_group *lgr = link->lgr; in smc_llc_srv_add_link()
1167 smc_pnet_find_alt_roce(lgr, &ini, link->smcibdev); in smc_llc_srv_add_link()
1170 ini.ib_dev = link->smcibdev; in smc_llc_srv_add_link()
1171 ini.ib_port = link->ibport; in smc_llc_srv_add_link()
1181 rc = smc_llc_send_add_link(link, in smc_llc_srv_add_link()
1187 qentry = smc_llc_wait(lgr, link, SMC_LLC_WAIT_TIME, SMC_LLC_ADD_LINK); in smc_llc_srv_add_link()
1199 (!memcmp(add_llc->sender_gid, link->peer_gid, SMC_GID_SIZE) && in smc_llc_srv_add_link()
1200 !memcmp(add_llc->sender_mac, link->peer_mac, ETH_ALEN))) { in smc_llc_srv_add_link()
1215 rc = smc_llc_srv_rkey_exchange(link, link_new); in smc_llc_srv_add_link()
1218 rc = smc_llc_srv_conf_link(link, link_new, lgr_new_t); in smc_llc_srv_add_link()
1230 struct smc_link *link = lgr->llc_flow_lcl.qentry->link; in smc_llc_process_srv_add_link() local
1236 rc = smc_llc_srv_add_link(link); in smc_llc_process_srv_add_link()
1245 void smc_llc_add_link_local(struct smc_link *link) in smc_llc_add_link_local() argument
1252 smc_llc_enqueue(link, (union smc_llc_msg *)&add_llc); in smc_llc_add_link_local()
1278 void smc_llc_srv_delete_link_local(struct smc_link *link, u8 del_link_id) in smc_llc_srv_delete_link_local() argument
1287 smc_llc_enqueue(link, (union smc_llc_msg *)&del_llc); in smc_llc_srv_delete_link_local()
1299 lnk = qentry->link; in smc_llc_process_cli_delete_link()
1378 lnk = qentry->link; in smc_llc_process_srv_delete_link()
1460 struct smc_link *link; in smc_llc_rmt_conf_rkey() local
1467 link = qentry->link; in smc_llc_rmt_conf_rkey()
1471 rk_idx = smc_rtoken_add(link, in smc_llc_rmt_conf_rkey()
1488 smc_llc_send_message(link, &qentry->msg); in smc_llc_rmt_conf_rkey()
1497 struct smc_link *link; in smc_llc_rmt_delete_rkey() local
1503 link = qentry->link; in smc_llc_rmt_delete_rkey()
1507 if (smc_rtoken_delete(link, llc->rkey[i])) in smc_llc_rmt_delete_rkey()
1515 smc_llc_send_message(link, &qentry->msg); in smc_llc_rmt_delete_rkey()
1543 struct smc_link *link = qentry->link; in smc_llc_event_handler() local
1544 struct smc_link_group *lgr = link->lgr; in smc_llc_event_handler()
1546 if (!smc_link_usable(link)) in smc_llc_event_handler()
1552 smc_llc_send_message(link, llc); in smc_llc_event_handler()
1641 if (smc_link_usable(qentry->link)) in smc_llc_event_work()
1661 static void smc_llc_rx_response(struct smc_link *link, in smc_llc_rx_response() argument
1664 enum smc_llc_flowtype flowtype = link->lgr->llc_flow_lcl.type; in smc_llc_rx_response()
1665 struct smc_llc_flow *flow = &link->lgr->llc_flow_lcl; in smc_llc_rx_response()
1670 if (smc_link_active(link)) in smc_llc_rx_response()
1671 complete(&link->llc_testlink_resp); in smc_llc_rx_response()
1692 smc_llc_protocol_violation(link->lgr, llc_type); in smc_llc_rx_response()
1699 smc_llc_flow_qentry_set(&link->lgr->llc_flow_lcl, qentry); in smc_llc_rx_response()
1700 wake_up(&link->lgr->llc_msg_waiter); in smc_llc_rx_response()
1703 static void smc_llc_enqueue(struct smc_link *link, union smc_llc_msg *llc) in smc_llc_enqueue() argument
1705 struct smc_link_group *lgr = link->lgr; in smc_llc_enqueue()
1712 qentry->link = link; in smc_llc_enqueue()
1718 smc_llc_rx_response(link, qentry); in smc_llc_enqueue()
1732 struct smc_link *link = (struct smc_link *)wc->qp->qp_context; in smc_llc_rx_handler() local
1740 smc_llc_enqueue(link, llc); in smc_llc_rx_handler()
1747 struct smc_link *link = container_of(to_delayed_work(work), in smc_llc_testlink_work() local
1754 if (!smc_link_active(link)) in smc_llc_testlink_work()
1756 expire_time = link->wr_rx_tstamp + link->llc_testlink_time; in smc_llc_testlink_work()
1761 reinit_completion(&link->llc_testlink_resp); in smc_llc_testlink_work()
1762 smc_llc_send_test_link(link, user_data); in smc_llc_testlink_work()
1764 rc = wait_for_completion_interruptible_timeout(&link->llc_testlink_resp, in smc_llc_testlink_work()
1766 if (!smc_link_active(link)) in smc_llc_testlink_work()
1769 smcr_link_down_cond_sched(link); in smc_llc_testlink_work()
1772 next_interval = link->llc_testlink_time; in smc_llc_testlink_work()
1774 schedule_delayed_work(&link->llc_testlink_wrk, next_interval); in smc_llc_testlink_work()
1808 int smc_llc_link_init(struct smc_link *link) in smc_llc_link_init() argument
1810 init_completion(&link->llc_testlink_resp); in smc_llc_link_init()
1811 INIT_DELAYED_WORK(&link->llc_testlink_wrk, smc_llc_testlink_work); in smc_llc_link_init()
1815 void smc_llc_link_active(struct smc_link *link) in smc_llc_link_active() argument
1819 SMC_LGR_ID_SIZE, &link->lgr->id, in smc_llc_link_active()
1820 SMC_LGR_ID_SIZE, &link->link_uid, in smc_llc_link_active()
1821 SMC_LGR_ID_SIZE, &link->peer_link_uid, in smc_llc_link_active()
1822 link->smcibdev->ibdev->name, link->ibport); in smc_llc_link_active()
1823 link->state = SMC_LNK_ACTIVE; in smc_llc_link_active()
1824 if (link->lgr->llc_testlink_time) { in smc_llc_link_active()
1825 link->llc_testlink_time = link->lgr->llc_testlink_time; in smc_llc_link_active()
1826 schedule_delayed_work(&link->llc_testlink_wrk, in smc_llc_link_active()
1827 link->llc_testlink_time); in smc_llc_link_active()
1832 void smc_llc_link_clear(struct smc_link *link, bool log) in smc_llc_link_clear() argument
1837 SMC_LGR_ID_SIZE, &link->lgr->id, in smc_llc_link_clear()
1838 SMC_LGR_ID_SIZE, &link->link_uid, in smc_llc_link_clear()
1839 SMC_LGR_ID_SIZE, &link->peer_link_uid, in smc_llc_link_clear()
1840 link->smcibdev->ibdev->name, link->ibport); in smc_llc_link_clear()
1841 complete(&link->llc_testlink_resp); in smc_llc_link_clear()
1842 cancel_delayed_work_sync(&link->llc_testlink_wrk); in smc_llc_link_clear()
1894 void smc_llc_link_set_uid(struct smc_link *link) in smc_llc_link_set_uid() argument
1898 link_uid = htonl(*((u32 *)link->lgr->id) + link->link_id); in smc_llc_link_set_uid()
1899 memcpy(link->link_uid, &link_uid, SMC_LGR_ID_SIZE); in smc_llc_link_set_uid()
1905 memcpy(qentry->link->peer_link_uid, qentry->msg.confirm_link.link_uid, in smc_llc_save_peer_uid()
1914 qentry->link->link_id = qentry->msg.confirm_link.link_num; in smc_llc_eval_conf_link()
1915 smc_llc_link_set_uid(qentry->link); in smc_llc_eval_conf_link()