Lines Matching refs:lnk

525 void smc_wr_remember_qp_attr(struct smc_link *lnk)  in smc_wr_remember_qp_attr()  argument
527 struct ib_qp_attr *attr = &lnk->qp_attr; in smc_wr_remember_qp_attr()
532 ib_query_qp(lnk->roce_qp, attr, in smc_wr_remember_qp_attr()
552 lnk->wr_tx_cnt = min_t(size_t, SMC_WR_BUF_CNT, in smc_wr_remember_qp_attr()
553 lnk->qp_attr.cap.max_send_wr); in smc_wr_remember_qp_attr()
554 lnk->wr_rx_cnt = min_t(size_t, SMC_WR_BUF_CNT * 3, in smc_wr_remember_qp_attr()
555 lnk->qp_attr.cap.max_recv_wr); in smc_wr_remember_qp_attr()
558 static void smc_wr_init_sge(struct smc_link *lnk) in smc_wr_init_sge() argument
560 int sges_per_buf = (lnk->lgr->smc_version == SMC_V2) ? 2 : 1; in smc_wr_init_sge()
563 for (i = 0; i < lnk->wr_tx_cnt; i++) { in smc_wr_init_sge()
564 lnk->wr_tx_sges[i].addr = in smc_wr_init_sge()
565 lnk->wr_tx_dma_addr + i * SMC_WR_BUF_SIZE; in smc_wr_init_sge()
566 lnk->wr_tx_sges[i].length = SMC_WR_TX_SIZE; in smc_wr_init_sge()
567 lnk->wr_tx_sges[i].lkey = lnk->roce_pd->local_dma_lkey; in smc_wr_init_sge()
568 lnk->wr_tx_rdma_sges[i].tx_rdma_sge[0].wr_tx_rdma_sge[0].lkey = in smc_wr_init_sge()
569 lnk->roce_pd->local_dma_lkey; in smc_wr_init_sge()
570 lnk->wr_tx_rdma_sges[i].tx_rdma_sge[0].wr_tx_rdma_sge[1].lkey = in smc_wr_init_sge()
571 lnk->roce_pd->local_dma_lkey; in smc_wr_init_sge()
572 lnk->wr_tx_rdma_sges[i].tx_rdma_sge[1].wr_tx_rdma_sge[0].lkey = in smc_wr_init_sge()
573 lnk->roce_pd->local_dma_lkey; in smc_wr_init_sge()
574 lnk->wr_tx_rdma_sges[i].tx_rdma_sge[1].wr_tx_rdma_sge[1].lkey = in smc_wr_init_sge()
575 lnk->roce_pd->local_dma_lkey; in smc_wr_init_sge()
576 lnk->wr_tx_ibs[i].next = NULL; in smc_wr_init_sge()
577 lnk->wr_tx_ibs[i].sg_list = &lnk->wr_tx_sges[i]; in smc_wr_init_sge()
578 lnk->wr_tx_ibs[i].num_sge = 1; in smc_wr_init_sge()
579 lnk->wr_tx_ibs[i].opcode = IB_WR_SEND; in smc_wr_init_sge()
580 lnk->wr_tx_ibs[i].send_flags = in smc_wr_init_sge()
582 lnk->wr_tx_rdmas[i].wr_tx_rdma[0].wr.opcode = IB_WR_RDMA_WRITE; in smc_wr_init_sge()
583 lnk->wr_tx_rdmas[i].wr_tx_rdma[1].wr.opcode = IB_WR_RDMA_WRITE; in smc_wr_init_sge()
584 lnk->wr_tx_rdmas[i].wr_tx_rdma[0].wr.sg_list = in smc_wr_init_sge()
585 lnk->wr_tx_rdma_sges[i].tx_rdma_sge[0].wr_tx_rdma_sge; in smc_wr_init_sge()
586 lnk->wr_tx_rdmas[i].wr_tx_rdma[1].wr.sg_list = in smc_wr_init_sge()
587 lnk->wr_tx_rdma_sges[i].tx_rdma_sge[1].wr_tx_rdma_sge; in smc_wr_init_sge()
590 if (lnk->lgr->smc_version == SMC_V2) { in smc_wr_init_sge()
591 lnk->wr_tx_v2_sge->addr = lnk->wr_tx_v2_dma_addr; in smc_wr_init_sge()
592 lnk->wr_tx_v2_sge->length = SMC_WR_BUF_V2_SIZE; in smc_wr_init_sge()
593 lnk->wr_tx_v2_sge->lkey = lnk->roce_pd->local_dma_lkey; in smc_wr_init_sge()
595 lnk->wr_tx_v2_ib->next = NULL; in smc_wr_init_sge()
596 lnk->wr_tx_v2_ib->sg_list = lnk->wr_tx_v2_sge; in smc_wr_init_sge()
597 lnk->wr_tx_v2_ib->num_sge = 1; in smc_wr_init_sge()
598 lnk->wr_tx_v2_ib->opcode = IB_WR_SEND; in smc_wr_init_sge()
599 lnk->wr_tx_v2_ib->send_flags = in smc_wr_init_sge()
609 for (i = 0; i < lnk->wr_rx_cnt; i++) { in smc_wr_init_sge()
612 lnk->wr_rx_sges[x].addr = in smc_wr_init_sge()
613 lnk->wr_rx_dma_addr + i * SMC_WR_BUF_SIZE; in smc_wr_init_sge()
614 lnk->wr_rx_sges[x].length = SMC_WR_TX_SIZE; in smc_wr_init_sge()
615 lnk->wr_rx_sges[x].lkey = lnk->roce_pd->local_dma_lkey; in smc_wr_init_sge()
616 if (lnk->lgr->smc_version == SMC_V2) { in smc_wr_init_sge()
617 lnk->wr_rx_sges[x + 1].addr = in smc_wr_init_sge()
618 lnk->wr_rx_v2_dma_addr + SMC_WR_TX_SIZE; in smc_wr_init_sge()
619 lnk->wr_rx_sges[x + 1].length = in smc_wr_init_sge()
621 lnk->wr_rx_sges[x + 1].lkey = in smc_wr_init_sge()
622 lnk->roce_pd->local_dma_lkey; in smc_wr_init_sge()
624 lnk->wr_rx_ibs[i].next = NULL; in smc_wr_init_sge()
625 lnk->wr_rx_ibs[i].sg_list = &lnk->wr_rx_sges[x]; in smc_wr_init_sge()
626 lnk->wr_rx_ibs[i].num_sge = sges_per_buf; in smc_wr_init_sge()
628 lnk->wr_reg.wr.next = NULL; in smc_wr_init_sge()
629 lnk->wr_reg.wr.num_sge = 0; in smc_wr_init_sge()
630 lnk->wr_reg.wr.send_flags = IB_SEND_SIGNALED; in smc_wr_init_sge()
631 lnk->wr_reg.wr.opcode = IB_WR_REG_MR; in smc_wr_init_sge()
632 lnk->wr_reg.access = IB_ACCESS_LOCAL_WRITE | IB_ACCESS_REMOTE_WRITE; in smc_wr_init_sge()
635 void smc_wr_free_link(struct smc_link *lnk) in smc_wr_free_link() argument
639 if (!lnk->smcibdev) in smc_wr_free_link()
641 ibdev = lnk->smcibdev->ibdev; in smc_wr_free_link()
643 smc_wr_wakeup_reg_wait(lnk); in smc_wr_free_link()
644 smc_wr_wakeup_tx_wait(lnk); in smc_wr_free_link()
646 smc_wr_tx_wait_no_pending_sends(lnk); in smc_wr_free_link()
647 wait_event(lnk->wr_reg_wait, (!atomic_read(&lnk->wr_reg_refcnt))); in smc_wr_free_link()
648 wait_event(lnk->wr_tx_wait, (!atomic_read(&lnk->wr_tx_refcnt))); in smc_wr_free_link()
650 if (lnk->wr_rx_dma_addr) { in smc_wr_free_link()
651 ib_dma_unmap_single(ibdev, lnk->wr_rx_dma_addr, in smc_wr_free_link()
652 SMC_WR_BUF_SIZE * lnk->wr_rx_cnt, in smc_wr_free_link()
654 lnk->wr_rx_dma_addr = 0; in smc_wr_free_link()
656 if (lnk->wr_rx_v2_dma_addr) { in smc_wr_free_link()
657 ib_dma_unmap_single(ibdev, lnk->wr_rx_v2_dma_addr, in smc_wr_free_link()
660 lnk->wr_rx_v2_dma_addr = 0; in smc_wr_free_link()
662 if (lnk->wr_tx_dma_addr) { in smc_wr_free_link()
663 ib_dma_unmap_single(ibdev, lnk->wr_tx_dma_addr, in smc_wr_free_link()
664 SMC_WR_BUF_SIZE * lnk->wr_tx_cnt, in smc_wr_free_link()
666 lnk->wr_tx_dma_addr = 0; in smc_wr_free_link()
668 if (lnk->wr_tx_v2_dma_addr) { in smc_wr_free_link()
669 ib_dma_unmap_single(ibdev, lnk->wr_tx_v2_dma_addr, in smc_wr_free_link()
672 lnk->wr_tx_v2_dma_addr = 0; in smc_wr_free_link()
687 void smc_wr_free_link_mem(struct smc_link *lnk) in smc_wr_free_link_mem() argument
689 kfree(lnk->wr_tx_v2_ib); in smc_wr_free_link_mem()
690 lnk->wr_tx_v2_ib = NULL; in smc_wr_free_link_mem()
691 kfree(lnk->wr_tx_v2_sge); in smc_wr_free_link_mem()
692 lnk->wr_tx_v2_sge = NULL; in smc_wr_free_link_mem()
693 kfree(lnk->wr_tx_v2_pend); in smc_wr_free_link_mem()
694 lnk->wr_tx_v2_pend = NULL; in smc_wr_free_link_mem()
695 kfree(lnk->wr_tx_compl); in smc_wr_free_link_mem()
696 lnk->wr_tx_compl = NULL; in smc_wr_free_link_mem()
697 kfree(lnk->wr_tx_pends); in smc_wr_free_link_mem()
698 lnk->wr_tx_pends = NULL; in smc_wr_free_link_mem()
699 kfree(lnk->wr_tx_mask); in smc_wr_free_link_mem()
700 lnk->wr_tx_mask = NULL; in smc_wr_free_link_mem()
701 kfree(lnk->wr_tx_sges); in smc_wr_free_link_mem()
702 lnk->wr_tx_sges = NULL; in smc_wr_free_link_mem()
703 kfree(lnk->wr_tx_rdma_sges); in smc_wr_free_link_mem()
704 lnk->wr_tx_rdma_sges = NULL; in smc_wr_free_link_mem()
705 kfree(lnk->wr_rx_sges); in smc_wr_free_link_mem()
706 lnk->wr_rx_sges = NULL; in smc_wr_free_link_mem()
707 kfree(lnk->wr_tx_rdmas); in smc_wr_free_link_mem()
708 lnk->wr_tx_rdmas = NULL; in smc_wr_free_link_mem()
709 kfree(lnk->wr_rx_ibs); in smc_wr_free_link_mem()
710 lnk->wr_rx_ibs = NULL; in smc_wr_free_link_mem()
711 kfree(lnk->wr_tx_ibs); in smc_wr_free_link_mem()
712 lnk->wr_tx_ibs = NULL; in smc_wr_free_link_mem()
713 kfree(lnk->wr_tx_bufs); in smc_wr_free_link_mem()
714 lnk->wr_tx_bufs = NULL; in smc_wr_free_link_mem()
715 kfree(lnk->wr_rx_bufs); in smc_wr_free_link_mem()
716 lnk->wr_rx_bufs = NULL; in smc_wr_free_link_mem()
849 int smc_wr_create_link(struct smc_link *lnk) in smc_wr_create_link() argument
851 struct ib_device *ibdev = lnk->smcibdev->ibdev; in smc_wr_create_link()
854 smc_wr_tx_set_wr_id(&lnk->wr_tx_id, 0); in smc_wr_create_link()
855 lnk->wr_rx_id = 0; in smc_wr_create_link()
856 lnk->wr_rx_dma_addr = ib_dma_map_single( in smc_wr_create_link()
857 ibdev, lnk->wr_rx_bufs, SMC_WR_BUF_SIZE * lnk->wr_rx_cnt, in smc_wr_create_link()
859 if (ib_dma_mapping_error(ibdev, lnk->wr_rx_dma_addr)) { in smc_wr_create_link()
860 lnk->wr_rx_dma_addr = 0; in smc_wr_create_link()
864 if (lnk->lgr->smc_version == SMC_V2) { in smc_wr_create_link()
865 lnk->wr_rx_v2_dma_addr = ib_dma_map_single(ibdev, in smc_wr_create_link()
866 lnk->lgr->wr_rx_buf_v2, SMC_WR_BUF_V2_SIZE, in smc_wr_create_link()
868 if (ib_dma_mapping_error(ibdev, lnk->wr_rx_v2_dma_addr)) { in smc_wr_create_link()
869 lnk->wr_rx_v2_dma_addr = 0; in smc_wr_create_link()
873 lnk->wr_tx_v2_dma_addr = ib_dma_map_single(ibdev, in smc_wr_create_link()
874 lnk->lgr->wr_tx_buf_v2, SMC_WR_BUF_V2_SIZE, in smc_wr_create_link()
876 if (ib_dma_mapping_error(ibdev, lnk->wr_tx_v2_dma_addr)) { in smc_wr_create_link()
877 lnk->wr_tx_v2_dma_addr = 0; in smc_wr_create_link()
882 lnk->wr_tx_dma_addr = ib_dma_map_single( in smc_wr_create_link()
883 ibdev, lnk->wr_tx_bufs, SMC_WR_BUF_SIZE * lnk->wr_tx_cnt, in smc_wr_create_link()
885 if (ib_dma_mapping_error(ibdev, lnk->wr_tx_dma_addr)) { in smc_wr_create_link()
889 smc_wr_init_sge(lnk); in smc_wr_create_link()
890 memset(lnk->wr_tx_mask, 0, in smc_wr_create_link()
891 BITS_TO_LONGS(SMC_WR_BUF_CNT) * sizeof(*lnk->wr_tx_mask)); in smc_wr_create_link()
892 init_waitqueue_head(&lnk->wr_tx_wait); in smc_wr_create_link()
893 atomic_set(&lnk->wr_tx_refcnt, 0); in smc_wr_create_link()
894 init_waitqueue_head(&lnk->wr_reg_wait); in smc_wr_create_link()
895 atomic_set(&lnk->wr_reg_refcnt, 0); in smc_wr_create_link()
899 if (lnk->wr_rx_v2_dma_addr) { in smc_wr_create_link()
900 ib_dma_unmap_single(ibdev, lnk->wr_rx_v2_dma_addr, in smc_wr_create_link()
903 lnk->wr_rx_v2_dma_addr = 0; in smc_wr_create_link()
905 if (lnk->wr_tx_v2_dma_addr) { in smc_wr_create_link()
906 ib_dma_unmap_single(ibdev, lnk->wr_tx_v2_dma_addr, in smc_wr_create_link()
909 lnk->wr_tx_v2_dma_addr = 0; in smc_wr_create_link()
911 ib_dma_unmap_single(ibdev, lnk->wr_rx_dma_addr, in smc_wr_create_link()
912 SMC_WR_BUF_SIZE * lnk->wr_rx_cnt, in smc_wr_create_link()
914 lnk->wr_rx_dma_addr = 0; in smc_wr_create_link()