RDMA/hns: Only assign the relatived fields of psn if IB_QP_SQ_PSN is set
authorLijun Ou <oulijun@huawei.com>
Sat, 23 Feb 2019 12:01:21 +0000 (20:01 +0800)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 25 Mar 2019 23:59:55 +0000 (20:59 -0300)
Only when the IB_QP_SQ_PSN flags of attr_mask is set is it valid to assign
the relatived fields of psn into the qp context when modified qp.

Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/hns/hns_roce_hw_v2.c

index 1c54390..4a9bc75 100644 (file)
@@ -3886,13 +3886,6 @@ static int modify_qp_rtr_to_rts(struct ib_qp *ibqp,
                       V2_QPC_BYTE_240_RX_ACK_MSN_M,
                       V2_QPC_BYTE_240_RX_ACK_MSN_S, 0);
 
-       roce_set_field(context->byte_244_rnr_rxack,
-                      V2_QPC_BYTE_244_RX_ACK_EPSN_M,
-                      V2_QPC_BYTE_244_RX_ACK_EPSN_S, attr->sq_psn);
-       roce_set_field(qpc_mask->byte_244_rnr_rxack,
-                      V2_QPC_BYTE_244_RX_ACK_EPSN_M,
-                      V2_QPC_BYTE_244_RX_ACK_EPSN_S, 0);
-
        roce_set_field(qpc_mask->byte_248_ack_psn,
                       V2_QPC_BYTE_248_ACK_LAST_OPTYPE_M,
                       V2_QPC_BYTE_248_ACK_LAST_OPTYPE_S, 0);
@@ -3906,27 +3899,6 @@ static int modify_qp_rtr_to_rts(struct ib_qp *ibqp,
                       V2_QPC_BYTE_240_IRRL_TAIL_REAL_M,
                       V2_QPC_BYTE_240_IRRL_TAIL_REAL_S, 0);
 
-       roce_set_field(context->byte_220_retry_psn_msn,
-                      V2_QPC_BYTE_220_RETRY_MSG_PSN_M,
-                      V2_QPC_BYTE_220_RETRY_MSG_PSN_S, attr->sq_psn);
-       roce_set_field(qpc_mask->byte_220_retry_psn_msn,
-                      V2_QPC_BYTE_220_RETRY_MSG_PSN_M,
-                      V2_QPC_BYTE_220_RETRY_MSG_PSN_S, 0);
-
-       roce_set_field(context->byte_224_retry_msg,
-                      V2_QPC_BYTE_224_RETRY_MSG_PSN_M,
-                      V2_QPC_BYTE_224_RETRY_MSG_PSN_S, attr->sq_psn >> 16);
-       roce_set_field(qpc_mask->byte_224_retry_msg,
-                      V2_QPC_BYTE_224_RETRY_MSG_PSN_M,
-                      V2_QPC_BYTE_224_RETRY_MSG_PSN_S, 0);
-
-       roce_set_field(context->byte_224_retry_msg,
-                      V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_M,
-                      V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_S, attr->sq_psn);
-       roce_set_field(qpc_mask->byte_224_retry_msg,
-                      V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_M,
-                      V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_S, 0);
-
        roce_set_field(qpc_mask->byte_220_retry_psn_msn,
                       V2_QPC_BYTE_220_RETRY_MSG_MSN_M,
                       V2_QPC_BYTE_220_RETRY_MSG_MSN_S, 0);
@@ -3977,17 +3949,8 @@ static int modify_qp_rtr_to_rts(struct ib_qp *ibqp,
                }
        }
 
-       roce_set_field(context->byte_172_sq_psn, V2_QPC_BYTE_172_SQ_CUR_PSN_M,
-                      V2_QPC_BYTE_172_SQ_CUR_PSN_S, attr->sq_psn);
-       roce_set_field(qpc_mask->byte_172_sq_psn, V2_QPC_BYTE_172_SQ_CUR_PSN_M,
-                      V2_QPC_BYTE_172_SQ_CUR_PSN_S, 0);
-
        roce_set_field(qpc_mask->byte_196_sq_psn, V2_QPC_BYTE_196_IRRL_HEAD_M,
                       V2_QPC_BYTE_196_IRRL_HEAD_S, 0);
