|
@@ -890,6 +890,8 @@ struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
|
|
|
|
|
|
pbl_ptr = cq->q.pbl_tbl->pa;
|
|
|
page_cnt = cq->q.pbl_info.num_pbes;
|
|
|
+
|
|
|
+ cq->ibcq.cqe = chain_entries;
|
|
|
} else {
|
|
|
cq->cq_type = QEDR_CQ_TYPE_KERNEL;
|
|
|
|
|
@@ -905,6 +907,7 @@ struct ib_cq *qedr_create_cq(struct ib_device *ibdev,
|
|
|
|
|
|
page_cnt = qed_chain_get_page_cnt(&cq->pbl);
|
|
|
pbl_ptr = qed_chain_get_pbl_phys(&cq->pbl);
|
|
|
+ cq->ibcq.cqe = cq->pbl.capacity;
|
|
|
}
|
|
|
|
|
|
qedr_init_cq_params(cq, ctx, dev, vector, chain_entries, page_cnt,
|
|
@@ -982,8 +985,13 @@ int qedr_destroy_cq(struct ib_cq *ibcq)
|
|
|
|
|
|
/* GSIs CQs are handled by driver, so they don't exist in the FW */
|
|
|
if (cq->cq_type != QEDR_CQ_TYPE_GSI) {
|
|
|
+ int rc;
|
|
|
+
|
|
|
iparams.icid = cq->icid;
|
|
|
- dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
|
|
|
+ rc = dev->ops->rdma_destroy_cq(dev->rdma_ctx, &iparams,
|
|
|
+ &oparams);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
dev->ops->common->chain_free(dev->cdev, &cq->pbl);
|
|
|
}
|
|
|
|
|
@@ -1966,7 +1974,7 @@ int qedr_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
|
|
|
|
|
|
if (attr_mask & IB_QP_STATE) {
|
|
|
if ((qp->qp_type != IB_QPT_GSI) && (!udata))
|
|
|
- qedr_update_qp_state(dev, qp, qp_params.new_state);
|
|
|
+ rc = qedr_update_qp_state(dev, qp, qp_params.new_state);
|
|
|
qp->state = qp_params.new_state;
|
|
|
}
|
|
|
|
|
@@ -2070,8 +2078,10 @@ int qedr_destroy_qp(struct ib_qp *ibqp)
|
|
|
DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n",
|
|
|
qp, qp->qp_type);
|
|
|
|
|
|
- if (qp->state != (QED_ROCE_QP_STATE_RESET | QED_ROCE_QP_STATE_ERR |
|
|
|
- QED_ROCE_QP_STATE_INIT)) {
|
|
|
+ if ((qp->state != QED_ROCE_QP_STATE_RESET) &&
|
|
|
+ (qp->state != QED_ROCE_QP_STATE_ERR) &&
|
|
|
+ (qp->state != QED_ROCE_QP_STATE_INIT)) {
|
|
|
+
|
|
|
attr.qp_state = IB_QPS_ERR;
|
|
|
attr_mask |= IB_QP_STATE;
|
|
|
|
|
@@ -2626,7 +2636,9 @@ static u32 qedr_prepare_sq_rdma_data(struct qedr_dev *dev,
|
|
|
rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey);
|
|
|
DMA_REGPAIR_LE(rwqe2->remote_va, rdma_wr(wr)->remote_addr);
|
|
|
|
|
|
- if (wr->send_flags & IB_SEND_INLINE) {
|
|
|
+ if (wr->send_flags & IB_SEND_INLINE &&
|
|
|
+ (wr->opcode == IB_WR_RDMA_WRITE_WITH_IMM ||
|
|
|
+ wr->opcode == IB_WR_RDMA_WRITE)) {
|
|
|
u8 flags = 0;
|
|
|
|
|
|
SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1);
|
|
@@ -2977,8 +2989,9 @@ int qedr_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
|
|
|
|
|
spin_lock_irqsave(&qp->q_lock, flags);
|
|
|
|
|
|
- if ((qp->state == QED_ROCE_QP_STATE_RESET) ||
|
|
|
- (qp->state == QED_ROCE_QP_STATE_ERR)) {
|
|
|
+ if ((qp->state != QED_ROCE_QP_STATE_RTS) &&
|
|
|
+ (qp->state != QED_ROCE_QP_STATE_ERR) &&
|
|
|
+ (qp->state != QED_ROCE_QP_STATE_SQD)) {
|
|
|
spin_unlock_irqrestore(&qp->q_lock, flags);
|
|
|
*bad_wr = wr;
|
|
|
DP_DEBUG(dev, QEDR_MSG_CQ,
|
|
@@ -3031,8 +3044,7 @@ int qedr_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *wr,
|
|
|
|
|
|
spin_lock_irqsave(&qp->q_lock, flags);
|
|
|
|
|
|
- if ((qp->state == QED_ROCE_QP_STATE_RESET) ||
|
|
|
- (qp->state == QED_ROCE_QP_STATE_ERR)) {
|
|
|
+ if (qp->state == QED_ROCE_QP_STATE_RESET) {
|
|
|
spin_unlock_irqrestore(&qp->q_lock, flags);
|
|
|
*bad_wr = wr;
|
|
|
return -EINVAL;
|
|
@@ -3174,6 +3186,7 @@ static int process_req(struct qedr_dev *dev, struct qedr_qp *qp,
|
|
|
|
|
|
/* fill WC */
|
|
|
wc->status = status;
|
|
|
+ wc->vendor_err = 0;
|
|
|
wc->wc_flags = 0;
|
|
|
wc->src_qp = qp->id;
|
|
|
wc->qp = &qp->ibqp;
|
|
@@ -3225,7 +3238,7 @@ static int qedr_poll_cq_req(struct qedr_dev *dev,
|
|
|
"Error: POLL CQ with RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR. CQ icid=0x%x, QP icid=0x%x\n",
|
|
|
cq->icid, qp->icid);
|
|
|
cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
|
|
|
- IB_WC_WR_FLUSH_ERR, 0);
|
|
|
+ IB_WC_WR_FLUSH_ERR, 1);
|
|
|
break;
|
|
|
default:
|
|
|
/* process all WQE before the cosumer */
|
|
@@ -3363,6 +3376,7 @@ static void __process_resp_one(struct qedr_dev *dev, struct qedr_qp *qp,
|
|
|
|
|
|
/* fill WC */
|
|
|
wc->status = wc_status;
|
|
|
+ wc->vendor_err = 0;
|
|
|
wc->src_qp = qp->id;
|
|
|
wc->qp = &qp->ibqp;
|
|
|
wc->wr_id = wr_id;
|
|
@@ -3391,6 +3405,7 @@ static int process_resp_flush(struct qedr_qp *qp, struct qedr_cq *cq,
|
|
|
while (num_entries && qp->rq.wqe_cons != hw_cons) {
|
|
|
/* fill WC */
|
|
|
wc->status = IB_WC_WR_FLUSH_ERR;
|
|
|
+ wc->vendor_err = 0;
|
|
|
wc->wc_flags = 0;
|
|
|
wc->src_qp = qp->id;
|
|
|
wc->byte_len = 0;
|