aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/hw/mlx4/cm.c72
1 files changed, 57 insertions, 15 deletions
diff --git a/drivers/infiniband/hw/mlx4/cm.c b/drivers/infiniband/hw/mlx4/cm.c
index b8d911543783..56a593e0ae5d 100644
--- a/drivers/infiniband/hw/mlx4/cm.c
+++ b/drivers/infiniband/hw/mlx4/cm.c
@@ -61,6 +61,11 @@ struct cm_generic_msg {
61 __be32 remote_comm_id; 61 __be32 remote_comm_id;
62}; 62};
63 63
64struct cm_sidr_generic_msg {
65 struct ib_mad_hdr hdr;
66 __be32 request_id;
67};
68
64struct cm_req_msg { 69struct cm_req_msg {
65 unsigned char unused[0x60]; 70 unsigned char unused[0x60];
66 union ib_gid primary_path_sgid; 71 union ib_gid primary_path_sgid;
@@ -69,28 +74,62 @@ struct cm_req_msg {
69 74
70static void set_local_comm_id(struct ib_mad *mad, u32 cm_id) 75static void set_local_comm_id(struct ib_mad *mad, u32 cm_id)
71{ 76{
72 struct cm_generic_msg *msg = (struct cm_generic_msg *)mad; 77 if (mad->mad_hdr.attr_id == CM_SIDR_REQ_ATTR_ID) {
73 msg->local_comm_id = cpu_to_be32(cm_id); 78 struct cm_sidr_generic_msg *msg =
79 (struct cm_sidr_generic_msg *)mad;
80 msg->request_id = cpu_to_be32(cm_id);
81 } else if (mad->mad_hdr.attr_id == CM_SIDR_REP_ATTR_ID) {
82 pr_err("trying to set local_comm_id in SIDR_REP\n");
83 return;
84 } else {
85 struct cm_generic_msg *msg = (struct cm_generic_msg *)mad;
86 msg->local_comm_id = cpu_to_be32(cm_id);
87 }
74} 88}
75 89
76static u32 get_local_comm_id(struct ib_mad *mad) 90static u32 get_local_comm_id(struct ib_mad *mad)
77{ 91{
78 struct cm_generic_msg *msg = (struct cm_generic_msg *)mad; 92 if (mad->mad_hdr.attr_id == CM_SIDR_REQ_ATTR_ID) {
79 93 struct cm_sidr_generic_msg *msg =
80 return be32_to_cpu(msg->local_comm_id); 94 (struct cm_sidr_generic_msg *)mad;
95 return be32_to_cpu(msg->request_id);
96 } else if (mad->mad_hdr.attr_id == CM_SIDR_REP_ATTR_ID) {
97 pr_err("trying to set local_comm_id in SIDR_REP\n");
98 return -1;
99 } else {
100 struct cm_generic_msg *msg = (struct cm_generic_msg *)mad;
101 return be32_to_cpu(msg->local_comm_id);
102 }
81} 103}
82 104
83static void set_remote_comm_id(struct ib_mad *mad, u32 cm_id) 105static void set_remote_comm_id(struct ib_mad *mad, u32 cm_id)
84{ 106{
85 struct cm_generic_msg *msg = (struct cm_generic_msg *)mad; 107 if (mad->mad_hdr.attr_id == CM_SIDR_REP_ATTR_ID) {
86 msg->remote_comm_id = cpu_to_be32(cm_id); 108 struct cm_sidr_generic_msg *msg =
109 (struct cm_sidr_generic_msg *)mad;
110 msg->request_id = cpu_to_be32(cm_id);
111 } else if (mad->mad_hdr.attr_id == CM_SIDR_REQ_ATTR_ID) {
112 pr_err("trying to set remote_comm_id in SIDR_REQ\n");
113 return;
114 } else {
115 struct cm_generic_msg *msg = (struct cm_generic_msg *)mad;
116 msg->remote_comm_id = cpu_to_be32(cm_id);
117 }
87} 118}
88 119
89static u32 get_remote_comm_id(struct ib_mad *mad) 120static u32 get_remote_comm_id(struct ib_mad *mad)
90{ 121{
91 struct cm_generic_msg *msg = (struct cm_generic_msg *)mad; 122 if (mad->mad_hdr.attr_id == CM_SIDR_REP_ATTR_ID) {
92 123 struct cm_sidr_generic_msg *msg =
93 return be32_to_cpu(msg->remote_comm_id); 124 (struct cm_sidr_generic_msg *)mad;
125 return be32_to_cpu(msg->request_id);
126 } else if (mad->mad_hdr.attr_id == CM_SIDR_REQ_ATTR_ID) {
127 pr_err("trying to set remote_comm_id in SIDR_REQ\n");
128 return -1;
129 } else {
130 struct cm_generic_msg *msg = (struct cm_generic_msg *)mad;
131 return be32_to_cpu(msg->remote_comm_id);
132 }
94} 133}
95 134
96static union ib_gid gid_from_req_msg(struct ib_device *ibdev, struct ib_mad *mad) 135static union ib_gid gid_from_req_msg(struct ib_device *ibdev, struct ib_mad *mad)
@@ -282,19 +321,21 @@ int mlx4_ib_multiplex_cm_handler(struct ib_device *ibdev, int port, int slave_id
282 u32 sl_cm_id; 321 u32 sl_cm_id;
283 int pv_cm_id = -1; 322 int pv_cm_id = -1;
284 323
285 sl_cm_id = get_local_comm_id(mad);
286
287 if (mad->mad_hdr.attr_id == CM_REQ_ATTR_ID || 324 if (mad->mad_hdr.attr_id == CM_REQ_ATTR_ID ||
288 mad->mad_hdr.attr_id == CM_REP_ATTR_ID) { 325 mad->mad_hdr.attr_id == CM_REP_ATTR_ID ||
326 mad->mad_hdr.attr_id == CM_SIDR_REQ_ATTR_ID) {
327 sl_cm_id = get_local_comm_id(mad);
289 id = id_map_alloc(ibdev, slave_id, sl_cm_id); 328 id = id_map_alloc(ibdev, slave_id, sl_cm_id);
290 if (IS_ERR(id)) { 329 if (IS_ERR(id)) {
291 mlx4_ib_warn(ibdev, "%s: id{slave: %d, sl_cm_id: 0x%x} Failed to id_map_alloc\n", 330 mlx4_ib_warn(ibdev, "%s: id{slave: %d, sl_cm_id: 0x%x} Failed to id_map_alloc\n",
292 __func__, slave_id, sl_cm_id); 331 __func__, slave_id, sl_cm_id);
293 return PTR_ERR(id); 332 return PTR_ERR(id);
294 } 333 }
295 } else if (mad->mad_hdr.attr_id == CM_REJ_ATTR_ID) { 334 } else if (mad->mad_hdr.attr_id == CM_REJ_ATTR_ID ||
335 mad->mad_hdr.attr_id == CM_SIDR_REP_ATTR_ID) {
296 return 0; 336 return 0;
297 } else { 337 } else {
338 sl_cm_id = get_local_comm_id(mad);
298 id = id_map_get(ibdev, &pv_cm_id, slave_id, sl_cm_id); 339 id = id_map_get(ibdev, &pv_cm_id, slave_id, sl_cm_id);
299 } 340 }
300 341
@@ -320,7 +361,8 @@ int mlx4_ib_demux_cm_handler(struct ib_device *ibdev, int port, int *slave,
320 u32 pv_cm_id; 361 u32 pv_cm_id;
321 struct id_map_entry *id; 362 struct id_map_entry *id;
322 363
323 if (mad->mad_hdr.attr_id == CM_REQ_ATTR_ID) { 364 if (mad->mad_hdr.attr_id == CM_REQ_ATTR_ID ||
365 mad->mad_hdr.attr_id == CM_SIDR_REQ_ATTR_ID) {
324 union ib_gid gid; 366 union ib_gid gid;
325 367
326 if (!slave) 368 if (!slave)