diff options
-rw-r--r-- | drivers/infiniband/hw/mlx4/cm.c | 72 |
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 | ||
64 | struct cm_sidr_generic_msg { | ||
65 | struct ib_mad_hdr hdr; | ||
66 | __be32 request_id; | ||
67 | }; | ||
68 | |||
64 | struct cm_req_msg { | 69 | struct 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 | ||
70 | static void set_local_comm_id(struct ib_mad *mad, u32 cm_id) | 75 | static 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 | ||
76 | static u32 get_local_comm_id(struct ib_mad *mad) | 90 | static 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 | ||
83 | static void set_remote_comm_id(struct ib_mad *mad, u32 cm_id) | 105 | static 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 | ||
89 | static u32 get_remote_comm_id(struct ib_mad *mad) | 120 | static 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 | ||
96 | static union ib_gid gid_from_req_msg(struct ib_device *ibdev, struct ib_mad *mad) | 135 | static 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) |