1219820SjeffAdded support for XRC receive-only QPs (version 2).
2219820Sjeff
3219820SjeffSigned-off-by: Jack Morgenstein <jackm@dev.mellanox.co.il>
4219820Sjeff---
5219820SjeffV2:
6219820Sjeff1. xrc_ops changed to more_ops
7219820Sjeff
8219820Sjeffdiff --git a/src/mlx4.c b/src/mlx4.c
9219820Sjeffindex 27ca75d..e5ded78 100644
10219820Sjeff--- a/src/mlx4.c
11219820Sjeff+++ b/src/mlx4.c
12219820Sjeff@@ -74,6 +74,11 @@ static struct ibv_more_ops mlx4_more_ops = {
13219820Sjeff 	.create_xrc_srq   = mlx4_create_xrc_srq,
14219820Sjeff 	.open_xrc_domain  = mlx4_open_xrc_domain,
15219820Sjeff 	.close_xrc_domain = mlx4_close_xrc_domain,
16219820Sjeff+	.create_xrc_rcv_qp = mlx4_create_xrc_rcv_qp,
17219820Sjeff+	.modify_xrc_rcv_qp = mlx4_modify_xrc_rcv_qp,
18219820Sjeff+	.query_xrc_rcv_qp = mlx4_query_xrc_rcv_qp,
19219820Sjeff+	.reg_xrc_rcv_qp   = mlx4_reg_xrc_rcv_qp,
20219820Sjeff+	.unreg_xrc_rcv_qp = mlx4_unreg_xrc_rcv_qp,
21219820Sjeff #endif
22219820Sjeff };
23219820Sjeff #endif
24219820Sjeffdiff --git a/src/mlx4.h b/src/mlx4.h
25219820Sjeffindex 3eadb98..6307a2d 100644
26219820Sjeff--- a/src/mlx4.h
27219820Sjeff+++ b/src/mlx4.h
28219820Sjeff@@ -429,6 +429,21 @@ struct ibv_xrc_domain *mlx4_open_xrc_domain(struct ibv_context *context,
29219820Sjeff 					    int fd, int oflag);
30219820Sjeff 
31219820Sjeff int mlx4_close_xrc_domain(struct ibv_xrc_domain *d);
32219820Sjeff+int mlx4_create_xrc_rcv_qp(struct ibv_qp_init_attr *init_attr,
33219820Sjeff+			   uint32_t *xrc_qp_num);
34219820Sjeff+int mlx4_modify_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
35219820Sjeff+			   uint32_t xrc_qp_num,
36219820Sjeff+			   struct ibv_qp_attr *attr,
37219820Sjeff+			   int attr_mask);
38219820Sjeff+int mlx4_query_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
39219820Sjeff+			  uint32_t xrc_qp_num,
40219820Sjeff+			  struct ibv_qp_attr *attr,
41219820Sjeff+			  int attr_mask,
42219820Sjeff+			  struct ibv_qp_init_attr *init_attr);
43219820Sjeff+int mlx4_reg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
44219820Sjeff+			uint32_t xrc_qp_num);
45219820Sjeff+int mlx4_unreg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
46219820Sjeff+			uint32_t xrc_qp_num);
47219820Sjeff #endif
48219820Sjeff 
49219820Sjeff 
50219820Sjeffdiff --git a/src/verbs.c b/src/verbs.c
51219820Sjeffindex b7c9c8e..8261eae 100644
52219820Sjeff--- a/src/verbs.c
53219820Sjeff+++ b/src/verbs.c
54219820Sjeff@@ -778,4 +778,59 @@ int mlx4_close_xrc_domain(struct ibv_xrc_domain *d)
55219820Sjeff 	free(d);
56219820Sjeff 	return 0;
57219820Sjeff }
58219820Sjeff+
59219820Sjeff+int mlx4_create_xrc_rcv_qp(struct ibv_qp_init_attr *init_attr,
60219820Sjeff+			   uint32_t *xrc_qp_num)
61219820Sjeff+{
62219820Sjeff+
63219820Sjeff+	return ibv_cmd_create_xrc_rcv_qp(init_attr, xrc_qp_num);
64219820Sjeff+}
65219820Sjeff+
66219820Sjeff+int mlx4_modify_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
67219820Sjeff+			   uint32_t xrc_qp_num,
68219820Sjeff+			   struct ibv_qp_attr *attr,
69219820Sjeff+			   int attr_mask)
70219820Sjeff+{
71219820Sjeff+	return ibv_cmd_modify_xrc_rcv_qp(xrc_domain, xrc_qp_num,
72219820Sjeff+					 attr, attr_mask);
73219820Sjeff+}
74219820Sjeff+
75219820Sjeff+int mlx4_query_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
76219820Sjeff+			  uint32_t xrc_qp_num,
77219820Sjeff+			  struct ibv_qp_attr *attr,
78219820Sjeff+			  int attr_mask,
79219820Sjeff+			  struct ibv_qp_init_attr *init_attr)
80219820Sjeff+{
81219820Sjeff+	int ret;
82219820Sjeff+
83219820Sjeff+	ret = ibv_cmd_query_xrc_rcv_qp(xrc_domain, xrc_qp_num,
84219820Sjeff+				       attr, attr_mask, init_attr);
85219820Sjeff+	if (ret)
86219820Sjeff+		return ret;
87219820Sjeff+
88219820Sjeff+	init_attr->cap.max_send_wr = init_attr->cap.max_send_sge = 1;
89219820Sjeff+	init_attr->cap.max_recv_sge = init_attr->cap.max_recv_wr = 0;
90219820Sjeff+	init_attr->cap.max_inline_data = 0;
91219820Sjeff+	init_attr->recv_cq = init_attr->send_cq = NULL;
92219820Sjeff+	init_attr->srq = NULL;
93219820Sjeff+	init_attr->xrc_domain = xrc_domain;
94219820Sjeff+	init_attr->qp_type = IBV_QPT_XRC;
95219820Sjeff+	init_attr->qp_context = NULL;
96219820Sjeff+	attr->cap = init_attr->cap;
97219820Sjeff+
98219820Sjeff+	return 0;
99219820Sjeff+}
100219820Sjeff+
101219820Sjeff+int mlx4_reg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
102219820Sjeff+			uint32_t xrc_qp_num)
103219820Sjeff+{
104219820Sjeff+	return ibv_cmd_reg_xrc_rcv_qp(xrc_domain, xrc_qp_num);
105219820Sjeff+}
106219820Sjeff+
107219820Sjeff+int mlx4_unreg_xrc_rcv_qp(struct ibv_xrc_domain *xrc_domain,
108219820Sjeff+			  uint32_t xrc_qp_num)
109219820Sjeff+{
110219820Sjeff+	return ibv_cmd_unreg_xrc_rcv_qp(xrc_domain, xrc_qp_num);
111219820Sjeff+}
112219820Sjeff+
113219820Sjeff #endif
114