]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
RDMA/erdma: Return QP state in erdma_query_qp
authorCheng Xu <chengyou@linux.alibaba.com>
Mon, 2 Sep 2024 11:29:20 +0000 (19:29 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 4 Oct 2024 14:33:10 +0000 (16:33 +0200)
[ Upstream commit e77127ff6416b17e0b3e630ac46ee5c9a6570f57 ]

Fix qp_state and cur_qp_state to return correct values in
struct ib_qp_attr.

Fixes: 155055771704 ("RDMA/erdma: Add verbs implementation")
Signed-off-by: Cheng Xu <chengyou@linux.alibaba.com>
Link: https://patch.msgid.link/20240902112920.58749-4-chengyou@linux.alibaba.com
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/infiniband/hw/erdma/erdma_verbs.c

index 40c9b6e46b82b33bb48a977a02e6686184790161..3e3a3e1c241e79ad8f04cfb9725ff26959afa1c3 100644 (file)
@@ -1544,11 +1544,31 @@ int erdma_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask,
        return ret;
 }
 
+static enum ib_qp_state query_qp_state(struct erdma_qp *qp)
+{
+       switch (qp->attrs.state) {
+       case ERDMA_QP_STATE_IDLE:
+               return IB_QPS_INIT;
+       case ERDMA_QP_STATE_RTR:
+               return IB_QPS_RTR;
+       case ERDMA_QP_STATE_RTS:
+               return IB_QPS_RTS;
+       case ERDMA_QP_STATE_CLOSING:
+               return IB_QPS_ERR;
+       case ERDMA_QP_STATE_TERMINATE:
+               return IB_QPS_ERR;
+       case ERDMA_QP_STATE_ERROR:
+               return IB_QPS_ERR;
+       default:
+               return IB_QPS_ERR;
+       }
+}
+
 int erdma_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
                   int qp_attr_mask, struct ib_qp_init_attr *qp_init_attr)
 {
-       struct erdma_qp *qp;
        struct erdma_dev *dev;
+       struct erdma_qp *qp;
 
        if (ibqp && qp_attr && qp_init_attr) {
                qp = to_eqp(ibqp);
@@ -1575,6 +1595,9 @@ int erdma_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr,
 
        qp_init_attr->cap = qp_attr->cap;
 
+       qp_attr->qp_state = query_qp_state(qp);
+       qp_attr->cur_qp_state = query_qp_state(qp);
+
        return 0;
 }