OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [include/] [rdma/] [ib_mad.h] - Blame information for rev 62

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
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
 * $Id: ib_mad.h 5596 2006-03-03 01:00:07Z sean.hefty $
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
 
46
/* Management base version */
47
#define IB_MGMT_BASE_VERSION                    1
48
 
49
/* Management classes */
50
#define IB_MGMT_CLASS_SUBN_LID_ROUTED           0x01
51
#define IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE       0x81
52
#define IB_MGMT_CLASS_SUBN_ADM                  0x03
53
#define IB_MGMT_CLASS_PERF_MGMT                 0x04
54
#define IB_MGMT_CLASS_BM                        0x05
55
#define IB_MGMT_CLASS_DEVICE_MGMT               0x06
56
#define IB_MGMT_CLASS_CM                        0x07
57
#define IB_MGMT_CLASS_SNMP                      0x08
58
#define IB_MGMT_CLASS_DEVICE_ADM                0x10
59
#define IB_MGMT_CLASS_BOOT_MGMT                 0x11
60
#define IB_MGMT_CLASS_BIS                       0x12
61
#define IB_MGMT_CLASS_CONG_MGMT                 0x21
62
#define IB_MGMT_CLASS_VENDOR_RANGE2_START       0x30
63
#define IB_MGMT_CLASS_VENDOR_RANGE2_END         0x4F
64
 
65
#define IB_OPENIB_OUI                           (0x001405)
66
 
67
/* Management methods */
68
#define IB_MGMT_METHOD_GET                      0x01
69
#define IB_MGMT_METHOD_SET                      0x02
70
#define IB_MGMT_METHOD_GET_RESP                 0x81
71
#define IB_MGMT_METHOD_SEND                     0x03
72
#define IB_MGMT_METHOD_TRAP                     0x05
73
#define IB_MGMT_METHOD_REPORT                   0x06
74
#define IB_MGMT_METHOD_REPORT_RESP              0x86
75
#define IB_MGMT_METHOD_TRAP_REPRESS             0x07
76
 
77
#define IB_MGMT_METHOD_RESP                     0x80
78
#define IB_BM_ATTR_MOD_RESP                     cpu_to_be32(1)
79
 
80
#define IB_MGMT_MAX_METHODS                     128
81
 
82
/* RMPP information */
83
#define IB_MGMT_RMPP_VERSION                    1
84
 
85
#define IB_MGMT_RMPP_TYPE_DATA                  1
86
#define IB_MGMT_RMPP_TYPE_ACK                   2
87
#define IB_MGMT_RMPP_TYPE_STOP                  3
88
#define IB_MGMT_RMPP_TYPE_ABORT                 4
89
 
90
#define IB_MGMT_RMPP_FLAG_ACTIVE                1
91
#define IB_MGMT_RMPP_FLAG_FIRST                 (1<<1)
92
#define IB_MGMT_RMPP_FLAG_LAST                  (1<<2)
93
 
94
#define IB_MGMT_RMPP_NO_RESPTIME                0x1F
95
 
96
#define IB_MGMT_RMPP_STATUS_SUCCESS             0
97
#define IB_MGMT_RMPP_STATUS_RESX                1
98
#define IB_MGMT_RMPP_STATUS_ABORT_MIN           118
99
#define IB_MGMT_RMPP_STATUS_T2L                 118
100
#define IB_MGMT_RMPP_STATUS_BAD_LEN             119
101
#define IB_MGMT_RMPP_STATUS_BAD_SEG             120
102
#define IB_MGMT_RMPP_STATUS_BADT                121
103
#define IB_MGMT_RMPP_STATUS_W2S                 122
104
#define IB_MGMT_RMPP_STATUS_S2B                 123
105
#define IB_MGMT_RMPP_STATUS_BAD_STATUS          124
106
#define IB_MGMT_RMPP_STATUS_UNV                 125
107
#define IB_MGMT_RMPP_STATUS_TMR                 126
108
#define IB_MGMT_RMPP_STATUS_UNSPEC              127
109
#define IB_MGMT_RMPP_STATUS_ABORT_MAX           127
110
 
