Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
rdma
ib_mad.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2004 Mellanox Technologies Ltd. All rights reserved.
3
* Copyright (c) 2004 Infinicon Corporation. All rights reserved.
4
* Copyright (c) 2004 Intel Corporation. All rights reserved.
5
* Copyright (c) 2004 Topspin Corporation. All rights reserved.
6
* Copyright (c) 2004-2006 Voltaire Corporation. All rights reserved.
7
*
8
* This software is available to you under a choice of one of two
9
* licenses. You may choose to be licensed under the terms of the GNU
10
* General Public License (GPL) Version 2, available from the file
11
* COPYING in the main directory of this source tree, or the
12
* OpenIB.org BSD license below:
13
*
14
* Redistribution and use in source and binary forms, with or
15
* without modification, are permitted provided that the following
16
* conditions are met:
17
*
18
* - Redistributions of source code must retain the above
19
* copyright notice, this list of conditions and the following
20
* disclaimer.
21
*
22
* - Redistributions in binary form must reproduce the above
23
* copyright notice, this list of conditions and the following
24
* disclaimer in the documentation and/or other materials
25
* provided with the distribution.
26
*
27
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
31
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
32
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34
* SOFTWARE.
35
*/
36
37
#if !defined(IB_MAD_H)
38
#define IB_MAD_H
39
40
#include <linux/list.h>
41
42
#include <
rdma/ib_verbs.h
>
43
44
/* Management base version */
45
#define IB_MGMT_BASE_VERSION 1
46
47
/* Management classes */
48
#define IB_MGMT_CLASS_SUBN_LID_ROUTED 0x01
49
#define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE 0x81
50
#define IB_MGMT_CLASS_SUBN_ADM 0x03
51
#define IB_MGMT_CLASS_PERF_MGMT 0x04
52
#define IB_MGMT_CLASS_BM 0x05
53
#define IB_MGMT_CLASS_DEVICE_MGMT 0x06
54
#define IB_MGMT_CLASS_CM 0x07
55
#define IB_MGMT_CLASS_SNMP 0x08
56
#define IB_MGMT_CLASS_DEVICE_ADM 0x10
57
#define IB_MGMT_CLASS_BOOT_MGMT 0x11
58
#define IB_MGMT_CLASS_BIS 0x12
59
#define IB_MGMT_CLASS_CONG_MGMT 0x21
60
#define IB_MGMT_CLASS_VENDOR_RANGE2_START 0x30
61
#define IB_MGMT_CLASS_VENDOR_RANGE2_END 0x4F
62
63
#define IB_OPENIB_OUI (0x001405)
64
65
/* Management methods */
66
#define IB_MGMT_METHOD_GET 0x01
67
#define IB_MGMT_METHOD_SET 0x02
68
#define IB_MGMT_METHOD_GET_RESP 0x81
69
#define IB_MGMT_METHOD_SEND 0x03
70
#define IB_MGMT_METHOD_TRAP 0x05
71
#define IB_MGMT_METHOD_REPORT 0x06
72
#define IB_MGMT_METHOD_REPORT_RESP 0x86
73
#define IB_MGMT_METHOD_TRAP_REPRESS 0x07
74
75
#define IB_MGMT_METHOD_RESP 0x80
76
#define IB_BM_ATTR_MOD_RESP cpu_to_be32(1)
77
78
#define IB_MGMT_MAX_METHODS 128
79
80
/* MAD Status field bit masks */
81
#define IB_MGMT_MAD_STATUS_SUCCESS 0x0000
82
#define IB_MGMT_MAD_STATUS_BUSY 0x0001
83
#define IB_MGMT_MAD_STATUS_REDIRECT_REQD 0x0002
84
#define IB_MGMT_MAD_STATUS_BAD_VERSION 0x0004
85
#define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD 0x0008
86
#define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD_ATTRIB 0x000c
87
#define IB_MGMT_MAD_STATUS_INVALID_ATTRIB_VALUE 0x001c
88
89
/* RMPP information */
90
#define IB_MGMT_RMPP_VERSION 1
91
92
#define IB_MGMT_RMPP_TYPE_DATA 1
93
#define IB_MGMT_RMPP_TYPE_ACK 2
94
#define IB_MGMT_RMPP_TYPE_STOP 3
95
#define IB_MGMT_RMPP_TYPE_ABORT 4
96
97
#define IB_MGMT_RMPP_FLAG_ACTIVE 1
98
#define IB_MGMT_RMPP_FLAG_FIRST (1<<1)
99
#define IB_MGMT_RMPP_FLAG_LAST (1<<2)
100
101
#define IB_MGMT_RMPP_NO_RESPTIME 0x1F
102
103
#define IB_MGMT_RMPP_STATUS_SUCCESS 0
104
#define IB_MGMT_RMPP_STATUS_RESX 1
105
#define IB_MGMT_RMPP_STATUS_ABORT_MIN 118
106
#define IB_MGMT_RMPP_STATUS_T2L 118
107
#define IB_MGMT_RMPP_STATUS_BAD_LEN 119
108
#define IB_MGMT_RMPP_STATUS_BAD_SEG 120
109
#define IB_MGMT_RMPP_STATUS_BADT 121
110
#define IB_MGMT_RMPP_STATUS_W2S 122
111
#define IB_MGMT_RMPP_STATUS_S2B 123
112
#define IB_MGMT_RMPP_STATUS_BAD_STATUS 124
113
#define IB_MGMT_RMPP_STATUS_UNV 125
114
#define IB_MGMT_RMPP_STATUS_TMR 126
115
#define IB_MGMT_RMPP_STATUS_UNSPEC 127
116
#define IB_MGMT_RMPP_STATUS_ABORT_MAX 127
117
118
#define IB_QP0 0
119
#define IB_QP1 cpu_to_be32(1)
120
#define IB_QP1_QKEY 0x80010000
121
#define IB_QP_SET_QKEY 0x80000000
122
123
#define IB_DEFAULT_PKEY_PARTIAL 0x7FFF
124
#define IB_DEFAULT_PKEY_FULL 0xFFFF
125
126
enum
{
127
IB_MGMT_MAD_HDR
= 24,
128
IB_MGMT_MAD_DATA
= 232,
129
IB_MGMT_RMPP_HDR
= 36,
130
IB_MGMT_RMPP_DATA
= 220,
131
IB_MGMT_VENDOR_HDR
= 40,
132
IB_MGMT_VENDOR_DATA
= 216,
133
IB_MGMT_SA_HDR
= 56,
134
IB_MGMT_SA_DATA
= 200,
135
IB_MGMT_DEVICE_HDR
= 64,
136
IB_MGMT_DEVICE_DATA
= 192,
137
};
138
139
struct
ib_mad_hdr
{
140
u8
base_version
;
141
u8
mgmt_class
;
142
u8
class_version
;
143
u8
method
;
144
__be16
status
;
145
__be16
class_specific
;
146
__be64
tid
;
147
__be16
attr_id
;
148
__be16
resv
;
149
__be32
attr_mod
;
150
};
151
152
struct
ib_rmpp_hdr
{
153
u8
rmpp_version
;
154
u8
rmpp_type
;
155
u8
rmpp_rtime_flags
;
156
u8
rmpp_status
;
157
__be32
seg_num
;
158
__be32
paylen_newwin
;
159
};
160
161
typedef
u64
__bitwise
ib_sa_comp_mask
;
162
163
#define IB_SA_COMP_MASK(n) ((__force ib_sa_comp_mask) cpu_to_be64(1ull << (n)))
164
165
/*
166
* ib_sa_hdr and ib_sa_mad structures must be packed because they have
167
* 64-bit fields that are only 32-bit aligned. 64-bit architectures will
168
* lay them out wrong otherwise. (And unfortunately they are sent on
169
* the wire so we can't change the layout)
170
*/
171
struct
ib_sa_hdr
{
172
__be64
sm_key
;
173
__be16
attr_offset
;
174
__be16
reserved
;
175
ib_sa_comp_mask
comp_mask
;
176
}
__attribute__
((packed));
177
178
struct
ib_mad
{
179
struct
ib_mad_hdr
mad_hdr
;
180
u8
data
[
IB_MGMT_MAD_DATA
];
181
};
182
183
struct
ib_rmpp_mad
{
184
struct
ib_mad_hdr
mad_hdr
;
185
struct
ib_rmpp_hdr
rmpp_hdr
;
186
u8
data
[
IB_MGMT_RMPP_DATA
];
187
};
188
189
struct
ib_sa_mad
{
190
struct
ib_mad_hdr
mad_hdr
;
191
struct
ib_rmpp_hdr
rmpp_hdr
;
192
struct
ib_sa_hdr
sa_hdr
;
193
u8
data
[
IB_MGMT_SA_DATA
];
194
}
__attribute__
((packed));
195
196
struct
ib_vendor_mad
{
197
struct
ib_mad_hdr
mad_hdr
;
198
struct
ib_rmpp_hdr
rmpp_hdr
;
199
u8
reserved
;
200
u8
oui
[3];
201
u8
data
[
IB_MGMT_VENDOR_DATA
];
202
};
203
204
struct
ib_class_port_info
{
205
u8
base_version
;
206
u8
class_version
;
207
__be16
capability_mask
;
208
u8
reserved
[3];
209
u8
resp_time_value
;
210
u8
redirect_gid
[16];
211
__be32
redirect_tcslfl
;
212
__be16
redirect_lid
;
213
__be16
redirect_pkey
;
214
__be32
redirect_qp
;
215
__be32
redirect_qkey
;
216
u8
trap_gid
[16];
217
__be32
trap_tcslfl
;
218
__be16
trap_lid
;
219
__be16
trap_pkey
;
220
__be32
trap_hlqp
;
221
__be32
trap_qkey
;
222
};
223
247
struct
ib_mad_send_buf
{
248
struct
ib_mad_send_buf
*
next
;
249
void
*
mad
;
250
struct
ib_mad_agent
*
mad_agent
;
251
struct
ib_ah
*
ah
;
252
void
*
context
[2];
253
int
hdr_len
;
254
int
data_len
;
255
int
seg_count
;
256
int
seg_size
;
257
int
timeout_ms
;
258
int
retries
;
259
};
260
265
int
ib_response_mad
(
struct
ib_mad
*
mad
);
266
271
static
inline
u8
ib_get_rmpp_resptime(
struct
ib_rmpp_hdr
*
rmpp_hdr
)
272
{
273
return
rmpp_hdr->
rmpp_rtime_flags
>> 3;
274
}
275
280
static
inline
u8
ib_get_rmpp_flags(
struct
ib_rmpp_hdr
*
rmpp_hdr
)
281
{
282
return
rmpp_hdr->
rmpp_rtime_flags
& 0x7;
283
}
284
290
static
inline
void
ib_set_rmpp_resptime(
struct
ib_rmpp_hdr
*
rmpp_hdr
,
u8
rtime
)
291
{
292
rmpp_hdr->
rmpp_rtime_flags
= ib_get_rmpp_flags(rmpp_hdr) | (rtime << 3);
293
}
294
300
static
inline
void
ib_set_rmpp_flags(
struct
ib_rmpp_hdr
*
rmpp_hdr
,
u8
flags
)
301
{
302
rmpp_hdr->
rmpp_rtime_flags
= (rmpp_hdr->
rmpp_rtime_flags
& 0xF8) |
303
(flags & 0x7);
304
}
305
306
struct
ib_mad_agent
;
307
struct
ib_mad_send_wc
;
308
struct
ib_mad_recv_wc
;
309
315
typedef
void
(*
ib_mad_send_handler
)(
struct
ib_mad_agent
*mad_agent,
316
struct
ib_mad_send_wc
*mad_send_wc);
317
328
typedef
void
(*
ib_mad_snoop_handler
)(
struct
ib_mad_agent
*mad_agent,
329
struct
ib_mad_send_buf
*send_buf,
330
struct
ib_mad_send_wc
*mad_send_wc);
331
343
typedef
void
(*
ib_mad_recv_handler
)(
struct
ib_mad_agent
*mad_agent,
344
struct
ib_mad_recv_wc
*mad_recv_wc);
345
361
struct
ib_mad_agent
{
362
struct
ib_device
*
device
;
363
struct
ib_qp
*
qp
;
364
struct
ib_mr
*
mr
;
365
ib_mad_recv_handler
recv_handler
;
366
ib_mad_send_handler
send_handler
;
367
ib_mad_snoop_handler
snoop_handler
;
368
void
*
context
;
369
u32
hi_tid
;
370
u8
port_num
;
371
u8
rmpp_version
;
372
};
373
381
struct
ib_mad_send_wc
{
382
struct
ib_mad_send_buf
*
send_buf
;
383
enum
ib_wc_status
status
;
384
u32
vendor_err
;
385
};
386
395
struct
ib_mad_recv_buf
{
396
struct
list_head
list
;
397
struct
ib_grh
*
grh
;
398
struct
ib_mad
*
mad
;
399
};
400
411
struct
ib_mad_recv_wc
{
412
struct
ib_wc
*
wc
;
413
struct
ib_mad_recv_buf
recv_buf
;
414
struct
list_head
rmpp_list
;
415
int
mad_len
;
416
};
417
430
struct
ib_mad_reg_req
{
431
u8
mgmt_class
;
432
u8
mgmt_class_version
;
433
u8
oui
[3];
434
DECLARE_BITMAP
(method_mask,
IB_MGMT_MAX_METHODS
);
435
};
436
455
struct
ib_mad_agent
*
ib_register_mad_agent
(
struct
ib_device
*
device
,
456
u8
port_num
,
457
enum
ib_qp_type
qp_type,
458
struct
ib_mad_reg_req
*mad_reg_req,
459
u8
rmpp_version
,
460
ib_mad_send_handler
send_handler
,
461
ib_mad_recv_handler
recv_handler
,
462
void
*
context
);
463
464
enum
ib_mad_snoop_flags
{
465
/*IB_MAD_SNOOP_POSTED_SENDS = 1,*/
466
/*IB_MAD_SNOOP_RMPP_SENDS = (1<<1),*/
467
IB_MAD_SNOOP_SEND_COMPLETIONS
= (1<<2),
468
/*IB_MAD_SNOOP_RMPP_SEND_COMPLETIONS = (1<<3),*/
469
IB_MAD_SNOOP_RECVS
= (1<<4)
470
/*IB_MAD_SNOOP_RMPP_RECVS = (1<<5),*/
471
/*IB_MAD_SNOOP_REDIRECTED_QPS = (1<<6)*/
472
};
473
485
struct
ib_mad_agent
*
ib_register_mad_snoop
(
struct
ib_device
*
device
,
486
u8
port_num
,
487
enum
ib_qp_type
qp_type,
488
int
mad_snoop_flags,
489
ib_mad_snoop_handler
snoop_handler
,
490
ib_mad_recv_handler
recv_handler
,
491
void
*
context
);
492
500
int
ib_unregister_mad_agent
(
struct
ib_mad_agent
*mad_agent);
501
521
int
ib_post_send_mad
(
struct
ib_mad_send_buf
*send_buf,
522
struct
ib_mad_send_buf
**bad_send_buf);
523
524
532
void
ib_free_recv_mad
(
struct
ib_mad_recv_wc
*mad_recv_wc);
533
542
void
ib_cancel_mad
(
struct
ib_mad_agent
*mad_agent,
543
struct
ib_mad_send_buf
*send_buf);
544
554
int
ib_modify_mad
(
struct
ib_mad_agent
*mad_agent,
555
struct
ib_mad_send_buf
*send_buf,
u32
timeout_ms
);
556
573
struct
ib_mad_agent
*
ib_redirect_mad_qp
(
struct
ib_qp
*
qp
,
574
u8
rmpp_version
,
575
ib_mad_send_handler
send_handler
,
576
ib_mad_recv_handler
recv_handler
,
577
void
*
context
);
578
594
int
ib_process_mad_wc
(
struct
ib_mad_agent
*mad_agent,
595
struct
ib_wc
*
wc
);
596
623
struct
ib_mad_send_buf
*
ib_create_send_mad
(
struct
ib_mad_agent
*mad_agent,
624
u32
remote_qpn
,
u16
pkey_index,
625
int
rmpp_active,
626
int
hdr_len
,
int
data_len
,
627
gfp_t
gfp_mask
);
628
636
int
ib_is_mad_class_rmpp
(
u8
mgmt_class
);
637
646
int
ib_get_mad_data_offset
(
u8
mgmt_class
);
647
656
void
*
ib_get_rmpp_segment
(
struct
ib_mad_send_buf
*send_buf,
int
seg_num);
657
662
void
ib_free_send_mad
(
struct
ib_mad_send_buf
*send_buf);
663
664
#endif
/* IB_MAD_H */
Generated on Thu Jan 10 2013 14:53:20 for Linux Kernel by
1.8.2