On 2019/8/30 16:50, Weihang Li wrote: > From: Lijun Ou <oulijun@xxxxxxxxxx> > > This patch aims to let hip08 support communication of Unreliable > Datagram. > > Signed-off-by: Lijun Ou <oulijun@xxxxxxxxxx> > Signed-off-by: Weihang Li <liweihang@xxxxxxxxxxxxx> > --- > drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 17 ++++++++++------- > drivers/infiniband/hw/hns/hns_roce_qp.c | 5 +++++ > 2 files changed, 15 insertions(+), 7 deletions(-) > > diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c > index 206dfdb..e27d864a 100644 > --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c > +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c > @@ -296,7 +296,7 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, > tmp_len = 0; > > /* Corresponding to the QP type, wqe process separately */ > - if (ibqp->qp_type == IB_QPT_GSI) { > + if (ibqp->qp_type == IB_QPT_GSI || ibqp->qp_type == IB_QPT_UD) { > ud_sq_wqe = wqe; > memset(ud_sq_wqe, 0, sizeof(*ud_sq_wqe)); > > @@ -420,8 +420,7 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, > roce_set_field(ud_sq_wqe->byte_48, > V2_UD_SEND_WQE_BYTE_48_SGID_INDX_M, > V2_UD_SEND_WQE_BYTE_48_SGID_INDX_S, > - hns_get_gid_index(hr_dev, qp->phy_port, > - ah->av.gid_index)); > + ah->av.gid_index); > > memcpy(&ud_sq_wqe->dgid[0], &ah->av.dgid[0], > GID_LEN_V2); > @@ -3130,7 +3129,8 @@ static void set_qpc_wqe_cnt(struct hns_roce_qp *hr_qp, > struct hns_roce_v2_qp_context *context, > struct hns_roce_v2_qp_context *qpc_mask) > { > - if (hr_qp->ibqp.qp_type == IB_QPT_GSI) > + if (hr_qp->ibqp.qp_type == IB_QPT_GSI || > + hr_qp->ibqp.qp_type == IB_QPT_UD) > roce_set_field(context->byte_4_sqpn_tst, > V2_QPC_BYTE_4_SGE_SHIFT_M, > V2_QPC_BYTE_4_SGE_SHIFT_S, > @@ -3650,8 +3650,9 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp, > roce_set_field(context->byte_20_smac_sgid_idx, > V2_QPC_BYTE_20_SGE_HOP_NUM_M, > V2_QPC_BYTE_20_SGE_HOP_NUM_S, > - ((ibqp->qp_type == IB_QPT_GSI) || > - hr_qp->sq.max_gs > HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE) ? > + ((ibqp->qp_type == IB_QPT_GSI || > + ibqp->qp_type == IB_QPT_UD) || > + hr_qp->sq.max_gs > HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE) ? > hr_dev->caps.wqe_sge_hop_num : 0); > roce_set_field(qpc_mask->byte_20_smac_sgid_idx, > V2_QPC_BYTE_20_SGE_HOP_NUM_M, > @@ -4564,7 +4565,9 @@ static int hns_roce_v2_destroy_qp_common(struct hns_roce_dev *hr_dev, > struct ib_device *ibdev = &hr_dev->ib_dev; > int ret; > > - if (hr_qp->ibqp.qp_type == IB_QPT_RC && hr_qp->state != IB_QPS_RESET) { > + if ((hr_qp->ibqp.qp_type == IB_QPT_RC || > + hr_qp->ibqp.qp_type == IB_QPT_UD) && > + hr_qp->state != IB_QPS_RESET) { > /* Modify qp to reset before destroying qp */ > ret = hns_roce_v2_modify_qp(&hr_qp->ibqp, NULL, 0, > hr_qp->state, IB_QPS_RESET); > diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c > index ba81768..5374cd0 100644 > --- a/drivers/infiniband/hw/hns/hns_roce_qp.c > +++ b/drivers/infiniband/hw/hns/hns_roce_qp.c > @@ -377,6 +377,10 @@ static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev, > hr_qp->sge.sge_cnt = roundup_pow_of_two(hr_qp->sq.wqe_cnt * > (hr_qp->sq.max_gs - 2)); > > + if (hr_qp->ibqp.qp_type == IB_QPT_UD) > + hr_qp->sge.sge_cnt = roundup_pow_of_two(hr_qp->sq.wqe_cnt * > + hr_qp->sq.max_gs); > + > if ((hr_qp->sq.max_gs > 2) && (hr_dev->pci_dev->revision == 0x20)) { > if (hr_qp->sge.sge_cnt > hr_dev->caps.max_extend_sg) { > dev_err(hr_dev->dev, > @@ -1005,6 +1009,7 @@ struct ib_qp *hns_roce_create_qp(struct ib_pd *pd, > int ret; > > switch (init_attr->qp_type) { > + case IB_QPT_UD: > case IB_QPT_RC: { > hr_qp = kzalloc(sizeof(*hr_qp), GFP_KERNEL); > if (!hr_qp) > Hi Jason & Leon, Do you have some suggestions on this patch? Could it be applied to for-next? Thanks, Weihang