Lines Matching refs:qp
49 static void __clean_cq(struct bnxt_qplib_cq *cq, u64 qp);
51 static void bnxt_re_legacy_cancel_phantom_processing(struct bnxt_qplib_qp *qp) in bnxt_re_legacy_cancel_phantom_processing() argument
53 qp->sq.condition = false; in bnxt_re_legacy_cancel_phantom_processing()
54 qp->sq.legacy_send_phantom = false; in bnxt_re_legacy_cancel_phantom_processing()
55 qp->sq.single = false; in bnxt_re_legacy_cancel_phantom_processing()
58 static void __bnxt_qplib_add_flush_qp(struct bnxt_qplib_qp *qp) in __bnxt_qplib_add_flush_qp() argument
62 scq = qp->scq; in __bnxt_qplib_add_flush_qp()
63 rcq = qp->rcq; in __bnxt_qplib_add_flush_qp()
65 if (!qp->sq.flushed) { in __bnxt_qplib_add_flush_qp()
68 qp); in __bnxt_qplib_add_flush_qp()
69 bnxt_re_legacy_cancel_phantom_processing(qp); in __bnxt_qplib_add_flush_qp()
70 list_add_tail(&qp->sq_flush, &scq->sqf_head); in __bnxt_qplib_add_flush_qp()
71 qp->sq.flushed = true; in __bnxt_qplib_add_flush_qp()
73 if (!qp->srq) { in __bnxt_qplib_add_flush_qp()
74 if (!qp->rq.flushed) { in __bnxt_qplib_add_flush_qp()
77 qp); in __bnxt_qplib_add_flush_qp()
78 list_add_tail(&qp->rq_flush, &rcq->rqf_head); in __bnxt_qplib_add_flush_qp()
79 qp->rq.flushed = true; in __bnxt_qplib_add_flush_qp()
84 static void bnxt_qplib_acquire_cq_flush_locks(struct bnxt_qplib_qp *qp) in bnxt_qplib_acquire_cq_flush_locks() argument
85 __acquires(&qp->scq->flush_lock) __acquires(&qp->rcq->flush_lock) in bnxt_qplib_acquire_cq_flush_locks()
88 spin_lock(&qp->scq->flush_lock); in bnxt_qplib_acquire_cq_flush_locks()
89 if (qp->scq == qp->rcq) in bnxt_qplib_acquire_cq_flush_locks()
90 __acquire(&qp->rcq->flush_lock); in bnxt_qplib_acquire_cq_flush_locks()
92 spin_lock(&qp->rcq->flush_lock); in bnxt_qplib_acquire_cq_flush_locks()
95 static void bnxt_qplib_release_cq_flush_locks(struct bnxt_qplib_qp *qp) in bnxt_qplib_release_cq_flush_locks() argument
96 __releases(&qp->scq->flush_lock) __releases(&qp->rcq->flush_lock) in bnxt_qplib_release_cq_flush_locks()
98 if (qp->scq == qp->rcq) in bnxt_qplib_release_cq_flush_locks()
99 __release(&qp->rcq->flush_lock); in bnxt_qplib_release_cq_flush_locks()
101 spin_unlock(&qp->rcq->flush_lock); in bnxt_qplib_release_cq_flush_locks()
102 spin_unlock(&qp->scq->flush_lock); in bnxt_qplib_release_cq_flush_locks()
105 void bnxt_qplib_add_flush_qp(struct bnxt_qplib_qp *qp) in bnxt_qplib_add_flush_qp() argument
108 bnxt_qplib_acquire_cq_flush_locks(qp); in bnxt_qplib_add_flush_qp()
109 __bnxt_qplib_add_flush_qp(qp); in bnxt_qplib_add_flush_qp()
110 bnxt_qplib_release_cq_flush_locks(qp); in bnxt_qplib_add_flush_qp()
113 static void __bnxt_qplib_del_flush_qp(struct bnxt_qplib_qp *qp) in __bnxt_qplib_del_flush_qp() argument
115 if (qp->sq.flushed) { in __bnxt_qplib_del_flush_qp()
116 qp->sq.flushed = false; in __bnxt_qplib_del_flush_qp()
117 list_del(&qp->sq_flush); in __bnxt_qplib_del_flush_qp()
119 if (!qp->srq) { in __bnxt_qplib_del_flush_qp()
120 if (qp->rq.flushed) { in __bnxt_qplib_del_flush_qp()
121 qp->rq.flushed = false; in __bnxt_qplib_del_flush_qp()
122 list_del(&qp->rq_flush); in __bnxt_qplib_del_flush_qp()
127 void bnxt_qplib_clean_qp(struct bnxt_qplib_qp *qp) in bnxt_qplib_clean_qp() argument
130 bnxt_qplib_acquire_cq_flush_locks(qp); in bnxt_qplib_clean_qp()
131 __clean_cq(qp->scq, (u64)(unsigned long)qp); in bnxt_qplib_clean_qp()
132 qp->sq.hwq.prod = 0; in bnxt_qplib_clean_qp()
133 qp->sq.hwq.cons = 0; in bnxt_qplib_clean_qp()
134 qp->sq.swq_start = 0; in bnxt_qplib_clean_qp()
135 qp->sq.swq_last = 0; in bnxt_qplib_clean_qp()
136 __clean_cq(qp->rcq, (u64)(unsigned long)qp); in bnxt_qplib_clean_qp()
137 qp->rq.hwq.prod = 0; in bnxt_qplib_clean_qp()
138 qp->rq.hwq.cons = 0; in bnxt_qplib_clean_qp()
139 qp->rq.swq_start = 0; in bnxt_qplib_clean_qp()
140 qp->rq.swq_last = 0; in bnxt_qplib_clean_qp()
142 __bnxt_qplib_del_flush_qp(qp); in bnxt_qplib_clean_qp()
143 bnxt_qplib_release_cq_flush_locks(qp); in bnxt_qplib_clean_qp()
198 struct bnxt_qplib_qp *qp) in bnxt_qplib_free_hdr_buf() argument
200 if (qp->rq_hdr_buf) { in bnxt_qplib_free_hdr_buf()
201 bnxt_qplib_put_hdr_buf(res->pdev, qp->rq_hdr_buf); in bnxt_qplib_free_hdr_buf()
202 qp->rq_hdr_buf = NULL; in bnxt_qplib_free_hdr_buf()
205 if (qp->sq_hdr_buf) { in bnxt_qplib_free_hdr_buf()
206 bnxt_qplib_put_hdr_buf(res->pdev, qp->sq_hdr_buf); in bnxt_qplib_free_hdr_buf()
207 qp->sq_hdr_buf = NULL; in bnxt_qplib_free_hdr_buf()
212 struct bnxt_qplib_qp *qp, u32 sstep, u32 rstep) in bnxt_qplib_alloc_hdr_buf() argument
219 qp->sq_hdr_buf = bnxt_qplib_get_hdr_buf(pdev, sstep, in bnxt_qplib_alloc_hdr_buf()
220 qp->sq.max_wqe); in bnxt_qplib_alloc_hdr_buf()
221 if (!qp->sq_hdr_buf) { in bnxt_qplib_alloc_hdr_buf()
228 qp->rq_hdr_buf = bnxt_qplib_get_hdr_buf(pdev, rstep, in bnxt_qplib_alloc_hdr_buf()
229 qp->rq.max_wqe); in bnxt_qplib_alloc_hdr_buf()
230 if (!qp->rq_hdr_buf) { in bnxt_qplib_alloc_hdr_buf()
239 bnxt_qplib_free_hdr_buf(res, qp); in bnxt_qplib_alloc_hdr_buf()
822 struct bnxt_qplib_qp *qp) in __qplib_destroy_qp() argument
828 req.qp_cid = cpu_to_le32(qp->id); in __qplib_destroy_qp()
905 int bnxt_qplib_create_qp1(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) in bnxt_qplib_create_qp1() argument
911 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_create_qp1()
912 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_create_qp1()
921 req.type = qp->type; in bnxt_qplib_create_qp1()
922 req.dpi = cpu_to_le32(qp->dpi->dpi); in bnxt_qplib_create_qp1()
923 req.qp_handle = cpu_to_le64(qp->qp_handle); in bnxt_qplib_create_qp1()
934 req.sq_size = cpu_to_le32(_set_sq_size(sq, qp->wqe_mode)); in bnxt_qplib_create_qp1()
945 req.scq_cid = cpu_to_le32(qp->scq->id); in bnxt_qplib_create_qp1()
948 if (!qp->srq) { in bnxt_qplib_create_qp1()
972 req.srq_cid = cpu_to_le32(qp->srq->id); in bnxt_qplib_create_qp1()
974 req.rcq_cid = cpu_to_le32(qp->rcq->id); in bnxt_qplib_create_qp1()
978 req.pd_id = cpu_to_le32(qp->pd->id); in bnxt_qplib_create_qp1()
992 if (!qp->srq) { in bnxt_qplib_create_qp1()
998 qp->id = le32_to_cpu(resp.xid); in bnxt_qplib_create_qp1()
999 qp->cur_qp_state = CMDQ_MODIFY_QP_NEW_STATE_RESET; in bnxt_qplib_create_qp1()
1000 qp->cctx = res->cctx; in bnxt_qplib_create_qp1()
1002 sq->dbinfo.xid = qp->id; in bnxt_qplib_create_qp1()
1003 sq->dbinfo.db = qp->dpi->dbr; in bnxt_qplib_create_qp1()
1004 sq->dbinfo.max_slot = _set_sq_max_slot(qp->wqe_mode); in bnxt_qplib_create_qp1()
1011 rq->dbinfo.xid = qp->id; in bnxt_qplib_create_qp1()
1012 rq->dbinfo.db = qp->dpi->dbr; in bnxt_qplib_create_qp1()
1022 tbl->rec[tbl->max].xid = qp->id; in bnxt_qplib_create_qp1()
1023 tbl->rec[tbl->max].handle = qp; in bnxt_qplib_create_qp1()
1030 __qplib_destroy_qp(rcfw, qp); in bnxt_qplib_create_qp1()
1039 static void bnxt_qplib_init_psn_ptr(struct bnxt_qplib_qp *qp, int size) in bnxt_qplib_init_psn_ptr() argument
1046 sq = &qp->sq; in bnxt_qplib_init_psn_ptr()
1057 int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) in bnxt_qplib_create_qp() argument
1064 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_create_qp()
1065 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_create_qp()
1077 qp->cctx = res->cctx; in bnxt_qplib_create_qp()
1079 qp->dev_cap_flags = res->dattr->dev_cap_flags; in bnxt_qplib_create_qp()
1081 req.type = qp->type; in bnxt_qplib_create_qp()
1082 req.dpi = cpu_to_le32(qp->dpi->dpi); in bnxt_qplib_create_qp()
1083 req.qp_handle = cpu_to_le64(qp->qp_handle); in bnxt_qplib_create_qp()
1086 if (qp->type == CMDQ_CREATE_QP_TYPE_RC) { in bnxt_qplib_create_qp()
1087 psn_sz = _is_chip_gen_p5_p7(qp->cctx) ? in bnxt_qplib_create_qp()
1090 if (BNXT_RE_HW_RETX(qp->dev_cap_flags)) { in bnxt_qplib_create_qp()
1092 qp->msn = 0; in bnxt_qplib_create_qp()
1104 _set_sq_size(sq, qp->wqe_mode) : 0; in bnxt_qplib_create_qp()
1106 if (BNXT_RE_HW_RETX(qp->dev_cap_flags) && psn_sz) { in bnxt_qplib_create_qp()
1107 if (qp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC) in bnxt_qplib_create_qp()
1108 hwq_attr.aux_depth = roundup_pow_of_two(_set_sq_size(sq, qp->wqe_mode)); in bnxt_qplib_create_qp()
1110 hwq_attr.aux_depth = roundup_pow_of_two(_set_sq_size(sq, qp->wqe_mode)) / 2; in bnxt_qplib_create_qp()
1111 qp->msn_tbl_sz = hwq_attr.aux_depth; in bnxt_qplib_create_qp()
1112 qp->msn = 0; in bnxt_qplib_create_qp()
1119 sqsz = _set_sq_size(sq, qp->wqe_mode); in bnxt_qplib_create_qp()
1122 pr_err("QPLIB: FP: QP (0x%x) exceeds sq size %d\n", qp->id, sqsz); in bnxt_qplib_create_qp()
1134 ((BNXT_RE_HW_RETX(qp->dev_cap_flags)) ? in bnxt_qplib_create_qp()
1137 req.scq_cid = cpu_to_le32(qp->scq->id); in bnxt_qplib_create_qp()
1140 if (!qp->srq) { in bnxt_qplib_create_qp()
1158 nsge = (qp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC) ? in bnxt_qplib_create_qp()
1166 req.srq_cid = cpu_to_le32(qp->srq->id); in bnxt_qplib_create_qp()
1168 req.rcq_cid = cpu_to_le32(qp->rcq->id); in bnxt_qplib_create_qp()
1172 if (qp->sig_type) in bnxt_qplib_create_qp()
1174 if (qp->wqe_mode == BNXT_QPLIB_WQE_MODE_VARIABLE) in bnxt_qplib_create_qp()
1179 bnxt_ext_stats_supported(qp->cctx, res->dattr->dev_cap_flags, res->is_vf)) in bnxt_qplib_create_qp()
1185 xrrq = &qp->orrq; in bnxt_qplib_create_qp()
1187 ORD_LIMIT_TO_ORRQ_SLOTS(qp->max_rd_atomic); in bnxt_qplib_create_qp()
1206 xrrq = &qp->irrq; in bnxt_qplib_create_qp()
1208 qp->max_dest_rd_atomic); in bnxt_qplib_create_qp()
1220 req.pd_id = cpu_to_le32(qp->pd->id); in bnxt_qplib_create_qp()
1230 if (!qp->is_user) { in bnxt_qplib_create_qp()
1234 if (!qp->srq) { in bnxt_qplib_create_qp()
1240 bnxt_qplib_init_psn_ptr(qp, psn_sz); in bnxt_qplib_create_qp()
1242 qp->id = le32_to_cpu(resp.xid); in bnxt_qplib_create_qp()
1243 qp->cur_qp_state = CMDQ_MODIFY_QP_NEW_STATE_RESET; in bnxt_qplib_create_qp()
1244 INIT_LIST_HEAD(&qp->sq_flush); in bnxt_qplib_create_qp()
1245 INIT_LIST_HEAD(&qp->rq_flush); in bnxt_qplib_create_qp()
1248 sq->dbinfo.xid = qp->id; in bnxt_qplib_create_qp()
1249 sq->dbinfo.db = qp->dpi->dbr; in bnxt_qplib_create_qp()
1250 sq->dbinfo.max_slot = _set_sq_max_slot(qp->wqe_mode); in bnxt_qplib_create_qp()
1255 sq->dbinfo.seed = qp->id; in bnxt_qplib_create_qp()
1258 rq->dbinfo.xid = qp->id; in bnxt_qplib_create_qp()
1259 rq->dbinfo.db = qp->dpi->dbr; in bnxt_qplib_create_qp()
1265 rq->dbinfo.seed = qp->id; in bnxt_qplib_create_qp()
1269 qp_idx = map_qp_id_to_tbl_indx(qp->id, tbl); in bnxt_qplib_create_qp()
1271 tbl->rec[qp_idx].xid = qp->id; in bnxt_qplib_create_qp()
1272 tbl->rec[qp_idx].handle = qp; in bnxt_qplib_create_qp()
1279 __qplib_destroy_qp(rcfw, qp); in bnxt_qplib_create_qp()
1281 bnxt_qplib_free_hwq(res, &qp->irrq); in bnxt_qplib_create_qp()
1283 bnxt_qplib_free_hwq(res, &qp->orrq); in bnxt_qplib_create_qp()
1292 static void __filter_modify_flags(struct bnxt_qplib_qp *qp) in __filter_modify_flags() argument
1294 switch (qp->cur_qp_state) { in __filter_modify_flags()
1296 switch (qp->state) { in __filter_modify_flags()
1304 switch (qp->state) { in __filter_modify_flags()
1306 if (!(qp->modify_flags & in __filter_modify_flags()
1308 qp->modify_flags |= in __filter_modify_flags()
1310 qp->path_mtu = CMDQ_MODIFY_QP_PATH_MTU_MTU_2048; in __filter_modify_flags()
1312 qp->modify_flags &= in __filter_modify_flags()
1315 if (qp->max_dest_rd_atomic < 1) in __filter_modify_flags()
1316 qp->max_dest_rd_atomic = 1; in __filter_modify_flags()
1317 qp->modify_flags &= ~CMDQ_MODIFY_QP_MODIFY_MASK_SRC_MAC; in __filter_modify_flags()
1319 if (!(qp->modify_flags & in __filter_modify_flags()
1321 qp->modify_flags |= in __filter_modify_flags()
1323 qp->ah.sgid_index = 0; in __filter_modify_flags()
1331 switch (qp->state) { in __filter_modify_flags()
1334 if (qp->max_rd_atomic < 1) in __filter_modify_flags()
1335 qp->max_rd_atomic = 1; in __filter_modify_flags()
1336 qp->modify_flags &= in __filter_modify_flags()
1367 int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) in bnxt_qplib_modify_qp() argument
1382 __filter_modify_flags(qp); in bnxt_qplib_modify_qp()
1383 bmask = qp->modify_flags; in bnxt_qplib_modify_qp()
1384 req.modify_mask = cpu_to_le32(qp->modify_flags); in bnxt_qplib_modify_qp()
1385 req.qp_cid = cpu_to_le32(qp->id); in bnxt_qplib_modify_qp()
1388 (qp->state & CMDQ_MODIFY_QP_NEW_STATE_MASK) | in bnxt_qplib_modify_qp()
1389 (qp->en_sqd_async_notify == true ? in bnxt_qplib_modify_qp()
1391 if (__can_request_ppp(qp)) { in bnxt_qplib_modify_qp()
1394 req.pingpong_push_dpi = qp->ppp.dpi; in bnxt_qplib_modify_qp()
1398 req.network_type_en_sqd_async_notify_new_state |= qp->nw_type; in bnxt_qplib_modify_qp()
1401 req.access = qp->access; in bnxt_qplib_modify_qp()
1407 req.qkey = cpu_to_le32(qp->qkey); in bnxt_qplib_modify_qp()
1410 memcpy(temp32, qp->ah.dgid.data, sizeof(struct bnxt_qplib_gid)); in bnxt_qplib_modify_qp()
1417 req.flow_label = cpu_to_le32(qp->ah.flow_label); in bnxt_qplib_modify_qp()
1420 req.sgid_index = cpu_to_le16(res->sgid_tbl.hw_id[qp->ah.sgid_index]); in bnxt_qplib_modify_qp()
1423 req.hop_limit = qp->ah.hop_limit; in bnxt_qplib_modify_qp()
1426 req.traffic_class = qp->ah.traffic_class; in bnxt_qplib_modify_qp()
1429 memcpy(req.dest_mac, qp->ah.dmac, 6); in bnxt_qplib_modify_qp()
1432 req.path_mtu_pingpong_push_enable = qp->path_mtu; in bnxt_qplib_modify_qp()
1435 req.timeout = qp->timeout; in bnxt_qplib_modify_qp()
1438 req.retry_cnt = qp->retry_cnt; in bnxt_qplib_modify_qp()
1441 req.rnr_retry = qp->rnr_retry; in bnxt_qplib_modify_qp()
1444 req.min_rnr_timer = qp->min_rnr_timer; in bnxt_qplib_modify_qp()
1447 req.rq_psn = cpu_to_le32(qp->rq.psn); in bnxt_qplib_modify_qp()
1450 req.sq_psn = cpu_to_le32(qp->sq.psn); in bnxt_qplib_modify_qp()
1454 ORD_LIMIT_TO_ORRQ_SLOTS(qp->max_rd_atomic); in bnxt_qplib_modify_qp()
1458 IRD_LIMIT_TO_IRRQ_SLOTS(qp->max_dest_rd_atomic); in bnxt_qplib_modify_qp()
1460 req.sq_size = cpu_to_le32(qp->sq.hwq.max_elements); in bnxt_qplib_modify_qp()
1461 req.rq_size = cpu_to_le32(qp->rq.hwq.max_elements); in bnxt_qplib_modify_qp()
1462 req.sq_sge = cpu_to_le16(qp->sq.max_sge); in bnxt_qplib_modify_qp()
1463 req.rq_sge = cpu_to_le16(qp->rq.max_sge); in bnxt_qplib_modify_qp()
1464 req.max_inline_data = cpu_to_le32(qp->max_inline_data); in bnxt_qplib_modify_qp()
1466 req.dest_qp_id = cpu_to_le32(qp->dest_qpn); in bnxt_qplib_modify_qp()
1471 ((qp->tos_ecn << CMDQ_MODIFY_QP_TOS_ECN_SFT) & in bnxt_qplib_modify_qp()
1475 ((qp->tos_dscp << CMDQ_MODIFY_QP_TOS_DSCP_SFT) & in bnxt_qplib_modify_qp()
1477 req.vlan_pcp_vlan_dei_vlan_id = cpu_to_le16(qp->vlan_id); in bnxt_qplib_modify_qp()
1480 msg.qp_state = qp->state; in bnxt_qplib_modify_qp()
1483 if (rc == -ETIMEDOUT && (qp->state == CMDQ_MODIFY_QP_NEW_STATE_ERR)) { in bnxt_qplib_modify_qp()
1484 qp->cur_qp_state = qp->state; in bnxt_qplib_modify_qp()
1489 if (qp->state == CMDQ_MODIFY_QP_NEW_STATE_RTR) in bnxt_qplib_modify_qp()
1490 qp->lag_src_mac = be32_to_cpu(resp.lag_src_mac); in bnxt_qplib_modify_qp()
1493 qp->ppp.st_idx_en = resp.pingpong_push_state_index_enabled; in bnxt_qplib_modify_qp()
1495 qp->cur_qp_state = qp->state; in bnxt_qplib_modify_qp()
1499 int bnxt_qplib_query_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) in bnxt_qplib_query_qp() argument
1519 req.qp_cid = cpu_to_le32(qp->id); in bnxt_qplib_query_qp()
1528 qp->state = sb->en_sqd_async_notify_state & in bnxt_qplib_query_qp()
1530 qp->cur_qp_state = qp->state; in bnxt_qplib_query_qp()
1531 qp->en_sqd_async_notify = sb->en_sqd_async_notify_state & in bnxt_qplib_query_qp()
1534 qp->access = sb->access; in bnxt_qplib_query_qp()
1535 qp->pkey_index = le16_to_cpu(sb->pkey); in bnxt_qplib_query_qp()
1536 qp->qkey = le32_to_cpu(sb->qkey); in bnxt_qplib_query_qp()
1542 memcpy(qp->ah.dgid.data, temp32, sizeof(qp->ah.dgid.data)); in bnxt_qplib_query_qp()
1544 qp->ah.flow_label = le32_to_cpu(sb->flow_label); in bnxt_qplib_query_qp()
1546 qp->ah.sgid_index = 0; in bnxt_qplib_query_qp()
1549 qp->ah.sgid_index = i; in bnxt_qplib_query_qp()
1556 qp->id, le16_to_cpu(sb->sgid_index)); in bnxt_qplib_query_qp()
1558 qp->ah.hop_limit = sb->hop_limit; in bnxt_qplib_query_qp()
1559 qp->ah.traffic_class = sb->traffic_class; in bnxt_qplib_query_qp()
1560 memcpy(qp->ah.dmac, sb->dest_mac, ETH_ALEN); in bnxt_qplib_query_qp()
1561 qp->ah.vlan_id = le16_to_cpu(sb->path_mtu_dest_vlan_id) & in bnxt_qplib_query_qp()
1564 qp->path_mtu = le16_to_cpu(sb->path_mtu_dest_vlan_id) & in bnxt_qplib_query_qp()
1566 qp->timeout = sb->timeout; in bnxt_qplib_query_qp()
1567 qp->retry_cnt = sb->retry_cnt; in bnxt_qplib_query_qp()
1568 qp->rnr_retry = sb->rnr_retry; in bnxt_qplib_query_qp()
1569 qp->min_rnr_timer = sb->min_rnr_timer; in bnxt_qplib_query_qp()
1570 qp->rq.psn = le32_to_cpu(sb->rq_psn); in bnxt_qplib_query_qp()
1571 qp->max_rd_atomic = ORRQ_SLOTS_TO_ORD_LIMIT(sb->max_rd_atomic); in bnxt_qplib_query_qp()
1572 qp->sq.psn = le32_to_cpu(sb->sq_psn); in bnxt_qplib_query_qp()
1573 qp->max_dest_rd_atomic = in bnxt_qplib_query_qp()
1575 qp->sq.max_wqe = qp->sq.hwq.max_elements; in bnxt_qplib_query_qp()
1576 qp->rq.max_wqe = qp->rq.hwq.max_elements; in bnxt_qplib_query_qp()
1577 qp->sq.max_sge = le16_to_cpu(sb->sq_sge); in bnxt_qplib_query_qp()
1578 qp->rq.max_sge = le16_to_cpu(sb->rq_sge); in bnxt_qplib_query_qp()
1579 qp->max_inline_data = le32_to_cpu(sb->max_inline_data); in bnxt_qplib_query_qp()
1580 qp->dest_qpn = le32_to_cpu(sb->dest_qp_id); in bnxt_qplib_query_qp()
1581 memcpy(qp->smac, sb->src_mac, ETH_ALEN); in bnxt_qplib_query_qp()
1582 qp->vlan_id = le16_to_cpu(sb->vlan_pcp_vlan_dei_vlan_id); in bnxt_qplib_query_qp()
1583 qp->port_id = le16_to_cpu(sb->port_id); in bnxt_qplib_query_qp()
1591 static void __clean_cq(struct bnxt_qplib_cq *cq, u64 qp) in __clean_cq() argument
1610 if (qp == le64_to_cpu(cqe->qp_handle)) in __clean_cq()
1620 if (qp == le64_to_cpu(cqe->qp_handle)) in __clean_cq()
1634 struct bnxt_qplib_qp *qp) in bnxt_qplib_destroy_qp() argument
1643 qp_idx = map_qp_id_to_tbl_indx(qp->id, tbl); in bnxt_qplib_destroy_qp()
1649 rc = __qplib_destroy_qp(rcfw, qp); in bnxt_qplib_destroy_qp()
1652 tbl->rec[qp_idx].xid = qp->id; in bnxt_qplib_destroy_qp()
1653 tbl->rec[qp_idx].handle = qp; in bnxt_qplib_destroy_qp()
1662 struct bnxt_qplib_qp *qp) in bnxt_qplib_free_qp_res() argument
1664 if (qp->irrq.max_elements) in bnxt_qplib_free_qp_res()
1665 bnxt_qplib_free_hwq(res, &qp->irrq); in bnxt_qplib_free_qp_res()
1666 if (qp->orrq.max_elements) in bnxt_qplib_free_qp_res()
1667 bnxt_qplib_free_hwq(res, &qp->orrq); in bnxt_qplib_free_qp_res()
1669 if (!qp->is_user) in bnxt_qplib_free_qp_res()
1670 kfree(qp->rq.swq); in bnxt_qplib_free_qp_res()
1671 bnxt_qplib_free_hwq(res, &qp->rq.hwq); in bnxt_qplib_free_qp_res()
1673 if (!qp->is_user) in bnxt_qplib_free_qp_res()
1674 kfree(qp->sq.swq); in bnxt_qplib_free_qp_res()
1675 bnxt_qplib_free_hwq(res, &qp->sq.hwq); in bnxt_qplib_free_qp_res()
1678 void *bnxt_qplib_get_qp1_sq_buf(struct bnxt_qplib_qp *qp, in bnxt_qplib_get_qp1_sq_buf() argument
1681 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_get_qp1_sq_buf()
1687 buf = qp->sq_hdr_buf; in bnxt_qplib_get_qp1_sq_buf()
1698 u32 bnxt_qplib_get_rq_prod_index(struct bnxt_qplib_qp *qp) in bnxt_qplib_get_rq_prod_index() argument
1700 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_get_rq_prod_index()
1705 void *bnxt_qplib_get_qp1_rq_buf(struct bnxt_qplib_qp *qp, in bnxt_qplib_get_qp1_rq_buf() argument
1708 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_get_qp1_rq_buf()
1714 buf = qp->rq_hdr_buf; in bnxt_qplib_get_qp1_rq_buf()
1726 static void bnxt_qplib_fill_msn_search(struct bnxt_qplib_qp *qp, in bnxt_qplib_fill_msn_search() argument
1743 qp->msn, in bnxt_qplib_fill_msn_search()
1750 qp->msn++; in bnxt_qplib_fill_msn_search()
1751 qp->msn %= qp->msn_tbl_sz; in bnxt_qplib_fill_msn_search()
1754 static void bnxt_qplib_fill_psn_search(struct bnxt_qplib_qp *qp, in bnxt_qplib_fill_psn_search() argument
1767 if (BNXT_RE_HW_RETX(qp->dev_cap_flags)) { in bnxt_qplib_fill_psn_search()
1768 bnxt_qplib_fill_msn_search(qp, wqe, swq); in bnxt_qplib_fill_psn_search()
1781 if (_is_chip_gen_p5_p7(qp->cctx)) { in bnxt_qplib_fill_psn_search()
1801 static int bnxt_qplib_put_inline(struct bnxt_qplib_qp *qp, in bnxt_qplib_put_inline() argument
1813 sq_hwq = &qp->sq.hwq; in bnxt_qplib_put_inline()
1819 if (t_len > qp->max_inline_data) in bnxt_qplib_put_inline()
1866 static u16 _calculate_wqe_byte(struct bnxt_qplib_qp *qp, in _calculate_wqe_byte() argument
1876 wqe_size = (ilsize > qp->max_inline_data) ? in _calculate_wqe_byte()
1877 qp->max_inline_data : ilsize; in _calculate_wqe_byte()
1899 static void bnxt_qplib_pull_psn_buff(struct bnxt_qplib_qp *qp, struct bnxt_qplib_q *sq, in bnxt_qplib_pull_psn_buff() argument
1913 tail %= qp->msn_tbl_sz; in bnxt_qplib_pull_psn_buff()
1921 void bnxt_qplib_post_send_db(struct bnxt_qplib_qp *qp) in bnxt_qplib_post_send_db() argument
1923 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_post_send_db()
1928 int bnxt_qplib_post_send(struct bnxt_qplib_qp *qp, in bnxt_qplib_post_send() argument
1933 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_post_send()
1948 if (qp->state != CMDQ_MODIFY_QP_NEW_STATE_RTS && in bnxt_qplib_post_send()
1949 qp->state != CMDQ_MODIFY_QP_NEW_STATE_ERR) { in bnxt_qplib_post_send()
1952 qp->id, qp->state); in bnxt_qplib_post_send()
1957 wqe_slots = _calculate_wqe_byte(qp, wqe, &wqe_size); in bnxt_qplib_post_send()
1958 slots_needed = (qp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC) ? in bnxt_qplib_post_send()
1963 "QPLIB: FP: QP (0x%x) SQ is full!\n", qp->id); in bnxt_qplib_post_send()
1979 bnxt_qplib_pull_psn_buff(qp, sq, swq, BNXT_RE_HW_RETX(qp->dev_cap_flags)); in bnxt_qplib_post_send()
1986 if (qp->sig_type || wqe->flags & BNXT_QPLIB_SWQE_FLAGS_SIGNAL_COMP) in bnxt_qplib_post_send()
1991 qp->id, wqe_idx, swq->wr_id); in bnxt_qplib_post_send()
1992 if (qp->cur_qp_state == CMDQ_MODIFY_QP_NEW_STATE_ERR) { in bnxt_qplib_post_send()
2007 data_len = bnxt_qplib_put_inline(qp, wqe, &sw_prod); in bnxt_qplib_post_send()
2016 if (qp->type == CMDQ_CREATE_QP_TYPE_RAW_ETHERTYPE || in bnxt_qplib_post_send()
2017 qp->type == CMDQ_CREATE_QP1_TYPE_GSI) { in bnxt_qplib_post_send()
2058 if (qp->type == CMDQ_CREATE_QP_TYPE_UD || in bnxt_qplib_post_send()
2059 qp->type == CMDQ_CREATE_QP_TYPE_GSI) { in bnxt_qplib_post_send()
2069 if (qp->mtu) in bnxt_qplib_post_send()
2070 pkt_num = (data_len + qp->mtu - 1) / qp->mtu; in bnxt_qplib_post_send()
2106 if (qp->mtu) in bnxt_qplib_post_send()
2107 pkt_num = (data_len + qp->mtu - 1) / qp->mtu; in bnxt_qplib_post_send()
2139 if (qp->mtu) in bnxt_qplib_post_send()
2140 pkt_num = (data_len + qp->mtu - 1) / qp->mtu; in bnxt_qplib_post_send()
2247 bnxt_qplib_fill_psn_search(qp, wqe, swq); in bnxt_qplib_post_send()
2252 qp->wqe_cnt++; in bnxt_qplib_post_send()
2257 nq_work->cq = qp->scq; in bnxt_qplib_post_send()
2258 nq_work->nq = qp->scq->nq; in bnxt_qplib_post_send()
2260 queue_work(qp->scq->nq->cqn_wq, &nq_work->work); in bnxt_qplib_post_send()
2270 void bnxt_qplib_post_recv_db(struct bnxt_qplib_qp *qp) in bnxt_qplib_post_recv_db() argument
2272 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_post_recv_db()
2295 int bnxt_qplib_post_recv(struct bnxt_qplib_qp *qp, in bnxt_qplib_post_recv() argument
2299 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_post_recv()
2312 if (qp->state == CMDQ_MODIFY_QP_NEW_STATE_RESET) { in bnxt_qplib_post_recv()
2315 qp->id, qp->state); in bnxt_qplib_post_recv()
2320 wqe_slots = _calculate_wqe_byte(qp, wqe, NULL); in bnxt_qplib_post_recv()
2323 "QPLIB: FP: QP (0x%x) RQ is full!\n", qp->id); in bnxt_qplib_post_recv()
2334 if (qp->cur_qp_state == CMDQ_MODIFY_QP_NEW_STATE_ERR) { in bnxt_qplib_post_recv()
2367 nq_work->cq = qp->rcq; in bnxt_qplib_post_recv()
2368 nq_work->nq = qp->rcq->nq; in bnxt_qplib_post_recv()
2370 queue_work(qp->rcq->nq->cqn_wq, &nq_work->work); in bnxt_qplib_post_recv()
2618 static int __flush_sq(struct bnxt_qplib_q *sq, struct bnxt_qplib_qp *qp, in __flush_sq() argument
2635 bnxt_re_legacy_cancel_phantom_processing(qp); in __flush_sq()
2642 cqe->qp_handle = (u64)qp; in __flush_sq()
2644 cqe->src_qp = qp->id; in __flush_sq()
2669 static int __flush_rq(struct bnxt_qplib_q *rq, struct bnxt_qplib_qp *qp, in __flush_rq() argument
2677 switch (qp->type) { in __flush_rq()
2700 cqe->qp_handle = (u64)qp; in __flush_rq()
2725 struct bnxt_qplib_qp *qp = qp_handle; in bnxt_qplib_mark_qp_error() local
2727 if (!qp) in bnxt_qplib_mark_qp_error()
2731 qp->cur_qp_state = CMDQ_MODIFY_QP_NEW_STATE_ERR; in bnxt_qplib_mark_qp_error()
2732 qp->state = qp->cur_qp_state; in bnxt_qplib_mark_qp_error()
2735 if (!qp->is_user) in bnxt_qplib_mark_qp_error()
2736 bnxt_qplib_add_flush_qp(qp); in bnxt_qplib_mark_qp_error()
2742 static int bnxt_re_legacy_do_wa9060(struct bnxt_qplib_qp *qp, in bnxt_re_legacy_do_wa9060() argument
2747 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_re_legacy_do_wa9060()
2767 cq_cons, qp->id, swq_last, cqe_sq_cons); in bnxt_re_legacy_do_wa9060()
2810 qp->id, swq_last, in bnxt_re_legacy_do_wa9060()
2834 if (peek_qp == qp) { in bnxt_re_legacy_do_wa9060()
2855 cq_cons, qp->id, swq_last, cqe_sq_cons); in bnxt_re_legacy_do_wa9060()
2867 struct bnxt_qplib_qp *qp; in bnxt_qplib_cq_process_req() local
2874 qp = (struct bnxt_qplib_qp *)le64_to_cpu(hwcqe->qp_handle); in bnxt_qplib_cq_process_req()
2875 dev_dbg(&cq->hwq.pdev->dev, "FP: Process Req qp=0x%p\n", qp); in bnxt_qplib_cq_process_req()
2876 if (!qp) { in bnxt_qplib_cq_process_req()
2881 sq = &qp->sq; in bnxt_qplib_cq_process_req()
2884 if (qp->sq.flushed) { in bnxt_qplib_cq_process_req()
2886 "%s: QPLIB: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_req()
2903 cqe->qp_handle = (u64)qp; in bnxt_qplib_cq_process_req()
2904 cqe->src_qp = qp->id; in bnxt_qplib_cq_process_req()
2926 bnxt_qplib_mark_qp_error(qp); in bnxt_qplib_cq_process_req()
2929 if (!_is_chip_gen_p5_p7(qp->cctx)) { in bnxt_qplib_cq_process_req()
2930 if (bnxt_re_legacy_do_wa9060(qp, cq, cq_cons, in bnxt_qplib_cq_process_req()
2933 *lib_qp = qp; in bnxt_qplib_cq_process_req()
2990 struct bnxt_qplib_qp *qp; in bnxt_qplib_cq_process_res_rc() local
2995 qp = (struct bnxt_qplib_qp *)le64_to_cpu(hwcqe->qp_handle); in bnxt_qplib_cq_process_res_rc()
2996 if (!qp) { in bnxt_qplib_cq_process_res_rc()
3000 if (qp->rq.flushed) { in bnxt_qplib_cq_process_res_rc()
3002 "%s: QPLIB: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_res_rc()
3013 cqe->qp_handle = (u64)(unsigned long)qp; in bnxt_qplib_cq_process_res_rc()
3018 srq = qp->srq; in bnxt_qplib_cq_process_res_rc()
3041 rq = &qp->rq; in bnxt_qplib_cq_process_res_rc()
3065 bnxt_qplib_mark_qp_error(qp); in bnxt_qplib_cq_process_res_rc()
3078 struct bnxt_qplib_qp *qp; in bnxt_qplib_cq_process_res_ud() local
3084 qp = (struct bnxt_qplib_qp *)le64_to_cpu(hwcqe->qp_handle); in bnxt_qplib_cq_process_res_ud()
3085 if (!qp) { in bnxt_qplib_cq_process_res_ud()
3089 if (qp->rq.flushed) { in bnxt_qplib_cq_process_res_ud()
3091 "%s: QPLIB: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_res_ud()
3106 cqe->qp_handle = (u64)(unsigned long)qp; in bnxt_qplib_cq_process_res_ud()
3119 srq = qp->srq; in bnxt_qplib_cq_process_res_ud()
3142 rq = &qp->rq; in bnxt_qplib_cq_process_res_ud()
3167 bnxt_qplib_mark_qp_error(qp); in bnxt_qplib_cq_process_res_ud()
3194 struct bnxt_qplib_qp *qp; in bnxt_qplib_cq_process_res_raweth_qp1() local
3201 qp = (struct bnxt_qplib_qp *)le64_to_cpu(hwcqe->qp_handle); in bnxt_qplib_cq_process_res_raweth_qp1()
3202 if (!qp) { in bnxt_qplib_cq_process_res_raweth_qp1()
3207 if (qp->rq.flushed) { in bnxt_qplib_cq_process_res_raweth_qp1()
3209 "%s: QPLIB: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_res_raweth_qp1()
3215 cqe->qp_handle = (u64)(unsigned long)qp; in bnxt_qplib_cq_process_res_raweth_qp1()
3219 cqe->src_qp = qp->id; in bnxt_qplib_cq_process_res_raweth_qp1()
3220 if (qp->id == 1 && !cqe->length) { in bnxt_qplib_cq_process_res_raweth_qp1()
3226 cqe->pkey_index = qp->pkey_index; in bnxt_qplib_cq_process_res_raweth_qp1()
3227 memcpy(cqe->smac, qp->smac, 6); in bnxt_qplib_cq_process_res_raweth_qp1()
3238 srq = qp->srq; in bnxt_qplib_cq_process_res_raweth_qp1()
3263 rq = &qp->rq; in bnxt_qplib_cq_process_res_raweth_qp1()
3289 bnxt_qplib_mark_qp_error(qp); in bnxt_qplib_cq_process_res_raweth_qp1()
3302 struct bnxt_qplib_qp *qp; in bnxt_qplib_cq_process_terminal() local
3313 qp = (struct bnxt_qplib_qp *)le64_to_cpu(hwcqe->qp_handle); in bnxt_qplib_cq_process_terminal()
3314 if (!qp) in bnxt_qplib_cq_process_terminal()
3317 "QPLIB: FP: CQ Process terminal for qp (0x%x)\n", qp->id); in bnxt_qplib_cq_process_terminal()
3323 bnxt_qplib_mark_qp_error(qp); in bnxt_qplib_cq_process_terminal()
3325 sq = &qp->sq; in bnxt_qplib_cq_process_terminal()
3326 rq = &qp->rq; in bnxt_qplib_cq_process_terminal()
3333 if (qp->sq.flushed) { in bnxt_qplib_cq_process_terminal()
3335 "%s: QPLIB: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_terminal()
3352 cqe->qp_handle = (u64)qp; in bnxt_qplib_cq_process_terminal()
3353 cqe->src_qp = qp->id; in bnxt_qplib_cq_process_terminal()
3390 if (qp->rq.flushed) { in bnxt_qplib_cq_process_terminal()
3392 "%s: QPLIB: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_terminal()
3423 struct bnxt_qplib_qp *qp = NULL; in bnxt_qplib_process_flush_list() local
3428 list_for_each_entry(qp, &cq->sqf_head, sq_flush) { in bnxt_qplib_process_flush_list()
3431 qp); in bnxt_qplib_process_flush_list()
3432 __flush_sq(&qp->sq, qp, &cqe, &budget); in bnxt_qplib_process_flush_list()
3435 list_for_each_entry(qp, &cq->rqf_head, rq_flush) { in bnxt_qplib_process_flush_list()
3438 qp); in bnxt_qplib_process_flush_list()
3439 __flush_rq(&qp->rq, qp, &cqe, &budget); in bnxt_qplib_process_flush_list()
3539 void bnxt_qplib_flush_cqn_wq(struct bnxt_qplib_qp *qp) in bnxt_qplib_flush_cqn_wq() argument
3541 flush_workqueue(qp->scq->nq->cqn_wq); in bnxt_qplib_flush_cqn_wq()
3542 if (qp->scq != qp->rcq) in bnxt_qplib_flush_cqn_wq()
3543 flush_workqueue(qp->rcq->nq->cqn_wq); in bnxt_qplib_flush_cqn_wq()