• Home
  • Raw
  • Download

Lines Matching full:link

5  *  Link Layer Control (LLC)
84 u8 num_rkeys; /* first rtoken byte of CONFIRM LINK msg */
86 /* rtoken is always for the current link */
87 u8 link_id; /* link id of the rtoken */
144 struct smc_link *link, in smc_llc_tx_handler() argument
152 * @link: Pointer to SMC link used for sending LLC control message.
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, pend); in smc_llc_add_pending_send()
177 …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()
184 /* high-level API to send LLC confirm link */
185 int smc_llc_send_confirm_link(struct smc_link *link, in smc_llc_send_confirm_link() argument
188 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_send_confirm_link()
194 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_confirm_link()
204 memcpy(confllc->sender_mac, link->smcibdev->mac[link->ibport - 1], in smc_llc_send_confirm_link()
206 memcpy(confllc->sender_gid, link->gid, SMC_GID_SIZE); in smc_llc_send_confirm_link()
207 hton24(confllc->sender_qp_num, link->roce_qp->qp_num); in smc_llc_send_confirm_link()
208 confllc->link_num = link->link_id; in smc_llc_send_confirm_link()
212 rc = smc_wr_tx_send(link, pend); in smc_llc_send_confirm_link()
217 static int smc_llc_send_confirm_rkey(struct smc_link *link, in smc_llc_send_confirm_rkey() argument
225 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_confirm_rkey()
237 rc = smc_wr_tx_send(link, pend); in smc_llc_send_confirm_rkey()
241 /* prepare an add link message */
243 struct smc_link *link, u8 mac[], u8 gid[], in smc_llc_prep_add_link() argument
259 /* send ADD LINK request or response */
260 int smc_llc_send_add_link(struct smc_link *link, u8 mac[], u8 gid[], in smc_llc_send_add_link() argument
268 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_add_link()
272 smc_llc_prep_add_link(addllc, link, mac, gid, reqresp); in smc_llc_send_add_link()
274 rc = smc_wr_tx_send(link, pend); in smc_llc_send_add_link()
278 /* prepare a delete link message */
280 struct smc_link *link, in smc_llc_prep_delete_link() argument
288 /* DEL_LINK_ALL because only 1 link supported */ in smc_llc_prep_delete_link()
292 delllc->link_num = link->link_id; in smc_llc_prep_delete_link()
295 /* send DELETE LINK request or response */
296 int smc_llc_send_delete_link(struct smc_link *link, in smc_llc_send_delete_link() argument
304 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_delete_link()
308 smc_llc_prep_delete_link(delllc, link, reqresp, orderly); in smc_llc_send_delete_link()
310 rc = smc_wr_tx_send(link, pend); in smc_llc_send_delete_link()
314 /* send LLC test link request */
315 static int smc_llc_send_test_link(struct smc_link *link, u8 user_data[16]) in smc_llc_send_test_link() argument
322 rc = smc_llc_add_pending_send(link, &wr_buf, &pend); in smc_llc_send_test_link()
331 rc = smc_wr_tx_send(link, pend); in smc_llc_send_test_link()
337 struct smc_link *link; member
351 if (llcwrk->link->state == SMC_LNK_INACTIVE) in smc_llc_send_message_work()
353 rc = smc_llc_add_pending_send(llcwrk->link, &wr_buf, &pend); in smc_llc_send_message_work()
357 smc_wr_tx_send(llcwrk->link, pend); in smc_llc_send_message_work()
362 /* copy llcbuf and schedule an llc send on link */
363 static int smc_llc_send_message(struct smc_link *link, void *llcbuf, int llclen) in smc_llc_send_message() argument
370 wrk->link = link; in smc_llc_send_message()
373 queue_work(link->llc_wq, &wrk->work); in smc_llc_send_message()
379 static void smc_llc_rx_confirm_link(struct smc_link *link, in smc_llc_rx_confirm_link() argument
382 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_rx_confirm_link()
393 link->state == SMC_LNK_ACTIVATING) { in smc_llc_rx_confirm_link()
394 link->llc_confirm_resp_rc = conf_rc; in smc_llc_rx_confirm_link()
395 complete(&link->llc_confirm_resp); in smc_llc_rx_confirm_link()
399 link->state == SMC_LNK_ACTIVATING) { in smc_llc_rx_confirm_link()
400 link->llc_confirm_rc = conf_rc; in smc_llc_rx_confirm_link()
401 link->link_id = llc->link_num; in smc_llc_rx_confirm_link()
402 complete(&link->llc_confirm); in smc_llc_rx_confirm_link()
407 static void smc_llc_rx_add_link(struct smc_link *link, in smc_llc_rx_add_link() argument
410 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_rx_add_link()
413 if (link->state == SMC_LNK_ACTIVATING) in smc_llc_rx_add_link()
414 complete(&link->llc_add_resp); in smc_llc_rx_add_link()
416 if (link->state == SMC_LNK_ACTIVATING) { in smc_llc_rx_add_link()
417 complete(&link->llc_add); in smc_llc_rx_add_link()
422 smc_llc_prep_add_link(llc, link, in smc_llc_rx_add_link()
423 link->smcibdev->mac[link->ibport - 1], in smc_llc_rx_add_link()
424 link->gid, SMC_LLC_REQ); in smc_llc_rx_add_link()
427 smc_llc_prep_add_link(llc, link, in smc_llc_rx_add_link()
428 link->smcibdev->mac[link->ibport - 1], in smc_llc_rx_add_link()
429 link->gid, SMC_LLC_RESP); in smc_llc_rx_add_link()
431 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_add_link()
435 static void smc_llc_rx_delete_link(struct smc_link *link, in smc_llc_rx_delete_link() argument
438 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_rx_delete_link()
445 smc_llc_link_deleting(link); in smc_llc_rx_delete_link()
447 /* client asks to delete this link, send request */ in smc_llc_rx_delete_link()
448 smc_llc_prep_delete_link(llc, link, SMC_LLC_REQ, true); in smc_llc_rx_delete_link()
450 /* server requests to delete this link, send response */ in smc_llc_rx_delete_link()
451 smc_llc_prep_delete_link(llc, link, SMC_LLC_RESP, true); in smc_llc_rx_delete_link()
453 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_delete_link()
458 static void smc_llc_rx_test_link(struct smc_link *link, in smc_llc_rx_test_link() argument
462 if (link->state == SMC_LNK_ACTIVE) in smc_llc_rx_test_link()
463 complete(&link->llc_testlink_resp); in smc_llc_rx_test_link()
466 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_test_link()
470 static void smc_llc_rx_confirm_rkey(struct smc_link *link, in smc_llc_rx_confirm_rkey() argument
476 link->llc_confirm_rkey_rc = llc->hd.flags & in smc_llc_rx_confirm_rkey()
478 complete(&link->llc_confirm_rkey); in smc_llc_rx_confirm_rkey()
480 rc = smc_rtoken_add(smc_get_lgr(link), in smc_llc_rx_confirm_rkey()
484 /* ignore rtokens for other links, we have only one link */ in smc_llc_rx_confirm_rkey()
489 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_confirm_rkey()
493 static void smc_llc_rx_confirm_rkey_cont(struct smc_link *link, in smc_llc_rx_confirm_rkey_cont() argument
499 /* ignore rtokens for other links, we have only one link */ in smc_llc_rx_confirm_rkey_cont()
501 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_confirm_rkey_cont()
505 static void smc_llc_rx_delete_rkey(struct smc_link *link, in smc_llc_rx_delete_rkey() argument
516 if (smc_rtoken_delete(smc_get_lgr(link), llc->rkey[i])) in smc_llc_rx_delete_rkey()
526 smc_llc_send_message(link, llc, sizeof(*llc)); in smc_llc_rx_delete_rkey()
532 struct smc_link *link = (struct smc_link *)wc->qp->qp_context; in smc_llc_rx_handler() local
539 if (link->state == SMC_LNK_INACTIVE) in smc_llc_rx_handler()
540 return; /* link not active, drop msg */ in smc_llc_rx_handler()
544 smc_llc_rx_test_link(link, &llc->test_link); in smc_llc_rx_handler()
547 smc_llc_rx_confirm_link(link, &llc->confirm_link); in smc_llc_rx_handler()
550 smc_llc_rx_add_link(link, &llc->add_link); in smc_llc_rx_handler()
553 smc_llc_rx_delete_link(link, &llc->delete_link); in smc_llc_rx_handler()
556 smc_llc_rx_confirm_rkey(link, &llc->confirm_rkey); in smc_llc_rx_handler()
559 smc_llc_rx_confirm_rkey_cont(link, &llc->confirm_rkey_cont); in smc_llc_rx_handler()
562 smc_llc_rx_delete_rkey(link, &llc->delete_rkey); in smc_llc_rx_handler()
571 struct smc_link *link = container_of(to_delayed_work(work), in smc_llc_testlink_work() local
578 if (link->state != SMC_LNK_ACTIVE) in smc_llc_testlink_work()
580 expire_time = link->wr_rx_tstamp + link->llc_testlink_time; in smc_llc_testlink_work()
585 reinit_completion(&link->llc_testlink_resp); in smc_llc_testlink_work()
586 smc_llc_send_test_link(link, user_data); in smc_llc_testlink_work()
587 /* receive TEST LINK response over RoCE fabric */ in smc_llc_testlink_work()
588 rc = wait_for_completion_interruptible_timeout(&link->llc_testlink_resp, in smc_llc_testlink_work()
591 smc_lgr_terminate(smc_get_lgr(link)); in smc_llc_testlink_work()
594 next_interval = link->llc_testlink_time; in smc_llc_testlink_work()
596 queue_delayed_work(link->llc_wq, &link->llc_testlink_wrk, in smc_llc_testlink_work()
600 int smc_llc_link_init(struct smc_link *link) in smc_llc_link_init() argument
602 struct smc_link_group *lgr = smc_get_lgr(link); in smc_llc_link_init()
603 link->llc_wq = alloc_ordered_workqueue("llc_wq-%x:%x)", WQ_MEM_RECLAIM, in smc_llc_link_init()
605 link->link_id); in smc_llc_link_init()
606 if (!link->llc_wq) in smc_llc_link_init()
608 init_completion(&link->llc_confirm); in smc_llc_link_init()
609 init_completion(&link->llc_confirm_resp); in smc_llc_link_init()
610 init_completion(&link->llc_add); in smc_llc_link_init()
611 init_completion(&link->llc_add_resp); in smc_llc_link_init()
612 init_completion(&link->llc_confirm_rkey); in smc_llc_link_init()
613 init_completion(&link->llc_testlink_resp); in smc_llc_link_init()
614 INIT_DELAYED_WORK(&link->llc_testlink_wrk, smc_llc_testlink_work); in smc_llc_link_init()
618 void smc_llc_link_active(struct smc_link *link, int testlink_time) in smc_llc_link_active() argument
620 link->state = SMC_LNK_ACTIVE; in smc_llc_link_active()
622 link->llc_testlink_time = testlink_time * HZ; in smc_llc_link_active()
623 queue_delayed_work(link->llc_wq, &link->llc_testlink_wrk, in smc_llc_link_active()
624 link->llc_testlink_time); in smc_llc_link_active()
628 void smc_llc_link_deleting(struct smc_link *link) in smc_llc_link_deleting() argument
630 link->state = SMC_LNK_DELETING; in smc_llc_link_deleting()
634 void smc_llc_link_inactive(struct smc_link *link) in smc_llc_link_inactive() argument
636 link->state = SMC_LNK_INACTIVE; in smc_llc_link_inactive()
637 cancel_delayed_work(&link->llc_testlink_wrk); in smc_llc_link_inactive()
641 void smc_llc_link_clear(struct smc_link *link) in smc_llc_link_clear() argument
643 flush_workqueue(link->llc_wq); in smc_llc_link_clear()
644 destroy_workqueue(link->llc_wq); in smc_llc_link_clear()
648 int smc_llc_do_confirm_rkey(struct smc_link *link, in smc_llc_do_confirm_rkey() argument
653 reinit_completion(&link->llc_confirm_rkey); in smc_llc_do_confirm_rkey()
654 smc_llc_send_confirm_rkey(link, rmb_desc); in smc_llc_do_confirm_rkey()
656 rc = wait_for_completion_interruptible_timeout(&link->llc_confirm_rkey, in smc_llc_do_confirm_rkey()
658 if (rc <= 0 || link->llc_confirm_rkey_rc) in smc_llc_do_confirm_rkey()