Lines Matching refs:link
144 struct smc_link *link, in smc_llc_tx_handler() argument
163 static int smc_llc_add_pending_send(struct smc_link *link, in smc_llc_add_pending_send() argument
169 rc = smc_wr_tx_get_free_slot(link, smc_llc_tx_handler, wr_buf, NULL, in smc_llc_add_pending_send()
186 int smc_llc_send_confirm_link(struct smc_link *link, in smc_llc_send_confirm_link() argument
189 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_send_confirm_link()
195 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_confirm_link()
205 memcpy(confllc->sender_mac, link->smcibdev->mac[link->ibport - 1], in smc_llc_send_confirm_link()
207 memcpy(confllc->sender_gid, link->gid, SMC_GID_SIZE); in smc_llc_send_confirm_link()
208 hton24(confllc->sender_qp_num, link->roce_qp->qp_num); in smc_llc_send_confirm_link()
209 confllc->link_num = link->link_id; in smc_llc_send_confirm_link()
213 rc = smc_wr_tx_send(link, pend); in smc_llc_send_confirm_link()
218 static int smc_llc_send_confirm_rkey(struct smc_link *link, in smc_llc_send_confirm_rkey() argument
226 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_confirm_rkey()
238 rc = smc_wr_tx_send(link, pend); in smc_llc_send_confirm_rkey()
243 static int smc_llc_send_delete_rkey(struct smc_link *link, in smc_llc_send_delete_rkey() argument
251 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_delete_rkey()
261 rc = smc_wr_tx_send(link, pend); in smc_llc_send_delete_rkey()
267 struct smc_link *link, u8 mac[], u8 gid[], in smc_llc_prep_add_link() argument
284 int smc_llc_send_add_link(struct smc_link *link, u8 mac[], u8 gid[], in smc_llc_send_add_link() argument
292 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_add_link()
296 smc_llc_prep_add_link(addllc, link, mac, gid, reqresp); in smc_llc_send_add_link()
298 rc = smc_wr_tx_send(link, pend); in smc_llc_send_add_link()
304 struct smc_link *link, in smc_llc_prep_delete_link() argument
316 delllc->link_num = link->link_id; in smc_llc_prep_delete_link()
320 int smc_llc_send_delete_link(struct smc_link *link, in smc_llc_send_delete_link() argument
328 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_delete_link()
332 smc_llc_prep_delete_link(delllc, link, reqresp, orderly); in smc_llc_send_delete_link()
334 rc = smc_wr_tx_send(link, pend); in smc_llc_send_delete_link()
339 static int smc_llc_send_test_link(struct smc_link *link, u8 user_data[16]) in smc_llc_send_test_link() argument
346 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_test_link()
355 rc = smc_wr_tx_send(link, pend); in smc_llc_send_test_link()
361 struct smc_link *link; member
375 if (llcwrk->link->state == SMC_LNK_INACTIVE) in smc_llc_send_message_work()
377 rc = smc_llc_add_pending_send(llcwrk->link, &wr_buf, &pend); in smc_llc_send_message_work()
381 smc_wr_tx_send(llcwrk->link, pend); in smc_llc_send_message_work()
387 static int smc_llc_send_message(struct smc_link *link, void *llcbuf, int llclen) in smc_llc_send_message() argument
394 wrk->link = link; in smc_llc_send_message()
397 queue_work(link->llc_wq, &wrk->work); in smc_llc_send_message()
403 static void smc_llc_rx_confirm_link(struct smc_link *link, in smc_llc_rx_confirm_link() argument
406 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_rx_confirm_link()
417 link->state == SMC_LNK_ACTIVATING) { in smc_llc_rx_confirm_link()
418 link->llc_confirm_resp_rc = conf_rc; in smc_llc_rx_confirm_link()
419 complete(&link->llc_confirm_resp); in smc_llc_rx_confirm_link()
423 link->state == SMC_LNK_ACTIVATING) { in smc_llc_rx_confirm_link()
424 link->llc_confirm_rc = conf_rc; in smc_llc_rx_confirm_link()
425 link->link_id = llc->link_num; in smc_llc_rx_confirm_link()
426 complete(&link->llc_confirm); in smc_llc_rx_confirm_link()
431 static void smc_llc_rx_add_link(struct smc_link *link, in smc_llc_rx_add_link() argument
434 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_rx_add_link()
437 if (link->state == SMC_LNK_ACTIVATING) in smc_llc_rx_add_link()
438 complete(&link->llc_add_resp); in smc_llc_rx_add_link()
440 if (link->state == SMC_LNK_ACTIVATING) { in smc_llc_rx_add_link()
441 complete(&link->llc_add); in smc_llc_rx_add_link()
446 smc_llc_prep_add_link(llc, link, in smc_llc_rx_add_link()
447 link->smcibdev->mac[link->ibport - 1], in smc_llc_rx_add_link()
448 link->gid, SMC_LLC_REQ); in smc_llc_rx_add_link()
451 smc_llc_prep_add_link(llc, link, in smc_llc_rx_add_link()
452 link->smcibdev->mac[link->ibport - 1], in smc_llc_rx_add_link()
453 link->gid, SMC_LLC_RESP); in smc_llc_rx_add_link()
455 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_add_link()
459 static void smc_llc_rx_delete_link(struct smc_link *link, in smc_llc_rx_delete_link() argument
462 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_rx_delete_link()
469 smc_llc_link_deleting(link); in smc_llc_rx_delete_link()
472 smc_llc_prep_delete_link(llc, link, SMC_LLC_REQ, true); in smc_llc_rx_delete_link()
475 smc_llc_prep_delete_link(llc, link, SMC_LLC_RESP, true); in smc_llc_rx_delete_link()
477 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_delete_link()
482 static void smc_llc_rx_test_link(struct smc_link *link, in smc_llc_rx_test_link() argument
486 if (link->state == SMC_LNK_ACTIVE) in smc_llc_rx_test_link()
487 complete(&link->llc_testlink_resp); in smc_llc_rx_test_link()
490 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_test_link()
494 static void smc_llc_rx_confirm_rkey(struct smc_link *link, in smc_llc_rx_confirm_rkey() argument
500 link->llc_confirm_rkey_rc = llc->hd.flags & in smc_llc_rx_confirm_rkey()
502 complete(&link->llc_confirm_rkey); in smc_llc_rx_confirm_rkey()
504 rc = smc_rtoken_add(smc_get_lgr(link), in smc_llc_rx_confirm_rkey()
513 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_confirm_rkey()
517 static void smc_llc_rx_confirm_rkey_cont(struct smc_link *link, in smc_llc_rx_confirm_rkey_cont() argument
525 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_confirm_rkey_cont()
529 static void smc_llc_rx_delete_rkey(struct smc_link *link, in smc_llc_rx_delete_rkey() argument
536 link->llc_delete_rkey_rc = llc->hd.flags & in smc_llc_rx_delete_rkey()
538 complete(&link->llc_delete_rkey); in smc_llc_rx_delete_rkey()
542 if (smc_rtoken_delete(smc_get_lgr(link), llc->rkey[i])) in smc_llc_rx_delete_rkey()
552 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_delete_rkey()
558 struct smc_link *link = (struct smc_link *)wc->qp->qp_context; in smc_llc_rx_handler() local
565 if (link->state == SMC_LNK_INACTIVE) in smc_llc_rx_handler()
570 smc_llc_rx_test_link(link, &llc->test_link); in smc_llc_rx_handler()
573 smc_llc_rx_confirm_link(link, &llc->confirm_link); in smc_llc_rx_handler()
576 smc_llc_rx_add_link(link, &llc->add_link); in smc_llc_rx_handler()
579 smc_llc_rx_delete_link(link, &llc->delete_link); in smc_llc_rx_handler()
582 smc_llc_rx_confirm_rkey(link, &llc->confirm_rkey); in smc_llc_rx_handler()
585 smc_llc_rx_confirm_rkey_cont(link, &llc->confirm_rkey_cont); in smc_llc_rx_handler()
588 smc_llc_rx_delete_rkey(link, &llc->delete_rkey); in smc_llc_rx_handler()
597 struct smc_link *link = container_of(to_delayed_work(work), in smc_llc_testlink_work() local
604 if (link->state != SMC_LNK_ACTIVE) in smc_llc_testlink_work()
606 expire_time = link->wr_rx_tstamp + link->llc_testlink_time; in smc_llc_testlink_work()
611 reinit_completion(&link->llc_testlink_resp); in smc_llc_testlink_work()
612 smc_llc_send_test_link(link, user_data); in smc_llc_testlink_work()
614 rc = wait_for_completion_interruptible_timeout(&link->llc_testlink_resp, in smc_llc_testlink_work()
617 smc_lgr_terminate(smc_get_lgr(link)); in smc_llc_testlink_work()
620 next_interval = link->llc_testlink_time; in smc_llc_testlink_work()
622 queue_delayed_work(link->llc_wq, &link->llc_testlink_wrk, in smc_llc_testlink_work()
626 int smc_llc_link_init(struct smc_link *link) in smc_llc_link_init() argument
628 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_link_init()
629 link->llc_wq = alloc_ordered_workqueue("llc_wq-%x:%x)", WQ_MEM_RECLAIM, in smc_llc_link_init()
631 link->link_id); in smc_llc_link_init()
632 if (!link->llc_wq) in smc_llc_link_init()
634 init_completion(&link->llc_confirm); in smc_llc_link_init()
635 init_completion(&link->llc_confirm_resp); in smc_llc_link_init()
636 init_completion(&link->llc_add); in smc_llc_link_init()
637 init_completion(&link->llc_add_resp); in smc_llc_link_init()
638 init_completion(&link->llc_confirm_rkey); in smc_llc_link_init()
639 init_completion(&link->llc_delete_rkey); in smc_llc_link_init()
640 mutex_init(&link->llc_delete_rkey_mutex); in smc_llc_link_init()
641 init_completion(&link->llc_testlink_resp); in smc_llc_link_init()
642 INIT_DELAYED_WORK(&link->llc_testlink_wrk, smc_llc_testlink_work); in smc_llc_link_init()
646 void smc_llc_link_active(struct smc_link *link, int testlink_time) in smc_llc_link_active() argument
648 link->state = SMC_LNK_ACTIVE; in smc_llc_link_active()
650 link->llc_testlink_time = testlink_time * HZ; in smc_llc_link_active()
651 queue_delayed_work(link->llc_wq, &link->llc_testlink_wrk, in smc_llc_link_active()
652 link->llc_testlink_time); in smc_llc_link_active()
656 void smc_llc_link_deleting(struct smc_link *link) in smc_llc_link_deleting() argument
658 link->state = SMC_LNK_DELETING; in smc_llc_link_deleting()
662 void smc_llc_link_inactive(struct smc_link *link) in smc_llc_link_inactive() argument
664 link->state = SMC_LNK_INACTIVE; in smc_llc_link_inactive()
665 cancel_delayed_work(&link->llc_testlink_wrk); in smc_llc_link_inactive()
669 void smc_llc_link_clear(struct smc_link *link) in smc_llc_link_clear() argument
671 flush_workqueue(link->llc_wq); in smc_llc_link_clear()
672 destroy_workqueue(link->llc_wq); in smc_llc_link_clear()
676 int smc_llc_do_confirm_rkey(struct smc_link *link, in smc_llc_do_confirm_rkey() argument
682 reinit_completion(&link->llc_confirm_rkey); in smc_llc_do_confirm_rkey()
683 rc = smc_llc_send_confirm_rkey(link, rmb_desc); in smc_llc_do_confirm_rkey()
687 rc = wait_for_completion_interruptible_timeout(&link->llc_confirm_rkey, in smc_llc_do_confirm_rkey()
689 if (rc <= 0 || link->llc_confirm_rkey_rc) in smc_llc_do_confirm_rkey()
695 int smc_llc_do_delete_rkey(struct smc_link *link, in smc_llc_do_delete_rkey() argument
700 mutex_lock(&link->llc_delete_rkey_mutex); in smc_llc_do_delete_rkey()
701 reinit_completion(&link->llc_delete_rkey); in smc_llc_do_delete_rkey()
702 rc = smc_llc_send_delete_rkey(link, rmb_desc); in smc_llc_do_delete_rkey()
706 rc = wait_for_completion_interruptible_timeout(&link->llc_delete_rkey, in smc_llc_do_delete_rkey()
708 if (rc <= 0 || link->llc_delete_rkey_rc) in smc_llc_do_delete_rkey()
713 mutex_unlock(&link->llc_delete_rkey_mutex); in smc_llc_do_delete_rkey()