RDMA/hns: Modify the usage of cmd_sn in hip08
authoroulijun <oulijun@huawei.com>
Fri, 10 Nov 2017 08:55:53 +0000 (16:55 +0800)
committerDoug Ledford <dledford@redhat.com>
Fri, 10 Nov 2017 17:32:43 +0000 (12:32 -0500)
The cmd_sn field of CQ doorbell inits for 0. It should be
increment on each first db rung after a completion Event.
if the cmd_sn of notify doorbell Adjacent two times is the
same, the hardware will distinguish it for the same notify
request and update its type according to the priority level
of next event and solicited event.

Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hns/hns_roce_cq.c
drivers/infiniband/hw/hns/hns_roce_device.h
drivers/infiniband/hw/hns/hns_roce_hw_v2.c

index f558f95d88270efe44df0520191257ed0c4adae0..2111b57a3489ba095fd313d5ac852743e616df17 100644 (file)
@@ -156,6 +156,7 @@ static int hns_roce_cq_alloc(struct hns_roce_dev *hr_dev, int nent,
        }
 
        hr_cq->cons_index = 0;
+       hr_cq->arm_sn = 1;
        hr_cq->uar = hr_uar;
 
        atomic_set(&hr_cq->refcount, 1);
@@ -456,6 +457,7 @@ void hns_roce_cq_completion(struct hns_roce_dev *hr_dev, u32 cqn)
                return;
        }
 
+       ++cq->arm_sn;
        cq->comp(cq);
 }
 
index 724a5a0c1991ec303072429fe7de8f9bbad18f73..01d3d695cbba1f2926929f0b59b47691cb08dd18 100644 (file)
@@ -347,6 +347,7 @@ struct hns_roce_cq {
        u32                             cons_index;
        void __iomem                    *cq_db_l;
        u16                             *tptr_addr;
+       int                             arm_sn;
        unsigned long                   cqn;
        u32                             vector;
        atomic_t                        refcount;
index 7008fa3add80715185f664cf060a1090523abb76..8f719c00467b833e15a507e522ac05c7857c5940 100644 (file)
@@ -1440,7 +1440,7 @@ static int hns_roce_v2_req_notify_cq(struct ib_cq *ibcq,
                       V2_CQ_DB_PARAMETER_CONS_IDX_S,
                       hr_cq->cons_index & ((hr_cq->cq_depth << 1) - 1));
        roce_set_field(doorbell[1], V2_CQ_DB_PARAMETER_CMD_SN_M,
-                      V2_CQ_DB_PARAMETER_CMD_SN_S, 1);
+                      V2_CQ_DB_PARAMETER_CMD_SN_S, hr_cq->arm_sn & 0x3);
        roce_set_bit(doorbell[1], V2_CQ_DB_PARAMETER_NOTIFY_S,
                     notification_flag);