Commit a81d4cbe authored by Selvin Xavier's avatar Selvin Xavier Committed by Wen Zhiwei
Browse files

RDMA/bnxt_re: Fix the max WQE size for static WQE support

stable inclusion
from stable-v6.6.70
commit 36e1b6890f228ccfc867031ecedffe50958b25e4
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IBOHV1

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=36e1b6890f228ccfc867031ecedffe50958b25e4



--------------------------------

[ Upstream commit 227f51743b61fe3f6fc481f0fb8086bf8c49b8c9 ]

When variable size WQE is supported, max_qp_sges reported
is more than 6. For devices that supports variable size WQE,
the Send WQE size calculation is wrong when an an older library
that doesn't support variable size WQE is used.

Set the WQE size to 128 when static WQE is supported.

Fixes: de1d364c3815 ("RDMA/bnxt_re: Add support for Variable WQE in Genp7 adapters")
Signed-off-by: default avatarSelvin Xavier <selvin.xavier@broadcom.com>
Link: https://patch.msgid.link/1725444253-13221-3-git-send-email-selvin.xavier@broadcom.com


Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarWen Zhiwei <wenzhiwei@kylinos.cn>
parent 992eb4e3
Loading
Loading
Loading
Loading
+10 −11
Original line number Diff line number Diff line
@@ -992,23 +992,22 @@ static int bnxt_re_setup_swqe_size(struct bnxt_re_qp *qp,
	align = sizeof(struct sq_send_hdr);
	ilsize = ALIGN(init_attr->cap.max_inline_data, align);

	/* For gen p4 and gen p5 fixed wqe compatibility mode
	 * wqe size is fixed to 128 bytes - ie 6 SGEs
	 */
	if (qplqp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC) {
		sq->wqe_size = bnxt_re_get_swqe_size(BNXT_STATIC_MAX_SGE);
		sq->max_sge = BNXT_STATIC_MAX_SGE;
	} else {
		sq->wqe_size = bnxt_re_get_wqe_size(ilsize, sq->max_sge);
		if (sq->wqe_size > bnxt_re_get_swqe_size(dev_attr->max_qp_sges))
			return -EINVAL;
	/* For gen p4 and gen p5 backward compatibility mode
	 * wqe size is fixed to 128 bytes
	 */
	if (sq->wqe_size < bnxt_re_get_swqe_size(dev_attr->max_qp_sges) &&
			qplqp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC)
		sq->wqe_size = bnxt_re_get_swqe_size(dev_attr->max_qp_sges);
	}

	if (init_attr->cap.max_inline_data) {
		qplqp->max_inline_data = sq->wqe_size -
			sizeof(struct sq_send_hdr);
		init_attr->cap.max_inline_data = qplqp->max_inline_data;
		if (qplqp->wqe_mode == BNXT_QPLIB_WQE_MODE_STATIC)
			sq->max_sge = qplqp->max_inline_data /
				sizeof(struct sq_sge);
	}

	return 0;
+2 −0
Original line number Diff line number Diff line
@@ -358,4 +358,6 @@ int bnxt_qplib_modify_cc(struct bnxt_qplib_res *res,
#define BNXT_VAR_MAX_SGE        13
#define BNXT_RE_MAX_RQ_WQES     65536

#define BNXT_STATIC_MAX_SGE	6

#endif /* __BNXT_QPLIB_SP_H__*/