]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
RDMA/bnxt_re: Fix access flags for MR and QP modify
authorHongguang Gao <hongguang.gao@broadcom.com>
Wed, 16 Oct 2024 07:55:46 +0000 (00:55 -0700)
committerLeon Romanovsky <leon@kernel.org>
Mon, 28 Oct 2024 18:59:32 +0000 (20:59 +0200)
Access flag definition in MR and QP is different
in FW. Currently both reg/bind MR and modify/query QP uses
the same flags. Add a different function to map
the QP access flags for newer adapters.

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Hongguang Gao <hongguang.gao@broadcom.com>
Reviewed-by: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com>
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Link: https://patch.msgid.link/1729065346-1364-6-git-send-email-selvin.xavier@broadcom.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/hw/bnxt_re/ib_verbs.c

index 2a21a908aa51116d6cfb9a555d372c4cdfac829b..e6108079dad5faed14d072599047956294386339 100644 (file)
@@ -94,9 +94,9 @@ static int __from_ib_access_flags(int iflags)
        return qflags;
 };
 
-static enum ib_access_flags __to_ib_access_flags(int qflags)
+static int __to_ib_access_flags(int qflags)
 {
-       enum ib_access_flags iflags = 0;
+       int iflags = 0;
 
        if (qflags & BNXT_QPLIB_ACCESS_LOCAL_WRITE)
                iflags |= IB_ACCESS_LOCAL_WRITE;
@@ -113,7 +113,49 @@ static enum ib_access_flags __to_ib_access_flags(int qflags)
        if (qflags & BNXT_QPLIB_ACCESS_ON_DEMAND)
                iflags |= IB_ACCESS_ON_DEMAND;
        return iflags;
-};
+}
+
+static u8 __qp_access_flags_from_ib(struct bnxt_qplib_chip_ctx *cctx, int iflags)
+{
+       u8 qflags = 0;
+
+       if (!bnxt_qplib_is_chip_gen_p5_p7(cctx))
+               /* For Wh+ */
+               return (u8)__from_ib_access_flags(iflags);
+
+       /* For P5, P7 and later chips */
+       if (iflags & IB_ACCESS_LOCAL_WRITE)
+               qflags |= CMDQ_MODIFY_QP_ACCESS_LOCAL_WRITE;
+       if (iflags & IB_ACCESS_REMOTE_WRITE)
+               qflags |= CMDQ_MODIFY_QP_ACCESS_REMOTE_WRITE;
+       if (iflags & IB_ACCESS_REMOTE_READ)
+               qflags |= CMDQ_MODIFY_QP_ACCESS_REMOTE_READ;
+       if (iflags & IB_ACCESS_REMOTE_ATOMIC)
+               qflags |= CMDQ_MODIFY_QP_ACCESS_REMOTE_ATOMIC;
+
+       return qflags;
+}
+
+static int __qp_access_flags_to_ib(struct bnxt_qplib_chip_ctx *cctx, u8 qflags)
+{
+       int iflags = 0;
+
+       if (!bnxt_qplib_is_chip_gen_p5_p7(cctx))
+               /* For Wh+ */
+               return __to_ib_access_flags(qflags);
+
+       /* For P5, P7 and later chips */
+       if (qflags & CMDQ_MODIFY_QP_ACCESS_LOCAL_WRITE)
+               iflags |= IB_ACCESS_LOCAL_WRITE;
+       if (qflags & CMDQ_MODIFY_QP_ACCESS_REMOTE_WRITE)
+               iflags |= IB_ACCESS_REMOTE_WRITE;
+       if (qflags & CMDQ_MODIFY_QP_ACCESS_REMOTE_READ)
+               iflags |= IB_ACCESS_REMOTE_READ;
+       if (qflags & CMDQ_MODIFY_QP_ACCESS_REMOTE_ATOMIC)
+               iflags |= IB_ACCESS_REMOTE_ATOMIC;
+
+       return iflags;
+}
 
 static void bnxt_re_check_and_set_relaxed_ordering(struct bnxt_re_dev *rdev,
                                                   struct bnxt_qplib_mrw *qplib_mr)
@@ -2053,12 +2095,10 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
        if (qp_attr_mask & IB_QP_ACCESS_FLAGS) {
                qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_ACCESS;
                qp->qplib_qp.access =
-                       __from_ib_access_flags(qp_attr->qp_access_flags);
+                       __qp_access_flags_from_ib(qp->qplib_qp.cctx,
+                                                 qp_attr->qp_access_flags);
                /* LOCAL_WRITE access must be set to allow RC receive */
-               qp->qplib_qp.access |= BNXT_QPLIB_ACCESS_LOCAL_WRITE;
-               /* Temp: Set all params on QP as of now */
-               qp->qplib_qp.access |= CMDQ_MODIFY_QP_ACCESS_REMOTE_WRITE;
-               qp->qplib_qp.access |= CMDQ_MODIFY_QP_ACCESS_REMOTE_READ;
+               qp->qplib_qp.access |= CMDQ_MODIFY_QP_ACCESS_LOCAL_WRITE;
        }
        if (qp_attr_mask & IB_QP_PKEY_INDEX) {
                qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_PKEY;
@@ -2263,7 +2303,8 @@ int bnxt_re_query_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
        qp_attr->qp_state = __to_ib_qp_state(qplib_qp->state);
        qp_attr->cur_qp_state = __to_ib_qp_state(qplib_qp->cur_qp_state);
        qp_attr->en_sqd_async_notify = qplib_qp->en_sqd_async_notify ? 1 : 0;
-       qp_attr->qp_access_flags = __to_ib_access_flags(qplib_qp->access);
+       qp_attr->qp_access_flags = __qp_access_flags_to_ib(qp->qplib_qp.cctx,
+                                                          qplib_qp->access);
        qp_attr->pkey_index = qplib_qp->pkey_index;
        qp_attr->qkey = qplib_qp->qkey;
        qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;