111
#define IB_QP0          0
112
#define IB_QP1          __constant_htonl(1)
113
#define IB_QP1_QKEY     0x80010000
114
#define IB_QP_SET_QKEY  0x80000000
115
 
116
#define IB_DEFAULT_PKEY_PARTIAL 0x7FFF
117
#define IB_DEFAULT_PKEY_FULL    0xFFFF
118
 
119
enum {
120
        IB_MGMT_MAD_HDR = 24,
121
        IB_MGMT_MAD_DATA = 232,
122
        IB_MGMT_RMPP_HDR = 36,
123
        IB_MGMT_RMPP_DATA = 220,
124
        IB_MGMT_VENDOR_HDR = 40,
125
        IB_MGMT_VENDOR_DATA = 216,
126
        IB_MGMT_SA_HDR = 56,
127
        IB_MGMT_SA_DATA = 200,
128
        IB_MGMT_DEVICE_HDR = 64,
129
        IB_MGMT_DEVICE_DATA = 192,
130
};
131
 
132
struct ib_mad_hdr {
133
        u8      base_version;
134
        u8      mgmt_class;
135
        u8      class_version;
136
        u8      method;
137
        __be16  status;
138
        __be16  class_specific;
139
        __be64  tid;
140
        __be16  attr_id;
141
        __be16  resv;
142
        __be32  attr_mod;
143
};
144
 
145
struct ib_rmpp_hdr {
146
        u8      rmpp_version;
147
        u8      rmpp_type;
148
        u8      rmpp_rtime_flags;
149
        u8      rmpp_status;
150
        __be32  seg_num;
151
        __be32  paylen_newwin;
152
};
153
 
154
typedef u64 __bitwise ib_sa_comp_mask;
155
 
156
#define IB_SA_COMP_MASK(n) ((__force ib_sa_comp_mask) cpu_to_be64(1ull << n))
157
 
158
/*
159
 * ib_sa_hdr and ib_sa_mad structures must be packed because they have
160
 * 64-bit fields that are only 32-bit aligned. 64-bit architectures will
161
 * lay them out wrong otherwise.  (And unfortunately they are sent on
162
 * the wire so we can't change the layout)
163
 */
164
struct ib_sa_hdr {
165
        __be64                  sm_key;
166
        __be16                  attr_offset;
167
        __be16                  reserved;
168
        ib_sa_comp_mask         comp_mask;
169
} __attribute__ ((packed));
170
 
171
struct ib_mad {
172
        struct ib_mad_hdr       mad_hdr;
173
        u8                      data[IB_MGMT_MAD_DATA];
174
};
175
 
176
struct ib_rmpp_mad {
177
        struct ib_mad_hdr       mad_hdr;
178
        struct ib_rmpp_hdr      rmpp_hdr;
179
        u8                      data[IB_MGMT_RMPP_DATA];
180
};
181
 
182
struct ib_sa_mad {
183
        struct ib_mad_hdr       mad_hdr;
184
        struct ib_rmpp_hdr      rmpp_hdr;
185
        struct ib_sa_hdr        sa_hdr;
186
        u8                      data[IB_MGMT_SA_DATA];
187
} __attribute__ ((packed));
188
 
189
struct ib_vendor_mad {
190
        struct ib_mad_hdr       mad_hdr;
191
        struct ib_rmpp_hdr      rmpp_hdr;
192
        u8                      reserved;
193
        u8                      oui[3];
194
        u8                      data[IB_MGMT_VENDOR_DATA];
195
};
196
 
197
struct ib_class_port_info
198
{
199
        u8                      base_version;
200
        u8                      class_version;
201
        __be16                  capability_mask;
202
        u8                      reserved[3];
203
        u8                      resp_time_value;
204
        u8                      redirect_gid[16];
205
        __be32                  redirect_tcslfl;
206
        __be16                  redirect_lid;
207
        __be16                  redirect_pkey;
208
        __be32                  redirect_qp;
209
        __be32                  redirect_qkey;
210
        u8                      trap_gid[16];
211
        __be32                  trap_tcslfl;
212
        __be16                  trap_lid;
213
        __be16                  trap_pkey;
214
        __be32                  trap_hlqp;
215
        __be32                  trap_qkey;
216
};
217
 
