On Wed, Jul 10, 2024 at 5:51 PM Jack Wang <jinpu.wang@xxxxxxxxx> wrote: > > When map a device between servers with MLX and BCM RoCE nics, RTRS > server complain about unknown imm type, and can't map the device, > > After more debug, it seems bnxt_re wrongly handle the > imm_data, this patch fixed the compat issue with MLX for us. > > In off list discussion, Selvin confirm HW is working in little endian format > and all data needs to be converted to LE while providing. > > This patch fix the endianness for imm_data > > Fixes: 1ac5a4047975 ("RDMA/bnxt_re: Add bnxt_re RoCE driver") > Signed-off-by: Jack Wang <jinpu.wang@xxxxxxxxx> Acked-by: Selvin Xavier <selvin.xavier@xxxxxxxxxxxx> Thanks, Selvin > --- > v2: address comment from Selvin, drop second patch. > drivers/infiniband/hw/bnxt_re/ib_verbs.c | 8 ++++---- > drivers/infiniband/hw/bnxt_re/qplib_fp.h | 6 +++--- > 2 files changed, 7 insertions(+), 7 deletions(-) > > diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c > index e453ca701e87..7c757351a016 100644 > --- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c > +++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c > @@ -2479,7 +2479,7 @@ static int bnxt_re_build_send_wqe(struct bnxt_re_qp *qp, > break; > case IB_WR_SEND_WITH_IMM: > wqe->type = BNXT_QPLIB_SWQE_TYPE_SEND_WITH_IMM; > - wqe->send.imm_data = wr->ex.imm_data; > + wqe->send.imm_data = be32_to_cpu(wr->ex.imm_data); > break; > case IB_WR_SEND_WITH_INV: > wqe->type = BNXT_QPLIB_SWQE_TYPE_SEND_WITH_INV; > @@ -2509,7 +2509,7 @@ static int bnxt_re_build_rdma_wqe(const struct ib_send_wr *wr, > break; > case IB_WR_RDMA_WRITE_WITH_IMM: > wqe->type = BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE_WITH_IMM; > - wqe->rdma.imm_data = wr->ex.imm_data; > + wqe->rdma.imm_data = be32_to_cpu(wr->ex.imm_data); > break; > case IB_WR_RDMA_READ: > wqe->type = BNXT_QPLIB_SWQE_TYPE_RDMA_READ; > @@ -3582,7 +3582,7 @@ static void bnxt_re_process_res_shadow_qp_wc(struct bnxt_re_qp *gsi_sqp, > wc->byte_len = orig_cqe->length; > wc->qp = &gsi_qp->ib_qp; > > - wc->ex.imm_data = orig_cqe->immdata; > + wc->ex.imm_data = cpu_to_be32(le32_to_cpu(orig_cqe->immdata)); > wc->src_qp = orig_cqe->src_qp; > memcpy(wc->smac, orig_cqe->smac, ETH_ALEN); > if (bnxt_re_is_vlan_pkt(orig_cqe, &vlan_id, &sl)) { > @@ -3727,7 +3727,7 @@ int bnxt_re_poll_cq(struct ib_cq *ib_cq, int num_entries, struct ib_wc *wc) > (unsigned long)(cqe->qp_handle), > struct bnxt_re_qp, qplib_qp); > wc->qp = &qp->ib_qp; > - wc->ex.imm_data = cqe->immdata; > + wc->ex.imm_data = cpu_to_be32(le32_to_cpu(cqe->immdata)); > wc->src_qp = cqe->src_qp; > memcpy(wc->smac, cqe->smac, ETH_ALEN); > wc->port_num = 1; > diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.h b/drivers/infiniband/hw/bnxt_re/qplib_fp.h > index 4aaac84c1b1b..56538b90d6c5 100644 > --- a/drivers/infiniband/hw/bnxt_re/qplib_fp.h > +++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.h > @@ -164,7 +164,7 @@ struct bnxt_qplib_swqe { > /* Send, with imm, inval key */ > struct { > union { > - __be32 imm_data; > + u32 imm_data; > u32 inv_key; > }; > u32 q_key; > @@ -182,7 +182,7 @@ struct bnxt_qplib_swqe { > /* RDMA write, with imm, read */ > struct { > union { > - __be32 imm_data; > + u32 imm_data; > u32 inv_key; > }; > u64 remote_va; > @@ -389,7 +389,7 @@ struct bnxt_qplib_cqe { > u16 cfa_meta; > u64 wr_id; > union { > - __be32 immdata; > + __le32 immdata; > u32 invrkey; > }; > u64 qp_handle; > -- > 2.34.1 >
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature