MLX5_QP_FLAG_BFREG_INDEX |
                                              MLX5_QP_FLAG_TYPE_DCT |
                                              MLX5_QP_FLAG_TYPE_DCI |
-                                             MLX5_QP_FLAG_ALLOW_SCATTER_CQE))
+                                             MLX5_QP_FLAG_ALLOW_SCATTER_CQE |
+                                             MLX5_QP_FLAG_PACKET_BASED_CREDIT_MODE))
                        return -EINVAL;
 
                err = get_qp_user_index(to_mucontext(pd->uobject->context),
                        qp->flags_en |= MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC;
                }
 
+               if (ucmd.flags & MLX5_QP_FLAG_PACKET_BASED_CREDIT_MODE) {
+                       if (init_attr->qp_type != IB_QPT_RC ||
+                               !MLX5_CAP_GEN(dev->mdev, qp_packet_based)) {
+                               mlx5_ib_dbg(dev, "packet based credit mode isn't supported\n");
+                               return -EOPNOTSUPP;
+                       }
+                       qp->flags |= MLX5_IB_QP_PACKET_BASED_CREDIT;
+               }
+
                if (init_attr->create_flags & IB_QP_CREATE_SOURCE_QPN) {
                        if (init_attr->qp_type != IB_QPT_UD ||
                            (MLX5_CAP_GEN(dev->mdev, port_type) !=
                MLX5_SET(qpc, qpc, cd_slave_send, 1);
        if (qp->flags & MLX5_IB_QP_MANAGED_RECV)
                MLX5_SET(qpc, qpc, cd_slave_receive, 1);
-
+       if (qp->flags & MLX5_IB_QP_PACKET_BASED_CREDIT)
+               MLX5_SET(qpc, qpc, req_e2e_credit_mode, 1);
        if (qp->scat_cqe && is_connected(init_attr->qp_type)) {
                configure_responder_scat_cqe(init_attr, qpc);
                configure_requester_scat_cqe(dev, init_attr,
 
        MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_UC = 1 << 6,
        MLX5_QP_FLAG_TIR_ALLOW_SELF_LB_MC = 1 << 7,
        MLX5_QP_FLAG_ALLOW_SCATTER_CQE  = 1 << 8,
+       MLX5_QP_FLAG_PACKET_BASED_CREDIT_MODE   = 1 << 9,
 };
 
 enum {