]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/hns: Fix configuration of ack_req_freq in QPC
authorWeihang Li <liweihang@huawei.com>
Sat, 19 Sep 2020 10:03:21 +0000 (18:03 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 29 Oct 2020 09:07:59 +0000 (10:07 +0100)
[ Upstream commit fbed9d2be292504e04caa2057e3a9477a1e1d040 ]

The hardware will add AckReq flag in BTH header according to the value of
ack_req_freq to request ACK from responder for the packets with this flag.
It should be greater than or equal to lp_pktn_ini instead of using a fixed
value.

Fixes: 7b9bd73ed13d ("RDMA/hns: Fix wrong assignment of lp_pktn_ini in QPC")
Link: https://lore.kernel.org/r/1600509802-44382-8-git-send-email-liweihang@huawei.com
Signed-off-by: Weihang Li <liweihang@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/hns/hns_roce_hw_v2.c

index a55a850a8b997cd20bd0df3ebc98886185e50bc3..d3b983d9f757bdb59d18d761a76413ebcc9c280f 100644 (file)
@@ -3640,9 +3640,6 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
                             V2_QPC_BYTE_76_SRQ_EN_S, 1);
        }
 
-       roce_set_field(context->byte_172_sq_psn, V2_QPC_BYTE_172_ACK_REQ_FREQ_M,
-                      V2_QPC_BYTE_172_ACK_REQ_FREQ_S, 4);
-
        roce_set_bit(context->byte_172_sq_psn, V2_QPC_BYTE_172_FRE_S, 1);
 
        hr_qp->access_flags = attr->qp_access_flags;
@@ -3983,6 +3980,7 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
        dma_addr_t trrl_ba;
        dma_addr_t irrl_ba;
        enum ib_mtu mtu;
+       u8 lp_pktn_ini;
        u8 port_num;
        u64 *mtts;
        u8 *dmac;
@@ -4090,13 +4088,21 @@ static int modify_qp_init_to_rtr(struct ib_qp *ibqp,
        }
 
 #define MAX_LP_MSG_LEN 65536
-       /* MTU*(2^LP_PKTN_INI) shouldn't be bigger than 64kb */
+       /* MTU * (2 ^ LP_PKTN_INI) shouldn't be bigger than 64KB */
+       lp_pktn_ini = ilog2(MAX_LP_MSG_LEN / ib_mtu_enum_to_int(mtu));
+
        roce_set_field(context->byte_56_dqpn_err, V2_QPC_BYTE_56_LP_PKTN_INI_M,
-                      V2_QPC_BYTE_56_LP_PKTN_INI_S,
-                      ilog2(MAX_LP_MSG_LEN / ib_mtu_enum_to_int(mtu)));
+                      V2_QPC_BYTE_56_LP_PKTN_INI_S, lp_pktn_ini);
        roce_set_field(qpc_mask->byte_56_dqpn_err, V2_QPC_BYTE_56_LP_PKTN_INI_M,
                       V2_QPC_BYTE_56_LP_PKTN_INI_S, 0);
 
+       /* ACK_REQ_FREQ should be larger than or equal to LP_PKTN_INI */
+       roce_set_field(context->byte_172_sq_psn, V2_QPC_BYTE_172_ACK_REQ_FREQ_M,
+                      V2_QPC_BYTE_172_ACK_REQ_FREQ_S, lp_pktn_ini);
+       roce_set_field(qpc_mask->byte_172_sq_psn,
+                      V2_QPC_BYTE_172_ACK_REQ_FREQ_M,
+                      V2_QPC_BYTE_172_ACK_REQ_FREQ_S, 0);
+
        roce_set_bit(qpc_mask->byte_108_rx_reqepsn,
                     V2_QPC_BYTE_108_RX_REQ_PSN_ERR_S, 0);
        roce_set_field(qpc_mask->byte_96_rx_reqmsn, V2_QPC_BYTE_96_RX_REQ_MSN_M,