@@ -61,6 +61,11 @@ struct cm_generic_msg {
61
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
69
struct cm_req_msg {
65
70
unsigned char unused [0x60 ];
66
71
union ib_gid primary_path_sgid ;
@@ -69,28 +74,62 @@ struct cm_req_msg {
69
74
70
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 ;
73
- msg -> local_comm_id = cpu_to_be32 (cm_id );
77
+ if (mad -> mad_hdr .attr_id == CM_SIDR_REQ_ATTR_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
90
static u32 get_local_comm_id (struct ib_mad * mad )
77
91
{
78
- struct cm_generic_msg * msg = (struct cm_generic_msg * )mad ;
79
-
80
- return be32_to_cpu (msg -> local_comm_id );
92
+ if (mad -> mad_hdr .attr_id == CM_SIDR_REQ_ATTR_ID ) {
93
+ struct cm_sidr_generic_msg * msg =
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
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 ;
86
- msg -> remote_comm_id = cpu_to_be32 (cm_id );
107
+ if (mad -> mad_hdr .attr_id == CM_SIDR_REP_ATTR_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
120
static u32 get_remote_comm_id (struct ib_mad * mad )
90
121
{
91
- struct cm_generic_msg * msg = (struct cm_generic_msg * )mad ;
92
-
93
- return be32_to_cpu (msg -> remote_comm_id );
122
+ if (mad -> mad_hdr .attr_id == CM_SIDR_REP_ATTR_ID ) {
123
+ struct cm_sidr_generic_msg * msg =
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
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
321
u32 sl_cm_id ;
283
322
int pv_cm_id = -1 ;
284
323
285
- sl_cm_id = get_local_comm_id (mad );
286
-
287
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
328
id = id_map_alloc (ibdev , slave_id , sl_cm_id );
290
329
if (IS_ERR (id )) {
291
330
mlx4_ib_warn (ibdev , "%s: id{slave: %d, sl_cm_id: 0x%x} Failed to id_map_alloc\n" ,
292
331
__func__ , slave_id , sl_cm_id );
293
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
336
return 0 ;
297
337
} else {
338
+ sl_cm_id = get_local_comm_id (mad );
298
339
id = id_map_get (ibdev , & pv_cm_id , slave_id , sl_cm_id );
299
340
}
300
341
@@ -315,14 +356,18 @@ int mlx4_ib_multiplex_cm_handler(struct ib_device *ibdev, int port, int slave_id
315
356
}
316
357
317
358
int mlx4_ib_demux_cm_handler (struct ib_device * ibdev , int port , int * slave ,
318
- struct ib_mad * mad )
359
+ struct ib_mad * mad )
319
360
{
320
361
u32 pv_cm_id ;
321
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
366
union ib_gid gid ;
325
367
368
+ if (!slave )
369
+ return 0 ;
370
+
326
371
gid = gid_from_req_msg (ibdev , mad );
327
372
* slave = mlx4_ib_find_real_gid (ibdev , port , gid .global .interface_id );
328
373
if (* slave < 0 ) {
@@ -341,7 +386,8 @@ int mlx4_ib_demux_cm_handler(struct ib_device *ibdev, int port, int *slave,
341
386
return - ENOENT ;
342
387
}
343
388
344
- * slave = id -> slave_id ;
389
+ if (slave )
390
+ * slave = id -> slave_id ;
345
391
set_remote_comm_id (mad , id -> sl_cm_id );
346
392
347
393
if (mad -> mad_hdr .attr_id == CM_DREQ_ATTR_ID )
0 commit comments