RDMA/ocrdma: Support RoCE-v2 in the UD path
This patch adds following changes to support RoCE-v2 in the UD path. * During AH creation GID-type is resolved for a given gid-index. * Based on GID-type protocol header is built. * Work completion reports network header type and set IB_WC_WITH_NETWORK_HDR_TYPE flag in wc->wc_flags to indicate that the network header type is valid. Signed-off-by: Somnath Kotur <somnath.kotur@avagotech.com> Signed-off-by: Devesh Sharma <devesh.sharma@avagotech.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
此提交包含在:
@@ -2005,6 +2005,7 @@ static void ocrdma_build_ud_hdr(struct ocrdma_qp *qp,
|
||||
else
|
||||
ud_hdr->qkey = ud_wr(wr)->remote_qkey;
|
||||
ud_hdr->rsvd_ahid = ah->id;
|
||||
ud_hdr->hdr_type = ah->hdr_type;
|
||||
if (ah->av->valid & OCRDMA_AV_VLAN_VALID)
|
||||
hdr->cw |= (OCRDMA_FLAG_AH_VLAN_PR << OCRDMA_WQE_FLAGS_SHIFT);
|
||||
}
|
||||
@@ -2717,9 +2718,11 @@ static bool ocrdma_poll_scqe(struct ocrdma_qp *qp, struct ocrdma_cqe *cqe,
|
||||
return expand;
|
||||
}
|
||||
|
||||
static int ocrdma_update_ud_rcqe(struct ib_wc *ibwc, struct ocrdma_cqe *cqe)
|
||||
static int ocrdma_update_ud_rcqe(struct ocrdma_dev *dev, struct ib_wc *ibwc,
|
||||
struct ocrdma_cqe *cqe)
|
||||
{
|
||||
int status;
|
||||
u16 hdr_type = 0;
|
||||
|
||||
status = (le32_to_cpu(cqe->flags_status_srcqpn) &
|
||||
OCRDMA_CQE_UD_STATUS_MASK) >> OCRDMA_CQE_UD_STATUS_SHIFT;
|
||||
@@ -2728,7 +2731,17 @@ static int ocrdma_update_ud_rcqe(struct ib_wc *ibwc, struct ocrdma_cqe *cqe)
|
||||
ibwc->pkey_index = 0;
|
||||
ibwc->wc_flags = IB_WC_GRH;
|
||||
ibwc->byte_len = (le32_to_cpu(cqe->ud.rxlen_pkey) >>
|
||||
OCRDMA_CQE_UD_XFER_LEN_SHIFT);
|
||||
OCRDMA_CQE_UD_XFER_LEN_SHIFT) &
|
||||
OCRDMA_CQE_UD_XFER_LEN_MASK;
|
||||
|
||||
if (ocrdma_is_udp_encap_supported(dev)) {
|
||||
hdr_type = (le32_to_cpu(cqe->ud.rxlen_pkey) >>
|
||||
OCRDMA_CQE_UD_L3TYPE_SHIFT) &
|
||||
OCRDMA_CQE_UD_L3TYPE_MASK;
|
||||
ibwc->wc_flags |= IB_WC_WITH_NETWORK_HDR_TYPE;
|
||||
ibwc->network_hdr_type = hdr_type;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
@@ -2791,12 +2804,15 @@ static bool ocrdma_poll_err_rcqe(struct ocrdma_qp *qp, struct ocrdma_cqe *cqe,
|
||||
static void ocrdma_poll_success_rcqe(struct ocrdma_qp *qp,
|
||||
struct ocrdma_cqe *cqe, struct ib_wc *ibwc)
|
||||
{
|
||||
struct ocrdma_dev *dev;
|
||||
|
||||
dev = get_ocrdma_dev(qp->ibqp.device);
|
||||
ibwc->opcode = IB_WC_RECV;
|
||||
ibwc->qp = &qp->ibqp;
|
||||
ibwc->status = IB_WC_SUCCESS;
|
||||
|
||||
if (qp->qp_type == IB_QPT_UD || qp->qp_type == IB_QPT_GSI)
|
||||
ocrdma_update_ud_rcqe(ibwc, cqe);
|
||||
ocrdma_update_ud_rcqe(dev, ibwc, cqe);
|
||||
else
|
||||
ibwc->byte_len = le32_to_cpu(cqe->rq.rxlen);
|
||||
|
||||
|
新增問題並參考
封鎖使用者