218
/**
219
 * ib_mad_send_buf - MAD data buffer and work request for sends.
220
 * @next: A pointer used to chain together MADs for posting.
221
 * @mad: References an allocated MAD data buffer for MADs that do not have
222
 *   RMPP active.  For MADs using RMPP, references the common and management
223
 *   class specific headers.
224
 * @mad_agent: MAD agent that allocated the buffer.
225
 * @ah: The address handle to use when sending the MAD.
226
 * @context: User-controlled context fields.
227
 * @hdr_len: Indicates the size of the data header of the MAD.  This length
228
 *   includes the common MAD, RMPP, and class specific headers.
229
 * @data_len: Indicates the total size of user-transferred data.
230
 * @seg_count: The number of RMPP segments allocated for this send.
231
 * @seg_size: Size of each RMPP segment.
232
 * @timeout_ms: Time to wait for a response.
233
 * @retries: Number of times to retry a request for a response.
234
 *
235
 * Users are responsible for initializing the MAD buffer itself, with the
236
 * exception of any RMPP header.  Additional segment buffer space allocated
237
 * beyond data_len is padding.
238
 */
239
struct ib_mad_send_buf {
240
        struct ib_mad_send_buf  *next;
241
        void                    *mad;
242
        struct ib_mad_agent     *mad_agent;
243
        struct ib_ah            *ah;
244
        void                    *context[2];
245
        int                     hdr_len;
246
        int                     data_len;
247
        int                     seg_count;
248
        int                     seg_size;
249
        int                     timeout_ms;
250
        int                     retries;
251
};
252
 
253
/**
254
 * ib_response_mad - Returns if the specified MAD has been generated in
255
 *   response to a sent request or trap.
256
 */
257
int ib_response_mad(struct ib_mad *mad);
258
 
259
/**
260
 * ib_get_rmpp_resptime - Returns the RMPP response time.
261
 * @rmpp_hdr: An RMPP header.
262
 */
263
static inline u8 ib_get_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr)
264
{
265
        return rmpp_hdr->rmpp_rtime_flags >> 3;
266
}
267
 
268
/**
269
 * ib_get_rmpp_flags - Returns the RMPP flags.
270
 * @rmpp_hdr: An RMPP header.
271
 */
272
static inline u8 ib_get_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr)
273
{
274
        return rmpp_hdr->rmpp_rtime_flags & 0x7;
275
}
276
 
277
/**
278
 * ib_set_rmpp_resptime - Sets the response time in an RMPP header.
279
 * @rmpp_hdr: An RMPP header.
280
 * @rtime: The response time to set.
281
 */
282
static inline void ib_set_rmpp_resptime(struct ib_rmpp_hdr *rmpp_hdr, u8 rtime)
283
{
284
        rmpp_hdr->rmpp_rtime_flags = ib_get_rmpp_flags(rmpp_hdr) | (rtime << 3);
285
}
286
 
287
/**
288
 * ib_set_rmpp_flags - Sets the flags in an RMPP header.
289
 * @rmpp_hdr: An RMPP header.
290
 * @flags: The flags to set.
291
 */
292
static inline void ib_set_rmpp_flags(struct ib_rmpp_hdr *rmpp_hdr, u8 flags)
293
{
294
        rmpp_hdr->rmpp_rtime_flags = (rmpp_hdr->rmpp_rtime_flags & 0xF1) |
295
                                     (flags & 0x7);
296
}
297
 
298
struct ib_mad_agent;
299
struct ib_mad_send_wc;
300
struct ib_mad_recv_wc;
301
 
302
/**
303
 * ib_mad_send_handler - callback handler for a sent MAD.
304
 * @mad_agent: MAD agent that sent the MAD.
305
 * @mad_send_wc: Send work completion information on the sent MAD.
306
 */
307
typedef void (*ib_mad_send_handler)(struct ib_mad_agent *mad_agent,
308
                                    struct ib_mad_send_wc *mad_send_wc);
309
 
