Lines Matching refs:rsrc

36 struct irdma_puda_buf *irdma_puda_get_bufpool(struct irdma_puda_rsrc *rsrc)  in irdma_puda_get_bufpool()  argument
39 struct list_head *list = &rsrc->bufpool; in irdma_puda_get_bufpool()
42 spin_lock_irqsave(&rsrc->bufpool_lock, flags); in irdma_puda_get_bufpool()
45 rsrc->avail_buf_count--; in irdma_puda_get_bufpool()
46 buf->vsi = rsrc->vsi; in irdma_puda_get_bufpool()
48 rsrc->stats_buf_alloc_fail++; in irdma_puda_get_bufpool()
50 spin_unlock_irqrestore(&rsrc->bufpool_lock, flags); in irdma_puda_get_bufpool()
60 void irdma_puda_ret_bufpool(struct irdma_puda_rsrc *rsrc, in irdma_puda_ret_bufpool() argument
66 spin_lock_irqsave(&rsrc->bufpool_lock, flags); in irdma_puda_ret_bufpool()
67 list_add(&buf->list, &rsrc->bufpool); in irdma_puda_ret_bufpool()
68 spin_unlock_irqrestore(&rsrc->bufpool_lock, flags); in irdma_puda_ret_bufpool()
69 rsrc->avail_buf_count++; in irdma_puda_ret_bufpool()
79 static void irdma_puda_post_recvbuf(struct irdma_puda_rsrc *rsrc, u32 wqe_idx, in irdma_puda_post_recvbuf() argument
83 struct irdma_sc_qp *qp = &rsrc->qp; in irdma_puda_post_recvbuf()
87 dma_sync_single_for_device(rsrc->dev->hw->device, buf->mem.pa, in irdma_puda_post_recvbuf()
116 static int irdma_puda_replenish_rq(struct irdma_puda_rsrc *rsrc, bool initial) in irdma_puda_replenish_rq() argument
119 u32 invalid_cnt = rsrc->rxq_invalid_cnt; in irdma_puda_replenish_rq()
123 buf = irdma_puda_get_bufpool(rsrc); in irdma_puda_replenish_rq()
126 irdma_puda_post_recvbuf(rsrc, rsrc->rx_wqe_idx, buf, initial); in irdma_puda_replenish_rq()
127 rsrc->rx_wqe_idx = ((rsrc->rx_wqe_idx + 1) % rsrc->rq_size); in irdma_puda_replenish_rq()
128 rsrc->rxq_invalid_cnt--; in irdma_puda_replenish_rq()
331 struct irdma_puda_rsrc *rsrc; in irdma_puda_poll_cmpl() local
336 rsrc = (cq_type == IRDMA_CQ_TYPE_ILQ) ? cq->vsi->ilq : in irdma_puda_poll_cmpl()
351 if (!qp || !rsrc) { in irdma_puda_poll_cmpl()
356 if (qp->qp_id != rsrc->qp_id) { in irdma_puda_poll_cmpl()
371 rsrc->stats_rcvd_pkt_err++; in irdma_puda_poll_cmpl()
373 irdma_ilq_putback_rcvbuf(&rsrc->qp, buf, in irdma_puda_poll_cmpl()
376 irdma_puda_ret_bufpool(rsrc, buf); in irdma_puda_poll_cmpl()
377 irdma_puda_replenish_rq(rsrc, false); in irdma_puda_poll_cmpl()
382 rsrc->stats_pkt_rcvd++; in irdma_puda_poll_cmpl()
383 rsrc->compl_rxwqe_idx = info.wqe_idx; in irdma_puda_poll_cmpl()
385 rsrc->receive(rsrc->vsi, buf); in irdma_puda_poll_cmpl()
387 irdma_ilq_putback_rcvbuf(&rsrc->qp, buf, info.wqe_idx); in irdma_puda_poll_cmpl()
389 irdma_puda_replenish_rq(rsrc, false); in irdma_puda_poll_cmpl()
400 rsrc->xmit_complete(rsrc->vsi, buf); in irdma_puda_poll_cmpl()
401 spin_lock_irqsave(&rsrc->bufpool_lock, flags); in irdma_puda_poll_cmpl()
402 rsrc->tx_wqe_avail_cnt++; in irdma_puda_poll_cmpl()
403 spin_unlock_irqrestore(&rsrc->bufpool_lock, flags); in irdma_puda_poll_cmpl()
404 if (!list_empty(&rsrc->txpend)) in irdma_puda_poll_cmpl()
405 irdma_puda_send_buf(rsrc, NULL); in irdma_puda_poll_cmpl()
501 void irdma_puda_send_buf(struct irdma_puda_rsrc *rsrc, in irdma_puda_send_buf() argument
508 spin_lock_irqsave(&rsrc->bufpool_lock, flags); in irdma_puda_send_buf()
512 if (!rsrc->tx_wqe_avail_cnt || (buf && !list_empty(&rsrc->txpend))) { in irdma_puda_send_buf()
513 list_add_tail(&buf->list, &rsrc->txpend); in irdma_puda_send_buf()
514 spin_unlock_irqrestore(&rsrc->bufpool_lock, flags); in irdma_puda_send_buf()
515 rsrc->stats_sent_pkt_q++; in irdma_puda_send_buf()
516 if (rsrc->type == IRDMA_PUDA_RSRC_TYPE_ILQ) in irdma_puda_send_buf()
517 ibdev_dbg(to_ibdev(rsrc->dev), in irdma_puda_send_buf()
521 rsrc->tx_wqe_avail_cnt--; in irdma_puda_send_buf()
526 buf = irdma_puda_get_listbuf(&rsrc->txpend); in irdma_puda_send_buf()
537 if (rsrc->dev->hw_attrs.uk_attrs.hw_rev >= IRDMA_GEN_2) { in irdma_puda_send_buf()
545 dma_sync_single_for_cpu(rsrc->dev->hw->device, buf->mem.pa, in irdma_puda_send_buf()
547 ret = irdma_puda_send(&rsrc->qp, &info); in irdma_puda_send_buf()
549 rsrc->tx_wqe_avail_cnt++; in irdma_puda_send_buf()
550 rsrc->stats_sent_pkt_q++; in irdma_puda_send_buf()
551 list_add(&buf->list, &rsrc->txpend); in irdma_puda_send_buf()
552 if (rsrc->type == IRDMA_PUDA_RSRC_TYPE_ILQ) in irdma_puda_send_buf()
553 ibdev_dbg(to_ibdev(rsrc->dev), in irdma_puda_send_buf()
556 rsrc->stats_pkt_sent++; in irdma_puda_send_buf()
559 spin_unlock_irqrestore(&rsrc->bufpool_lock, flags); in irdma_puda_send_buf()
566 static void irdma_puda_qp_setctx(struct irdma_puda_rsrc *rsrc) in irdma_puda_qp_setctx() argument
568 struct irdma_sc_qp *qp = &rsrc->qp; in irdma_puda_qp_setctx()
577 FIELD_PREP(IRDMAQPC_SNDMSS, rsrc->buf_size)); in irdma_puda_qp_setctx()
582 FIELD_PREP(IRDMAQPC_TXCQNUM, rsrc->cq_id) | in irdma_puda_qp_setctx()
583 FIELD_PREP(IRDMAQPC_RXCQNUM, rsrc->cq_id)); in irdma_puda_qp_setctx()
585 FIELD_PREP(IRDMAQPC_STAT_INDEX, rsrc->stats_idx)); in irdma_puda_qp_setctx()
588 FIELD_PREP(IRDMAQPC_USESTATSINSTANCE, rsrc->stats_idx_valid)); in irdma_puda_qp_setctx()
644 static int irdma_puda_qp_create(struct irdma_puda_rsrc *rsrc) in irdma_puda_qp_create() argument
646 struct irdma_sc_qp *qp = &rsrc->qp; in irdma_puda_qp_create()
652 sq_size = rsrc->sq_size * IRDMA_QP_WQE_MIN_SIZE; in irdma_puda_qp_create()
653 rq_size = rsrc->rq_size * IRDMA_QP_WQE_MIN_SIZE; in irdma_puda_qp_create()
654 rsrc->qpmem.size = ALIGN((sq_size + rq_size + (IRDMA_SHADOW_AREA_SIZE << 3) + IRDMA_QP_CTX_SIZE), in irdma_puda_qp_create()
656 rsrc->qpmem.va = dma_alloc_coherent(rsrc->dev->hw->device, in irdma_puda_qp_create()
657 rsrc->qpmem.size, &rsrc->qpmem.pa, in irdma_puda_qp_create()
659 if (!rsrc->qpmem.va) in irdma_puda_qp_create()
662 mem = &rsrc->qpmem; in irdma_puda_qp_create()
663 memset(mem->va, 0, rsrc->qpmem.size); in irdma_puda_qp_create()
664 qp->hw_sq_size = irdma_get_encoded_wqe_size(rsrc->sq_size, IRDMA_QUEUE_TYPE_SQ_RQ); in irdma_puda_qp_create()
665 qp->hw_rq_size = irdma_get_encoded_wqe_size(rsrc->rq_size, IRDMA_QUEUE_TYPE_SQ_RQ); in irdma_puda_qp_create()
666 qp->pd = &rsrc->sc_pd; in irdma_puda_qp_create()
668 qp->dev = rsrc->dev; in irdma_puda_qp_create()
669 qp->qp_uk.back_qp = rsrc; in irdma_puda_qp_create()
672 qp->vsi = rsrc->vsi; in irdma_puda_qp_create()
674 ukqp->rq_base = &ukqp->sq_base[rsrc->sq_size]; in irdma_puda_qp_create()
675 ukqp->shadow_area = ukqp->rq_base[rsrc->rq_size].elem; in irdma_puda_qp_create()
681 ukqp->qp_id = rsrc->qp_id; in irdma_puda_qp_create()
682 ukqp->sq_wrtrk_array = rsrc->sq_wrtrk_array; in irdma_puda_qp_create()
683 ukqp->rq_wrid_array = rsrc->rq_wrid_array; in irdma_puda_qp_create()
684 ukqp->sq_size = rsrc->sq_size; in irdma_puda_qp_create()
685 ukqp->rq_size = rsrc->rq_size; in irdma_puda_qp_create()
692 ret = rsrc->dev->ws_add(qp->vsi, qp->user_pri); in irdma_puda_qp_create()
694 dma_free_coherent(rsrc->dev->hw->device, rsrc->qpmem.size, in irdma_puda_qp_create()
695 rsrc->qpmem.va, rsrc->qpmem.pa); in irdma_puda_qp_create()
696 rsrc->qpmem.va = NULL; in irdma_puda_qp_create()
701 irdma_puda_qp_setctx(rsrc); in irdma_puda_qp_create()
703 if (rsrc->dev->ceq_valid) in irdma_puda_qp_create()
704 ret = irdma_cqp_qp_create_cmd(rsrc->dev, qp); in irdma_puda_qp_create()
706 ret = irdma_puda_qp_wqe(rsrc->dev, qp); in irdma_puda_qp_create()
709 rsrc->dev->ws_remove(qp->vsi, qp->user_pri); in irdma_puda_qp_create()
710 dma_free_coherent(rsrc->dev->hw->device, rsrc->qpmem.size, in irdma_puda_qp_create()
711 rsrc->qpmem.va, rsrc->qpmem.pa); in irdma_puda_qp_create()
712 rsrc->qpmem.va = NULL; in irdma_puda_qp_create()
775 static int irdma_puda_cq_create(struct irdma_puda_rsrc *rsrc) in irdma_puda_cq_create() argument
777 struct irdma_sc_dev *dev = rsrc->dev; in irdma_puda_cq_create()
778 struct irdma_sc_cq *cq = &rsrc->cq; in irdma_puda_cq_create()
785 cq->vsi = rsrc->vsi; in irdma_puda_cq_create()
786 cqsize = rsrc->cq_size * (sizeof(struct irdma_cqe)); in irdma_puda_cq_create()
787 rsrc->cqmem.size = ALIGN(cqsize + sizeof(struct irdma_cq_shadow_area), in irdma_puda_cq_create()
789 rsrc->cqmem.va = dma_alloc_coherent(dev->hw->device, rsrc->cqmem.size, in irdma_puda_cq_create()
790 &rsrc->cqmem.pa, GFP_KERNEL); in irdma_puda_cq_create()
791 if (!rsrc->cqmem.va) in irdma_puda_cq_create()
794 mem = &rsrc->cqmem; in irdma_puda_cq_create()
796 info.type = (rsrc->type == IRDMA_PUDA_RSRC_TYPE_ILQ) ? in irdma_puda_cq_create()
798 info.shadow_read_threshold = rsrc->cq_size >> 2; in irdma_puda_cq_create()
803 init_info->cq_size = rsrc->cq_size; in irdma_puda_cq_create()
804 init_info->cq_id = rsrc->cq_id; in irdma_puda_cq_create()
807 info.vsi = rsrc->vsi; in irdma_puda_cq_create()
813 if (rsrc->dev->ceq_valid) in irdma_puda_cq_create()
819 dma_free_coherent(dev->hw->device, rsrc->cqmem.size, in irdma_puda_cq_create()
820 rsrc->cqmem.va, rsrc->cqmem.pa); in irdma_puda_cq_create()
821 rsrc->cqmem.va = NULL; in irdma_puda_cq_create()
831 static void irdma_puda_free_qp(struct irdma_puda_rsrc *rsrc) in irdma_puda_free_qp() argument
835 struct irdma_sc_dev *dev = rsrc->dev; in irdma_puda_free_qp()
837 if (rsrc->dev->ceq_valid) { in irdma_puda_free_qp()
838 irdma_cqp_qp_destroy_cmd(dev, &rsrc->qp); in irdma_puda_free_qp()
839 rsrc->dev->ws_remove(rsrc->qp.vsi, rsrc->qp.user_pri); in irdma_puda_free_qp()
843 ret = irdma_sc_qp_destroy(&rsrc->qp, 0, false, true, true); in irdma_puda_free_qp()
856 rsrc->dev->ws_remove(rsrc->qp.vsi, rsrc->qp.user_pri); in irdma_puda_free_qp()
863 static void irdma_puda_free_cq(struct irdma_puda_rsrc *rsrc) in irdma_puda_free_cq() argument
867 struct irdma_sc_dev *dev = rsrc->dev; in irdma_puda_free_cq()
869 if (rsrc->dev->ceq_valid) { in irdma_puda_free_cq()
870 irdma_cqp_cq_destroy_cmd(dev, &rsrc->cq); in irdma_puda_free_cq()
874 ret = irdma_sc_cq_destroy(&rsrc->cq, 0, true); in irdma_puda_free_cq()
896 struct irdma_puda_rsrc *rsrc; in irdma_puda_dele_rsrc() local
905 rsrc = vsi->ilq; in irdma_puda_dele_rsrc()
909 irdma_sc_remove_cq_ctx(ceq, &rsrc->cq); in irdma_puda_dele_rsrc()
912 rsrc = vsi->ieq; in irdma_puda_dele_rsrc()
916 irdma_sc_remove_cq_ctx(ceq, &rsrc->cq); in irdma_puda_dele_rsrc()
924 switch (rsrc->cmpl) { in irdma_puda_dele_rsrc()
926 irdma_free_hash_desc(rsrc->hash_desc); in irdma_puda_dele_rsrc()
929 irdma_qp_rem_qos(&rsrc->qp); in irdma_puda_dele_rsrc()
932 irdma_puda_free_qp(rsrc); in irdma_puda_dele_rsrc()
934 dma_free_coherent(dev->hw->device, rsrc->qpmem.size, in irdma_puda_dele_rsrc()
935 rsrc->qpmem.va, rsrc->qpmem.pa); in irdma_puda_dele_rsrc()
936 rsrc->qpmem.va = NULL; in irdma_puda_dele_rsrc()
940 irdma_puda_free_cq(rsrc); in irdma_puda_dele_rsrc()
942 dma_free_coherent(dev->hw->device, rsrc->cqmem.size, in irdma_puda_dele_rsrc()
943 rsrc->cqmem.va, rsrc->cqmem.pa); in irdma_puda_dele_rsrc()
944 rsrc->cqmem.va = NULL; in irdma_puda_dele_rsrc()
947 ibdev_dbg(to_ibdev(rsrc->dev), "PUDA: error no resources\n"); in irdma_puda_dele_rsrc()
951 buf = rsrc->alloclist; in irdma_puda_dele_rsrc()
956 rsrc->alloc_buf_count--; in irdma_puda_dele_rsrc()
967 static int irdma_puda_allocbufs(struct irdma_puda_rsrc *rsrc, u32 count) in irdma_puda_allocbufs() argument
974 buf = irdma_puda_alloc_buf(rsrc->dev, rsrc->buf_size); in irdma_puda_allocbufs()
976 rsrc->stats_buf_alloc_fail++; in irdma_puda_allocbufs()
979 irdma_puda_ret_bufpool(rsrc, buf); in irdma_puda_allocbufs()
980 rsrc->alloc_buf_count++; in irdma_puda_allocbufs()
981 if (!rsrc->alloclist) { in irdma_puda_allocbufs()
982 rsrc->alloclist = buf; in irdma_puda_allocbufs()
984 nextbuf = rsrc->alloclist; in irdma_puda_allocbufs()
985 rsrc->alloclist = buf; in irdma_puda_allocbufs()
990 rsrc->avail_buf_count = rsrc->alloc_buf_count; in irdma_puda_allocbufs()
1005 struct irdma_puda_rsrc *rsrc; in irdma_puda_create_rsrc() local
1029 rsrc = vmem->va; in irdma_puda_create_rsrc()
1030 spin_lock_init(&rsrc->bufpool_lock); in irdma_puda_create_rsrc()
1035 rsrc->receive = info->receive; in irdma_puda_create_rsrc()
1036 rsrc->xmit_complete = info->xmit_complete; in irdma_puda_create_rsrc()
1041 rsrc->receive = irdma_ieq_receive; in irdma_puda_create_rsrc()
1042 rsrc->xmit_complete = irdma_ieq_tx_compl; in irdma_puda_create_rsrc()
1048 rsrc->type = info->type; in irdma_puda_create_rsrc()
1049 rsrc->sq_wrtrk_array = (struct irdma_sq_uk_wr_trk_info *) in irdma_puda_create_rsrc()
1051 rsrc->rq_wrid_array = (u64 *)((u8 *)vmem->va + pudasize + sqwridsize); in irdma_puda_create_rsrc()
1053 INIT_LIST_HEAD(&rsrc->bufpool); in irdma_puda_create_rsrc()
1054 INIT_LIST_HEAD(&rsrc->txpend); in irdma_puda_create_rsrc()
1056 rsrc->tx_wqe_avail_cnt = info->sq_size - 1; in irdma_puda_create_rsrc()
1057 irdma_sc_pd_init(dev, &rsrc->sc_pd, info->pd_id, info->abi_ver); in irdma_puda_create_rsrc()
1058 rsrc->qp_id = info->qp_id; in irdma_puda_create_rsrc()
1059 rsrc->cq_id = info->cq_id; in irdma_puda_create_rsrc()
1060 rsrc->sq_size = info->sq_size; in irdma_puda_create_rsrc()
1061 rsrc->rq_size = info->rq_size; in irdma_puda_create_rsrc()
1062 rsrc->cq_size = info->rq_size + info->sq_size; in irdma_puda_create_rsrc()
1064 if (rsrc->type == IRDMA_PUDA_RSRC_TYPE_ILQ) in irdma_puda_create_rsrc()
1065 rsrc->cq_size += info->rq_size; in irdma_puda_create_rsrc()
1067 rsrc->buf_size = info->buf_size; in irdma_puda_create_rsrc()
1068 rsrc->dev = dev; in irdma_puda_create_rsrc()
1069 rsrc->vsi = vsi; in irdma_puda_create_rsrc()
1070 rsrc->stats_idx = info->stats_idx; in irdma_puda_create_rsrc()
1071 rsrc->stats_idx_valid = info->stats_idx_valid; in irdma_puda_create_rsrc()
1073 ret = irdma_puda_cq_create(rsrc); in irdma_puda_create_rsrc()
1075 rsrc->cmpl = PUDA_CQ_CREATED; in irdma_puda_create_rsrc()
1076 ret = irdma_puda_qp_create(rsrc); in irdma_puda_create_rsrc()
1081 rsrc->type, ret); in irdma_puda_create_rsrc()
1084 rsrc->cmpl = PUDA_QP_CREATED; in irdma_puda_create_rsrc()
1086 ret = irdma_puda_allocbufs(rsrc, info->tx_buf_cnt + info->rq_size); in irdma_puda_create_rsrc()
1092 rsrc->rxq_invalid_cnt = info->rq_size; in irdma_puda_create_rsrc()
1093 ret = irdma_puda_replenish_rq(rsrc, true); in irdma_puda_create_rsrc()
1098 if (!irdma_init_hash_desc(&rsrc->hash_desc)) { in irdma_puda_create_rsrc()
1099 rsrc->check_crc = true; in irdma_puda_create_rsrc()
1100 rsrc->cmpl = PUDA_HASH_CRC_COMPLETE; in irdma_puda_create_rsrc()
1105 irdma_sc_ccq_arm(&rsrc->cq); in irdma_puda_create_rsrc()