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