310
/**
311
 * ib_mad_snoop_handler - Callback handler for snooping sent MADs.
312
 * @mad_agent: MAD agent that snooped the MAD.
313
 * @send_wr: Work request information on the sent MAD.
314
 * @mad_send_wc: Work completion information on the sent MAD.  Valid
315
 *   only for snooping that occurs on a send completion.
316
 *
317
 * Clients snooping MADs should not modify data referenced by the @send_wr
318
 * or @mad_send_wc.
319
 */
320
typedef void (*ib_mad_snoop_handler)(struct ib_mad_agent *mad_agent,
321
                                     struct ib_mad_send_buf *send_buf,
322
                                     struct ib_mad_send_wc *mad_send_wc);
323
 
324
/**
325
 * ib_mad_recv_handler - callback handler for a received MAD.
326
 * @mad_agent: MAD agent requesting the received MAD.
327
 * @mad_recv_wc: Received work completion information on the received MAD.
328
 *
329
 * MADs received in response to a send request operation will be handed to
330
 * the user before the send operation completes.  All data buffers given
331
 * to registered agents through this routine are owned by the receiving
332
 * client, except for snooping agents.  Clients snooping MADs should not
333
 * modify the data referenced by @mad_recv_wc.
334
 */
335
typedef void (*ib_mad_recv_handler)(struct ib_mad_agent *mad_agent,
336
                                    struct ib_mad_recv_wc *mad_recv_wc);
337
 
338
/**
339
 * ib_mad_agent - Used to track MAD registration with the access layer.
340
 * @device: Reference to device registration is on.
341
 * @qp: Reference to QP used for sending and receiving MADs.
342
 * @mr: Memory region for system memory usable for DMA.
343
 * @recv_handler: Callback handler for a received MAD.
344
 * @send_handler: Callback handler for a sent MAD.
345
 * @snoop_handler: Callback handler for snooped sent MADs.
346
 * @context: User-specified context associated with this registration.
347
 * @hi_tid: Access layer assigned transaction ID for this client.
348
 *   Unsolicited MADs sent by this client will have the upper 32-bits
349
 *   of their TID set to this value.
350
 * @port_num: Port number on which QP is registered
351
 * @rmpp_version: If set, indicates the RMPP version used by this agent.
352
 */
353
struct ib_mad_agent {
354
        struct ib_device        *device;
355
        struct ib_qp            *qp;
356
        struct ib_mr            *mr;
357
        ib_mad_recv_handler     recv_handler;
358
        ib_mad_send_handler     send_handler;
359
        ib_mad_snoop_handler    snoop_handler;
360
        void                    *context;
361
        u32                     hi_tid;
362
        u8                      port_num;
363
        u8                      rmpp_version;
364
};
365
 
366
/**
367
 * ib_mad_send_wc - MAD send completion information.
368
 * @send_buf: Send MAD data buffer associated with the send MAD request.
369
 * @status: Completion status.
370
 * @vendor_err: Optional vendor error information returned with a failed
371
 *   request.
372
 */
373
struct ib_mad_send_wc {
374
        struct ib_mad_send_buf  *send_buf;
375
        enum ib_wc_status       status;
376
        u32                     vendor_err;
377
};
378
 
379
/**
380
 * ib_mad_recv_buf - received MAD buffer information.
381
 * @list: Reference to next data buffer for a received RMPP MAD.
382
 * @grh: References a data buffer containing the global route header.
383
 *   The data refereced by this buffer is only valid if the GRH is
384
 *   valid.
385
 * @mad: References the start of the received MAD.
386
 */
387
struct ib_mad_recv_buf {
388
        struct list_head        list;
389
        struct ib_grh           *grh;
390
        struct ib_mad           *mad;
391
};
392
 
393
/**
394
 * ib_mad_recv_wc - received MAD information.
395
 * @wc: Completion information for the received data.
396
 * @recv_buf: Specifies the location of the received data buffer(s).
397
 * @rmpp_list: Specifies a list of RMPP reassembled received MAD buffers.
398
 * @mad_len: The length of the received MAD, without duplicated headers.
399
 *
400
 * For received response, the wr_id contains a pointer to the ib_mad_send_buf
401
 *   for the corresponding send request.
402
 */
