Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/ofed/include/rdma/ib_mad.h
39482 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3
*
4
* Copyright (c) 2004 Mellanox Technologies Ltd. All rights reserved.
5
* Copyright (c) 2004 Infinicon Corporation. All rights reserved.
6
* Copyright (c) 2004 Intel Corporation. All rights reserved.
7
* Copyright (c) 2004 Topspin Corporation. All rights reserved.
8
* Copyright (c) 2004-2006 Voltaire Corporation. All rights reserved.
9
*
10
* This software is available to you under a choice of one of two
11
* licenses. You may choose to be licensed under the terms of the GNU
12
* General Public License (GPL) Version 2, available from the file
13
* COPYING in the main directory of this source tree, or the
14
* OpenIB.org BSD license below:
15
*
16
* Redistribution and use in source and binary forms, with or
17
* without modification, are permitted provided that the following
18
* conditions are met:
19
*
20
* - Redistributions of source code must retain the above
21
* copyright notice, this list of conditions and the following
22
* disclaimer.
23
*
24
* - Redistributions in binary form must reproduce the above
25
* copyright notice, this list of conditions and the following
26
* disclaimer in the documentation and/or other materials
27
* provided with the distribution.
28
*
29
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
30
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
31
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
32
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
33
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
34
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
35
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
36
* SOFTWARE.
37
*/
38
39
#if !defined(IB_MAD_H)
40
#define IB_MAD_H
41
42
#include <linux/list.h>
43
44
#include <rdma/ib_verbs.h>
45
#include <uapi/rdma/ib_user_mad.h>
46
47
/* Management base versions */
48
#define IB_MGMT_BASE_VERSION 1
49
#define OPA_MGMT_BASE_VERSION 0x80
50
51
#define OPA_SMP_CLASS_VERSION 0x80
52
53
/* Management classes */
54
#define IB_MGMT_CLASS_SUBN_LID_ROUTED 0x01
55
#define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE 0x81
56
#define IB_MGMT_CLASS_SUBN_ADM 0x03
57
#define IB_MGMT_CLASS_PERF_MGMT 0x04
58
#define IB_MGMT_CLASS_BM 0x05
59
#define IB_MGMT_CLASS_DEVICE_MGMT 0x06
60
#define IB_MGMT_CLASS_CM 0x07
61
#define IB_MGMT_CLASS_SNMP 0x08
62
#define IB_MGMT_CLASS_DEVICE_ADM 0x10
63
#define IB_MGMT_CLASS_BOOT_MGMT 0x11
64
#define IB_MGMT_CLASS_BIS 0x12
65
#define IB_MGMT_CLASS_CONG_MGMT 0x21
66
#define IB_MGMT_CLASS_VENDOR_RANGE2_START 0x30
67
#define IB_MGMT_CLASS_VENDOR_RANGE2_END 0x4F
68
69
#define IB_OPENIB_OUI (0x001405)
70
71
/* Management methods */
72
#define IB_MGMT_METHOD_GET 0x01
73
#define IB_MGMT_METHOD_SET 0x02
74
#define IB_MGMT_METHOD_GET_RESP 0x81
75
#define IB_MGMT_METHOD_SEND 0x03
76
#define IB_MGMT_METHOD_TRAP 0x05
77
#define IB_MGMT_METHOD_REPORT 0x06
78
#define IB_MGMT_METHOD_REPORT_RESP 0x86
79
#define IB_MGMT_METHOD_TRAP_REPRESS 0x07
80
81
#define IB_MGMT_METHOD_RESP 0x80
82
#define IB_BM_ATTR_MOD_RESP cpu_to_be32(1)
83
84
#define IB_MGMT_MAX_METHODS 128
85
86
/* MAD Status field bit masks */
87
#define IB_MGMT_MAD_STATUS_SUCCESS 0x0000
88
#define IB_MGMT_MAD_STATUS_BUSY 0x0001
89
#define IB_MGMT_MAD_STATUS_REDIRECT_REQD 0x0002
90
#define IB_MGMT_MAD_STATUS_BAD_VERSION 0x0004
91
#define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD 0x0008
92
#define IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD_ATTRIB 0x000c
93
#define IB_MGMT_MAD_STATUS_INVALID_ATTRIB_VALUE 0x001c
94
95
/* RMPP information */
96
#define IB_MGMT_RMPP_VERSION 1
97
98
#define IB_MGMT_RMPP_TYPE_DATA 1
99
#define IB_MGMT_RMPP_TYPE_ACK 2
100
#define IB_MGMT_RMPP_TYPE_STOP 3
101
#define IB_MGMT_RMPP_TYPE_ABORT 4
102
103
#define IB_MGMT_RMPP_FLAG_ACTIVE 1
104
#define IB_MGMT_RMPP_FLAG_FIRST (1<<1)
105
#define IB_MGMT_RMPP_FLAG_LAST (1<<2)
106
107
#define IB_MGMT_RMPP_NO_RESPTIME 0x1F
108
109
#define IB_MGMT_RMPP_STATUS_SUCCESS 0
110
#define IB_MGMT_RMPP_STATUS_RESX 1
111
#define IB_MGMT_RMPP_STATUS_ABORT_MIN 118
112
#define IB_MGMT_RMPP_STATUS_T2L 118
113
#define IB_MGMT_RMPP_STATUS_BAD_LEN 119
114
#define IB_MGMT_RMPP_STATUS_BAD_SEG 120
115
#define IB_MGMT_RMPP_STATUS_BADT 121
116
#define IB_MGMT_RMPP_STATUS_W2S 122
117
#define IB_MGMT_RMPP_STATUS_S2B 123
118
#define IB_MGMT_RMPP_STATUS_BAD_STATUS 124
119
#define IB_MGMT_RMPP_STATUS_UNV 125
120
#define IB_MGMT_RMPP_STATUS_TMR 126
121
#define IB_MGMT_RMPP_STATUS_UNSPEC 127
122
#define IB_MGMT_RMPP_STATUS_ABORT_MAX 127
123
124
#define IB_QP0 0
125
#define IB_QP1 cpu_to_be32(1)
126
#define IB_QP1_QKEY 0x80010000
127
#define IB_QP_SET_QKEY 0x80000000
128
129
#define IB_DEFAULT_PKEY_PARTIAL 0x7FFF
130
#define IB_DEFAULT_PKEY_FULL 0xFFFF
131
132
/*
133
* Generic trap/notice types
134
*/
135
#define IB_NOTICE_TYPE_FATAL 0x80
136
#define IB_NOTICE_TYPE_URGENT 0x81
137
#define IB_NOTICE_TYPE_SECURITY 0x82
138
#define IB_NOTICE_TYPE_SM 0x83
139
#define IB_NOTICE_TYPE_INFO 0x84
140
141
/*
142
* Generic trap/notice producers
143
*/
144
#define IB_NOTICE_PROD_CA cpu_to_be16(1)
145
#define IB_NOTICE_PROD_SWITCH cpu_to_be16(2)
146
#define IB_NOTICE_PROD_ROUTER cpu_to_be16(3)
147
#define IB_NOTICE_PROD_CLASS_MGR cpu_to_be16(4)
148
149
enum {
150
IB_MGMT_MAD_HDR = 24,
151
IB_MGMT_MAD_DATA = 232,
152
IB_MGMT_RMPP_HDR = 36,
153
IB_MGMT_RMPP_DATA = 220,
154
IB_MGMT_VENDOR_HDR = 40,
155
IB_MGMT_VENDOR_DATA = 216,
156
IB_MGMT_SA_HDR = 56,
157
IB_MGMT_SA_DATA = 200,
158
IB_MGMT_DEVICE_HDR = 64,
159
IB_MGMT_DEVICE_DATA = 192,
160
IB_MGMT_MAD_SIZE = IB_MGMT_MAD_HDR + IB_MGMT_MAD_DATA,
161
OPA_MGMT_MAD_DATA = 2024,
162
OPA_MGMT_RMPP_DATA = 2012,
163
OPA_MGMT_MAD_SIZE = IB_MGMT_MAD_HDR + OPA_MGMT_MAD_DATA,
164
};
165
166
struct ib_mad_hdr {
167
u8 base_version;
168
u8 mgmt_class;
169
u8 class_version;
170
u8 method;
171
__be16 status;
172
__be16 class_specific;
173
__be64 tid;
174
__be16 attr_id;
175
__be16 resv;
176
__be32 attr_mod;
177
};
178
179
struct ib_rmpp_hdr {
180
u8 rmpp_version;
181
u8 rmpp_type;
182
u8 rmpp_rtime_flags;
183
u8 rmpp_status;
184
__be32 seg_num;
185
__be32 paylen_newwin;
186
};
187
188
typedef u64 __bitwise ib_sa_comp_mask;
189
190
#define IB_SA_COMP_MASK(n) ((__force ib_sa_comp_mask) cpu_to_be64(1ull << (n)))
191
192
/*
193
* ib_sa_hdr and ib_sa_mad structures must be packed because they have
194
* 64-bit fields that are only 32-bit aligned. 64-bit architectures will
195
* lay them out wrong otherwise. (And unfortunately they are sent on
196
* the wire so we can't change the layout)
197
*/
198
struct ib_sa_hdr {
199
__be64 sm_key;
200
__be16 attr_offset;
201
__be16 reserved;
202
ib_sa_comp_mask comp_mask;
203
} __attribute__ ((packed));
204
205
struct ib_mad {
206
struct ib_mad_hdr mad_hdr;
207
u8 data[IB_MGMT_MAD_DATA];
208
};
209
210
struct opa_mad {
211
struct ib_mad_hdr mad_hdr;
212
u8 data[OPA_MGMT_MAD_DATA];
213
};
214
215
struct ib_rmpp_mad {
216
struct ib_mad_hdr mad_hdr;
217
struct ib_rmpp_hdr rmpp_hdr;
218
u8 data[IB_MGMT_RMPP_DATA];
219
};
220
221
struct opa_rmpp_mad {
222
struct ib_mad_hdr mad_hdr;
223
struct ib_rmpp_hdr rmpp_hdr;
224
u8 data[OPA_MGMT_RMPP_DATA];
225
};
226
227
struct ib_sa_mad {
228
struct ib_mad_hdr mad_hdr;
229
struct ib_rmpp_hdr rmpp_hdr;
230
struct ib_sa_hdr sa_hdr;
231
u8 data[IB_MGMT_SA_DATA];
232
} __attribute__ ((packed));
233
234
struct ib_vendor_mad {
235
struct ib_mad_hdr mad_hdr;
236
struct ib_rmpp_hdr rmpp_hdr;
237
u8 reserved;
238
u8 oui[3];
239
u8 data[IB_MGMT_VENDOR_DATA];
240
};
241
242
#define IB_MGMT_CLASSPORTINFO_ATTR_ID cpu_to_be16(0x0001)
243
244
#define IB_CLASS_PORT_INFO_RESP_TIME_MASK 0x1F
245
#define IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE 5
246
247
struct ib_class_port_info {
248
u8 base_version;
249
u8 class_version;
250
__be16 capability_mask;
251
/* 27 bits for cap_mask2, 5 bits for resp_time */
252
__be32 cap_mask2_resp_time;
253
u8 redirect_gid[16];
254
__be32 redirect_tcslfl;
255
__be16 redirect_lid;
256
__be16 redirect_pkey;
257
__be32 redirect_qp;
258
__be32 redirect_qkey;
259
u8 trap_gid[16];
260
__be32 trap_tcslfl;
261
__be16 trap_lid;
262
__be16 trap_pkey;
263
__be32 trap_hlqp;
264
__be32 trap_qkey;
265
};
266
267
/**
268
* ib_get_cpi_resp_time - Returns the resp_time value from
269
* cap_mask2_resp_time in ib_class_port_info.
270
* @cpi: A struct ib_class_port_info mad.
271
*/
272
static inline u8 ib_get_cpi_resp_time(struct ib_class_port_info *cpi)
273
{
274
return (u8)(be32_to_cpu(cpi->cap_mask2_resp_time) &
275
IB_CLASS_PORT_INFO_RESP_TIME_MASK);
276
}
277
278
/**
279
* ib_set_cpi_resptime - Sets the response time in an
280
* ib_class_port_info mad.
281
* @cpi: A struct ib_class_port_info.
282
* @rtime: The response time to set.
283
*/
284
static inline void ib_set_cpi_resp_time(struct ib_class_port_info *cpi,
285
u8 rtime)
286
{
287
cpi->cap_mask2_resp_time =
288
(cpi->cap_mask2_resp_time &
289
cpu_to_be32(~IB_CLASS_PORT_INFO_RESP_TIME_MASK)) |
290
cpu_to_be32(rtime & IB_CLASS_PORT_INFO_RESP_TIME_MASK);
291
}
292
293
/**
294
* ib_get_cpi_capmask2 - Returns the capmask2 value from
295
* cap_mask2_resp_time in ib_class_port_info.
296
* @cpi: A struct ib_class_port_info mad.
297
*/
298
static inline u32 ib_get_cpi_capmask2(struct ib_class_port_info *cpi)
299
{
300
return (be32_to_cpu(cpi->cap_mask2_resp_time) >>
301
IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE);
302
}
303
304
/**
305
* ib_set_cpi_capmask2 - Sets the capmask2 in an
306
* ib_class_port_info mad.
307
* @cpi: A struct ib_class_port_info.
308
* @capmask2: The capmask2 to set.
309
*/
310
static inline void ib_set_cpi_capmask2(struct ib_class_port_info *cpi,
311
u32 capmask2)
312
{
313
cpi->cap_mask2_resp_time =
314
(cpi->cap_mask2_resp_time &
315
cpu_to_be32(IB_CLASS_PORT_INFO_RESP_TIME_MASK)) |
316
cpu_to_be32(capmask2 <<
317
IB_CLASS_PORT_INFO_RESP_TIME_FIELD_SIZE);
318
}
319
320
struct ib_mad_notice_attr {
321
u8 generic_type;
322
u8 prod_type_msb;
323
__be16 prod_type_lsb;
324
__be16 trap_num;
325
__be16 issuer_lid;
326
__be16 toggle_count;
327
328
union {
329
struct {
330
u8 details[54];
331
} raw_data;
332
333
struct {
334
__be16 reserved;
335
__be16 lid; /* where violation happened */
336
u8 port_num; /* where violation happened */
337
} __packed ntc_129_131;
338
339
struct {
340
__be16 reserved;
341
__be16 lid; /* LID where change occurred */
342
u8 reserved2;
343
u8 local_changes; /* low bit - local changes */
344
__be32 new_cap_mask; /* new capability mask */
345
u8 reserved3;
346
u8 change_flags; /* low 3 bits only */
347
} __packed ntc_144;
348
349
struct {
350
__be16 reserved;
351
__be16 lid; /* lid where sys guid changed */
352
__be16 reserved2;
353
__be64 new_sys_guid;
354
} __packed ntc_145;
355
356
struct {
357
__be16 reserved;
358
__be16 lid;
359
__be16 dr_slid;
360
u8 method;
361
u8 reserved2;
362
__be16 attr_id;
363
__be32 attr_mod;
364
__be64 mkey;
365
u8 reserved3;
366
u8 dr_trunc_hop;
367
u8 dr_rtn_path[30];
368
} __packed ntc_256;
369
370
struct {
371
__be16 reserved;
372
__be16 lid1;
373
__be16 lid2;
374
__be32 key;
375
__be32 sl_qp1; /* SL: high 4 bits */
376
__be32 qp2; /* high 8 bits reserved */
377
union ib_gid gid1;
378
union ib_gid gid2;
379
} __packed ntc_257_258;
380
381
} details;
382
};
383
384
/**
385
* ib_mad_send_buf - MAD data buffer and work request for sends.
386
* @next: A pointer used to chain together MADs for posting.
387
* @mad: References an allocated MAD data buffer for MADs that do not have
388
* RMPP active. For MADs using RMPP, references the common and management
389
* class specific headers.
390
* @mad_agent: MAD agent that allocated the buffer.
391
* @ah: The address handle to use when sending the MAD.
392
* @context: User-controlled context fields.
393
* @hdr_len: Indicates the size of the data header of the MAD. This length
394
* includes the common MAD, RMPP, and class specific headers.
395
* @data_len: Indicates the total size of user-transferred data.
396
* @seg_count: The number of RMPP segments allocated for this send.
397
* @seg_size: Size of the data in each RMPP segment. This does not include
398
* class specific headers.
399
* @seg_rmpp_size: Size of each RMPP segment including the class specific
400
* headers.
401
* @timeout_ms: Time to wait for a response.
402
* @retries: Number of times to retry a request for a response. For MADs
403
* using RMPP, this applies per window. On completion, returns the number
404
* of retries needed to complete the transfer.
405
*
406
* Users are responsible for initializing the MAD buffer itself, with the
407
* exception of any RMPP header. Additional segment buffer space allocated
408
* beyond data_len is padding.
409
*/
410
struct ib_mad_send_buf {
411
struct ib_mad_send_buf *next;
412
void *mad;
413
struct ib_mad_agent *mad_agent;
414
struct ib_ah *ah;
415
void *context[2];
416
int hdr_len;
417
int data_len;
418
int seg_count;
419
int seg_size;
420
int seg_rmpp_size;
421
int timeout_ms;
422
int retries;
423
};
424
425
/**
426
* ib_response_mad - Returns if the specified MAD has been generated in
427
* response to a sent request or trap.
428
*/
429
int ib_response_mad(const struct ib_mad_hdr *hdr);
430
431
/**
432
* ib_get_rmpp_resptime - Returns the RMPP response time.
433
* @rmpp_hdr: An RMPP header.
434
*/
435
static inline u8 ib_get_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr)
436
{
437
return rmpp_hdr->rmpp_rtime_flags >> 3;
438
}
439
440
/**
441
* ib_get_rmpp_flags - Returns the RMPP flags.
442
* @rmpp_hdr: An RMPP header.
443
*/
444
static inline u8 ib_get_rmpp_flags(const struct ib_rmpp_hdr *rmpp_hdr)
445
{
446
return rmpp_hdr->rmpp_rtime_flags & 0x7;
447
}
448
449
/**
450
* ib_set_rmpp_resptime - Sets the response time in an RMPP header.
451
* @rmpp_hdr: An RMPP header.
452
* @rtime: The response time to set.
453
*/
454
static inline void ib_set_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr, u8 rtime)
455
{
456
rmpp_hdr->rmpp_rtime_flags = ib_get_rmpp_flags(rmpp_hdr) | (rtime << 3);
457
}
458
459
/**
460
* ib_set_rmpp_flags - Sets the flags in an RMPP header.
461
* @rmpp_hdr: An RMPP header.
462
* @flags: The flags to set.
463
*/
464
static inline void ib_set_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr, u8 flags)
465
{
466
rmpp_hdr->rmpp_rtime_flags = (rmpp_hdr->rmpp_rtime_flags & 0xF8) |
467
(flags & 0x7);
468
}
469
470
struct ib_mad_agent;
471
struct ib_mad_send_wc;
472
struct ib_mad_recv_wc;
473
474
/**
475
* ib_mad_send_handler - callback handler for a sent MAD.
476
* @mad_agent: MAD agent that sent the MAD.
477
* @mad_send_wc: Send work completion information on the sent MAD.
478
*/
479
typedef void (*ib_mad_send_handler)(struct ib_mad_agent *mad_agent,
480
struct ib_mad_send_wc *mad_send_wc);
481
482
/**
483
* ib_mad_snoop_handler - Callback handler for snooping sent MADs.
484
* @mad_agent: MAD agent that snooped the MAD.
485
* @send_buf: send MAD data buffer.
486
* @mad_send_wc: Work completion information on the sent MAD. Valid
487
* only for snooping that occurs on a send completion.
488
*
489
* Clients snooping MADs should not modify data referenced by the @send_buf
490
* or @mad_send_wc.
491
*/
492
typedef void (*ib_mad_snoop_handler)(struct ib_mad_agent *mad_agent,
493
struct ib_mad_send_buf *send_buf,
494
struct ib_mad_send_wc *mad_send_wc);
495
496
/**
497
* ib_mad_recv_handler - callback handler for a received MAD.
498
* @mad_agent: MAD agent requesting the received MAD.
499
* @send_buf: Send buffer if found, else NULL
500
* @mad_recv_wc: Received work completion information on the received MAD.
501
*
502
* MADs received in response to a send request operation will be handed to
503
* the user before the send operation completes. All data buffers given
504
* to registered agents through this routine are owned by the receiving
505
* client, except for snooping agents. Clients snooping MADs should not
506
* modify the data referenced by @mad_recv_wc.
507
*/
508
typedef void (*ib_mad_recv_handler)(struct ib_mad_agent *mad_agent,
509
struct ib_mad_send_buf *send_buf,
510
struct ib_mad_recv_wc *mad_recv_wc);
511
512
/**
513
* ib_mad_agent - Used to track MAD registration with the access layer.
514
* @device: Reference to device registration is on.
515
* @qp: Reference to QP used for sending and receiving MADs.
516
* @mr: Memory region for system memory usable for DMA.
517
* @recv_handler: Callback handler for a received MAD.
518
* @send_handler: Callback handler for a sent MAD.
519
* @snoop_handler: Callback handler for snooped sent MADs.
520
* @context: User-specified context associated with this registration.
521
* @hi_tid: Access layer assigned transaction ID for this client.
522
* Unsolicited MADs sent by this client will have the upper 32-bits
523
* of their TID set to this value.
524
* @flags: registration flags
525
* @port_num: Port number on which QP is registered
526
* @rmpp_version: If set, indicates the RMPP version used by this agent.
527
*/
528
enum {
529
IB_MAD_USER_RMPP = IB_USER_MAD_USER_RMPP,
530
};
531
struct ib_mad_agent {
532
struct ib_device *device;
533
struct ib_qp *qp;
534
ib_mad_recv_handler recv_handler;
535
ib_mad_send_handler send_handler;
536
ib_mad_snoop_handler snoop_handler;
537
void *context;
538
u32 hi_tid;
539
u32 flags;
540
u8 port_num;
541
u8 rmpp_version;
542
};
543
544
/**
545
* ib_mad_send_wc - MAD send completion information.
546
* @send_buf: Send MAD data buffer associated with the send MAD request.
547
* @status: Completion status.
548
* @vendor_err: Optional vendor error information returned with a failed
549
* request.
550
*/
551
struct ib_mad_send_wc {
552
struct ib_mad_send_buf *send_buf;
553
enum ib_wc_status status;
554
u32 vendor_err;
555
};
556
557
/**
558
* ib_mad_recv_buf - received MAD buffer information.
559
* @list: Reference to next data buffer for a received RMPP MAD.
560
* @grh: References a data buffer containing the global route header.
561
* The data refereced by this buffer is only valid if the GRH is
562
* valid.
563
* @mad: References the start of the received MAD.
564
*/
565
struct ib_mad_recv_buf {
566
struct list_head list;
567
struct ib_grh *grh;
568
union {
569
struct ib_mad *mad;
570
struct opa_mad *opa_mad;
571
};
572
};
573
574
/**
575
* ib_mad_recv_wc - received MAD information.
576
* @wc: Completion information for the received data.
577
* @recv_buf: Specifies the location of the received data buffer(s).
578
* @rmpp_list: Specifies a list of RMPP reassembled received MAD buffers.
579
* @mad_len: The length of the received MAD, without duplicated headers.
580
* @mad_seg_size: The size of individual MAD segments
581
*
582
* For received response, the wr_id contains a pointer to the ib_mad_send_buf
583
* for the corresponding send request.
584
*/
585
struct ib_mad_recv_wc {
586
struct ib_wc *wc;
587
struct ib_mad_recv_buf recv_buf;
588
struct list_head rmpp_list;
589
int mad_len;
590
size_t mad_seg_size;
591
};
592
593
/**
594
* ib_mad_reg_req - MAD registration request
595
* @mgmt_class: Indicates which management class of MADs should be receive
596
* by the caller. This field is only required if the user wishes to
597
* receive unsolicited MADs, otherwise it should be 0.
598
* @mgmt_class_version: Indicates which version of MADs for the given
599
* management class to receive.
600
* @oui: Indicates IEEE OUI when mgmt_class is a vendor class
601
* in the range from 0x30 to 0x4f. Otherwise not used.
602
* @method_mask: The caller will receive unsolicited MADs for any method
603
* where @method_mask = 1.
604
*
605
*/
606
struct ib_mad_reg_req {
607
u8 mgmt_class;
608
u8 mgmt_class_version;
609
u8 oui[3];
610
DECLARE_BITMAP(method_mask, IB_MGMT_MAX_METHODS);
611
};
612
613
/**
614
* ib_register_mad_agent - Register to send/receive MADs.
615
* @device: The device to register with.
616
* @port_num: The port on the specified device to use.
617
* @qp_type: Specifies which QP to access. Must be either
618
* IB_QPT_SMI or IB_QPT_GSI.
619
* @mad_reg_req: Specifies which unsolicited MADs should be received
620
* by the caller. This parameter may be NULL if the caller only
621
* wishes to receive solicited responses.
622
* @rmpp_version: If set, indicates that the client will send
623
* and receive MADs that contain the RMPP header for the given version.
624
* If set to 0, indicates that RMPP is not used by this client.
625
* @send_handler: The completion callback routine invoked after a send
626
* request has completed.
627
* @recv_handler: The completion callback routine invoked for a received
628
* MAD.
629
* @context: User specified context associated with the registration.
630
* @registration_flags: Registration flags to set for this agent
631
*/
632
struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
633
u8 port_num,
634
enum ib_qp_type qp_type,
635
struct ib_mad_reg_req *mad_reg_req,
636
u8 rmpp_version,
637
ib_mad_send_handler send_handler,
638
ib_mad_recv_handler recv_handler,
639
void *context,
640
u32 registration_flags);
641
642
enum ib_mad_snoop_flags {
643
/*IB_MAD_SNOOP_POSTED_SENDS = 1,*/
644
/*IB_MAD_SNOOP_RMPP_SENDS = (1<<1),*/
645
IB_MAD_SNOOP_SEND_COMPLETIONS = (1<<2),
646
/*IB_MAD_SNOOP_RMPP_SEND_COMPLETIONS = (1<<3),*/
647
IB_MAD_SNOOP_RECVS = (1<<4)
648
/*IB_MAD_SNOOP_RMPP_RECVS = (1<<5),*/
649
/*IB_MAD_SNOOP_REDIRECTED_QPS = (1<<6)*/
650
};
651
652
/**
653
* ib_register_mad_snoop - Register to snoop sent and received MADs.
654
* @device: The device to register with.
655
* @port_num: The port on the specified device to use.
656
* @qp_type: Specifies which QP traffic to snoop. Must be either
657
* IB_QPT_SMI or IB_QPT_GSI.
658
* @mad_snoop_flags: Specifies information where snooping occurs.
659
* @send_handler: The callback routine invoked for a snooped send.
660
* @recv_handler: The callback routine invoked for a snooped receive.
661
* @context: User specified context associated with the registration.
662
*/
663
struct ib_mad_agent *ib_register_mad_snoop(struct ib_device *device,
664
u8 port_num,
665
enum ib_qp_type qp_type,
666
int mad_snoop_flags,
667
ib_mad_snoop_handler snoop_handler,
668
ib_mad_recv_handler recv_handler,
669
void *context);
670
671
/**
672
* ib_unregister_mad_agent - Unregisters a client from using MAD services.
673
* @mad_agent: Corresponding MAD registration request to deregister.
674
*
675
* After invoking this routine, MAD services are no longer usable by the
676
* client on the associated QP.
677
*/
678
int ib_unregister_mad_agent(struct ib_mad_agent *mad_agent);
679
680
/**
681
* ib_post_send_mad - Posts MAD(s) to the send queue of the QP associated
682
* with the registered client.
683
* @send_buf: Specifies the information needed to send the MAD(s).
684
* @bad_send_buf: Specifies the MAD on which an error was encountered. This
685
* parameter is optional if only a single MAD is posted.
686
*
687
* Sent MADs are not guaranteed to complete in the order that they were posted.
688
*
689
* If the MAD requires RMPP, the data buffer should contain a single copy
690
* of the common MAD, RMPP, and class specific headers, followed by the class
691
* defined data. If the class defined data would not divide evenly into
692
* RMPP segments, then space must be allocated at the end of the referenced
693
* buffer for any required padding. To indicate the amount of class defined
694
* data being transferred, the paylen_newwin field in the RMPP header should
695
* be set to the size of the class specific header plus the amount of class
696
* defined data being transferred. The paylen_newwin field should be
697
* specified in network-byte order.
698
*/
699
int ib_post_send_mad(struct ib_mad_send_buf *send_buf,
700
struct ib_mad_send_buf **bad_send_buf);
701
702
703
/**
704
* ib_free_recv_mad - Returns data buffers used to receive a MAD.
705
* @mad_recv_wc: Work completion information for a received MAD.
706
*
707
* Clients receiving MADs through their ib_mad_recv_handler must call this
708
* routine to return the work completion buffers to the access layer.
709
*/
710
void ib_free_recv_mad(struct ib_mad_recv_wc *mad_recv_wc);
711
712
/**
713
* ib_cancel_mad - Cancels an outstanding send MAD operation.
714
* @mad_agent: Specifies the registration associated with sent MAD.
715
* @send_buf: Indicates the MAD to cancel.
716
*
717
* MADs will be returned to the user through the corresponding
718
* ib_mad_send_handler.
719
*/
720
void ib_cancel_mad(struct ib_mad_agent *mad_agent,
721
struct ib_mad_send_buf *send_buf);
722
723
/**
724
* ib_modify_mad - Modifies an outstanding send MAD operation.
725
* @mad_agent: Specifies the registration associated with sent MAD.
726
* @send_buf: Indicates the MAD to modify.
727
* @timeout_ms: New timeout value for sent MAD.
728
*
729
* This call will reset the timeout value for a sent MAD to the specified
730
* value.
731
*/
732
int ib_modify_mad(struct ib_mad_agent *mad_agent,
733
struct ib_mad_send_buf *send_buf, u32 timeout_ms);
734
735
/**
736
* ib_redirect_mad_qp - Registers a QP for MAD services.
737
* @qp: Reference to a QP that requires MAD services.
738
* @rmpp_version: If set, indicates that the client will send
739
* and receive MADs that contain the RMPP header for the given version.
740
* If set to 0, indicates that RMPP is not used by this client.
741
* @send_handler: The completion callback routine invoked after a send
742
* request has completed.
743
* @recv_handler: The completion callback routine invoked for a received
744
* MAD.
745
* @context: User specified context associated with the registration.
746
*
747
* Use of this call allows clients to use MAD services, such as RMPP,
748
* on user-owned QPs. After calling this routine, users may send
749
* MADs on the specified QP by calling ib_mad_post_send.
750
*/
751
struct ib_mad_agent *ib_redirect_mad_qp(struct ib_qp *qp,
752
u8 rmpp_version,
753
ib_mad_send_handler send_handler,
754
ib_mad_recv_handler recv_handler,
755
void *context);
756
757
/**
758
* ib_process_mad_wc - Processes a work completion associated with a
759
* MAD sent or received on a redirected QP.
760
* @mad_agent: Specifies the registered MAD service using the redirected QP.
761
* @wc: References a work completion associated with a sent or received
762
* MAD segment.
763
*
764
* This routine is used to complete or continue processing on a MAD request.
765
* If the work completion is associated with a send operation, calling
766
* this routine is required to continue an RMPP transfer or to wait for a
767
* corresponding response, if it is a request. If the work completion is
768
* associated with a receive operation, calling this routine is required to
769
* process an inbound or outbound RMPP transfer, or to match a response MAD
770
* with its corresponding request.
771
*/
772
int ib_process_mad_wc(struct ib_mad_agent *mad_agent,
773
struct ib_wc *wc);
774
775
/**
776
* ib_create_send_mad - Allocate and initialize a data buffer and work request
777
* for sending a MAD.
778
* @mad_agent: Specifies the registered MAD service to associate with the MAD.
779
* @remote_qpn: Specifies the QPN of the receiving node.
780
* @pkey_index: Specifies which PKey the MAD will be sent using. This field
781
* is valid only if the remote_qpn is QP 1.
782
* @rmpp_active: Indicates if the send will enable RMPP.
783
* @hdr_len: Indicates the size of the data header of the MAD. This length
784
* should include the common MAD header, RMPP header, plus any class
785
* specific header.
786
* @data_len: Indicates the size of any user-transferred data. The call will
787
* automatically adjust the allocated buffer size to account for any
788
* additional padding that may be necessary.
789
* @gfp_mask: GFP mask used for the memory allocation.
790
* @base_version: Base Version of this MAD
791
*
792
* This routine allocates a MAD for sending. The returned MAD send buffer
793
* will reference a data buffer usable for sending a MAD, along
794
* with an initialized work request structure. Users may modify the returned
795
* MAD data buffer before posting the send.
796
*
797
* The returned MAD header, class specific headers, and any padding will be
798
* cleared. Users are responsible for initializing the common MAD header,
799
* any class specific header, and MAD data area.
800
* If @rmpp_active is set, the RMPP header will be initialized for sending.
801
*/
802
struct ib_mad_send_buf *ib_create_send_mad(struct ib_mad_agent *mad_agent,
803
u32 remote_qpn, u16 pkey_index,
804
int rmpp_active,
805
int hdr_len, int data_len,
806
gfp_t gfp_mask,
807
u8 base_version);
808
809
/**
810
* ib_is_mad_class_rmpp - returns whether given management class
811
* supports RMPP.
812
* @mgmt_class: management class
813
*
814
* This routine returns whether the management class supports RMPP.
815
*/
816
int ib_is_mad_class_rmpp(u8 mgmt_class);
817
818
/**
819
* ib_get_mad_data_offset - returns the data offset for a given
820
* management class.
821
* @mgmt_class: management class
822
*
823
* This routine returns the data offset in the MAD for the management
824
* class requested.
825
*/
826
int ib_get_mad_data_offset(u8 mgmt_class);
827
828
/**
829
* ib_get_rmpp_segment - returns the data buffer for a given RMPP segment.
830
* @send_buf: Previously allocated send data buffer.
831
* @seg_num: number of segment to return
832
*
833
* This routine returns a pointer to the data buffer of an RMPP MAD.
834
* Users must provide synchronization to @send_buf around this call.
835
*/
836
void *ib_get_rmpp_segment(struct ib_mad_send_buf *send_buf, int seg_num);
837
838
/**
839
* ib_free_send_mad - Returns data buffers used to send a MAD.
840
* @send_buf: Previously allocated send data buffer.
841
*/
842
void ib_free_send_mad(struct ib_mad_send_buf *send_buf);
843
844
/**
845
* ib_mad_kernel_rmpp_agent - Returns if the agent is performing RMPP.
846
* @agent: the agent in question
847
* @return: true if agent is performing rmpp, false otherwise.
848
*/
849
int ib_mad_kernel_rmpp_agent(const struct ib_mad_agent *agent);
850
851
#endif /* IB_MAD_H */
852
853