Lines Matching defs:qp

45 static int hermon_qp_create_qpn(hermon_state_t *state, hermon_qphdl_t qp,
67 hermon_qphdl_t qp;
273 qp = (hermon_qphdl_t)rsrc->hr_addr;
274 bzero(qp, sizeof (struct hermon_sw_qp_s));
275 _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*qp))
277 qp->qp_alloc_flags = alloc_flags;
285 qp->qp_qpnum = qpc->hr_indx;
286 qp->qp_ring = qp->qp_qpnum << 8;
287 qp->qp_qpn_hdl = NULL;
289 status = hermon_qp_create_qpn(state, qp, qpc);
304 umapdb = hermon_umap_db_alloc(state->hs_instance, qp->qp_qpnum,
319 status = hermon_dbr_alloc(state, uarpg, &qp->qp_rq_dbr_acchdl,
320 &qp->qp_rq_vdbr, &qp->qp_rq_pdbr, &qp->qp_rdbr_mapoffset);
327 qp->qp_uses_lso = (attr_p->qp_flags & IBT_USES_LSO);
357 qp->qp_rq_log_wqesz = 0;
358 qp->qp_rq_sgl = 0;
362 &qp->qp_rq_log_wqesz, &qp->qp_rq_sgl);
365 max_sgl, swq_type, &qp->qp_sq_log_wqesz, &qp->qp_sq_sgl);
367 sq_wqe_size = 1 << qp->qp_sq_log_wqesz;
370 qp->qp_no_prefetch = 0;
378 if (qp->qp_no_prefetch)
379 qp->qp_sq_headroom = 2 * sq_wqe_size;
381 qp->qp_sq_headroom = sq_wqe_size + HERMON_QP_OH_SIZE;
386 qp->qp_sq_hdrmwqes = (qp->qp_sq_headroom / sq_wqe_size);
405 log_qp_sq_size = highbit(attr_p->qp_sizes.cs_sq + qp->qp_sq_hdrmwqes);
407 if (ISP2(attr_p->qp_sizes.cs_sq + qp->qp_sq_hdrmwqes)) {
458 sq_wqe_size = 1 << qp->qp_sq_log_wqesz;
467 rq_wqe_size = 1 << qp->qp_rq_log_wqesz;
472 qp->qp_wqinfo.qa_size = sq_size + rq_size;
474 qp->qp_wqinfo.qa_alloc_align = PAGESIZE;
475 qp->qp_wqinfo.qa_bind_align = PAGESIZE;
478 qp->qp_wqinfo.qa_location = HERMON_QUEUE_LOCATION_USERLAND;
480 qp->qp_wqinfo.qa_location = HERMON_QUEUE_LOCATION_NORMAL;
482 status = hermon_queue_alloc(state, &qp->qp_wqinfo, sleepflag);
492 qp->qp_sq_baseaddr = 0;
493 qp->qp_rq_baseaddr = 0;
495 sq_buf = qp->qp_wqinfo.qa_buf_aligned;
502 qp->qp_rq_baseaddr = sq_size;
505 rq_buf = qp->qp_wqinfo.qa_buf_aligned;
507 qp->qp_sq_baseaddr = rq_size;
511 qp->qp_sq_wqhdr = hermon_wrid_wqhdr_create(sq_depth);
512 if (qp->qp_sq_wqhdr == NULL) {
517 qp->qp_rq_wqavl.wqa_wq = srq->srq_wq_wqhdr;
518 qp->qp_rq_wqavl.wqa_srq_en = 1;
519 qp->qp_rq_wqavl.wqa_srq = srq;
521 qp->qp_rq_wqhdr = hermon_wrid_wqhdr_create(rq_depth);
522 if (qp->qp_rq_wqhdr == NULL) {
526 qp->qp_rq_wqavl.wqa_wq = qp->qp_rq_wqhdr;
528 qp->qp_sq_wqavl.wqa_qpn = qp->qp_qpnum;
529 qp->qp_sq_wqavl.wqa_type = HERMON_WR_SEND;
530 qp->qp_sq_wqavl.wqa_wq = qp->qp_sq_wqhdr;
531 qp->qp_rq_wqavl.wqa_qpn = qp->qp_qpnum;
532 qp->qp_rq_wqavl.wqa_type = HERMON_WR_RECV;
550 mr_attr.mr_vaddr = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned;
551 mr_attr.mr_len = qp->qp_wqinfo.qa_size;
561 mr_op.mro_bind_dmahdl = qp->qp_wqinfo.qa_dmahdl;
575 qp_desc_off = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned -
584 (1 << log_qp_sq_size) - qp->qp_sq_hdrmwqes;
585 queuesz_p->cs_sq_sgl = qp->qp_sq_sgl;
593 queuesz_p->cs_rq_sgl = qp->qp_rq_sgl;
597 *qpn = (ib_qpn_t)qp->qp_qpnum;
603 qp->qp_qpcrsrcp = qpc;
604 qp->qp_rsrcp = rsrc;
605 qp->qp_state = HERMON_QP_RESET;
606 HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_RESET);
607 qp->qp_pdhdl = pd;
608 qp->qp_mrhdl = mr;
609 qp->qp_sq_sigtype = (attr_p->qp_flags & IBT_WR_SIGNALED) ?
611 qp->qp_is_special = 0;
612 qp->qp_uarpg = uarpg;
613 qp->qp_umap_dhp = (devmap_cookie_t)NULL;
614 qp->qp_sq_cqhdl = sq_cq;
615 qp->qp_sq_bufsz = (1 << log_qp_sq_size);
616 qp->qp_sq_logqsz = log_qp_sq_size;
617 qp->qp_sq_buf = sq_buf;
618 qp->qp_desc_off = qp_desc_off;
619 qp->qp_rq_cqhdl = rq_cq;
620 qp->qp_rq_buf = rq_buf;
621 qp->qp_rlky = (attr_p->qp_flags & IBT_FAST_REG_RES_LKEY) !=
626 qp->qp_rq_bufsz = 0;
627 qp->qp_rq_logqsz = 0;
629 qp->qp_rq_bufsz = (1 << log_qp_rq_size);
630 qp->qp_rq_logqsz = log_qp_rq_size;
633 qp->qp_forward_sqd_event = 0;
634 qp->qp_sqd_still_draining = 0;
635 qp->qp_hdlrarg = (void *)ibt_qphdl;
636 qp->qp_mcg_refcnt = 0;
642 qp->qp_srqhdl = srq;
643 hermon_srq_refcnt_inc(qp->qp_srqhdl);
645 qp->qp_srqhdl = NULL;
649 qp->qp_type = type;
651 qp->qp_serv_type = HERMON_QP_RC;
654 qp->qp_serv_type = HERMON_QP_RFCI;
656 qp->qp_serv_type = HERMON_QP_FCMND;
658 qp->qp_serv_type = HERMON_QP_UD;
660 qp->qp_serv_type = HERMON_QP_UC;
673 wqesz_shift = qp->qp_sq_log_wqesz;
675 thewqe = (uint64_t *)(void *)(qp->qp_sq_buf);
690 bzero(&qp->qpc, sizeof (hermon_hw_qpc_t));
696 hermon_icm_set_num_to_hdl(state, HERMON_QPC, qpc->hr_indx, qp);
706 mutex_init(&qp->qp_sq_lock, NULL, MUTEX_DRIVER,
709 *qphdl = qp;
717 hermon_queue_free(&qp->qp_wqinfo);
719 if (qp->qp_sq_wqhdr)
720 hermon_wrid_wqhdr_destroy(qp->qp_sq_wqhdr);
721 if (qp->qp_rq_wqhdr)
722 hermon_wrid_wqhdr_destroy(qp->qp_rq_wqhdr);
728 hermon_dbr_free(state, uarpg, qp->qp_rq_vdbr);
736 if (qp->qp_qpn_hdl) {
737 hermon_qp_release_qpn(state, qp->qp_qpn_hdl,
770 hermon_qphdl_t qp;
885 qp = (hermon_qphdl_t)rsrc->hr_addr;
887 bzero(qp, sizeof (struct hermon_sw_qp_s));
889 _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*qp))
890 qp->qp_alloc_flags = attr_p->qp_alloc_flags;
897 qp->qp_qpnum = qpc->hr_indx + port;
898 qp->qp_ring = qp->qp_qpnum << 8;
900 uarpg = state->hs_kernel_uar_index; /* must be for spec qp */
903 * alloc a qp doorbell, using uarpg (above) as the uar index
906 status = hermon_dbr_alloc(state, uarpg, &qp->qp_rq_dbr_acchdl,
907 &qp->qp_rq_vdbr, &qp->qp_rq_pdbr, &qp->qp_rdbr_mapoffset);
962 &qp->qp_rq_log_wqesz, &qp->qp_rq_sgl);
966 &qp->qp_sq_log_wqesz, &qp->qp_sq_sgl);
970 &qp->qp_sq_log_wqesz, &qp->qp_sq_sgl);
996 sq_wqe_size = 1 << qp->qp_sq_log_wqesz;
1000 rq_wqe_size = 1 << qp->qp_rq_log_wqesz;
1003 qp->qp_wqinfo.qa_size = sq_size + rq_size;
1005 qp->qp_wqinfo.qa_alloc_align = PAGESIZE;
1006 qp->qp_wqinfo.qa_bind_align = PAGESIZE;
1007 qp->qp_wqinfo.qa_location = HERMON_QUEUE_LOCATION_NORMAL;
1009 status = hermon_queue_alloc(state, &qp->qp_wqinfo, sleepflag);
1019 qp->qp_sq_baseaddr = 0;
1020 qp->qp_rq_baseaddr = 0;
1022 sq_buf = qp->qp_wqinfo.qa_buf_aligned;
1024 qp->qp_rq_baseaddr = sq_size;
1026 rq_buf = qp->qp_wqinfo.qa_buf_aligned;
1028 qp->qp_sq_baseaddr = rq_size;
1031 qp->qp_sq_wqhdr = hermon_wrid_wqhdr_create(sq_depth);
1032 if (qp->qp_sq_wqhdr == NULL) {
1036 qp->qp_rq_wqhdr = hermon_wrid_wqhdr_create(1 << log_qp_rq_size);
1037 if (qp->qp_rq_wqhdr == NULL) {
1041 qp->qp_sq_wqavl.wqa_qpn = qp->qp_qpnum;
1042 qp->qp_sq_wqavl.wqa_type = HERMON_WR_SEND;
1043 qp->qp_sq_wqavl.wqa_wq = qp->qp_sq_wqhdr;
1044 qp->qp_rq_wqavl.wqa_qpn = qp->qp_qpnum;
1045 qp->qp_rq_wqavl.wqa_type = HERMON_WR_RECV;
1046 qp->qp_rq_wqavl.wqa_wq = qp->qp_rq_wqhdr;
1062 mr_attr.mr_vaddr = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned;
1063 mr_attr.mr_len = qp->qp_wqinfo.qa_size;
1068 mr_op.mro_bind_dmahdl = qp->qp_wqinfo.qa_dmahdl;
1083 qp_desc_off = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned -
1087 qp->qp_no_prefetch = 1;
1089 if (qp->qp_no_prefetch)
1090 qp->qp_sq_headroom = 2 * sq_wqe_size;
1092 qp->qp_sq_headroom = sq_wqe_size + HERMON_QP_OH_SIZE;
1097 qp->qp_sq_hdrmwqes = (qp->qp_sq_headroom / sq_wqe_size);
1105 (1 << log_qp_sq_size) - qp->qp_sq_hdrmwqes;
1106 queuesz_p->cs_sq_sgl = qp->qp_sq_sgl;
1108 queuesz_p->cs_rq_sgl = qp->qp_rq_sgl;
1115 qp->qp_qpcrsrcp = qpc;
1116 qp->qp_rsrcp = rsrc;
1117 qp->qp_state = HERMON_QP_RESET;
1118 HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_RESET);
1119 qp->qp_pdhdl = pd;
1120 qp->qp_mrhdl = mr;
1121 qp->qp_sq_sigtype = (attr_p->qp_flags & IBT_WR_SIGNALED) ?
1123 qp->qp_is_special = (type == IBT_SMI_SQP) ?
1125 qp->qp_uarpg = uarpg;
1126 qp->qp_umap_dhp = (devmap_cookie_t)NULL;
1127 qp->qp_sq_cqhdl = sq_cq;
1128 qp->qp_sq_bufsz = (1 << log_qp_sq_size);
1129 qp->qp_sq_buf = sq_buf;
1130 qp->qp_sq_logqsz = log_qp_sq_size;
1131 qp->qp_desc_off = qp_desc_off;
1132 qp->qp_rq_cqhdl = rq_cq;
1133 qp->qp_rq_bufsz = (1 << log_qp_rq_size);
1134 qp->qp_rq_buf = rq_buf;
1135 qp->qp_rq_logqsz = log_qp_rq_size;
1136 qp->qp_portnum = port;
1137 qp->qp_pkeyindx = 0;
1138 qp->qp_forward_sqd_event = 0;
1139 qp->qp_sqd_still_draining = 0;
1140 qp->qp_hdlrarg = (void *)ibt_qphdl;
1141 qp->qp_mcg_refcnt = 0;
1142 qp->qp_srqhdl = NULL;
1145 qp->qp_type = IBT_UD_RQP;
1146 qp->qp_serv_type = HERMON_QP_UD;
1159 wqesz_shift = qp->qp_sq_log_wqesz;
1161 thewqe = (uint64_t *)(void *)(qp->qp_sq_buf);
1175 bzero(&qp->qpc, sizeof (hermon_hw_qpc_t));
1181 hermon_icm_set_num_to_hdl(state, HERMON_QPC, qpc->hr_indx + port, qp);
1183 mutex_init(&qp->qp_sq_lock, NULL, MUTEX_DRIVER,
1186 *qphdl = qp;
1194 hermon_queue_free(&qp->qp_wqinfo);
1195 if (qp->qp_sq_wqhdr)
1196 hermon_wrid_wqhdr_destroy(qp->qp_sq_wqhdr);
1197 if (qp->qp_rq_wqhdr)
1198 hermon_wrid_wqhdr_destroy(qp->qp_rq_wqhdr);
1200 hermon_dbr_free(state, uarpg, qp->qp_rq_vdbr);
1230 hermon_qphdl_t qp;
1419 qp = (hermon_qphdl_t)rsrc->hr_addr;
1420 bzero(qp, sizeof (struct hermon_sw_qp_s));
1421 _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*qp))
1422 qp->qp_alloc_flags = attr_p->qp_alloc_flags;
1429 qp->qp_qpnum = qpc->hr_indx + ii;
1430 qp->qp_ring = qp->qp_qpnum << 8;
1431 qp->qp_qpn_hdl = NULL;
1440 status = hermon_dbr_alloc(state, uarpg, &qp->qp_rq_dbr_acchdl,
1441 &qp->qp_rq_vdbr, &qp->qp_rq_pdbr, &qp->qp_rdbr_mapoffset);
1448 qp->qp_uses_lso = (attr_p->qp_flags & IBT_USES_LSO);
1473 qp->qp_rq_log_wqesz = 0;
1474 qp->qp_rq_sgl = 0;
1478 &qp->qp_rq_log_wqesz, &qp->qp_rq_sgl);
1481 max_sgl, swq_type, &qp->qp_sq_log_wqesz, &qp->qp_sq_sgl);
1483 sq_wqe_size = 1 << qp->qp_sq_log_wqesz;
1486 qp->qp_no_prefetch = 0;
1494 if (qp->qp_no_prefetch)
1495 qp->qp_sq_headroom = 2 * sq_wqe_size;
1497 qp->qp_sq_headroom = sq_wqe_size + HERMON_QP_OH_SIZE;
1502 qp->qp_sq_hdrmwqes = (qp->qp_sq_headroom / sq_wqe_size);
1521 log_qp_sq_size = highbit(attr_p->qp_sizes.cs_sq + qp->qp_sq_hdrmwqes);
1523 if (ISP2(attr_p->qp_sizes.cs_sq + qp->qp_sq_hdrmwqes)) {
1574 sq_wqe_size = 1 << qp->qp_sq_log_wqesz;
1583 rq_wqe_size = 1 << qp->qp_rq_log_wqesz;
1588 qp->qp_wqinfo.qa_size = sq_size + rq_size;
1589 qp->qp_wqinfo.qa_alloc_align = PAGESIZE;
1590 qp->qp_wqinfo.qa_bind_align = PAGESIZE;
1591 qp->qp_wqinfo.qa_location = HERMON_QUEUE_LOCATION_NORMAL;
1592 status = hermon_queue_alloc(state, &qp->qp_wqinfo, sleepflag);
1602 qp->qp_sq_baseaddr = 0;
1603 qp->qp_rq_baseaddr = 0;
1605 sq_buf = qp->qp_wqinfo.qa_buf_aligned;
1612 qp->qp_rq_baseaddr = sq_size;
1615 rq_buf = qp->qp_wqinfo.qa_buf_aligned;
1617 qp->qp_sq_baseaddr = rq_size;
1620 qp->qp_sq_wqhdr = hermon_wrid_wqhdr_create(sq_depth);
1621 if (qp->qp_sq_wqhdr == NULL) {
1626 qp->qp_rq_wqavl.wqa_wq = srq->srq_wq_wqhdr;
1627 qp->qp_rq_wqavl.wqa_srq_en = 1;
1628 qp->qp_rq_wqavl.wqa_srq = srq;
1630 qp->qp_rq_wqhdr = hermon_wrid_wqhdr_create(rq_depth);
1631 if (qp->qp_rq_wqhdr == NULL) {
1635 qp->qp_rq_wqavl.wqa_wq = qp->qp_rq_wqhdr;
1637 qp->qp_sq_wqavl.wqa_qpn = qp->qp_qpnum;
1638 qp->qp_sq_wqavl.wqa_type = HERMON_WR_SEND;
1639 qp->qp_sq_wqavl.wqa_wq = qp->qp_sq_wqhdr;
1640 qp->qp_rq_wqavl.wqa_qpn = qp->qp_qpnum;
1641 qp->qp_rq_wqavl.wqa_type = HERMON_WR_RECV;
1658 mr_attr.mr_vaddr = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned;
1659 mr_attr.mr_len = qp->qp_wqinfo.qa_size;
1665 mr_op.mro_bind_dmahdl = qp->qp_wqinfo.qa_dmahdl;
1679 qp_desc_off = (uint64_t)(uintptr_t)qp->qp_wqinfo.qa_buf_aligned -
1688 (1 << log_qp_sq_size) - qp->qp_sq_hdrmwqes;
1689 queuesz_p->cs_sq_sgl = qp->qp_sq_sgl;
1697 queuesz_p->cs_rq_sgl = qp->qp_rq_sgl;
1704 qp->qp_qpcrsrcp = NULL;
1705 qp->qp_rsrcp = rsrc;
1706 qp->qp_state = HERMON_QP_RESET;
1707 HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_RESET);
1708 qp->qp_pdhdl = pd;
1709 qp->qp_mrhdl = mr;
1710 qp->qp_sq_sigtype = (attr_p->qp_flags & IBT_WR_SIGNALED) ?
1712 qp->qp_is_special = 0;
1713 qp->qp_uarpg = uarpg;
1714 qp->qp_umap_dhp = (devmap_cookie_t)NULL;
1715 qp->qp_sq_cqhdl = sq_cq;
1716 qp->qp_sq_bufsz = (1 << log_qp_sq_size);
1717 qp->qp_sq_logqsz = log_qp_sq_size;
1718 qp->qp_sq_buf = sq_buf;
1719 qp->qp_desc_off = qp_desc_off;
1720 qp->qp_rq_cqhdl = rq_cq;
1721 qp->qp_rq_buf = rq_buf;
1722 qp->qp_rlky = (attr_p->qp_flags & IBT_FAST_REG_RES_LKEY) !=
1727 qp->qp_rq_bufsz = 0;
1728 qp->qp_rq_logqsz = 0;
1730 qp->qp_rq_bufsz = (1 << log_qp_rq_size);
1731 qp->qp_rq_logqsz = log_qp_rq_size;
1734 qp->qp_forward_sqd_event = 0;
1735 qp->qp_sqd_still_draining = 0;
1736 qp->qp_hdlrarg = (void *)ibt_qphdl[ii];
1737 qp->qp_mcg_refcnt = 0;
1743 qp->qp_srqhdl = srq;
1744 hermon_srq_refcnt_inc(qp->qp_srqhdl);
1746 qp->qp_srqhdl = NULL;
1749 qp->qp_type = IBT_UD_RQP;
1750 qp->qp_serv_type = serv_type;
1762 wqesz_shift = qp->qp_sq_log_wqesz;
1764 thewqe = (uint64_t *)(void *)(qp->qp_sq_buf);
1778 bzero(&qp->qpc, sizeof (hermon_hw_qpc_t));
1784 hermon_icm_set_num_to_hdl(state, HERMON_QPC, qpc->hr_indx + ii, qp);
1786 mutex_init(&qp->qp_sq_lock, NULL, MUTEX_DRIVER,
1789 qp->qp_rangep = qp_range_p;
1791 qphdl[ii] = qp;
1802 hermon_queue_free(&qp->qp_wqinfo);
1804 if (qp->qp_sq_wqhdr)
1805 hermon_wrid_wqhdr_destroy(qp->qp_sq_wqhdr);
1806 if (qp->qp_rq_wqhdr)
1807 hermon_wrid_wqhdr_destroy(qp->qp_rq_wqhdr);
1810 hermon_dbr_free(state, uarpg, qp->qp_rq_vdbr);
1829 mutex_enter(&qp->qp_rangep->hqpr_lock);
1831 mutex_exit(&qp->qp_rangep->hqpr_lock);
1870 hermon_qphdl_t qp;
1882 qp = *qphdl;
1883 mutex_enter(&qp->qp_lock);
1884 qpc = qp->qp_qpcrsrcp; /* NULL if part of a "range" */
1885 rsrc = qp->qp_rsrcp;
1886 pd = qp->qp_pdhdl;
1887 srq = qp->qp_srqhdl;
1888 mr = qp->qp_mrhdl;
1889 rq_cq = qp->qp_rq_cqhdl;
1890 sq_cq = qp->qp_sq_cqhdl;
1891 port = qp->qp_portnum;
1892 qp_srq_en = qp->qp_alloc_flags & IBT_QP_USES_SRQ;
1897 if (qp->qp_mcg_refcnt != 0) {
1898 mutex_exit(&qp->qp_lock);
1911 if (qp->qp_state != HERMON_QP_RESET) {
1912 if (hermon_qp_to_reset(state, qp) != DDI_SUCCESS) {
1913 mutex_exit(&qp->qp_lock);
1918 qp->qp_state = HERMON_QP_RESET;
1919 HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_RESET);
1925 if (hermon_wrid_to_reset_handling(state, qp) != DDI_SUCCESS) {
1926 mutex_exit(&qp->qp_lock);
1941 if (qp->qp_alloc_flags & IBT_QP_USER_MAP) {
1942 status = hermon_umap_db_find(state->hs_instance, qp->qp_qpnum,
1946 mutex_exit(&qp->qp_lock);
1951 if (qp->qp_umap_dhp != NULL) {
1953 status = devmap_devmem_remap(qp->qp_umap_dhp,
1954 state->hs_dip, 0, 0, qp->qp_wqinfo.qa_size,
1957 mutex_exit(&qp->qp_lock);
1962 qp->qp_umap_dhp = (devmap_cookie_t)NULL;
1975 qp->qp_qpnum, NULL);
1976 } else if (qp->qp_is_special) {
1992 mutex_exit(&qp->qp_lock);
1993 _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS(*qp))
2014 hermon_queue_free(&qp->qp_wqinfo);
2016 if (qp->qp_sq_wqhdr)
2017 hermon_wrid_wqhdr_destroy(qp->qp_sq_wqhdr);
2018 if (qp->qp_rq_wqhdr)
2019 hermon_wrid_wqhdr_destroy(qp->qp_rq_wqhdr);
2023 hermon_dbr_free(state, qp->qp_uarpg, qp->qp_rq_vdbr);
2034 if (qp->qp_is_special) {
2035 type = (qp->qp_is_special == HERMON_QP_SMI) ?
2046 } else if (qp->qp_rangep) {
2048 mutex_enter(&qp->qp_rangep->hqpr_lock);
2049 refcnt = --qp->qp_rangep->hqpr_refcnt;
2050 mutex_exit(&qp->qp_rangep->hqpr_lock);
2052 mutex_destroy(&qp->qp_rangep->hqpr_lock);
2053 hermon_rsrc_free(state, &qp->qp_rangep->hqpr_qpcrsrc);
2054 kmem_free(qp->qp_rangep, sizeof (*qp->qp_rangep));
2056 qp->qp_rangep = NULL;
2057 } else if (qp->qp_qpn_hdl == NULL) {
2065 entry = qp->qp_qpn_hdl;
2066 hermon_qp_release_qpn(state, qp->qp_qpn_hdl,
2070 hermon_qp_release_qpn(state, qp->qp_qpn_hdl,
2075 mutex_destroy(&qp->qp_sq_lock);
2103 hermon_qp_query(hermon_state_t *state, hermon_qphdl_t qp,
2117 mutex_enter(&qp->qp_lock);
2122 qpc = &qp->qpc;
2125 switch (qp->qp_state) {
2142 if (qp->qp_sqd_still_draining) {
2152 mutex_exit(&qp->qp_lock);
2166 (qp->qp_sq_cqhdl == NULL) ? NULL : qp->qp_sq_cqhdl->cq_hdlrarg;
2168 (qp->qp_rq_cqhdl == NULL) ? NULL : qp->qp_rq_cqhdl->cq_hdlrarg;
2169 if (qp->qp_is_special) {
2170 attr_p->qp_qpn = (qp->qp_is_special == HERMON_QP_SMI) ? 0 : 1;
2172 attr_p->qp_qpn = (ib_qpn_t)qp->qp_qpnum;
2174 attr_p->qp_sq_sgl = qp->qp_sq_sgl;
2175 attr_p->qp_rq_sgl = qp->qp_rq_sgl;
2176 attr_p->qp_info.qp_sq_sz = qp->qp_sq_bufsz - qp->qp_sq_hdrmwqes;
2177 attr_p->qp_info.qp_rq_sz = qp->qp_rq_bufsz;
2184 mutex_exit(&qp->qp_lock);
2198 status = hermon_cmn_query_cmd_post(state, QUERY_QP, 0, qp->qp_qpnum,
2201 mutex_exit(&qp->qp_lock);
2215 if (qp->qp_type == IBT_UD_RQP) {
2228 if (qp->qp_serv_type == HERMON_QP_FEXCH) {
2236 hermon_fcoib_qpn_to_mkey(state, qp->qp_qpnum);
2250 qp->qp_qpnum, &heart_beat) == HERMON_CMD_SUCCESS) &&
2254 ud->ud_fc = qp->qp_fc_attr;
2255 } else if (qp->qp_serv_type == HERMON_QP_FCMND ||
2256 qp->qp_serv_type == HERMON_QP_RFCI) {
2257 ud->ud_fc = qp->qp_fc_attr;
2260 } else if (qp->qp_serv_type == HERMON_QP_RC) {
2320 } else if (qp->qp_serv_type == HERMON_QP_UC) {
2373 mutex_exit(&qp->qp_lock);
2385 qp->qp_state = HERMON_QP_SQERR;
2386 HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_SQERR);
2390 qp->qp_state = HERMON_QP_ERR;
2391 HERMON_SET_QP_POST_SEND_STATE(qp, HERMON_QP_ERR);
2393 mutex_exit(&qp->qp_lock);
2404 hermon_qp_create_qpn(hermon_state_t *state, hermon_qphdl_t qp,
2454 qp->qp_qpn_hdl = entry;
2455 qp->qp_qpnum = ((entry->qpn_counter <<
2458 qp->qp_ring = qp->qp_qpnum << 8;