|
@@ -71,6 +71,11 @@ static int set_rwqe_data_seg(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+ if (wr->opcode == IB_WR_RDMA_READ) {
|
|
|
+ dev_err(hr_dev->dev, "Not support inline data!\n");
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
for (i = 0; i < wr->num_sge; i++) {
|
|
|
memcpy(wqe, ((void *)wr->sg_list[i].addr),
|
|
|
wr->sg_list[i].length);
|
|
@@ -148,7 +153,7 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
|
|
ibqp->qp_type != IB_QPT_GSI &&
|
|
|
ibqp->qp_type != IB_QPT_UD)) {
|
|
|
dev_err(dev, "Not supported QP(0x%x)type!\n", ibqp->qp_type);
|
|
|
- *bad_wr = NULL;
|
|
|
+ *bad_wr = wr;
|
|
|
return -EOPNOTSUPP;
|
|
|
}
|
|
|
|
|
@@ -182,7 +187,8 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
|
|
qp->sq.wrid[(qp->sq.head + nreq) & (qp->sq.wqe_cnt - 1)] =
|
|
|
wr->wr_id;
|
|
|
|
|
|
- owner_bit = ~(qp->sq.head >> ilog2(qp->sq.wqe_cnt)) & 0x1;
|
|
|
+ owner_bit =
|
|
|
+ ~(((qp->sq.head + nreq) >> ilog2(qp->sq.wqe_cnt)) & 0x1);
|
|
|
|
|
|
/* Corresponding to the QP type, wqe process separately */
|
|
|
if (ibqp->qp_type == IB_QPT_GSI) {
|
|
@@ -456,6 +462,7 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
|
|
|
} else {
|
|
|
dev_err(dev, "Illegal qp_type(0x%x)\n", ibqp->qp_type);
|
|
|
spin_unlock_irqrestore(&qp->sq.lock, flags);
|
|
|
+ *bad_wr = wr;
|
|
|
return -EOPNOTSUPP;
|
|
|
}
|
|
|
}
|
|
@@ -2592,10 +2599,12 @@ static void modify_qp_init_to_init(struct ib_qp *ibqp,
|
|
|
roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_SQPN_M,
|
|
|
V2_QPC_BYTE_4_SQPN_S, 0);
|
|
|
|
|
|
- roce_set_field(context->byte_56_dqpn_err, V2_QPC_BYTE_56_DQPN_M,
|
|
|
- V2_QPC_BYTE_56_DQPN_S, hr_qp->qpn);
|
|
|
- roce_set_field(qpc_mask->byte_56_dqpn_err, V2_QPC_BYTE_56_DQPN_M,
|
|
|
- V2_QPC_BYTE_56_DQPN_S, 0);
|
|
|
+ if (attr_mask & IB_QP_DEST_QPN) {
|
|
|
+ roce_set_field(context->byte_56_dqpn_err, V2_QPC_BYTE_56_DQPN_M,
|
|
|
+ V2_QPC_BYTE_56_DQPN_S, hr_qp->qpn);
|
|
|
+ roce_set_field(qpc_mask->byte_56_dqpn_err,
|
|
|
+ V2_QPC_BYTE_56_DQPN_M, V2_QPC_BYTE_56_DQPN_S, 0);
|
|
|
+ }
|
|
|
roce_set_field(context->byte_168_irrl_idx,
|
|
|
V2_QPC_BYTE_168_SQ_SHIFT_BAK_M,
|
|
|
V2_QPC_BYTE_168_SQ_SHIFT_BAK_S,
|
|
@@ -2650,8 +2659,7 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- if ((attr_mask & IB_QP_ALT_PATH) || (attr_mask & IB_QP_ACCESS_FLAGS) ||
|
|
|
- (attr_mask & IB_QP_PKEY_INDEX) || (attr_mask & IB_QP_QKEY)) {
|
|
|
+ if (attr_mask & IB_QP_ALT_PATH) {
|
|
|
dev_err(dev, "INIT2RTR attr_mask (0x%x) error\n", attr_mask);
|
|
|
return -EINVAL;
|
|
|
}
|
|
@@ -2800,10 +2808,12 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
|
|
|
V2_QPC_BYTE_140_RR_MAX_S, 0);
|
|
|
}
|
|
|
|
|
|
- roce_set_field(context->byte_56_dqpn_err, V2_QPC_BYTE_56_DQPN_M,
|
|
|
- V2_QPC_BYTE_56_DQPN_S, attr->dest_qp_num);
|
|
|
- roce_set_field(qpc_mask->byte_56_dqpn_err, V2_QPC_BYTE_56_DQPN_M,
|
|
|
- V2_QPC_BYTE_56_DQPN_S, 0);
|
|
|
+ if (attr_mask & IB_QP_DEST_QPN) {
|
|
|
+ roce_set_field(context->byte_56_dqpn_err, V2_QPC_BYTE_56_DQPN_M,
|
|
|
+ V2_QPC_BYTE_56_DQPN_S, attr->dest_qp_num);
|
|
|
+ roce_set_field(qpc_mask->byte_56_dqpn_err,
|
|
|
+ V2_QPC_BYTE_56_DQPN_M, V2_QPC_BYTE_56_DQPN_S, 0);
|
|
|
+ }
|
|
|
|
|
|
/* Configure GID index */
|
|
|
port_num = rdma_ah_get_port_num(&attr->ah_attr);
|
|
@@ -2845,7 +2855,7 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
|
|
|
if (ibqp->qp_type == IB_QPT_GSI || ibqp->qp_type == IB_QPT_UD)
|
|
|
roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_MTU_M,
|
|
|
V2_QPC_BYTE_24_MTU_S, IB_MTU_4096);
|
|
|
- else
|
|
|
+ else if (attr_mask & IB_QP_PATH_MTU)
|
|
|
roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_MTU_M,
|
|
|
V2_QPC_BYTE_24_MTU_S, attr->path_mtu);
|
|
|
|
|
@@ -2922,11 +2932,9 @@ static int modify_qp_rtr_to_rts(struct ib_qp *ibqp,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- /* If exist optional param, return error */
|
|
|
- if ((attr_mask & IB_QP_ALT_PATH) || (attr_mask & IB_QP_ACCESS_FLAGS) ||
|
|
|
- (attr_mask & IB_QP_QKEY) || (attr_mask & IB_QP_PATH_MIG_STATE) ||
|
|
|
- (attr_mask & IB_QP_CUR_STATE) ||
|
|
|
- (attr_mask & IB_QP_MIN_RNR_TIMER)) {
|
|
|
+ /* Not support alternate path and path migration */
|
|
|
+ if ((attr_mask & IB_QP_ALT_PATH) ||
|
|
|
+ (attr_mask & IB_QP_PATH_MIG_STATE)) {
|
|
|
dev_err(dev, "RTR2RTS attr_mask (0x%x)error\n", attr_mask);
|
|
|
return -EINVAL;
|
|
|
}
|
|
@@ -3161,7 +3169,8 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
|
|
|
(cur_state == IB_QPS_RTR && new_state == IB_QPS_ERR) ||
|
|
|
(cur_state == IB_QPS_RTS && new_state == IB_QPS_ERR) ||
|
|
|
(cur_state == IB_QPS_SQD && new_state == IB_QPS_ERR) ||
|
|
|
- (cur_state == IB_QPS_SQE && new_state == IB_QPS_ERR)) {
|
|
|
+ (cur_state == IB_QPS_SQE && new_state == IB_QPS_ERR) ||
|
|
|
+ (cur_state == IB_QPS_ERR && new_state == IB_QPS_ERR)) {
|
|
|
/* Nothing */
|
|
|
;
|
|
|
} else {
|
|
@@ -4478,7 +4487,7 @@ static int hns_roce_v2_create_eq(struct hns_roce_dev *hr_dev,
|
|
|
ret = hns_roce_cmd_mbox(hr_dev, mailbox->dma, 0, eq->eqn, 0,
|
|
|
eq_cmd, HNS_ROCE_CMD_TIMEOUT_MSECS);
|
|
|
if (ret) {
|
|
|
- dev_err(dev, "[mailbox cmd] creat eqc failed.\n");
|
|
|
+ dev_err(dev, "[mailbox cmd] create eqc failed.\n");
|
|
|
goto err_cmd_mbox;
|
|
|
}
|
|
|
|