403
struct ib_mad_recv_wc {
404
        struct ib_wc            *wc;
405
        struct ib_mad_recv_buf  recv_buf;
406
        struct list_head        rmpp_list;
407
        int                     mad_len;
408
};
409
 
410
/**
411
 * ib_mad_reg_req - MAD registration request
412
 * @mgmt_class: Indicates which management class of MADs should be receive
413
 *   by the caller.  This field is only required if the user wishes to
414
 *   receive unsolicited MADs, otherwise it should be 0.
415
 * @mgmt_class_version: Indicates which version of MADs for the given
416
 *   management class to receive.
417
 * @oui: Indicates IEEE OUI when mgmt_class is a vendor class
418
 *   in the range from 0x30 to 0x4f. Otherwise not used.
419
 * @method_mask: The caller will receive unsolicited MADs for any method
420
 *   where @method_mask = 1.
421
 */
422
struct ib_mad_reg_req {
423
        u8      mgmt_class;
424
        u8      mgmt_class_version;
425
        u8      oui[3];
426
        DECLARE_BITMAP(method_mask, IB_MGMT_MAX_METHODS);
427
};
428
 
429
/**
430
 * ib_register_mad_agent - Register to send/receive MADs.
431
 * @device: The device to register with.
432
 * @port_num: The port on the specified device to use.
433
 * @qp_type: Specifies which QP to access.  Must be either
434
 *   IB_QPT_SMI or IB_QPT_GSI.
435
 * @mad_reg_req: Specifies which unsolicited MADs should be received
436
 *   by the caller.  This parameter may be NULL if the caller only
437
 *   wishes to receive solicited responses.
438
 * @rmpp_version: If set, indicates that the client will send
439
 *   and receive MADs that contain the RMPP header for the given version.
440
 *   If set to 0, indicates that RMPP is not used by this client.
441
 * @send_handler: The completion callback routine invoked after a send
442
 *   request has completed.
443
 * @recv_handler: The completion callback routine invoked for a received
444
 *   MAD.
445
 * @context: User specified context associated with the registration.
446
 */
447
struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
448
                                           u8 port_num,
449
                                           enum ib_qp_type qp_type,
450
                                           struct ib_mad_reg_req *mad_reg_req,
451
                                           u8 rmpp_version,
452
                                           ib_mad_send_handler send_handler,
453
                                           ib_mad_recv_handler recv_handler,
454
                                           void *context);
455
 
456
enum ib_mad_snoop_flags {
457
        /*IB_MAD_SNOOP_POSTED_SENDS        = 1,*/
458
        /*IB_MAD_SNOOP_RMPP_SENDS          = (1<<1),*/
459
        IB_MAD_SNOOP_SEND_COMPLETIONS      = (1<<2),
460
        /*IB_MAD_SNOOP_RMPP_SEND_COMPLETIONS = (1<<3),*/
461
        IB_MAD_SNOOP_RECVS                 = (1<<4)
462
        /*IB_MAD_SNOOP_RMPP_RECVS          = (1<<5),*/
463
        /*IB_MAD_SNOOP_REDIRECTED_QPS      = (1<<6)*/
464
};
465
 
466
/**
467
 * ib_register_mad_snoop - Register to snoop sent and received MADs.
468
 * @device: The device to register with.
469
 * @port_num: The port on the specified device to use.
470
 * @qp_type: Specifies which QP traffic to snoop.  Must be either
471
 *   IB_QPT_SMI or IB_QPT_GSI.
472
 * @mad_snoop_flags: Specifies information where snooping occurs.
473
 * @send_handler: The callback routine invoked for a snooped send.
474
 * @recv_handler: The callback routine invoked for a snooped receive.
475
 * @context: User specified context associated with the registration.
476
 */
477
struct ib_mad_agent *ib_register_mad_snoop(struct ib_device *device,
478
                                           u8 port_num,
479
                                           enum ib_qp_type qp_type,
480
                                           int mad_snoop_flags,
481
                                           ib_mad_snoop_handler snoop_handler,
482
                                           ib_mad_recv_handler recv_handler,
483
                                           void *context);
