This patch adds the iWARP specific doorbells to the doorbell
recovery mechanism

Signed-off-by: Ariel Elior <ariel.el...@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalde...@marvell.com>
---
 drivers/infiniband/hw/qedr/qedr.h  | 12 +++++++-----
 drivers/infiniband/hw/qedr/verbs.c | 37 ++++++++++++++++++++++++++++++++++++-
 2 files changed, 43 insertions(+), 6 deletions(-)

diff --git a/drivers/infiniband/hw/qedr/qedr.h 
b/drivers/infiniband/hw/qedr/qedr.h
index 8aed24b32de6..dc9ebbf625d2 100644
--- a/drivers/infiniband/hw/qedr/qedr.h
+++ b/drivers/infiniband/hw/qedr/qedr.h
@@ -234,6 +234,11 @@ struct qedr_ucontext {
        bool db_rec;
 };
 
+union db_prod32 {
+       struct rdma_pwm_val16_data data;
+       u32 raw;
+};
+
 union db_prod64 {
        struct rdma_pwm_val32_data data;
        u64 raw;
@@ -265,6 +270,8 @@ struct qedr_userq {
        struct qedr_user_db_rec *db_rec_data;
        u64 db_rec_phys;
        u64 db_rec_key;
+       void __iomem *db_rec_db2_addr;
+       union db_prod32 db_rec_db2_data;
 };
 
 struct qedr_cq {
@@ -300,11 +307,6 @@ struct qedr_pd {
        struct qedr_ucontext *uctx;
 };
 
-union db_prod32 {
-       struct rdma_pwm_val16_data data;
-       u32 raw;
-};
-
 struct qedr_qp_hwq_info {
        /* WQE Elements */
        struct qed_chain pbl;
diff --git a/drivers/infiniband/hw/qedr/verbs.c 
b/drivers/infiniband/hw/qedr/verbs.c
index b0b9ec70f2fd..64190de4ce23 100644
--- a/drivers/infiniband/hw/qedr/verbs.c
+++ b/drivers/infiniband/hw/qedr/verbs.c
@@ -1684,6 +1684,10 @@ static void qedr_cleanup_user(struct qedr_dev *dev, 
struct qedr_qp *qp)
        if (qp->urq.db_rec_data)
                qedr_db_recovery_del(dev, qp->urq.db_addr,
                                     &qp->urq.db_rec_data->db_data);
+
+       if (rdma_protocol_iwarp(&dev->ibdev, 1))
+               qedr_db_recovery_del(dev, qp->urq.db_rec_db2_addr,
+                                    &qp->urq.db_rec_db2_data);
 }
 
 static int qedr_create_user_qp(struct qedr_dev *dev,
@@ -1758,6 +1762,17 @@ static int qedr_create_user_qp(struct qedr_dev *dev,
        qp->usq.db_addr = ctx->dpi_addr + uresp.sq_db_offset;
        qp->urq.db_addr = ctx->dpi_addr + uresp.rq_db_offset;
 
+       if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
+               qp->urq.db_rec_db2_addr = ctx->dpi_addr + uresp.rq_db2_offset;
+
+               /* calculate the db_rec_db2 data since it is constant so no
+                *  need to reflect from user
+                */
+               qp->urq.db_rec_db2_data.data.icid = cpu_to_le16(qp->icid);
+               qp->urq.db_rec_db2_data.data.value =
+                       cpu_to_le16(DQ_TCM_IWARP_POST_RQ_CF_CMD);
+       }
+
        rc = qedr_db_recovery_add(dev, qp->usq.db_addr,
                                  &qp->usq.db_rec_data->db_data,
                                  DB_REC_WIDTH_32B,
@@ -1771,6 +1786,15 @@ static int qedr_create_user_qp(struct qedr_dev *dev,
                                  DB_REC_USER);
        if (rc)
                goto err;
+
+       if (rdma_protocol_iwarp(&dev->ibdev, 1)) {
+               rc = qedr_db_recovery_add(dev, qp->urq.db_rec_db2_addr,
+                                         &qp->urq.db_rec_db2_data,
+                                         DB_REC_WIDTH_32B,
+                                         DB_REC_USER);
+               if (rc)
+                       goto err;
+       }
        qedr_qp_user_print(dev, qp);
 
        return rc;
@@ -1811,7 +1835,13 @@ static int qedr_set_iwarp_db_info(struct qedr_dev *dev, 
struct qedr_qp *qp)
                                  &qp->rq.db_data,
                                  DB_REC_WIDTH_32B,
                                  DB_REC_KERNEL);
+       if (rc)
+               return rc;
 
+       rc = qedr_db_recovery_add(dev, qp->rq.iwarp_db2,
+                                 &qp->rq.iwarp_db2_data,
+                                 DB_REC_WIDTH_32B,
+                                 DB_REC_KERNEL);
        return rc;
 }
 
@@ -1940,8 +1970,13 @@ static void qedr_cleanup_kernel(struct qedr_dev *dev, 
struct qedr_qp *qp)
 
        qedr_db_recovery_del(dev, qp->sq.db, &qp->sq.db_data);
 
-       if (!qp->srq)
+       if (!qp->srq) {
                qedr_db_recovery_del(dev, qp->rq.db, &qp->rq.db_data);
+
+               if (rdma_protocol_iwarp(&dev->ibdev, 1))
+                       qedr_db_recovery_del(dev, qp->rq.iwarp_db2,
+                                            &qp->rq.iwarp_db2_data);
+       }
 }
 
 static int qedr_create_kernel_qp(struct qedr_dev *dev,
-- 
2.14.5

Reply via email to