Lines Matching refs:qp
57 static void __clean_cq(struct bnxt_qplib_cq *cq, u64 qp);
59 static void bnxt_qplib_cancel_phantom_processing(struct bnxt_qplib_qp *qp) in bnxt_qplib_cancel_phantom_processing() argument
61 qp->sq.condition = false; in bnxt_qplib_cancel_phantom_processing()
62 qp->sq.send_phantom = false; in bnxt_qplib_cancel_phantom_processing()
63 qp->sq.single = false; in bnxt_qplib_cancel_phantom_processing()
67 static void __bnxt_qplib_add_flush_qp(struct bnxt_qplib_qp *qp) in __bnxt_qplib_add_flush_qp() argument
71 scq = qp->scq; in __bnxt_qplib_add_flush_qp()
72 rcq = qp->rcq; in __bnxt_qplib_add_flush_qp()
74 if (!qp->sq.flushed) { in __bnxt_qplib_add_flush_qp()
76 "FP: Adding to SQ Flush list = %p\n", qp); in __bnxt_qplib_add_flush_qp()
77 bnxt_qplib_cancel_phantom_processing(qp); in __bnxt_qplib_add_flush_qp()
78 list_add_tail(&qp->sq_flush, &scq->sqf_head); in __bnxt_qplib_add_flush_qp()
79 qp->sq.flushed = true; in __bnxt_qplib_add_flush_qp()
81 if (!qp->srq) { in __bnxt_qplib_add_flush_qp()
82 if (!qp->rq.flushed) { in __bnxt_qplib_add_flush_qp()
84 "FP: Adding to RQ Flush list = %p\n", qp); in __bnxt_qplib_add_flush_qp()
85 list_add_tail(&qp->rq_flush, &rcq->rqf_head); in __bnxt_qplib_add_flush_qp()
86 qp->rq.flushed = true; in __bnxt_qplib_add_flush_qp()
91 static void bnxt_qplib_acquire_cq_flush_locks(struct bnxt_qplib_qp *qp, in bnxt_qplib_acquire_cq_flush_locks() argument
93 __acquires(&qp->scq->flush_lock) __acquires(&qp->rcq->flush_lock) in bnxt_qplib_acquire_cq_flush_locks()
95 spin_lock_irqsave(&qp->scq->flush_lock, *flags); in bnxt_qplib_acquire_cq_flush_locks()
96 if (qp->scq == qp->rcq) in bnxt_qplib_acquire_cq_flush_locks()
97 __acquire(&qp->rcq->flush_lock); in bnxt_qplib_acquire_cq_flush_locks()
99 spin_lock(&qp->rcq->flush_lock); in bnxt_qplib_acquire_cq_flush_locks()
102 static void bnxt_qplib_release_cq_flush_locks(struct bnxt_qplib_qp *qp, in bnxt_qplib_release_cq_flush_locks() argument
104 __releases(&qp->scq->flush_lock) __releases(&qp->rcq->flush_lock) in bnxt_qplib_release_cq_flush_locks()
106 if (qp->scq == qp->rcq) in bnxt_qplib_release_cq_flush_locks()
107 __release(&qp->rcq->flush_lock); in bnxt_qplib_release_cq_flush_locks()
109 spin_unlock(&qp->rcq->flush_lock); in bnxt_qplib_release_cq_flush_locks()
110 spin_unlock_irqrestore(&qp->scq->flush_lock, *flags); in bnxt_qplib_release_cq_flush_locks()
113 void bnxt_qplib_add_flush_qp(struct bnxt_qplib_qp *qp) in bnxt_qplib_add_flush_qp() argument
117 bnxt_qplib_acquire_cq_flush_locks(qp, &flags); in bnxt_qplib_add_flush_qp()
118 __bnxt_qplib_add_flush_qp(qp); in bnxt_qplib_add_flush_qp()
119 bnxt_qplib_release_cq_flush_locks(qp, &flags); in bnxt_qplib_add_flush_qp()
122 static void __bnxt_qplib_del_flush_qp(struct bnxt_qplib_qp *qp) in __bnxt_qplib_del_flush_qp() argument
124 if (qp->sq.flushed) { in __bnxt_qplib_del_flush_qp()
125 qp->sq.flushed = false; in __bnxt_qplib_del_flush_qp()
126 list_del(&qp->sq_flush); in __bnxt_qplib_del_flush_qp()
128 if (!qp->srq) { in __bnxt_qplib_del_flush_qp()
129 if (qp->rq.flushed) { in __bnxt_qplib_del_flush_qp()
130 qp->rq.flushed = false; in __bnxt_qplib_del_flush_qp()
131 list_del(&qp->rq_flush); in __bnxt_qplib_del_flush_qp()
136 void bnxt_qplib_clean_qp(struct bnxt_qplib_qp *qp) in bnxt_qplib_clean_qp() argument
140 bnxt_qplib_acquire_cq_flush_locks(qp, &flags); in bnxt_qplib_clean_qp()
141 __clean_cq(qp->scq, (u64)(unsigned long)qp); in bnxt_qplib_clean_qp()
142 qp->sq.hwq.prod = 0; in bnxt_qplib_clean_qp()
143 qp->sq.hwq.cons = 0; in bnxt_qplib_clean_qp()
144 __clean_cq(qp->rcq, (u64)(unsigned long)qp); in bnxt_qplib_clean_qp()
145 qp->rq.hwq.prod = 0; in bnxt_qplib_clean_qp()
146 qp->rq.hwq.cons = 0; in bnxt_qplib_clean_qp()
148 __bnxt_qplib_del_flush_qp(qp); in bnxt_qplib_clean_qp()
149 bnxt_qplib_release_cq_flush_locks(qp, &flags); in bnxt_qplib_clean_qp()
174 struct bnxt_qplib_qp *qp) in bnxt_qplib_free_qp_hdr_buf() argument
176 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_free_qp_hdr_buf()
177 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_free_qp_hdr_buf()
179 if (qp->rq_hdr_buf) in bnxt_qplib_free_qp_hdr_buf()
181 rq->max_wqe * qp->rq_hdr_buf_size, in bnxt_qplib_free_qp_hdr_buf()
182 qp->rq_hdr_buf, qp->rq_hdr_buf_map); in bnxt_qplib_free_qp_hdr_buf()
183 if (qp->sq_hdr_buf) in bnxt_qplib_free_qp_hdr_buf()
185 sq->max_wqe * qp->sq_hdr_buf_size, in bnxt_qplib_free_qp_hdr_buf()
186 qp->sq_hdr_buf, qp->sq_hdr_buf_map); in bnxt_qplib_free_qp_hdr_buf()
187 qp->rq_hdr_buf = NULL; in bnxt_qplib_free_qp_hdr_buf()
188 qp->sq_hdr_buf = NULL; in bnxt_qplib_free_qp_hdr_buf()
189 qp->rq_hdr_buf_map = 0; in bnxt_qplib_free_qp_hdr_buf()
190 qp->sq_hdr_buf_map = 0; in bnxt_qplib_free_qp_hdr_buf()
191 qp->sq_hdr_buf_size = 0; in bnxt_qplib_free_qp_hdr_buf()
192 qp->rq_hdr_buf_size = 0; in bnxt_qplib_free_qp_hdr_buf()
196 struct bnxt_qplib_qp *qp) in bnxt_qplib_alloc_qp_hdr_buf() argument
198 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_alloc_qp_hdr_buf()
199 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_alloc_qp_hdr_buf()
202 if (qp->sq_hdr_buf_size && sq->max_wqe) { in bnxt_qplib_alloc_qp_hdr_buf()
203 qp->sq_hdr_buf = dma_alloc_coherent(&res->pdev->dev, in bnxt_qplib_alloc_qp_hdr_buf()
204 sq->max_wqe * qp->sq_hdr_buf_size, in bnxt_qplib_alloc_qp_hdr_buf()
205 &qp->sq_hdr_buf_map, GFP_KERNEL); in bnxt_qplib_alloc_qp_hdr_buf()
206 if (!qp->sq_hdr_buf) { in bnxt_qplib_alloc_qp_hdr_buf()
214 if (qp->rq_hdr_buf_size && rq->max_wqe) { in bnxt_qplib_alloc_qp_hdr_buf()
215 qp->rq_hdr_buf = dma_alloc_coherent(&res->pdev->dev, in bnxt_qplib_alloc_qp_hdr_buf()
217 qp->rq_hdr_buf_size, in bnxt_qplib_alloc_qp_hdr_buf()
218 &qp->rq_hdr_buf_map, in bnxt_qplib_alloc_qp_hdr_buf()
220 if (!qp->rq_hdr_buf) { in bnxt_qplib_alloc_qp_hdr_buf()
230 bnxt_qplib_free_qp_hdr_buf(res, qp); in bnxt_qplib_alloc_qp_hdr_buf()
809 int bnxt_qplib_create_qp1(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) in bnxt_qplib_create_qp1() argument
813 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_create_qp1()
814 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_create_qp1()
827 req.type = qp->type; in bnxt_qplib_create_qp1()
828 req.dpi = cpu_to_le32(qp->dpi->dpi); in bnxt_qplib_create_qp1()
829 req.qp_handle = cpu_to_le64(qp->qp_handle); in bnxt_qplib_create_qp1()
845 req.sq_size = cpu_to_le32(bnxt_qplib_set_sq_size(sq, qp->wqe_mode)); in bnxt_qplib_create_qp1()
855 req.scq_cid = cpu_to_le32(qp->scq->id); in bnxt_qplib_create_qp1()
882 req.rcq_cid = cpu_to_le32(qp->rcq->id); in bnxt_qplib_create_qp1()
884 rc = bnxt_qplib_alloc_qp_hdr_buf(res, qp); in bnxt_qplib_create_qp1()
891 req.pd_id = cpu_to_le32(qp->pd->id); in bnxt_qplib_create_qp1()
898 qp->id = le32_to_cpu(resp.xid); in bnxt_qplib_create_qp1()
899 qp->cur_qp_state = CMDQ_MODIFY_QP_NEW_STATE_RESET; in bnxt_qplib_create_qp1()
900 qp->cctx = res->cctx; in bnxt_qplib_create_qp1()
902 sq->dbinfo.xid = qp->id; in bnxt_qplib_create_qp1()
903 sq->dbinfo.db = qp->dpi->dbr; in bnxt_qplib_create_qp1()
904 sq->dbinfo.max_slot = bnxt_qplib_set_sq_max_slot(qp->wqe_mode); in bnxt_qplib_create_qp1()
907 rq->dbinfo.xid = qp->id; in bnxt_qplib_create_qp1()
908 rq->dbinfo.db = qp->dpi->dbr; in bnxt_qplib_create_qp1()
911 tbl_indx = map_qp_id_to_tbl_indx(qp->id, rcfw); in bnxt_qplib_create_qp1()
912 rcfw->qp_tbl[tbl_indx].qp_id = qp->id; in bnxt_qplib_create_qp1()
913 rcfw->qp_tbl[tbl_indx].qp_handle = (void *)qp; in bnxt_qplib_create_qp1()
918 bnxt_qplib_free_qp_hdr_buf(res, qp); in bnxt_qplib_create_qp1()
931 static void bnxt_qplib_init_psn_ptr(struct bnxt_qplib_qp *qp, int size) in bnxt_qplib_init_psn_ptr() argument
938 sq = &qp->sq; in bnxt_qplib_init_psn_ptr()
949 int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) in bnxt_qplib_create_qp() argument
954 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_create_qp()
955 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_create_qp()
970 req.type = qp->type; in bnxt_qplib_create_qp()
971 req.dpi = cpu_to_le32(qp->dpi->dpi); in bnxt_qplib_create_qp()
972 req.qp_handle = cpu_to_le64(qp->qp_handle); in bnxt_qplib_create_qp()
975 if (qp->type == CMDQ_CREATE_QP_TYPE_RC) { in bnxt_qplib_create_qp()
986 hwq_attr.aux_depth = bnxt_qplib_set_sq_size(sq, qp->wqe_mode); in bnxt_qplib_create_qp()
997 bnxt_qplib_init_psn_ptr(qp, psn_sz); in bnxt_qplib_create_qp()
999 req.sq_size = cpu_to_le32(bnxt_qplib_set_sq_size(sq, qp->wqe_mode)); in bnxt_qplib_create_qp()
1009 req.scq_cid = cpu_to_le32(qp->scq->id); in bnxt_qplib_create_qp()
1012 if (!qp->srq) { in bnxt_qplib_create_qp()
1034 nsge = (qp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC) ? in bnxt_qplib_create_qp()
1043 req.srq_cid = cpu_to_le32(qp->srq->id); in bnxt_qplib_create_qp()
1045 req.rcq_cid = cpu_to_le32(qp->rcq->id); in bnxt_qplib_create_qp()
1049 if (qp->sig_type) in bnxt_qplib_create_qp()
1051 if (qp->wqe_mode == BNXT_QPLIB_WQE_MODE_VARIABLE) in bnxt_qplib_create_qp()
1060 xrrq = &qp->orrq; in bnxt_qplib_create_qp()
1062 ORD_LIMIT_TO_ORRQ_SLOTS(qp->max_rd_atomic); in bnxt_qplib_create_qp()
1082 xrrq = &qp->irrq; in bnxt_qplib_create_qp()
1084 qp->max_dest_rd_atomic); in bnxt_qplib_create_qp()
1098 req.pd_id = cpu_to_le32(qp->pd->id); in bnxt_qplib_create_qp()
1105 qp->id = le32_to_cpu(resp.xid); in bnxt_qplib_create_qp()
1106 qp->cur_qp_state = CMDQ_MODIFY_QP_NEW_STATE_RESET; in bnxt_qplib_create_qp()
1107 INIT_LIST_HEAD(&qp->sq_flush); in bnxt_qplib_create_qp()
1108 INIT_LIST_HEAD(&qp->rq_flush); in bnxt_qplib_create_qp()
1109 qp->cctx = res->cctx; in bnxt_qplib_create_qp()
1111 sq->dbinfo.xid = qp->id; in bnxt_qplib_create_qp()
1112 sq->dbinfo.db = qp->dpi->dbr; in bnxt_qplib_create_qp()
1113 sq->dbinfo.max_slot = bnxt_qplib_set_sq_max_slot(qp->wqe_mode); in bnxt_qplib_create_qp()
1116 rq->dbinfo.xid = qp->id; in bnxt_qplib_create_qp()
1117 rq->dbinfo.db = qp->dpi->dbr; in bnxt_qplib_create_qp()
1120 tbl_indx = map_qp_id_to_tbl_indx(qp->id, rcfw); in bnxt_qplib_create_qp()
1121 rcfw->qp_tbl[tbl_indx].qp_id = qp->id; in bnxt_qplib_create_qp()
1122 rcfw->qp_tbl[tbl_indx].qp_handle = (void *)qp; in bnxt_qplib_create_qp()
1126 bnxt_qplib_free_hwq(res, &qp->irrq); in bnxt_qplib_create_qp()
1128 bnxt_qplib_free_hwq(res, &qp->orrq); in bnxt_qplib_create_qp()
1141 static void __modify_flags_from_init_state(struct bnxt_qplib_qp *qp) in __modify_flags_from_init_state() argument
1143 switch (qp->state) { in __modify_flags_from_init_state()
1148 if (!(qp->modify_flags & in __modify_flags_from_init_state()
1150 qp->modify_flags |= in __modify_flags_from_init_state()
1152 qp->path_mtu = in __modify_flags_from_init_state()
1155 qp->modify_flags &= in __modify_flags_from_init_state()
1158 if (qp->max_dest_rd_atomic < 1) in __modify_flags_from_init_state()
1159 qp->max_dest_rd_atomic = 1; in __modify_flags_from_init_state()
1160 qp->modify_flags &= ~CMDQ_MODIFY_QP_MODIFY_MASK_SRC_MAC; in __modify_flags_from_init_state()
1162 if (!(qp->modify_flags & in __modify_flags_from_init_state()
1164 qp->modify_flags |= in __modify_flags_from_init_state()
1166 qp->ah.sgid_index = 0; in __modify_flags_from_init_state()
1174 static void __modify_flags_from_rtr_state(struct bnxt_qplib_qp *qp) in __modify_flags_from_rtr_state() argument
1176 switch (qp->state) { in __modify_flags_from_rtr_state()
1179 if (qp->max_rd_atomic < 1) in __modify_flags_from_rtr_state()
1180 qp->max_rd_atomic = 1; in __modify_flags_from_rtr_state()
1187 qp->modify_flags &= in __modify_flags_from_rtr_state()
1206 static void __filter_modify_flags(struct bnxt_qplib_qp *qp) in __filter_modify_flags() argument
1208 switch (qp->cur_qp_state) { in __filter_modify_flags()
1212 __modify_flags_from_init_state(qp); in __filter_modify_flags()
1215 __modify_flags_from_rtr_state(qp); in __filter_modify_flags()
1230 int bnxt_qplib_modify_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) in bnxt_qplib_modify_qp() argument
1243 __filter_modify_flags(qp); in bnxt_qplib_modify_qp()
1244 bmask = qp->modify_flags; in bnxt_qplib_modify_qp()
1245 req.modify_mask = cpu_to_le32(qp->modify_flags); in bnxt_qplib_modify_qp()
1246 req.qp_cid = cpu_to_le32(qp->id); in bnxt_qplib_modify_qp()
1249 (qp->state & CMDQ_MODIFY_QP_NEW_STATE_MASK) | in bnxt_qplib_modify_qp()
1250 (qp->en_sqd_async_notify ? in bnxt_qplib_modify_qp()
1253 req.network_type_en_sqd_async_notify_new_state |= qp->nw_type; in bnxt_qplib_modify_qp()
1256 req.access = qp->access; in bnxt_qplib_modify_qp()
1260 qp->pkey_index, &pkey)) in bnxt_qplib_modify_qp()
1264 req.qkey = cpu_to_le32(qp->qkey); in bnxt_qplib_modify_qp()
1267 memcpy(temp32, qp->ah.dgid.data, sizeof(struct bnxt_qplib_gid)); in bnxt_qplib_modify_qp()
1274 req.flow_label = cpu_to_le32(qp->ah.flow_label); in bnxt_qplib_modify_qp()
1278 [qp->ah.sgid_index]); in bnxt_qplib_modify_qp()
1281 req.hop_limit = qp->ah.hop_limit; in bnxt_qplib_modify_qp()
1284 req.traffic_class = qp->ah.traffic_class; in bnxt_qplib_modify_qp()
1287 memcpy(req.dest_mac, qp->ah.dmac, 6); in bnxt_qplib_modify_qp()
1290 req.path_mtu = qp->path_mtu; in bnxt_qplib_modify_qp()
1293 req.timeout = qp->timeout; in bnxt_qplib_modify_qp()
1296 req.retry_cnt = qp->retry_cnt; in bnxt_qplib_modify_qp()
1299 req.rnr_retry = qp->rnr_retry; in bnxt_qplib_modify_qp()
1302 req.min_rnr_timer = qp->min_rnr_timer; in bnxt_qplib_modify_qp()
1305 req.rq_psn = cpu_to_le32(qp->rq.psn); in bnxt_qplib_modify_qp()
1308 req.sq_psn = cpu_to_le32(qp->sq.psn); in bnxt_qplib_modify_qp()
1312 ORD_LIMIT_TO_ORRQ_SLOTS(qp->max_rd_atomic); in bnxt_qplib_modify_qp()
1316 IRD_LIMIT_TO_IRRQ_SLOTS(qp->max_dest_rd_atomic); in bnxt_qplib_modify_qp()
1318 req.sq_size = cpu_to_le32(qp->sq.hwq.max_elements); in bnxt_qplib_modify_qp()
1319 req.rq_size = cpu_to_le32(qp->rq.hwq.max_elements); in bnxt_qplib_modify_qp()
1320 req.sq_sge = cpu_to_le16(qp->sq.max_sge); in bnxt_qplib_modify_qp()
1321 req.rq_sge = cpu_to_le16(qp->rq.max_sge); in bnxt_qplib_modify_qp()
1322 req.max_inline_data = cpu_to_le32(qp->max_inline_data); in bnxt_qplib_modify_qp()
1324 req.dest_qp_id = cpu_to_le32(qp->dest_qpn); in bnxt_qplib_modify_qp()
1326 req.vlan_pcp_vlan_dei_vlan_id = cpu_to_le16(qp->vlan_id); in bnxt_qplib_modify_qp()
1332 qp->cur_qp_state = qp->state; in bnxt_qplib_modify_qp()
1336 int bnxt_qplib_query_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp) in bnxt_qplib_query_qp() argument
1354 req.qp_cid = cpu_to_le32(qp->id); in bnxt_qplib_query_qp()
1361 qp->state = sb->en_sqd_async_notify_state & in bnxt_qplib_query_qp()
1363 qp->en_sqd_async_notify = sb->en_sqd_async_notify_state & in bnxt_qplib_query_qp()
1366 qp->access = sb->access; in bnxt_qplib_query_qp()
1367 qp->pkey_index = le16_to_cpu(sb->pkey); in bnxt_qplib_query_qp()
1368 qp->qkey = le32_to_cpu(sb->qkey); in bnxt_qplib_query_qp()
1374 memcpy(qp->ah.dgid.data, temp32, sizeof(qp->ah.dgid.data)); in bnxt_qplib_query_qp()
1376 qp->ah.flow_label = le32_to_cpu(sb->flow_label); in bnxt_qplib_query_qp()
1378 qp->ah.sgid_index = 0; in bnxt_qplib_query_qp()
1381 qp->ah.sgid_index = i; in bnxt_qplib_query_qp()
1388 qp->ah.hop_limit = sb->hop_limit; in bnxt_qplib_query_qp()
1389 qp->ah.traffic_class = sb->traffic_class; in bnxt_qplib_query_qp()
1390 memcpy(qp->ah.dmac, sb->dest_mac, 6); in bnxt_qplib_query_qp()
1391 qp->ah.vlan_id = (le16_to_cpu(sb->path_mtu_dest_vlan_id) & in bnxt_qplib_query_qp()
1394 qp->path_mtu = (le16_to_cpu(sb->path_mtu_dest_vlan_id) & in bnxt_qplib_query_qp()
1397 qp->timeout = sb->timeout; in bnxt_qplib_query_qp()
1398 qp->retry_cnt = sb->retry_cnt; in bnxt_qplib_query_qp()
1399 qp->rnr_retry = sb->rnr_retry; in bnxt_qplib_query_qp()
1400 qp->min_rnr_timer = sb->min_rnr_timer; in bnxt_qplib_query_qp()
1401 qp->rq.psn = le32_to_cpu(sb->rq_psn); in bnxt_qplib_query_qp()
1402 qp->max_rd_atomic = ORRQ_SLOTS_TO_ORD_LIMIT(sb->max_rd_atomic); in bnxt_qplib_query_qp()
1403 qp->sq.psn = le32_to_cpu(sb->sq_psn); in bnxt_qplib_query_qp()
1404 qp->max_dest_rd_atomic = in bnxt_qplib_query_qp()
1406 qp->sq.max_wqe = qp->sq.hwq.max_elements; in bnxt_qplib_query_qp()
1407 qp->rq.max_wqe = qp->rq.hwq.max_elements; in bnxt_qplib_query_qp()
1408 qp->sq.max_sge = le16_to_cpu(sb->sq_sge); in bnxt_qplib_query_qp()
1409 qp->rq.max_sge = le16_to_cpu(sb->rq_sge); in bnxt_qplib_query_qp()
1410 qp->max_inline_data = le32_to_cpu(sb->max_inline_data); in bnxt_qplib_query_qp()
1411 qp->dest_qpn = le32_to_cpu(sb->dest_qp_id); in bnxt_qplib_query_qp()
1412 memcpy(qp->smac, sb->src_mac, 6); in bnxt_qplib_query_qp()
1413 qp->vlan_id = le16_to_cpu(sb->vlan_pcp_vlan_dei_vlan_id); in bnxt_qplib_query_qp()
1419 static void __clean_cq(struct bnxt_qplib_cq *cq, u64 qp) in __clean_cq() argument
1440 if (qp == le64_to_cpu(cqe->qp_handle)) in __clean_cq()
1450 if (qp == le64_to_cpu(cqe->qp_handle)) in __clean_cq()
1461 struct bnxt_qplib_qp *qp) in bnxt_qplib_destroy_qp() argument
1470 tbl_indx = map_qp_id_to_tbl_indx(qp->id, rcfw); in bnxt_qplib_destroy_qp()
1476 req.qp_cid = cpu_to_le32(qp->id); in bnxt_qplib_destroy_qp()
1480 rcfw->qp_tbl[tbl_indx].qp_id = qp->id; in bnxt_qplib_destroy_qp()
1481 rcfw->qp_tbl[tbl_indx].qp_handle = qp; in bnxt_qplib_destroy_qp()
1489 struct bnxt_qplib_qp *qp) in bnxt_qplib_free_qp_res() argument
1491 bnxt_qplib_free_qp_hdr_buf(res, qp); in bnxt_qplib_free_qp_res()
1492 bnxt_qplib_free_hwq(res, &qp->sq.hwq); in bnxt_qplib_free_qp_res()
1493 kfree(qp->sq.swq); in bnxt_qplib_free_qp_res()
1495 bnxt_qplib_free_hwq(res, &qp->rq.hwq); in bnxt_qplib_free_qp_res()
1496 kfree(qp->rq.swq); in bnxt_qplib_free_qp_res()
1498 if (qp->irrq.max_elements) in bnxt_qplib_free_qp_res()
1499 bnxt_qplib_free_hwq(res, &qp->irrq); in bnxt_qplib_free_qp_res()
1500 if (qp->orrq.max_elements) in bnxt_qplib_free_qp_res()
1501 bnxt_qplib_free_hwq(res, &qp->orrq); in bnxt_qplib_free_qp_res()
1505 void *bnxt_qplib_get_qp1_sq_buf(struct bnxt_qplib_qp *qp, in bnxt_qplib_get_qp1_sq_buf() argument
1508 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_get_qp1_sq_buf()
1513 if (qp->sq_hdr_buf) { in bnxt_qplib_get_qp1_sq_buf()
1515 sge->addr = (dma_addr_t)(qp->sq_hdr_buf_map + in bnxt_qplib_get_qp1_sq_buf()
1516 sw_prod * qp->sq_hdr_buf_size); in bnxt_qplib_get_qp1_sq_buf()
1518 sge->size = qp->sq_hdr_buf_size; in bnxt_qplib_get_qp1_sq_buf()
1519 return qp->sq_hdr_buf + sw_prod * sge->size; in bnxt_qplib_get_qp1_sq_buf()
1524 u32 bnxt_qplib_get_rq_prod_index(struct bnxt_qplib_qp *qp) in bnxt_qplib_get_rq_prod_index() argument
1526 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_get_rq_prod_index()
1531 dma_addr_t bnxt_qplib_get_qp_buf_from_index(struct bnxt_qplib_qp *qp, u32 index) in bnxt_qplib_get_qp_buf_from_index() argument
1533 return (qp->rq_hdr_buf_map + index * qp->rq_hdr_buf_size); in bnxt_qplib_get_qp_buf_from_index()
1536 void *bnxt_qplib_get_qp1_rq_buf(struct bnxt_qplib_qp *qp, in bnxt_qplib_get_qp1_rq_buf() argument
1539 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_get_qp1_rq_buf()
1544 if (qp->rq_hdr_buf) { in bnxt_qplib_get_qp1_rq_buf()
1546 sge->addr = (dma_addr_t)(qp->rq_hdr_buf_map + in bnxt_qplib_get_qp1_rq_buf()
1547 sw_prod * qp->rq_hdr_buf_size); in bnxt_qplib_get_qp1_rq_buf()
1549 sge->size = qp->rq_hdr_buf_size; in bnxt_qplib_get_qp1_rq_buf()
1550 return qp->rq_hdr_buf + sw_prod * sge->size; in bnxt_qplib_get_qp1_rq_buf()
1555 static void bnxt_qplib_fill_psn_search(struct bnxt_qplib_qp *qp, in bnxt_qplib_fill_psn_search() argument
1576 if (bnxt_qplib_is_chip_gen_p5(qp->cctx)) { in bnxt_qplib_fill_psn_search()
1586 static int bnxt_qplib_put_inline(struct bnxt_qplib_qp *qp, in bnxt_qplib_put_inline() argument
1598 hwq = &qp->sq.hwq; in bnxt_qplib_put_inline()
1604 if (t_len > qp->max_inline_data) in bnxt_qplib_put_inline()
1651 static u16 bnxt_qplib_required_slots(struct bnxt_qplib_qp *qp, in bnxt_qplib_required_slots() argument
1663 ilsize = bnxt_qplib_calc_ilsize(wqe, qp->max_inline_data); in bnxt_qplib_required_slots()
1668 *qdf = __xlate_qfd(qp->sq.q_full_delta, bytes); in bnxt_qplib_required_slots()
1695 void bnxt_qplib_post_send_db(struct bnxt_qplib_qp *qp) in bnxt_qplib_post_send_db() argument
1697 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_post_send_db()
1702 int bnxt_qplib_post_send(struct bnxt_qplib_qp *qp, in bnxt_qplib_post_send() argument
1707 struct bnxt_qplib_q *sq = &qp->sq; in bnxt_qplib_post_send()
1720 if (qp->state != CMDQ_MODIFY_QP_NEW_STATE_RTS && in bnxt_qplib_post_send()
1721 qp->state != CMDQ_MODIFY_QP_NEW_STATE_ERR) { in bnxt_qplib_post_send()
1724 qp->id, qp->state); in bnxt_qplib_post_send()
1729 slots = bnxt_qplib_required_slots(qp, wqe, &wqe_sz, &qdf, qp->wqe_mode); in bnxt_qplib_post_send()
1748 if (qp->sig_type) in bnxt_qplib_post_send()
1751 if (qp->state == CMDQ_MODIFY_QP_NEW_STATE_ERR) { in bnxt_qplib_post_send()
1765 data_len = bnxt_qplib_put_inline(qp, wqe, &idx); in bnxt_qplib_post_send()
1774 if (qp->type == CMDQ_CREATE_QP1_TYPE_GSI) { in bnxt_qplib_post_send()
1802 if (qp->type == CMDQ_CREATE_QP_TYPE_UD || in bnxt_qplib_post_send()
1803 qp->type == CMDQ_CREATE_QP_TYPE_GSI) { in bnxt_qplib_post_send()
1813 if (qp->mtu) in bnxt_qplib_post_send()
1814 pkt_num = (data_len + qp->mtu - 1) / qp->mtu; in bnxt_qplib_post_send()
1835 if (qp->mtu) in bnxt_qplib_post_send()
1836 pkt_num = (data_len + qp->mtu - 1) / qp->mtu; in bnxt_qplib_post_send()
1854 if (qp->mtu) in bnxt_qplib_post_send()
1855 pkt_num = (data_len + qp->mtu - 1) / qp->mtu; in bnxt_qplib_post_send()
1925 bnxt_qplib_fill_psn_search(qp, wqe, swq); in bnxt_qplib_post_send()
1929 qp->wqe_cnt++; in bnxt_qplib_post_send()
1934 nq_work->cq = qp->scq; in bnxt_qplib_post_send()
1935 nq_work->nq = qp->scq->nq; in bnxt_qplib_post_send()
1937 queue_work(qp->scq->nq->cqn_wq, &nq_work->work); in bnxt_qplib_post_send()
1947 void bnxt_qplib_post_recv_db(struct bnxt_qplib_qp *qp) in bnxt_qplib_post_recv_db() argument
1949 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_post_recv_db()
1954 int bnxt_qplib_post_recv(struct bnxt_qplib_qp *qp, in bnxt_qplib_post_recv() argument
1958 struct bnxt_qplib_q *rq = &qp->rq; in bnxt_qplib_post_recv()
1969 if (qp->state == CMDQ_MODIFY_QP_NEW_STATE_RESET) { in bnxt_qplib_post_recv()
1972 qp->id, qp->state); in bnxt_qplib_post_recv()
1979 "FP: QP (0x%x) RQ is full!\n", qp->id); in bnxt_qplib_post_recv()
1988 if (qp->state == CMDQ_MODIFY_QP_NEW_STATE_ERR) { in bnxt_qplib_post_recv()
2021 nq_work->cq = qp->rcq; in bnxt_qplib_post_recv()
2022 nq_work->nq = qp->rcq->nq; in bnxt_qplib_post_recv()
2024 queue_work(qp->rcq->nq->cqn_wq, &nq_work->work); in bnxt_qplib_post_recv()
2126 static int __flush_sq(struct bnxt_qplib_q *sq, struct bnxt_qplib_qp *qp, in __flush_sq() argument
2142 bnxt_qplib_cancel_phantom_processing(qp); in __flush_sq()
2148 cqe->qp_handle = (u64)(unsigned long)qp; in __flush_sq()
2150 cqe->src_qp = qp->id; in __flush_sq()
2166 static int __flush_rq(struct bnxt_qplib_q *rq, struct bnxt_qplib_qp *qp, in __flush_rq() argument
2174 switch (qp->type) { in __flush_rq()
2198 cqe->qp_handle = (unsigned long)qp; in __flush_rq()
2215 struct bnxt_qplib_qp *qp = qp_handle; in bnxt_qplib_mark_qp_error() local
2217 if (!qp) in bnxt_qplib_mark_qp_error()
2221 qp->state = CMDQ_MODIFY_QP_NEW_STATE_ERR; in bnxt_qplib_mark_qp_error()
2222 bnxt_qplib_cancel_phantom_processing(qp); in bnxt_qplib_mark_qp_error()
2228 static int do_wa9060(struct bnxt_qplib_qp *qp, struct bnxt_qplib_cq *cq, in do_wa9060() argument
2232 struct bnxt_qplib_q *sq = &qp->sq; in do_wa9060()
2251 cq_cons, qp->id, swq_last, cqe_sq_cons); in do_wa9060()
2319 cq_cons, qp->id, swq_last, cqe_sq_cons); in do_wa9060()
2333 struct bnxt_qplib_qp *qp; in bnxt_qplib_cq_process_req() local
2338 qp = (struct bnxt_qplib_qp *)((unsigned long) in bnxt_qplib_cq_process_req()
2340 if (!qp) { in bnxt_qplib_cq_process_req()
2345 sq = &qp->sq; in bnxt_qplib_cq_process_req()
2348 if (qp->sq.flushed) { in bnxt_qplib_cq_process_req()
2350 "%s: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_req()
2366 cqe->qp_handle = (u64)(unsigned long)qp; in bnxt_qplib_cq_process_req()
2367 cqe->src_qp = qp->id; in bnxt_qplib_cq_process_req()
2385 bnxt_qplib_mark_qp_error(qp); in bnxt_qplib_cq_process_req()
2387 bnxt_qplib_add_flush_qp(qp); in bnxt_qplib_cq_process_req()
2390 if (do_wa9060(qp, cq, cq_cons, sq->swq_last, in bnxt_qplib_cq_process_req()
2392 *lib_qp = qp; in bnxt_qplib_cq_process_req()
2440 struct bnxt_qplib_qp *qp; in bnxt_qplib_cq_process_res_rc() local
2445 qp = (struct bnxt_qplib_qp *)((unsigned long) in bnxt_qplib_cq_process_res_rc()
2447 if (!qp) { in bnxt_qplib_cq_process_res_rc()
2451 if (qp->rq.flushed) { in bnxt_qplib_cq_process_res_rc()
2453 "%s: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_res_rc()
2464 cqe->qp_handle = (u64)(unsigned long)qp; in bnxt_qplib_cq_process_res_rc()
2469 srq = qp->srq; in bnxt_qplib_cq_process_res_rc()
2486 rq = &qp->rq; in bnxt_qplib_cq_process_res_rc()
2504 qp->state = CMDQ_MODIFY_QP_NEW_STATE_ERR; in bnxt_qplib_cq_process_res_rc()
2506 bnxt_qplib_add_flush_qp(qp); in bnxt_qplib_cq_process_res_rc()
2521 struct bnxt_qplib_qp *qp; in bnxt_qplib_cq_process_res_ud() local
2526 qp = (struct bnxt_qplib_qp *)((unsigned long) in bnxt_qplib_cq_process_res_ud()
2528 if (!qp) { in bnxt_qplib_cq_process_res_ud()
2532 if (qp->rq.flushed) { in bnxt_qplib_cq_process_res_ud()
2534 "%s: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_res_ud()
2544 cqe->qp_handle = (u64)(unsigned long)qp; in bnxt_qplib_cq_process_res_ud()
2555 srq = qp->srq; in bnxt_qplib_cq_process_res_ud()
2573 rq = &qp->rq; in bnxt_qplib_cq_process_res_ud()
2592 qp->state = CMDQ_MODIFY_QP_NEW_STATE_ERR; in bnxt_qplib_cq_process_res_ud()
2594 bnxt_qplib_add_flush_qp(qp); in bnxt_qplib_cq_process_res_ud()
2620 struct bnxt_qplib_qp *qp; in bnxt_qplib_cq_process_res_raweth_qp1() local
2627 qp = (struct bnxt_qplib_qp *)((unsigned long) in bnxt_qplib_cq_process_res_raweth_qp1()
2629 if (!qp) { in bnxt_qplib_cq_process_res_raweth_qp1()
2633 if (qp->rq.flushed) { in bnxt_qplib_cq_process_res_raweth_qp1()
2635 "%s: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_res_raweth_qp1()
2641 cqe->qp_handle = (u64)(unsigned long)qp; in bnxt_qplib_cq_process_res_raweth_qp1()
2646 cqe->src_qp = qp->id; in bnxt_qplib_cq_process_res_raweth_qp1()
2647 if (qp->id == 1 && !cqe->length) { in bnxt_qplib_cq_process_res_raweth_qp1()
2653 cqe->pkey_index = qp->pkey_index; in bnxt_qplib_cq_process_res_raweth_qp1()
2654 memcpy(cqe->smac, qp->smac, 6); in bnxt_qplib_cq_process_res_raweth_qp1()
2661 srq = qp->srq; in bnxt_qplib_cq_process_res_raweth_qp1()
2681 rq = &qp->rq; in bnxt_qplib_cq_process_res_raweth_qp1()
2699 qp->state = CMDQ_MODIFY_QP_NEW_STATE_ERR; in bnxt_qplib_cq_process_res_raweth_qp1()
2701 bnxt_qplib_add_flush_qp(qp); in bnxt_qplib_cq_process_res_raweth_qp1()
2714 struct bnxt_qplib_qp *qp; in bnxt_qplib_cq_process_terminal() local
2726 qp = (struct bnxt_qplib_qp *)((unsigned long) in bnxt_qplib_cq_process_terminal()
2728 if (!qp) { in bnxt_qplib_cq_process_terminal()
2735 qp->state = CMDQ_MODIFY_QP_NEW_STATE_ERR; in bnxt_qplib_cq_process_terminal()
2737 sq = &qp->sq; in bnxt_qplib_cq_process_terminal()
2738 rq = &qp->rq; in bnxt_qplib_cq_process_terminal()
2745 if (qp->sq.flushed) { in bnxt_qplib_cq_process_terminal()
2747 "%s: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_terminal()
2764 cqe->qp_handle = (u64)(unsigned long)qp; in bnxt_qplib_cq_process_terminal()
2765 cqe->src_qp = qp->id; in bnxt_qplib_cq_process_terminal()
2795 if (qp->rq.flushed) { in bnxt_qplib_cq_process_terminal()
2797 "%s: QP in Flush QP = %p\n", __func__, qp); in bnxt_qplib_cq_process_terminal()
2808 bnxt_qplib_add_flush_qp(qp); in bnxt_qplib_cq_process_terminal()
2833 struct bnxt_qplib_qp *qp = NULL; in bnxt_qplib_process_flush_list() local
2838 list_for_each_entry(qp, &cq->sqf_head, sq_flush) { in bnxt_qplib_process_flush_list()
2839 dev_dbg(&cq->hwq.pdev->dev, "FP: Flushing SQ QP= %p\n", qp); in bnxt_qplib_process_flush_list()
2840 __flush_sq(&qp->sq, qp, &cqe, &budget); in bnxt_qplib_process_flush_list()
2843 list_for_each_entry(qp, &cq->rqf_head, rq_flush) { in bnxt_qplib_process_flush_list()
2844 dev_dbg(&cq->hwq.pdev->dev, "FP: Flushing RQ QP= %p\n", qp); in bnxt_qplib_process_flush_list()
2845 __flush_rq(&qp->rq, qp, &cqe, &budget); in bnxt_qplib_process_flush_list()
2947 void bnxt_qplib_flush_cqn_wq(struct bnxt_qplib_qp *qp) in bnxt_qplib_flush_cqn_wq() argument
2949 flush_workqueue(qp->scq->nq->cqn_wq); in bnxt_qplib_flush_cqn_wq()
2950 if (qp->scq != qp->rcq) in bnxt_qplib_flush_cqn_wq()
2951 flush_workqueue(qp->rcq->nq->cqn_wq); in bnxt_qplib_flush_cqn_wq()