484
 
485
/**
486
 * ib_unregister_mad_agent - Unregisters a client from using MAD services.
487
 * @mad_agent: Corresponding MAD registration request to deregister.
488
 *
489
 * After invoking this routine, MAD services are no longer usable by the
490
 * client on the associated QP.
491
 */
492
int ib_unregister_mad_agent(struct ib_mad_agent *mad_agent);
493
 
494
/**
495
 * ib_post_send_mad - Posts MAD(s) to the send queue of the QP associated
496
 *   with the registered client.
497
 * @send_buf: Specifies the information needed to send the MAD(s).
498
 * @bad_send_buf: Specifies the MAD on which an error was encountered.  This
499
 *   parameter is optional if only a single MAD is posted.
500
 *
501
 * Sent MADs are not guaranteed to complete in the order that they were posted.
502
 *
503
 * If the MAD requires RMPP, the data buffer should contain a single copy
504
 * of the common MAD, RMPP, and class specific headers, followed by the class
505
 * defined data.  If the class defined data would not divide evenly into
506
 * RMPP segments, then space must be allocated at the end of the referenced
507
 * buffer for any required padding.  To indicate the amount of class defined
508
 * data being transferred, the paylen_newwin field in the RMPP header should
509
 * be set to the size of the class specific header plus the amount of class
510
 * defined data being transferred.  The paylen_newwin field should be
511
 * specified in network-byte order.
512
 */
513
int ib_post_send_mad(struct ib_mad_send_buf *send_buf,
514
                     struct ib_mad_send_buf **bad_send_buf);
515
 
516
 
517
/**
518
 * ib_free_recv_mad - Returns data buffers used to receive a MAD.
519
 * @mad_recv_wc: Work completion information for a received MAD.
520
 *
521
 * Clients receiving MADs through their ib_mad_recv_handler must call this
522
 * routine to return the work completion buffers to the access layer.
523
 */
524
void ib_free_recv_mad(struct ib_mad_recv_wc *mad_recv_wc);
525
 
526
/**
527
 * ib_cancel_mad - Cancels an outstanding send MAD operation.
528
 * @mad_agent: Specifies the registration associated with sent MAD.
529
 * @send_buf: Indicates the MAD to cancel.
530
 *
531
 * MADs will be returned to the user through the corresponding
532
 * ib_mad_send_handler.
533
 */
534
void ib_cancel_mad(struct ib_mad_agent *mad_agent,
535
                   struct ib_mad_send_buf *send_buf);
536
 
537
/**
538
 * ib_modify_mad - Modifies an outstanding send MAD operation.
539
 * @mad_agent: Specifies the registration associated with sent MAD.
540
 * @send_buf: Indicates the MAD to modify.
541
 * @timeout_ms: New timeout value for sent MAD.
542
 *
543
 * This call will reset the timeout value for a sent MAD to the specified
544
 * value.
545
 */
546
int ib_modify_mad(struct ib_mad_agent *mad_agent,
547
                  struct ib_mad_send_buf *send_buf, u32 timeout_ms);
548
 
549
/**
550
 * ib_redirect_mad_qp - Registers a QP for MAD services.
551
 * @qp: Reference to a QP that requires MAD services.
552
 * @rmpp_version: If set, indicates that the client will send
553
 *   and receive MADs that contain the RMPP header for the given version.
554
 *   If set to 0, indicates that RMPP is not used by this client.
555
 * @send_handler: The completion callback routine invoked after a send
556
 *   request has completed.
557
 * @recv_handler: The completion callback routine invoked for a received
558
 *   MAD.
559
 * @context: User specified context associated with the registration.
560
 *
561
 * Use of this call allows clients to use MAD services, such as RMPP,
562
 * on user-owned QPs.  After calling this routine, users may send
563
 * MADs on the specified QP by calling ib_mad_post_send.
564
 */
565
struct ib_mad_agent *ib_redirect_mad_qp(struct ib_qp *qp,
566
                                        u8 rmpp_version,
567
                                        ib_mad_send_handler send_handler,
568
                                        ib_mad_recv_handler recv_handler,
569
                                        void *context);
