The cmd_sn field of CQ doorbell should be 1 for the first db rung. It inits for 0. It should be increment on each first db rung after a complemention Event. Signed-off-by: Lijun Ou <oulijun@xxxxxxxxxx> --- providers/hns/hns_roce_u_hw_v2.c | 4 +++- providers/hns/hns_roce_u_hw_v2.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/providers/hns/hns_roce_u_hw_v2.c b/providers/hns/hns_roce_u_hw_v2.c index 900387c..7777e75 100644 --- a/providers/hns/hns_roce_u_hw_v2.c +++ b/providers/hns/hns_roce_u_hw_v2.c @@ -444,11 +444,13 @@ static int hns_roce_u_v2_poll_cq(struct ibv_cq *ibvcq, int ne, static int hns_roce_u_v2_arm_cq(struct ibv_cq *ibvcq, int solicited) { uint32_t ci; + uint32_t cmd_sn; uint32_t solicited_flag; struct hns_roce_v2_cq_db cq_db; struct hns_roce_cq *cq = to_hr_cq(ibvcq); ci = cq->cons_index & ((cq->cq_depth << 1) - 1); + cmd_sn = cq->arm_sn & HNS_ROCE_CMDSN_MASK; solicited_flag = solicited ? HNS_ROCE_V2_CQ_DB_REQ_SOL : HNS_ROCE_V2_CQ_DB_REQ_NEXT; @@ -462,7 +464,7 @@ static int hns_roce_u_v2_arm_cq(struct ibv_cq *ibvcq, int solicited) CQ_DB_PARAMETER_CQ_CONSUMER_IDX_S, ci); roce_set_field(cq_db.parameter, CQ_DB_PARAMETER_CMD_SN_M, - CQ_DB_PARAMETER_CMD_SN_S, 1); + CQ_DB_PARAMETER_CMD_SN_S, cmd_sn); roce_set_bit(cq_db.parameter, CQ_DB_PARAMETER_NOTIFY_S, solicited_flag); hns_roce_write64((uint32_t *)&cq_db, to_hr_ctx(ibvcq->context), diff --git a/providers/hns/hns_roce_u_hw_v2.h b/providers/hns/hns_roce_u_hw_v2.h index 28aab60..196ba4e 100644 --- a/providers/hns/hns_roce_u_hw_v2.h +++ b/providers/hns/hns_roce_u_hw_v2.h @@ -38,6 +38,8 @@ #define HNS_ROCE_V2_CQ_DB_REQ_SOL 1 #define HNS_ROCE_V2_CQ_DB_REQ_NEXT 0 +#define HNS_ROCE_CMDSN_MASK 0x3 + /* V2 REG DEFINITION */ #define ROCEE_VF_DB_CFG0_OFFSET 0x0230 -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html