RDMA/cxgb4: Add query_qp support
authorVipul Pandya <vipul@chelsio.com>
Fri, 18 May 2012 09:59:33 +0000 (15:29 +0530)
committerRoland Dreier <roland@purestorage.com>
Fri, 18 May 2012 20:22:37 +0000 (13:22 -0700)
This allows querying the QP state before flushing.

Signed-off-by: Vipul Pandya <vipul@chelsio.com>
Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/cxgb4/iw_cxgb4.h
drivers/infiniband/hw/cxgb4/provider.c
drivers/infiniband/hw/cxgb4/qp.c

index 2d5b06b3217b3536f39d2fdf12388826048a6835..9beb3a9f0336fd55a8e2b709be7a62131c5d9d0a 100644 (file)
@@ -551,6 +551,23 @@ static inline int c4iw_convert_state(enum ib_qp_state ib_state)
        }
 }
 
+static inline int to_ib_qp_state(int c4iw_qp_state)
+{
+       switch (c4iw_qp_state) {
+       case C4IW_QP_STATE_IDLE:
+               return IB_QPS_INIT;
+       case C4IW_QP_STATE_RTS:
+               return IB_QPS_RTS;
+       case C4IW_QP_STATE_CLOSING:
+               return IB_QPS_SQD;
+       case C4IW_QP_STATE_TERMINATE:
+               return IB_QPS_SQE;
+       case C4IW_QP_STATE_ERROR:
+               return IB_QPS_ERR;
+       }
+       return IB_QPS_ERR;
+}
+
 static inline u32 c4iw_ib_to_tpt_access(int a)
 {
        return (a & IB_ACCESS_REMOTE_WRITE ? FW_RI_MEM_ACCESS_REM_WRITE : 0) |
@@ -846,6 +863,8 @@ struct ib_qp *c4iw_create_qp(struct ib_pd *pd,
                             struct ib_udata *udata);
 int c4iw_ib_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
                                 int attr_mask, struct ib_udata *udata);
+int c4iw_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
+                    int attr_mask, struct ib_qp_init_attr *init_attr);
 struct ib_qp *c4iw_get_qp(struct ib_device *dev, int qpn);
 u32 c4iw_rqtpool_alloc(struct c4iw_rdev *rdev, int size);
 void c4iw_rqtpool_free(struct c4iw_rdev *rdev, u32 addr, int size);
index fe98a0a5543071ae6de0fb9fbf0e13dc25945524..e084fdc6da7f0b12a0cca43e13d0e1327de9c72d 100644 (file)
@@ -443,6 +443,7 @@ int c4iw_register_device(struct c4iw_dev *dev)
            (1ull << IB_USER_VERBS_CMD_REQ_NOTIFY_CQ) |
            (1ull << IB_USER_VERBS_CMD_CREATE_QP) |
            (1ull << IB_USER_VERBS_CMD_MODIFY_QP) |
+           (1ull << IB_USER_VERBS_CMD_QUERY_QP) |
            (1ull << IB_USER_VERBS_CMD_POLL_CQ) |
            (1ull << IB_USER_VERBS_CMD_DESTROY_QP) |
            (1ull << IB_USER_VERBS_CMD_POST_SEND) |
@@ -465,6 +466,7 @@ int c4iw_register_device(struct c4iw_dev *dev)
        dev->ibdev.destroy_ah = c4iw_ah_destroy;
        dev->ibdev.create_qp = c4iw_create_qp;
        dev->ibdev.modify_qp = c4iw_ib_modify_qp;
+       dev->ibdev.query_qp = c4iw_ib_query_qp;
        dev->ibdev.destroy_qp = c4iw_destroy_qp;
        dev->ibdev.create_cq = c4iw_create_cq;
        dev->ibdev.destroy_cq = c4iw_destroy_cq;
index ba1343ee1414fb56fab030f27fda1e627e0e74b3..45aedf1d9338a2d9e274778fa025d496bb6f09fc 100644 (file)
@@ -1711,3 +1711,14 @@ struct ib_qp *c4iw_get_qp(struct ib_device *dev, int qpn)
        PDBG("%s ib_dev %p qpn 0x%x\n", __func__, dev, qpn);
        return (struct ib_qp *)get_qhp(to_c4iw_dev(dev), qpn);
 }
+
+int c4iw_ib_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
+                    int attr_mask, struct ib_qp_init_attr *init_attr)
+{
+       struct c4iw_qp *qhp = to_c4iw_qp(ibqp);
+
+       memset(attr, 0, sizeof *attr);
+       memset(init_attr, 0, sizeof *init_attr);
+       attr->qp_state = to_ib_qp_state(qhp->attr.state);
+       return 0;
+}