570
 
571
/**
572
 * ib_process_mad_wc - Processes a work completion associated with a
573
 *   MAD sent or received on a redirected QP.
574
 * @mad_agent: Specifies the registered MAD service using the redirected QP.
575
 * @wc: References a work completion associated with a sent or received
576
 *   MAD segment.
577
 *
578
 * This routine is used to complete or continue processing on a MAD request.
579
 * If the work completion is associated with a send operation, calling
580
 * this routine is required to continue an RMPP transfer or to wait for a
581
 * corresponding response, if it is a request.  If the work completion is
582
 * associated with a receive operation, calling this routine is required to
583
 * process an inbound or outbound RMPP transfer, or to match a response MAD
584
 * with its corresponding request.
585
 */
586
int ib_process_mad_wc(struct ib_mad_agent *mad_agent,
587
                      struct ib_wc *wc);
588
 
589
/**
590
 * ib_create_send_mad - Allocate and initialize a data buffer and work request
591
 *   for sending a MAD.
592
 * @mad_agent: Specifies the registered MAD service to associate with the MAD.
593
 * @remote_qpn: Specifies the QPN of the receiving node.
594
 * @pkey_index: Specifies which PKey the MAD will be sent using.  This field
595
 *   is valid only if the remote_qpn is QP 1.
596
 * @rmpp_active: Indicates if the send will enable RMPP.
597
 * @hdr_len: Indicates the size of the data header of the MAD.  This length
598
 *   should include the common MAD header, RMPP header, plus any class
599
 *   specific header.
600
 * @data_len: Indicates the size of any user-transferred data.  The call will
601
 *   automatically adjust the allocated buffer size to account for any
602
 *   additional padding that may be necessary.
603
 * @gfp_mask: GFP mask used for the memory allocation.
604
 *
605
 * This routine allocates a MAD for sending.  The returned MAD send buffer
606
 * will reference a data buffer usable for sending a MAD, along
607
 * with an initialized work request structure.  Users may modify the returned
608
 * MAD data buffer before posting the send.
609
 *
610
 * The returned MAD header, class specific headers, and any padding will be
611
 * cleared.  Users are responsible for initializing the common MAD header,
612
 * any class specific header, and MAD data area.
613
 * If @rmpp_active is set, the RMPP header will be initialized for sending.
614
 */
615
struct ib_mad_send_buf * ib_create_send_mad(struct ib_mad_agent *mad_agent,
616
                                            u32 remote_qpn, u16 pkey_index,
617
                                            int rmpp_active,
618
                                            int hdr_len, int data_len,
619
                                            gfp_t gfp_mask);
620
 
621
/**
622
 * ib_is_mad_class_rmpp - returns whether given management class
623
 * supports RMPP.
624
 * @mgmt_class: management class
625
 *
626
 * This routine returns whether the management class supports RMPP.
627
 */
628
int ib_is_mad_class_rmpp(u8 mgmt_class);
629
 
630
/**
631
 * ib_get_mad_data_offset - returns the data offset for a given
632
 * management class.
633
 * @mgmt_class: management class
634
 *
635
 * This routine returns the data offset in the MAD for the management
636
 * class requested.
637
 */
638
int ib_get_mad_data_offset(u8 mgmt_class);
639
 
640
/**
641
 * ib_get_rmpp_segment - returns the data buffer for a given RMPP segment.
642
 * @send_buf: Previously allocated send data buffer.
643
 * @seg_num: number of segment to return
644
 *
645
 * This routine returns a pointer to the data buffer of an RMPP MAD.
646
 * Users must provide synchronization to @send_buf around this call.
647
 */
648
void *ib_get_rmpp_segment(struct ib_mad_send_buf *send_buf, int seg_num);
649
 
650
/**
651
 * ib_free_send_mad - Returns data buffers used to send a MAD.
652
 * @send_buf: Previously allocated send data buffer.
653
 */
654
void ib_free_send_mad(struct ib_mad_send_buf *send_buf);
655
 
656
#endif /* IB_MAD_H */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.