-       roce_set_field(context->byte_196_sq_psn, V2_QPC_BYTE_196_SQ_MAX_PSN_M,
-                      V2_QPC_BYTE_196_SQ_MAX_PSN_S, attr->sq_psn);
-       roce_set_field(qpc_mask->byte_196_sq_psn, V2_QPC_BYTE_196_SQ_MAX_PSN_M,
-                      V2_QPC_BYTE_196_SQ_MAX_PSN_S, 0);
 
        if ((attr_mask & IB_QP_MAX_QP_RD_ATOMIC) && attr->max_rd_atomic) {
                roce_set_field(context->byte_208_irrl, V2_QPC_BYTE_208_SR_MAX_M,
@@ -4190,6 +4153,52 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp,
                hr_qp->sl = rdma_ah_get_sl(&attr->ah_attr);
        }
 
+       if (attr_mask & IB_QP_SQ_PSN) {
+               roce_set_field(context->byte_172_sq_psn,
+                              V2_QPC_BYTE_172_SQ_CUR_PSN_M,
+                              V2_QPC_BYTE_172_SQ_CUR_PSN_S, attr->sq_psn);
+               roce_set_field(qpc_mask->byte_172_sq_psn,
+                              V2_QPC_BYTE_172_SQ_CUR_PSN_M,
+                              V2_QPC_BYTE_172_SQ_CUR_PSN_S, 0);
+
+               roce_set_field(context->byte_196_sq_psn,
+                              V2_QPC_BYTE_196_SQ_MAX_PSN_M,
+                              V2_QPC_BYTE_196_SQ_MAX_PSN_S, attr->sq_psn);
+               roce_set_field(qpc_mask->byte_196_sq_psn,
+                              V2_QPC_BYTE_196_SQ_MAX_PSN_M,
+                              V2_QPC_BYTE_196_SQ_MAX_PSN_S, 0);
+
+               roce_set_field(context->byte_220_retry_psn_msn,
+                              V2_QPC_BYTE_220_RETRY_MSG_PSN_M,
+                              V2_QPC_BYTE_220_RETRY_MSG_PSN_S, attr->sq_psn);
+               roce_set_field(qpc_mask->byte_220_retry_psn_msn,
+                              V2_QPC_BYTE_220_RETRY_MSG_PSN_M,
+                              V2_QPC_BYTE_220_RETRY_MSG_PSN_S, 0);
+
+               roce_set_field(context->byte_224_retry_msg,
+                              V2_QPC_BYTE_224_RETRY_MSG_PSN_M,
+                              V2_QPC_BYTE_224_RETRY_MSG_PSN_S,
+                              attr->sq_psn >> 16);
+               roce_set_field(qpc_mask->byte_224_retry_msg,
+                              V2_QPC_BYTE_224_RETRY_MSG_PSN_M,
+                              V2_QPC_BYTE_224_RETRY_MSG_PSN_S, 0);
+
+               roce_set_field(context->byte_224_retry_msg,
+                              V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_M,
+                              V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_S,
+                              attr->sq_psn);
+               roce_set_field(qpc_mask->byte_224_retry_msg,
+                              V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_M,
+                              V2_QPC_BYTE_224_RETRY_MSG_FPKT_PSN_S, 0);
+
+               roce_set_field(context->byte_244_rnr_rxack,
+                              V2_QPC_BYTE_244_RX_ACK_EPSN_M,
+                              V2_QPC_BYTE_244_RX_ACK_EPSN_S, attr->sq_psn);
+               roce_set_field(qpc_mask->byte_244_rnr_rxack,
+                              V2_QPC_BYTE_244_RX_ACK_EPSN_M,
+                              V2_QPC_BYTE_244_RX_ACK_EPSN_S, 0);
+       }
+
        if (attr_mask & (IB_QP_ACCESS_FLAGS | IB_QP_MAX_DEST_RD_ATOMIC))
                set_access_flags(hr_qp, context, qpc_mask, attr, attr_mask);