xref: /illumos-gate/usr/src/uts/common/sys/ib/ibtl/ibti_common.h (revision 7a088f03b431bdffa96c3b2175964d4d38420caa)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef	_SYS_IB_IBTL_IBTI_COMMON_H
27 #define	_SYS_IB_IBTL_IBTI_COMMON_H
28 
29 /*
30  * ibti_common.h
31  *
32  * This file contains the shared/common transport data types and function
33  * prototypes.
34  */
35 #include <sys/ib/ibtl/ibtl_types.h>
36 #include <sys/ib/ibtl/ibti_cm.h>
37 #include <sys/isa_defs.h>
38 #include <sys/byteorder.h>
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 /*
45  * Max number of paths that can be requested in an ibt_get_paths() call,
46  * if IBT_PATH_PERF or IBT_PATH_AVAIL flag (ibt_path_flags_t) is set.
47  */
48 #define	IBT_MAX_SPECIAL_PATHS	2
49 
50 /*
51  * The name of DDI Event, generated when the properties of IOC device
52  * node properties were modified.
53  */
54 #define	IB_PROP_UPDATE_EVENT	"SUNW,IB:IB_PROP_UPDATE"
55 
56 
57 /* Transport Interface version */
58 typedef enum ibt_version_e {
59 	IBTI_V1 = 1,
60 	IBTI_V2 = 2,		/* FMR Support */
61 	IBTI_V3 = 3,
62 	IBTI_V_CURR = IBTI_V3
63 } ibt_version_t;
64 
65 /*
66  * Driver class type. Identifies a type of client driver so that
67  * "IBTF Policy" decisions can be made on a driver class basis.
68  * The last class should always be IBT_CLNT_NUM, and any new classes added
69  * must be defined before IBT_CLNT_NUM. The class values must be above 0.
70  * Any class values below or equal to 0 shall be invalid
71  */
72 typedef enum ibt_clnt_class_e {
73 	IBT_STORAGE_DEV = 0x1,	/* SCSI, FC, etc.. */
74 	IBT_NETWORK_DEV,	/* Network driver with associated client H/W */
75 	IBT_GENERIC_DEV,	/* Generic client H/W device driver */
76 	IBT_NETWORK,		/* Network driver with no associated */
77 				/* client H/W, e.g., IPoIB */
78 	IBT_GENERIC,		/* A generic IB driver not */
79 				/* associated with client H/W */
80 	IBT_USER,		/* A user application IBT interface driver */
81 	IBT_IBMA,		/* The IBMA Module */
82 	IBT_CM,			/* The CM Module */
83 	IBT_DM,			/* The DM Module */
84 	IBT_DM_AGENT,		/* DM Agent Module */
85 	IBT_CLASS_NUM		/* Place holder for class count */
86 } ibt_clnt_class_t;
87 
88 #define	IBT_TEST_DEV	999	/* Place holder for modules that test IBTL */
89 
90 #define	IBT_CLNT_DEVICE_CLASS(class)	((class) == IBT_STORAGE_DEV || \
91 					(class) == IBT_NETWORK_DEV || \
92 					(class) == IBT_GENERIC_DEV)
93 
94 #define	IBT_CLNT_GENERAL_CLASS(class)	((class) == IBT_NETWORK || \
95 					(class) == IBT_GENERIC || \
96 					(class) == IBT_DM_AGENT || \
97 					(class) == IBT_TEST_DEV || \
98 					(class) == IBT_USER)
99 
100 #define	IBT_CLNT_MGMT_CLASS(class)	((class) == IBT_IBMA || \
101 					(class) == IBT_CM || \
102 					(class) == IBT_DM)
103 
104 /*
105  * These are some special client classes which don't have a 'dip' hence have
106  * to be handled specially in ibt_attach, where we bypass the check for a valid
107  * dip if the client belongs to the class below.
108  */
109 #define	IBT_MISCMOD_CLIENTS(class)	((class) == IBT_IBMA || \
110 					(class) == IBT_CM || \
111 					(class) == IBT_DM || \
112 					(class) == IBT_DM_AGENT || \
113 					(class) == IBT_TEST_DEV)
114 
115 /*
116  * Event record & status returns for asynchronous events and errors.
117  */
118 typedef struct ibt_async_event_s {
119 	uint64_t		ev_fma_ena;		/* FMA Error data */
120 	ibt_channel_hdl_t	ev_chan_hdl;		/* Channel handle */
121 	ibt_cq_hdl_t		ev_cq_hdl;		/* CQ handle */
122 	ib_guid_t		ev_hca_guid;		/* HCA node GUID */
123 	ibt_srq_hdl_t		ev_srq_hdl;		/* SRQ handle */
124 	ibt_port_change_t	ev_port_flags;		/* Port Change flags */
125 	uint8_t			ev_port;		/* HCA port */
126 } ibt_async_event_t;
127 
128 /*
129  * IBT Client Callback function typedefs.
130  *
131  * ibt_async_handler_t
132  *	Pointer to an async event/error handler function.  This function is
133  *	called when an async event/error is detected on a HCA that is being
134  *	used by the IBT client driver that registered the function.
135  */
136 typedef void (*ibt_async_handler_t)(void *clnt_private,
137     ibt_hca_hdl_t hca_hdl, ibt_async_code_t code, ibt_async_event_t *event);
138 
139 /*
140  * IBT Client Memory Error Callback function typedefs.
141  *
142  * ibt_memory_handler_t
143  *	Pointer to an memory event/error handler function.
144  */
145 typedef void (*ibt_memory_handler_t)(void *clnt_private,
146     ibt_hca_hdl_t hca_hdl, ibt_mem_code_t code, ibt_mem_data_t *data);
147 
148 /*
149  * Define a client module information structure. All clients MUST
150  * define a global of type ibt_clnt_modinfo_t. A pointer to this global
151  * is passed into the IBTF by a client when calling ibt_attach().
152  * This struct must persist during the life of the client.
153  *
154  * The client's mi_async_handler is called when an async event/error is
155  * detected on a HCA that is being used by this client.
156  */
157 typedef struct ibt_clnt_modinfo_s {
158 	ibt_version_t		mi_ibt_version;		/* TI version */
159 	ibt_clnt_class_t	mi_clnt_class;		/* Type of client */
160 	ibt_async_handler_t	mi_async_handler;	/* Async Handler */
161 	ibt_memory_handler_t	mi_reserved;		/* Memory handler */
162 	char			*mi_clnt_name;		/* Client Name. */
163 } ibt_clnt_modinfo_t;
164 
165 
166 /*
167  * Definitions for use with ibt_register_subnet_notices()
168  */
169 typedef enum ibt_subnet_event_code_e {
170 	IBT_SM_EVENT_MCG_CREATED = 1,
171 	IBT_SM_EVENT_MCG_DELETED = 2,
172 	IBT_SM_EVENT_AVAILABLE	 = 3,
173 	IBT_SM_EVENT_UNAVAILABLE = 4,
174 	IBT_SM_EVENT_GID_AVAIL	 = 5,
175 	IBT_SM_EVENT_GID_UNAVAIL = 6
176 } ibt_subnet_event_code_t;
177 
178 typedef struct ibt_subnet_event_s {
179 	ib_gid_t sm_notice_gid;
180 } ibt_subnet_event_t;
181 
182 typedef void (*ibt_sm_notice_handler_t)(void *private, ib_gid_t gid,
183     ibt_subnet_event_code_t code, ibt_subnet_event_t *event);
184 
185 
186 /*
187  * MTU Request type.
188  */
189 typedef struct ibt_mtu_req_s {
190 	ib_mtu_t	r_mtu;		/* Requested MTU */
191 	ibt_selector_t	r_selector;	/* Qualifier for r_mtu */
192 } ibt_mtu_req_t;
193 
194 
195 /*
196  * Qflags, used by ibt_resize_queues().
197  */
198 typedef enum ibt_qflags_e {
199 	IBT_SEND_Q	= 1 << 0,	/* Op applies to the Send Q */
200 	IBT_RECV_Q	= 1 << 1	/* Op applies to the Recv Q */
201 } ibt_qflags_t;
202 
203 /*
204  * CQ priorities
205  * The IBTF will attempt to implement a coarse 3 level priority scheme
206  * (IBT_CQ_LOW, IBT_CQ_MEDIUM, IBT_CQ_HIGH) based on the class of client
207  * driver. The requested priority is not guaranteed. If a CI implementation
208  * has the ability to implement priority CQs, then the IBTF will take advantage
209  * of that when calling the CI to create a CQ by passing a priority indicator
210  * to the CI.
211  */
212 typedef enum ibt_cq_priority_e {
213 	IBT_CQ_DEFAULT		= 0x0,
214 	IBT_CQ_LOW		= 0x1,
215 	IBT_CQ_MEDIUM		= 0x2,
216 	IBT_CQ_HIGH		= 0x3,
217 	IBT_CQ_OPAQUE_1		= 0x4,
218 	IBT_CQ_OPAQUE_2		= 0x5,
219 	IBT_CQ_OPAQUE_3		= 0x6,
220 	IBT_CQ_OPAQUE_4		= 0x7,
221 	IBT_CQ_OPAQUE_5		= 0x8,
222 	IBT_CQ_OPAQUE_6		= 0x9,
223 	IBT_CQ_OPAQUE_7		= 0xA,
224 	IBT_CQ_OPAQUE_8		= 0xB,
225 	IBT_CQ_OPAQUE_9		= 0xC,
226 	IBT_CQ_OPAQUE_10	= 0xD,
227 	IBT_CQ_OPAQUE_11	= 0xE,
228 	IBT_CQ_OPAQUE_12	= 0xF,
229 	IBT_CQ_OPAQUE_13	= 0x10,
230 	IBT_CQ_OPAQUE_14	= 0x11,
231 	IBT_CQ_OPAQUE_15	= 0x12,
232 	IBT_CQ_OPAQUE_16	= 0x13
233 } ibt_cq_priority_t;
234 
235 /*
236  * Attributes when creating a Completion Queue Scheduling Handle.
237  */
238 typedef struct ibt_cq_sched_attr_s {
239 	ibt_cq_sched_flags_t	cqs_flags;
240 	ibt_cq_priority_t	cqs_priority;
241 	uint_t			cqs_load;
242 	ibt_sched_hdl_t		cqs_affinity_hdl;
243 } ibt_cq_sched_attr_t;
244 
245 
246 /*
247  * ibt_cq_handler_t
248  *	Pointer to a work request completion handler function.  This function
249  *	is called when a WR completes on a CQ that is being used by the IBTF
250  *	client driver that registered the function.
251  */
252 typedef void (*ibt_cq_handler_t)(ibt_cq_hdl_t ibt_cq, void *arg);
253 
254 /* default CQ handler ID */
255 #define	IBT_CQ_HID_DEFAULT	(1)
256 
257 /*
258  * Service Data and flags.
259  *	(IBTA Spec Release 1.1, Vol-1 Ref: 15.2.5.14.4)
260  *
261  * The ServiceData8.1 (sb_data8[0]) through ServiceData64.2 (sb_data64[1])
262  * components together constitutes a 64-byte area in which any data may be
263  * placed. It is intended to be a convenient way for a service to provide its
264  * clients with some initial data.
265  *
266  * In addition, this 64-byte area is formally divided into a total of 30
267  * components, 16 8-bit (uint8_t) components, then 8 16-bit (uint16_t)
268  * components, then 6 32-bit (uint32_t) components, then 2 64-bit (uint64_t)
269  * components,  thereby assigning ComponentMask bits (ibt_srv_data_flags_t) to
270  * variously-sized segments of the data. All data are in host endian format.
271  * This allows query operations (ibt_get_paths()) to be used which match
272  * parts of the Service Data, making it possible, for example, for
273  * service-specific parts of the ServiceData to serve as a binary-coded
274  * extension to the ServiceName for purposes of lookup.
275  */
276 typedef enum ibt_srv_data_flags_e {
277 	IBT_NO_SDATA	= 0,
278 
279 	IBT_SDATA8_0	= (1 << 0),
280 	IBT_SDATA8_1	= (1 << 1),
281 	IBT_SDATA8_2	= (1 << 2),
282 	IBT_SDATA8_3	= (1 << 3),
283 	IBT_SDATA8_4	= (1 << 4),
284 	IBT_SDATA8_5	= (1 << 5),
285 	IBT_SDATA8_6	= (1 << 6),
286 	IBT_SDATA8_7	= (1 << 7),
287 	IBT_SDATA8_8	= (1 << 8),
288 	IBT_SDATA8_9	= (1 << 9),
289 	IBT_SDATA8_10	= (1 << 10),
290 	IBT_SDATA8_11	= (1 << 11),
291 	IBT_SDATA8_12	= (1 << 12),
292 	IBT_SDATA8_13	= (1 << 13),
293 	IBT_SDATA8_14	= (1 << 14),
294 	IBT_SDATA8_15	= (1 << 15),
295 
296 	IBT_SDATA16_0	= (1 << 16),
297 	IBT_SDATA16_1	= (1 << 17),
298 	IBT_SDATA16_2	= (1 << 18),
299 	IBT_SDATA16_3	= (1 << 19),
300 	IBT_SDATA16_4	= (1 << 20),
301 	IBT_SDATA16_5	= (1 << 21),
302 	IBT_SDATA16_6	= (1 << 22),
303 	IBT_SDATA16_7	= (1 << 23),
304 
305 	IBT_SDATA32_0	= (1 << 24),
306 	IBT_SDATA32_1	= (1 << 25),
307 	IBT_SDATA32_2	= (1 << 26),
308 	IBT_SDATA32_3	= (1 << 27),
309 
310 	IBT_SDATA64_0	= (1 << 28),
311 	IBT_SDATA64_1	= (1 << 29),
312 
313 	IBT_SDATA_ALL	= 0x3FFFFFFF
314 } ibt_srv_data_flags_t;
315 
316 typedef struct ibt_srv_data_s {
317 	uint8_t		s_data8[16];	/* 8-bit service data fields. */
318 	uint16_t	s_data16[8];	/* 16-bit service data fields. */
319 	uint32_t	s_data32[4];	/* 32-bit service data fields. */
320 	uint64_t	s_data64[2];	/* 64-bit service data fields. */
321 } ibt_srv_data_t;
322 
323 /*
324  * Path flags, used in ibt_get_paths()
325  */
326 typedef enum ibt_path_flags_e {
327 	IBT_PATH_NO_FLAGS	= 0,
328 	IBT_PATH_APM		= 1 << 0,	/* APM is desired. */
329 	IBT_PATH_AVAIL		= 1 << 2,
330 	IBT_PATH_PERF		= 1 << 3,
331 	IBT_PATH_MULTI_SVC_DEST	= 1 << 4,	/* Multiple ServiceRecords */
332 	IBT_PATH_HOP		= 1 << 5,	/* pa_hop is specified. */
333 	IBT_PATH_PKEY		= 1 << 6	/* pa_pkey is specified. */
334 } ibt_path_flags_t;
335 
336 /*
337  * Path attributes.
338  *
339  * The ibt_path_attr_t structure is used to specify required attributes in a
340  * path from the requesting (source) node to a specified destination node.
341  * Attributes that are don't care should be set to NULL or '0'.
342  * A destination must be specified, where a destination can be defined as
343  * one of the following:
344  *
345  *	o Service Name
346  *	o Service ID (SID)
347  *	o Array of DGIDs.
348  *	o Service Name and Array of DGIDs.
349  */
350 typedef struct ibt_path_attr_s {
351 	ib_gid_t		*pa_dgids;	/* Array of DGIDs */
352 	ib_gid_t		pa_sgid;
353 	ib_guid_t		pa_hca_guid;
354 	char			*pa_sname;	/* ASCII Service name  */
355 						/* NULL Terminated */
356 	ib_svc_id_t		pa_sid;		/* Service ID */
357 	ibt_srv_data_flags_t	pa_sd_flags;	/* Service Data flags. */
358 	ibt_srv_data_t		pa_sdata;	/* Service Data */
359 	uint8_t			pa_hca_port_num;
360 	uint8_t			pa_num_dgids;	/* size of pa_dgids array */
361 	uint8_t			pa_sl:4;
362 	ibt_mtu_req_t		pa_mtu;
363 	ibt_srate_req_t		pa_srate;
364 	ibt_pkt_lt_req_t	pa_pkt_lt;	/* Packet Life Time Request */
365 	uint_t			pa_flow:20;
366 	uint8_t			pa_hop;		/* IBT_PATH_HOP */
367 	uint8_t			pa_tclass;
368 	ib_pkey_t		pa_pkey;	/* IBT_PATH_PKEY */
369 } ibt_path_attr_t;
370 
371 /*
372  * Path Information.
373  *
374  * The ibt_get_paths() performs SA Path record lookups to select a path(s) to
375  * a given destination(s), details of selected path(s) are returned in this
376  * structure.
377  *
378  * The ibt_path_info_t contains all the attributes of the best path(s), as
379  * as determined by IBTL, to the specified destination(s), including the
380  * local HCA and HCA port to use to access the fabric.
381  *
382  * The Service ID (pi_sid) and Service Data (pi_sdata) are returned only for
383  * lookups based on Service ID or/and Service Name.
384  */
385 typedef struct ibt_path_info_s {
386 	ib_guid_t	pi_hca_guid;		/* Local HCA GUID; 0 implies */
387 						/* this record is invalid */
388 	ib_svc_id_t	pi_sid;			/* Service ID */
389 	ibt_srv_data_t	pi_sdata;		/* Service Data */
390 
391 	ibt_cep_path_t	pi_prim_cep_path;	/* Contains CEP adds info */
392 	ibt_cep_path_t	pi_alt_cep_path;	/* RC & UC Only, valid if */
393 						/* cep_hca_port_num is not */
394 						/* '0' */
395 	ib_mtu_t	pi_path_mtu;		/* Common path MTU */
396 	ib_time_t	pi_prim_pkt_lt;
397 	ib_time_t	pi_alt_pkt_lt;
398 } ibt_path_info_t;
399 
400 /*
401  * Optional Alternate Path attributes.
402  *
403  * The ibt_alt_path_attr_t structure is used to specify additional optional
404  * attributes when requesting an alternate path for an existing channel.
405  *
406  * Attributes that are don't care should be set to NULL or '0'.
407  */
408 typedef struct ibt_alt_path_attr_s {
409 	ib_gid_t		apa_sgid;
410 	ib_gid_t		apa_dgid;
411 	ibt_srate_req_t		apa_srate;
412 	ibt_pkt_lt_req_t	apa_pkt_lt;	/* Packet Life Time Request */
413 	uint_t			apa_flow:20;
414 	uint8_t			apa_sl:4;
415 	uint8_t			apa_hop;
416 	uint8_t			apa_tclass;
417 } ibt_alt_path_attr_t;
418 
419 /*
420  * Path Information for Alternate Path - input to ibt_set_alt_path().
421  */
422 typedef struct ibt_alt_path_info_s {
423 	ibt_cep_path_t	ap_alt_cep_path;	/* RC & UC Only, valid if */
424 						/* cep_hca_port_num is not */
425 						/* '0' */
426 	ib_time_t	ap_alt_pkt_lt;
427 } ibt_alt_path_info_t;
428 
429 /*
430  * Open Channel flags, Used in ibt_open_rc_channel call
431  */
432 typedef enum ibt_chan_open_flags_e {
433 	IBT_OCHAN_NO_FLAGS		= 0,
434 	IBT_OCHAN_REDIRECTED		= 1 << 0,
435 	IBT_OCHAN_PORT_REDIRECTED	= 1 << 1,
436 	IBT_OCHAN_DUP			= 1 << 2,
437 	IBT_OCHAN_PORT_FIXED		= 1 << 3,
438 	IBT_OCHAN_OPAQUE1		= 1 << 4,
439 	IBT_OCHAN_OPAQUE2		= 1 << 5,
440 	IBT_OCHAN_OPAQUE3		= 1 << 6,
441 	IBT_OCHAN_OPAQUE4		= 1 << 7,
442 	IBT_OCHAN_OPAQUE5		= 1 << 8
443 } ibt_chan_open_flags_t;
444 
445 /*
446  * Arguments for ibt_open_rc_channel().
447  *
448  * oc_priv_data should be NULL or point to a buffer allocated by the caller,
449  * the size of which should be in oc_priv_data_len, where oc_priv_data_len <=
450  * IBT_REQ_PRIV_DATA_SZ.
451  *
452  * When ibt_open_rc_channel returns with ibt_cm_reason_t of
453  * IBT_CM_REDIRECT_PORT, the client can re-issue ibt_open_rc_channel setting
454  * new fields as follows:
455  *
456  * Set (ibt_chan_args_t)->oc_cm_cep_path  =
457  *    original (ibt_chan_open_args_t)->oc_path->pi_prim_cep_path.
458  * Set (ibt_chan_args_t)->oc_cm_pkt_lt  =
459  *    original (ibt_chan_open_args_t)->oc_prim_pkt_lt.
460  * Update (ibt_chan_args_t)->oc_path based on path information returned
461  * from ibt_get_paths using the gid in the return data below:
462  * 	(ibt_rc_returns_t)->rc_arej_info.ari_redirect_info.ari_gid.
463  * Set flags to IBT_OCHAN_PORT_REDIRECTED.
464  *
465  * Note : oc_cm_path is not used for any other scenario, and must be set for
466  * IBT_OCHAN_PORT_REDIRECTED.
467  *
468  * When ibt_open_rc_channel returns with ibt_cm_reason_t of
469  * IBT_CM_REDIRECT_CM, the client can re-issue ibt_open_rc_channel setting
470  * new fields as follows:
471  *
472  * Update (ibt_chan_args_t)->oc_path based on path information returned
473  * from ibt_get_paths using the return data in
474  * (ibt_rc_returns_t)->rc_arej_info.ari_redirect_info.
475  *
476  * Set (ibt_chan_args_t)->oc_cm_redirect_info =
477  *    Returned (ibt_rc_returns_t)->rc_arej_info.ari_redirect_info.
478  * Set flags to IBT_OCHAN_REDIRECTED.
479  *
480  * Note:
481  *
482  * IBT_OCHAN_PORT_REDIRECTED flag cannot be used to specify a remote CM MAD
483  * address, that is on a different subnet than the RC connection itself.
484  *
485  * Not specified attributes should be set to "NULL" or "0".
486  */
487 typedef struct ibt_chan_open_args_s {
488 	ibt_path_info_t 	*oc_path;	/* Primary & Alternate */
489 	ibt_cm_handler_t 	oc_cm_handler;	/* cm_handler - required */
490 	void			*oc_cm_clnt_private;	/* First argument to */
491 							/* cm_handler */
492 	ibt_rnr_retry_cnt_t	oc_path_rnr_retry_cnt;
493 	uint8_t			oc_path_retry_cnt:3;
494 	uint8_t			oc_rdma_ra_out;
495 	uint8_t			oc_rdma_ra_in;
496 	ibt_priv_data_len_t	oc_priv_data_len;	/* Number of bytes of */
497 							/* REQ Private data */
498 	void			*oc_priv_data;		/* REQ private data */
499 	ibt_channel_hdl_t	oc_dup_channel; 	/* IBT_OCHAN_DUP */
500 	ibt_redirect_info_t	*oc_cm_redirect_info;	/* Redirect params */
501 							/* for port and CM */
502 							/* redirection */
503 	ibt_cep_path_t		*oc_cm_cep_path;	/* Optional Path for */
504 							/* CM MADs on */
505 							/* port redirection */
506 	ib_time_t		oc_cm_pkt_lt;		/* Pkt life time for */
507 							/* CM MADs */
508 	uint32_t		oc_opaque1:4;
509 	uint32_t		oc_opaque2:24;
510 	uint32_t		oc_opaque3;
511 	uint32_t		oc_opaque4;
512 } ibt_chan_open_args_t;
513 
514 
515 /*
516  * Define an optional RC return arguments structure. This contains return
517  * parameters from ibt_open_rc_channel() when called in BLOCKING mode.
518  *
519  * rc_priv_data should be NULL or point to a buffer allocated by the caller,
520  * the size of which should be in rc_priv_data_len, where rc_priv_data_len <=
521  * IBT_REP_PRIV_DATA_SZ.
522  */
523 typedef struct ibt_rc_returns_s {
524 	uint8_t			rc_rdma_ra_in;	/* Arbitrated resp resources */
525 	uint8_t			rc_rdma_ra_out;	/* Arbitrated initiator depth */
526 	ibt_arej_info_t		rc_arej_info;
527 	ibt_cm_reason_t		rc_status;
528 	uint8_t			rc_failover_status;	/* Failover status */
529 	ibt_priv_data_len_t	rc_priv_data_len;
530 	void			*rc_priv_data;
531 } ibt_rc_returns_t;
532 
533 /*
534  * Define a callback function that can be used in Non-Blocking calls to
535  * ibt_recycle_rc().
536  */
537 
538 typedef	void	(*ibt_recycle_handler_t)(ibt_status_t ibt_status, void *arg);
539 
540 /*
541  * Define an optional return arguments structure from ibt_set_alt_path()
542  * This contains return parameters, when called in BLOCKING mode.
543  *
544  * ap_priv_data should be NULL or point to a buffer allocated by the caller,
545  * the size of which should be in ap_priv_data_len, where ap_priv_data_len <=
546  * IBT_APR_PRIV_DATA_SZ.
547  * The private data from APR is returned in ap_priv_data.
548  * The caller specifies amount of APR private data to be returned in
549  * ap_priv_data_len.
550  */
551 typedef struct ibt_ap_returns_s {
552 	ibt_ap_status_t		ap_status;
553 	boolean_t		ap_arej_info_valid;
554 	ibt_arej_info_t		ap_arej_info;	/* Only valid if redirect */
555 	ibt_priv_data_len_t	ap_priv_data_len;
556 	void			*ap_priv_data;
557 } ibt_ap_returns_t;
558 
559 /*
560  * UD remote destination attributes.
561  *
562  * ud_sid, ud_addr, ud_pkt_lt and ud_pkey_ix must be specified.
563  * These values can be as returned in an ibt_path_info_t struct from an
564  * ibt_get_paths() call.
565  *
566  * ud_priv_data should be NULL or point to a buffer allocated by the caller,
567  * the size of which is in ud_priv_data_len, where ud_priv_data_len <=
568  * IBT_SIDR_REQ_PRIV_DATA_SZ.
569  */
570 typedef struct ibt_ud_dest_attr_s {
571 	ib_svc_id_t		ud_sid;		/* Service ID */
572 	ibt_adds_vect_t		*ud_addr;	/* Address Info */
573 	uint16_t		ud_pkey_ix;	/* Pkey Index */
574 	ib_time_t		ud_pkt_lt;
575 	ibt_cm_ud_handler_t	ud_cm_handler;	/* An optional CM UD event */
576 						/* which must be NULL */
577 						/* if not specified. */
578 	void			*ud_cm_private; /* First arg to ud_cm_handler */
579 	ibt_priv_data_len_t	ud_priv_data_len;
580 	void			*ud_priv_data;	/* SIDR REQ private data */
581 } ibt_ud_dest_attr_t;
582 
583 /*
584  * Define an optional UD return arguments structure.
585  *
586  * ud_priv_data should be NULL or point to a buffer allocated by the caller,
587  * the size of which should be in ud_priv_data_len, where ud_priv_data_len <=
588  * IBT_SIDR_REP_PRIV_DATA_SZ.
589  */
590 typedef struct ibt_ud_returns_s {
591 	ibt_sidr_status_t	ud_status;
592 	ibt_redirect_info_t	ud_redirect;
593 	ib_qpn_t		ud_dqpn;	/* Returned destination QPN */
594 	ib_qkey_t		ud_qkey;	/* Q_Key for destination QPN */
595 	ibt_priv_data_len_t	ud_priv_data_len;
596 	void			*ud_priv_data;
597 } ibt_ud_returns_t;
598 
599 /*
600  * Multicast group attributes
601  * Not specified attributes should be set to "NULL" or "0".
602  * Used by ibt_join_mcg()/ibt_query_mcg().
603  *
604  * mc_qkey, mc_pkey, mc_flow, mc_tclass, mc_sl, mc_join_state are required for
605  * create - ibt_join_mcg().
606  */
607 typedef struct ibt_mcg_attr_s {
608 	ib_gid_t		mc_mgid;	/* MGID */
609 	ib_gid_t		mc_pgid;	/* SGID of the end port being */
610 						/* added to the MCG. */
611 	ib_qkey_t		mc_qkey;	/* Q_Key */
612 	ib_pkey_t		mc_pkey;	/* Partition key for this MCG */
613 	ibt_mtu_req_t		mc_mtu_req;	/* MTU */
614 	ibt_srate_req_t		mc_rate_req;	/* Static rate */
615 	ibt_pkt_lt_req_t	mc_pkt_lt_req;	/* Packet Life Time Request */
616 	uint_t			mc_flow:20;	/* FlowLabel. */
617 	uint8_t			mc_hop;		/* HopLimit */
618 	uint8_t			mc_tclass;	/* Traffic Class. */
619 	uint8_t			mc_sl:4;	/* Service Level */
620 	uint8_t			mc_scope:4,	/* Multicast Address Scope */
621 				mc_join_state:4; /* FULL For create */
622 	ib_lid_t		mc_opaque1;
623 } ibt_mcg_attr_t;
624 
625 /*
626  * Multicast group attributes.
627  * returned by ibt_join_mcg()/ibt_query_mcg().
628  */
629 typedef struct ibt_mcg_info_s {
630 	ibt_adds_vect_t		mc_adds_vect;   /* Address information */
631 	ib_mtu_t		mc_mtu;		/* MTU */
632 	ib_qkey_t		mc_qkey;	/* Q_Key */
633 	uint16_t		mc_pkey_ix;	/* Pkey Index */
634 	uint8_t			mc_scope:4;	/* Multicast Address Scope */
635 	clock_t			mc_opaque2;
636 } ibt_mcg_info_t;
637 
638 /*
639  * Define a callback function that can be used in Non-Blocking calls to
640  * ibt_join_mcg().
641  */
642 typedef void (*ibt_mcg_handler_t)(void *arg, ibt_status_t retval,
643     ibt_mcg_info_t *mcg_info_p);
644 
645 
646 /*
647  * Service Flags - sd_flags
648  *
649  *    IBT_SRV_PEER_TYPE_SID	Peer-to-peer Service IDs.
650  */
651 
652 typedef enum ibt_service_flags_e {
653 	IBT_SRV_NO_FLAGS	= 0x0,
654 	IBT_SRV_PEER_TYPE_SID	= 0x1
655 } ibt_service_flags_t;
656 
657 /*
658  * Define a Service ID Registration structure.
659  */
660 typedef struct ibt_srv_desc_s {
661 	ibt_cm_ud_handler_t	sd_ud_handler;	/* UD Service Handler */
662 	ibt_cm_handler_t	sd_handler;	/* Non-UD Service Handler */
663 	ibt_service_flags_t	sd_flags;	/* Flags */
664 } ibt_srv_desc_t;
665 
666 /*
667  * Flag to indicate ibt_bind_service() to or NOT-to clean-up Stale matching
668  * Local Service Records with SA prior to binding the new request.
669  */
670 #define	IBT_SBIND_NO_FLAGS	0
671 #define	IBT_SBIND_NO_CLEANUP	1
672 
673 /*
674  * Define a Service ID Binding structure (data for service records).
675  */
676 typedef struct ibt_srv_bind_s {
677 	uint64_t	sb_key[2];	/* Service Key */
678 	char		*sb_name;	/* Service Name (up to 63 chars) */
679 	uint32_t	sb_lease;	/* Service Lease period (in seconds) */
680 	ib_pkey_t	sb_pkey;	/* Service P_Key */
681 	ibt_srv_data_t	sb_data;	/* Service Data */
682 	uint_t		sb_flag;	/* indicates to/not-to clean-up stale */
683 					/* matching local service records. */
684 } ibt_srv_bind_t;
685 
686 /*
687  * ibt_cm_delay() flags.
688  *
689  * Refer to InfiniBand Architecture Release Volume 1 Rev 1.0a:
690  * Section 12.6.6 MRA
691  */
692 typedef enum ibt_cmdelay_flags_e {
693 	IBT_CM_DELAY_REQ	= 0,
694 	IBT_CM_DELAY_REP	= 1,
695 	IBT_CM_DELAY_LAP	= 2
696 } ibt_cmdelay_flags_t;
697 
698 /*
699  * The payload for DDI events passed on IB_PROP_UPDATE_EVENT.
700  * This is passed as the bus nexus data to event_handler(9e).
701  */
702 typedef struct ibt_prop_update_payload_s {
703 	union {
704 		struct {
705 			uint32_t	srv_updated:1;
706 			uint32_t	gid_updated:1;
707 		} _ib_prop_update_struct;
708 		uint32_t	prop_updated;
709 	} _ib_prop_update_union;
710 	ibt_status_t		ib_reprobe_status;
711 
712 #define	ib_srv_prop_updated	\
713     _ib_prop_update_union._ib_prop_update_struct.srv_updated
714 #define	ib_gid_prop_updated	\
715     _ib_prop_update_union._ib_prop_update_struct.gid_updated
716 #define	ib_prop_updated		\
717     _ib_prop_update_union.prop_updated
718 } ibt_prop_update_payload_t;
719 
720 
721 /*
722  * FUNCTION PROTOTYPES.
723  */
724 
725 /*
726  * ibt_attach() and ibt_detach():
727  *	These are the calls into IBTF used during client driver attach() and
728  *	detach().
729  *
730  *	The IBTF returns an ibt_clnt_hdl_t to the client. This handle is used
731  *	to identify this client device in all subsequent calls into the IBTF.
732  *
733  *	The ibt_detach() routine is called from a client driver's detach()
734  *	routine to deregister itself from the IBTF.
735  */
736 ibt_status_t ibt_attach(ibt_clnt_modinfo_t *mod_infop, dev_info_t *arg,
737     void *clnt_private, ibt_clnt_hdl_t *ibt_hdl_p);
738 
739 ibt_status_t ibt_detach(ibt_clnt_hdl_t ibt_hdl);
740 
741 /*
742  * HCA FUNCTIONS
743  */
744 
745 /*
746  * ibt_get_hca_list()
747  *	Returns the number of HCAs in a system and their node GUIDS.
748  *
749  *	If hca_list_p is not NULL then the memory for the array of GUIDs is
750  *	allocated by the IBTF and should be freed by the caller using
751  *	ibt_free_hca_list(). If hca_list_p is NULL then no memory is allocated
752  *	by ibt_get_hca_list and only the number of HCAs in a system is returned.
753  *
754  *	It is assumed that the caller can block in kmem_alloc.
755  *
756  * ibt_free_hca_list()
757  *	Free the memory allocated by ibt_get_hca_list().
758  */
759 uint_t ibt_get_hca_list(ib_guid_t **hca_list_p);
760 
761 void ibt_free_hca_list(ib_guid_t *hca_list, uint_t entries);
762 
763 /*
764  * ibt_open_hca()	- Open/Close a HCA. HCA can only be opened/closed
765  * ibt_close_hca()	  once. ibt_open_hca() takes a client's ibt handle
766  *			  and a GUID and returns a unique IBT client HCA
767  *			  handle.
768  *
769  * These routines can not be called from interrupt context.
770  */
771 ibt_status_t ibt_open_hca(ibt_clnt_hdl_t ibt_hdl, ib_guid_t hca_guid,
772     ibt_hca_hdl_t *hca_hdl);
773 
774 ibt_status_t ibt_close_hca(ibt_hca_hdl_t hca_hdl);
775 
776 
777 /*
778  * ibt_query_hca()
779  * ibt_query_hca_byguid()
780  * 	Returns the static attributes of the specified HCA
781  */
782 ibt_status_t ibt_query_hca(ibt_hca_hdl_t hca_hdl, ibt_hca_attr_t *hca_attrs);
783 
784 ibt_status_t ibt_query_hca_byguid(ib_guid_t hca_guid,
785     ibt_hca_attr_t *hca_attrs);
786 
787 
788 /*
789  * ibt_query_hca_ports()
790  * ibt_query_hca_ports_byguid()
791  *	Returns HCA port/ports attributes for the specified HCA port/ports.
792  *	ibt_query_hca_ports() allocates the memory required for the
793  *	ibt_hca_portinfo_t struct as well as the memory required for the SGID
794  *	and P_Key tables contained within that struct.
795  *
796  * ibt_free_portinfo()
797  *	Frees the memory allocated for a specified ibt_hca_portinfo_t struct.
798  */
799 ibt_status_t ibt_query_hca_ports(ibt_hca_hdl_t hca_hdl, uint8_t port,
800     ibt_hca_portinfo_t **port_info_p, uint_t *ports_p, uint_t *size_p);
801 
802 ibt_status_t ibt_query_hca_ports_byguid(ib_guid_t hca_guid, uint8_t port,
803     ibt_hca_portinfo_t **port_info_p, uint_t *ports_p, uint_t *size_p);
804 
805 void ibt_free_portinfo(ibt_hca_portinfo_t *port_info, uint_t size);
806 
807 /*
808  * ibt_set_hca_private()	- Set/get the client private data.
809  * ibt_get_hca_private()
810  */
811 void ibt_set_hca_private(ibt_hca_hdl_t hca_hdl, void *clnt_private);
812 void *ibt_get_hca_private(ibt_hca_hdl_t hca_hdl);
813 
814 /*
815  * ibt_hca_handle_to_guid()
816  *	A helper function to retrieve HCA GUID for the specified handle.
817  *	Returns HCA GUID on which the specified Channel is allocated. Valid
818  *	if it is non-NULL on return.
819  */
820 ib_guid_t ibt_hca_handle_to_guid(ibt_hca_hdl_t hca);
821 
822 /*
823  * ibt_hca_guid_to_handle()
824  *	A helper function to retrieve a hca handle from a HCA GUID.
825  */
826 ibt_status_t ibt_hca_guid_to_handle(ibt_clnt_hdl_t ibt_hdl, ib_guid_t hca_guid,
827     ibt_hca_hdl_t *hca_hdl);
828 
829 /*
830  * CONNECTION ESTABLISHMENT/TEAR DOWN FUNCTIONS.
831  */
832 
833 /*
834  * ibt_get_paths
835  *	Finds the best path to a specified destination (as determined by the
836  *	IBTL) that satisfies the requirements specified in an ibt_path_attr_t
837  *	struct.
838  */
839 ibt_status_t ibt_get_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags,
840     ibt_path_attr_t *attr, uint8_t max_paths, ibt_path_info_t *paths,
841     uint8_t *num_paths_p);
842 
843 
844 /*
845  * Callback function that can be used in ibt_aget_paths(), a Non-Blocking
846  * version of ibt_get_paths().
847  */
848 typedef void (*ibt_path_handler_t)(void *arg, ibt_status_t retval,
849     ibt_path_info_t *paths, uint8_t num_paths);
850 
851 /*
852  * Find path(s) to a given destination or service asynchronously.
853  * ibt_aget_paths() is a Non-Blocking version of ibt_get_paths().
854  */
855 ibt_status_t ibt_aget_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags,
856     ibt_path_attr_t *attr, uint8_t max_paths, ibt_path_handler_t func,
857     void  *arg);
858 
859 /*
860  * ibt_get_alt_path
861  *	Finds the best alternate path to a specified channel (as determined by
862  *	the IBTL) that satisfies the requirements specified in an
863  *	ibt_alt_path_attr_t struct.  The specified channel must have been
864  *	previously opened successfully using ibt_open_rc_channel.
865  */
866 ibt_status_t ibt_get_alt_path(ibt_channel_hdl_t chan, ibt_path_flags_t flags,
867     ibt_alt_path_attr_t *attr, ibt_alt_path_info_t *alt_path);
868 
869 /*
870  * ibt_open_rc_channel
871  * 	ibt_open_rc_channel() opens a previously allocated RC communication
872  *	channel. The IBTL initiates the channel establishment protocol.
873  */
874 ibt_status_t ibt_open_rc_channel(ibt_channel_hdl_t rc_chan,
875     ibt_chan_open_flags_t flags, ibt_execution_mode_t mode,
876     ibt_chan_open_args_t *args, ibt_rc_returns_t *returns);
877 
878 /*
879  * ibt_close_rc_channel
880  *	Close the specified channel. Outstanding work requests are flushed
881  *	so that the client can do the associated clean up. After that, the
882  *	client will usually deregister the previously registered memory,
883  *	then free the channel by calling ibt_free_rc_channel().
884  *
885  *	This function will reuse CM event Handler provided in
886  *	ibt_open_rc_channel().
887  */
888 ibt_status_t ibt_close_rc_channel(ibt_channel_hdl_t rc_chan,
889     ibt_execution_mode_t mode, void *priv_data,
890     ibt_priv_data_len_t priv_data_len, uint8_t *ret_status,
891     void *ret_priv_data, ibt_priv_data_len_t *ret_priv_data_len_p);
892 
893 /*
894  * ibt_prime_close_rc_channel
895  *
896  *	Allocates resources required for a close rc channel operation.
897  *	Calling ibt_prime_close_rc_channel() allows a channel to be
898  *	subsequently closed in interrupt context.
899  *
900  *	A call is first made to ibt_prime_close_rc_channel in non-interrupt
901  *	context, followed by ibt_close_rc_channel in non-blocking mode from
902  *	interrupt context
903  *
904  *	ibt_prime_close_rc_channel() can only be called on a previously opened
905  *	channel.
906  */
907 ibt_status_t ibt_prime_close_rc_channel(ibt_channel_hdl_t rc_chan);
908 
909 /*
910  * ibt_recycle_rc
911  *
912  *      Recycle a RC channel which has transitioned to Error state. The
913  *      ibt_recycle_rc() function transitions the channel from Error
914  *      state (IBT_STATE_ERROR) to the state ready for use by
915  *      ibt_open_rc_channel. Basically, this function is very similar to
916  *      ibt_alloc_rc_channel, but reuses an existing RC channel.
917  *
918  * Clients are allowed to make resource clean up/free calls in the CM handler
919  *
920  * Client(s) must not invoke blocking version (ie., func specified as NULL) of
921  * ibt_recycle_rc from cm callback for IBT_CM_EVENT_CONN_CLOSED
922  *
923  * Clients are strongly advised not to issue blocking calls from  func, as this
924  * would block the CM threads, and could delay or block other client connections
925  * and ibtl related API invocations.
926  */
927 ibt_status_t ibt_recycle_rc(ibt_channel_hdl_t rc_chan, ibt_cep_flags_t control,
928     uint8_t hca_port_num, ibt_recycle_handler_t func, void *arg);
929 
930 /*
931  * ibt_recycle_ud
932  *
933  *      Recycle a UD channel which has transitioned to Error state. The
934  *      ibt_recycle_ud() function transitions the channel from Error
935  *      state (IBT_STATE_ERROR) to a usable state (IBT_STATE_RTS).
936  *      Basically, this function is very similar to ibt_alloc_ud_channel,
937  *	but reuses an existing UD channel.
938  */
939 ibt_status_t ibt_recycle_ud(ibt_channel_hdl_t ud_chan, uint8_t hca_port_num,
940     uint16_t pkey_ix, ib_qkey_t qkey);
941 
942 /*
943  * MODIFY CHANNEL ATTRIBUTE FUNCTIONs.
944  */
945 
946 /*
947  * ibt_pause_sendq
948  * ibt_unpause_sendq
949  *	Place the send queue of the specified channel into the send queue
950  *	drained state.
951  *	Applicable for both RC and UD channels.
952  */
953 ibt_status_t ibt_pause_sendq(ibt_channel_hdl_t chan,
954     ibt_cep_modify_flags_t modify_flags);
955 
956 ibt_status_t ibt_unpause_sendq(ibt_channel_hdl_t chan);
957 
958 /*
959  * ibt_resize_queues()
960  *	Resize the SendQ/RecvQ sizes of a channel.
961  *
962  *	Applicable for both RC and UD channels.
963  */
964 ibt_status_t ibt_resize_queues(ibt_channel_hdl_t chan, ibt_qflags_t flags,
965     ibt_queue_sizes_t *request_sz, ibt_queue_sizes_t *actual_sz);
966 
967 /*
968  * ibt_query_queues()
969  *
970  *	Query the SendQ/RecvQ sizes of a channel.
971  *	Applicable for both RC and UD channels.
972  */
973 ibt_status_t ibt_query_queues(ibt_channel_hdl_t chan,
974     ibt_queue_sizes_t *actual_sz);
975 
976 /*
977  * ibt_modify_rdma
978  *	Enable/disable RDMA operations.
979  *
980  *	Applicable for RC channels only.
981  */
982 ibt_status_t ibt_modify_rdma(ibt_channel_hdl_t rc_chan,
983     ibt_cep_modify_flags_t modify_flags, ibt_cep_flags_t flags);
984 
985 
986 /*
987  * ibt_set_rdma_resource
988  *	Change the number of resources to be used for incoming and outgoing
989  *	RDMA reads & Atomics.
990  */
991 ibt_status_t ibt_set_rdma_resource(ibt_channel_hdl_t rc_chan,
992     ibt_cep_modify_flags_t modify_flags, uint8_t rdma_ra_out,
993     uint8_t rdma_ra_in);
994 
995 /*
996  * ibt_change_port
997  *	Change the primary physical port of an RC channel. (This is done only
998  *	if HCA supports this capability).  Can only be called on a paused
999  *	channel.
1000  *	Applicable for RC channels only.
1001  */
1002 ibt_status_t ibt_change_port(ibt_channel_hdl_t rc_chan, uint8_t port_num);
1003 
1004 
1005 /*
1006  * SERVICE REGISTRATION FUNCTIONS
1007  */
1008 
1009 /*
1010  * ibt_register_service()
1011  * ibt_deregister_service()
1012  *	Register/deregister a Service (range of Service IDs) with the IBTF.
1013  *
1014  * ibt_bind_service()
1015  * ibt_unbind_service()
1016  * ibt_unbind_all_services()
1017  *	Bind a Service to a given port (GID), and optionally create
1018  *	service record(s) with the SA for ibt_get_paths() to find.
1019  */
1020 ibt_status_t ibt_register_service(ibt_clnt_hdl_t ibt_hdl,
1021     ibt_srv_desc_t *service, ib_svc_id_t sid, int num_sids,
1022     ibt_srv_hdl_t *srv_hdl_p, ib_svc_id_t *ret_sid_p);
1023 
1024 ibt_status_t ibt_deregister_service(ibt_clnt_hdl_t ibt_hdl,
1025     ibt_srv_hdl_t srv_hdl);
1026 
1027 ibt_status_t ibt_bind_service(ibt_srv_hdl_t srv_hdl, ib_gid_t gid,
1028     ibt_srv_bind_t *srv_bind, void *cm_private, ibt_sbind_hdl_t *sb_hdl_p);
1029 
1030 ibt_status_t ibt_unbind_service(ibt_srv_hdl_t srv_hdl, ibt_sbind_hdl_t sb_hdl);
1031 ibt_status_t ibt_unbind_all_services(ibt_srv_hdl_t srv_hdl);
1032 
1033 /*
1034  * ibt_cm_delay
1035  *	A client CM handler/srv_handler function can call this function to
1036  *	extend its response time to a CM event.
1037  *	Applicable for RC channels only.
1038  */
1039 ibt_status_t ibt_cm_delay(ibt_cmdelay_flags_t flags, void *cm_session_id,
1040     clock_t service_time, void *priv_data, ibt_priv_data_len_t priv_data_len);
1041 
1042 /*
1043  * ibt_cm_proceed
1044  *
1045  * An IBT client calls ibt_cm_proceed() to proceed with a connection that
1046  * previously deferred by the client returning IBT_CM_DEFER on a CM handler
1047  * callback. CM events that can be deferred and continued with ibt_cm_proceed()
1048  * are REQ_RCV, REP_RCV, LAP_RCV, and DREQ_RCV.
1049  *
1050  * NOTE :
1051  *
1052  * Typically CM completes processing of a client's CM handler return, with
1053  * IBT_CM_DEFER status, before  processing of the corresponding ibt_cm_proceed()
1054  * is started. However a race exists where by CM may not have completed the
1055  * client's handler return processing when ibt_cm_proceed() is called by a
1056  * client. In this case ibt_cm_proceed() will block until processing of the
1057  * client's CM handler return is complete.
1058  *
1059  * A client that returns IBT_CM_DEFER from the cm handler must
1060  * subsequently make a call to ibt_cm_proceed(). It is illegal to call
1061  * ibt_cm_proceed() on a channel that has not had the connection
1062  * establishment deferred.
1063  *
1064  * Client cannot call ibt_cm_proceed from the cm handler.
1065  */
1066 ibt_status_t ibt_cm_proceed(ibt_cm_event_type_t event, void *session_id,
1067     ibt_cm_status_t status, ibt_cm_proceed_reply_t *cm_event_data,
1068     void *priv_data, ibt_priv_data_len_t priv_data_len);
1069 
1070 /*
1071  * ibt_cm_ud_proceed
1072  *
1073  * An IBT client calls ibt_cm_ud_proceed() to proceed with an
1074  * IBT_CM_UD_EVENT_SIDR_REQ  UD event that was previously deferred by the
1075  * client returning IBT_CM_DEFER on a CM UD handler callback.
1076  * NOTE :
1077  *
1078  * Typically CM completes processing of a client's CM handler return, with
1079  * IBT_CM_DEFER status, before  processing of the corresponding
1080  * ibt_cm_ud_proceed() is started. However a race exists where by CM may not
1081  * have completed the client's handler return processing when
1082  * ibt_cm_ud_proceed() is called by a client. In this case ibt_cm_ud_proceed()
1083  * will block until processing of the client's CM handler return is complete.
1084  *
1085  * A client that returns IBT_CM_DEFER from the cm handler must
1086  * subsequently make a call to ibt_cm_ud_proceed(). It is illegal to call
1087  * ibt_cm_ud_proceed() on a channel that has not had the connection
1088  * establishment deferred.
1089  *
1090  * Client cannot call ibt_cm_ud_proceed from the cm handler.
1091  */
1092 ibt_status_t ibt_cm_ud_proceed(void *session_id, ibt_channel_hdl_t ud_channel,
1093     ibt_cm_status_t status, ibt_redirect_info_t *redirect_infop,
1094     void *priv_data, ibt_priv_data_len_t priv_data_len);
1095 
1096 
1097 /*
1098  * COMPLETION QUEUES.
1099  *
1100  * ibt_alloc_cq_sched()
1101  *	Reserve CQ scheduling class resources
1102  *
1103  * ibt_free_cq_sched()
1104  *	Free CQ scheduling class resources
1105  */
1106 ibt_status_t ibt_alloc_cq_sched(ibt_hca_hdl_t hca_hdl,
1107     ibt_cq_sched_attr_t *attr, ibt_sched_hdl_t *sched_hdl_p);
1108 
1109 ibt_status_t ibt_free_cq_sched(ibt_hca_hdl_t hca_hdl,
1110     ibt_sched_hdl_t sched_hdl, uint_t load);
1111 
1112 /*
1113  * ibt_alloc_cq()
1114  *	Allocate a completion queue.
1115  */
1116 ibt_status_t ibt_alloc_cq(ibt_hca_hdl_t hca_hdl, ibt_cq_attr_t *cq_attr,
1117     ibt_cq_hdl_t *ibt_cq_p, uint_t *real_size);
1118 
1119 /*
1120  * ibt_free_cq()
1121  *	Free allocated CQ resources.
1122  */
1123 ibt_status_t ibt_free_cq(ibt_cq_hdl_t ibt_cq);
1124 
1125 
1126 /*
1127  * ibt_enable_cq_notify()
1128  *	Enable notification requests on the specified CQ.
1129  *	Applicable for both RC and UD channels.
1130  *
1131  *	Completion notifications are disabled by setting the completion
1132  *	handler to NULL by calling ibt_set_cq_handler().
1133  */
1134 ibt_status_t ibt_enable_cq_notify(ibt_cq_hdl_t ibt_cq,
1135     ibt_cq_notify_flags_t notify_type);
1136 
1137 /*
1138  * ibt_set_cq_handler()
1139  *	Register a work request completion handler with the IBTF.
1140  *	Applicable for both RC and UD channels.
1141  *
1142  *	Completion notifications are disabled by setting the completion
1143  *	handler to NULL. When setting the handler to NULL, no additional
1144  *	calls to the CQ handler will be initiated.
1145  *
1146  *	This function does not otherwise change the state of previous
1147  *	calls to ibt_enable_cq_notify().
1148  */
1149 void ibt_set_cq_handler(ibt_cq_hdl_t ibt_cq,
1150     ibt_cq_handler_t completion_handler, void *arg);
1151 
1152 /*
1153  * ibt_poll_cq()
1154  *	Poll the specified CQ for the completion of work requests (WRs).
1155  *	If the CQ contains completed WRs, up to num_wc of them are returned.
1156  *	Applicable for both RC and UD channels.
1157  */
1158 ibt_status_t ibt_poll_cq(ibt_cq_hdl_t ibt_cq, ibt_wc_t *work_completions,
1159     uint_t num_wc, uint_t *num_polled);
1160 
1161 /*
1162  * ibt_query_cq()
1163  *	Return the total number of entries in the CQ.
1164  */
1165 ibt_status_t ibt_query_cq(ibt_cq_hdl_t ibt_cq, uint_t *entries,
1166     uint_t *count_p, uint_t *usec_p, ibt_cq_handler_id_t *hid_p);
1167 
1168 /*
1169  * ibt_resize_cq()
1170  *	Change the size of a CQ.
1171  */
1172 ibt_status_t ibt_resize_cq(ibt_cq_hdl_t ibt_cq, uint_t new_sz, uint_t *real_sz);
1173 
1174 /*
1175  * ibt_modify_cq()
1176  *	Change the interrupt moderation values of a CQ.
1177  *	"count" is number of completions before interrupting.
1178  *	"usec" is the number of microseconds before interrupting.
1179  */
1180 ibt_status_t ibt_modify_cq(ibt_cq_hdl_t ibt_cq, uint_t count, uint_t usec,
1181     ibt_cq_handler_id_t hid);
1182 
1183 /*
1184  * ibt_set_cq_private()
1185  * ibt_get_cq_private()
1186  *	Set/get the client private data.
1187  */
1188 void ibt_set_cq_private(ibt_cq_hdl_t ibt_cq, void *clnt_private);
1189 void *ibt_get_cq_private(ibt_cq_hdl_t ibt_cq);
1190 
1191 
1192 /*
1193  * Memory Management Functions.
1194  *	Applicable for both RC and UD channels.
1195  *
1196  * ibt_register_mr()
1197  * 	Prepares a virtually addressed memory region for use by a HCA. A
1198  *	description of the registered memory suitable for use in Work Requests
1199  *	(WRs) is returned in the ibt_mr_desc_t parameter.
1200  *
1201  * ibt_register_buf()
1202  * 	Prepares a memory region described by a buf(9S) struct for use by a
1203  *	HCA. A description of the registered memory suitable for use in
1204  *	Work Requests (WRs) is returned in the ibt_mr_desc_t parameter.
1205  *
1206  * ibt_query_mr()
1207  *	Retrieves information about a specified memory region.
1208  *
1209  * ibt_deregister_mr()
1210  *	Remove a memory region from a HCA translation table, and free all
1211  *	resources associated with the memory region.
1212  *
1213  * ibt_reregister_mr()
1214  * ibt_reregister_buf()
1215  *	Modify the attributes of an existing memory region.
1216  *
1217  * ibt_register_shared_mr()
1218  *	Given an existing memory region, a new memory region associated with
1219  *	the same physical locations is created.
1220  *
1221  * ibt_sync_mr()
1222  *	Sync a memory region for either RDMA reads or RDMA writes
1223  *
1224  * ibt_alloc_mw()
1225  *	Allocate a memory window.
1226  *
1227  * ibt_query_mw()
1228  *	Retrieves information about a specified memory window.
1229  *
1230  * ibt_free_mw()
1231  *	De-allocate the Memory Window.
1232  */
1233 ibt_status_t ibt_register_mr(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1234     ibt_mr_attr_t *mem_attr, ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc);
1235 
1236 ibt_status_t ibt_register_buf(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1237     ibt_smr_attr_t *mem_bpattr, struct buf *bp, ibt_mr_hdl_t *mr_hdl_p,
1238     ibt_mr_desc_t *mem_desc);
1239 
1240 ibt_status_t ibt_query_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1241     ibt_mr_query_attr_t *attr);
1242 
1243 ibt_status_t ibt_deregister_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl);
1244 
1245 ibt_status_t ibt_reregister_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1246     ibt_pd_hdl_t pd, ibt_mr_attr_t *mem_attr, ibt_mr_hdl_t *mr_hdl_p,
1247     ibt_mr_desc_t *mem_desc);
1248 
1249 ibt_status_t ibt_reregister_buf(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1250     ibt_pd_hdl_t pd, ibt_smr_attr_t *mem_bpattr, struct buf *bp,
1251     ibt_mr_hdl_t *mr_hdl_p, ibt_mr_desc_t *mem_desc);
1252 
1253 ibt_status_t ibt_register_shared_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1254     ibt_pd_hdl_t pd, ibt_smr_attr_t *mem_sattr, ibt_mr_hdl_t *mr_hdl_p,
1255     ibt_mr_desc_t *mem_desc);
1256 
1257 ibt_status_t ibt_sync_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_sync_t *mr_segments,
1258     size_t num_segments);
1259 
1260 ibt_status_t ibt_alloc_mw(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1261     ibt_mw_flags_t flags, ibt_mw_hdl_t *mw_hdl_p, ibt_rkey_t *rkey);
1262 
1263 ibt_status_t ibt_query_mw(ibt_hca_hdl_t hca_hdl, ibt_mw_hdl_t mw_hdl,
1264     ibt_mw_query_attr_t *mw_attr_p);
1265 
1266 ibt_status_t ibt_free_mw(ibt_hca_hdl_t hca_hdl, ibt_mw_hdl_t mw_hdl);
1267 
1268 /*
1269  * ibt_alloc_lkey()
1270  * 	Allocates physical buffer list resources for use in memory
1271  *	registrations.
1272  *
1273  *	Applicable for both RC and UD channels.
1274  */
1275 ibt_status_t ibt_alloc_lkey(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1276     ibt_lkey_flags_t flags, uint_t phys_buf_list_sz, ibt_mr_hdl_t *mr_p,
1277     ibt_pmr_desc_t *mem_desc_p);
1278 
1279 
1280 /*
1281  * Physical Memory Management Functions.
1282  *	Applicable for both RC and UD channels.
1283  *
1284  * ibt_register_phys_mr()
1285  *	Prepares a physically addressed memory region for use by a HCA.
1286  *
1287  * ibt_reregister_phys_mr()
1288  *	Modify the attributes of an existing memory region.
1289  */
1290 ibt_status_t ibt_register_phys_mr(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1291     ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p,
1292     ibt_pmr_desc_t *mem_desc_p);
1293 
1294 ibt_status_t ibt_reregister_phys_mr(ibt_hca_hdl_t hca_hdl, ibt_mr_hdl_t mr_hdl,
1295     ibt_pd_hdl_t pd, ibt_pmr_attr_t *mem_pattr, ibt_mr_hdl_t *mr_hdl_p,
1296     ibt_pmr_desc_t *mem_desc_p);
1297 
1298 
1299 /*
1300  * Address Translation.
1301  */
1302 
1303 /*
1304  * ibt_map_mem_area()
1305  *	Translate a kernel virtual address range into HCA physical addresses.
1306  *	A set of physical addresses, that can be used with "Reserved L_Key",
1307  *	register physical,  and "Fast Registration Work Request" operations
1308  *	is returned.
1309  */
1310 ibt_status_t ibt_map_mem_area(ibt_hca_hdl_t hca_hdl, ibt_va_attr_t *va_attrs,
1311     uint_t paddr_list_len, ibt_phys_buf_t *paddr_list_p, uint_t *num_paddr_p,
1312     size_t *paddr_bufsz_p, ib_memlen_t *paddr_offset_p, ibt_ma_hdl_t *ma_hdl_p);
1313 
1314 /*
1315  * ibt_unmap_mem_area()
1316  *	Un pin physical pages pinned during an ibt_map_mem_area() call.
1317  */
1318 ibt_status_t ibt_unmap_mem_area(ibt_hca_hdl_t hca_hdl, ibt_ma_hdl_t ma_hdl);
1319 
1320 /* ibt_map_mem_iov() */
1321 ibt_status_t ibt_map_mem_iov(ibt_hca_hdl_t hca_hdl,
1322     ibt_iov_attr_t *iov_attr, ibt_all_wr_t *wr, ibt_mi_hdl_t *mi_hdl);
1323 
1324 /* ibt_unmap_mem_iov() */
1325 ibt_status_t ibt_unmap_mem_iov(ibt_hca_hdl_t hca_hdl, ibt_mi_hdl_t mi_hdl);
1326 
1327 /*
1328  * Work Request Functions
1329  *	Applicable for RC and UD channels.
1330  *
1331  * ibt_post_send()
1332  *	Post send work requests to the specified channel.
1333  *
1334  * ibt_post_recv()
1335  * ibt_post_srq()
1336  *	Post receive work requests to the specified channel.
1337  */
1338 ibt_status_t ibt_post_send(ibt_channel_hdl_t chan, ibt_send_wr_t *wr_list,
1339     uint_t num_wr, uint_t *posted);
1340 
1341 ibt_status_t ibt_post_recv(ibt_channel_hdl_t chan, ibt_recv_wr_t *wr_list,
1342     uint_t num_wr, uint_t *posted);
1343 
1344 ibt_status_t ibt_post_srq(ibt_srq_hdl_t srq, ibt_recv_wr_t *wr_list,
1345     uint_t num_wr, uint_t *posted);
1346 
1347 
1348 /*
1349  * Alternate Path Migration Functions.
1350  *	Applicable for RC channels only.
1351  *
1352  *
1353  * ibt_get_alt_path()
1354  *	Finds the best alternate path to a specified channel (as determined by
1355  *	the IBTL) that satisfies the requirements specified in an
1356  *	ibt_alt_path_attr_t struct.  The specified channel must have been
1357  *	previously opened successfully using ibt_open_rc_channel.
1358  *	This function also ensures that the service being accessed by the
1359  *	channel is available at the selected alternate port.
1360  *
1361  *	Note: The apa_dgid must be on the same destination channel adapter,
1362  *	if specified.
1363  *
1364  *
1365  * ibt_set_alt_path()
1366  *	Load the specified alternate path. Causes the CM to send an LAP message
1367  *	to the remote node. If successful, the local channel is updated with
1368  *	the new alternate path and the channel migration state is set to REARM.
1369  *	Can only be called on a previously opened RC channel. The channel must
1370  *	be either in RTS or paused state.
1371  *
1372  *
1373  * ibt_migrate_path()
1374  *	Force the CI to use the alternate path. The alternate path becomes
1375  *	the primary path. A new alternate path should be loaded and enabled.
1376  */
1377 ibt_status_t ibt_get_alt_path(ibt_channel_hdl_t rc_chan, ibt_path_flags_t flags,
1378     ibt_alt_path_attr_t *attr, ibt_alt_path_info_t *alt_pathp);
1379 
1380 ibt_status_t ibt_set_alt_path(ibt_channel_hdl_t rc_chan,
1381     ibt_execution_mode_t mode, ibt_alt_path_info_t *alt_pinfo, void *priv_data,
1382     ibt_priv_data_len_t priv_data_len, ibt_ap_returns_t *ret_args);
1383 
1384 ibt_status_t ibt_migrate_path(ibt_channel_hdl_t rc_chan);
1385 
1386 
1387 /*
1388  * Multicast group Functions.
1389  *	Applicable for UD channels only.
1390  */
1391 
1392 /*
1393  * ibt_attach_mcg()
1394  *	Attaches a UD channel to the specified multicast group. On successful
1395  *	completion, this channel will be provided with a copy of every
1396  *	multicast message addressed to the group specified by the MGID
1397  *	(mcg_info->mc_adds_vect.av_dgid) and received on the HCA port with
1398  *	which the channel is associated.
1399  */
1400 ibt_status_t ibt_attach_mcg(ibt_channel_hdl_t ud_chan,
1401     ibt_mcg_info_t *mcg_info);
1402 
1403 /*
1404  * ibt_detach_mcg()
1405  *	Detach the specified UD channel from the specified multicast group.
1406  */
1407 ibt_status_t ibt_detach_mcg(ibt_channel_hdl_t ud_chan,
1408     ibt_mcg_info_t *mcg_info);
1409 
1410 /*
1411  * ibt_join_mcg()
1412  *	Join a multicast group.  The first full member "join" causes the MCG
1413  *	to be created.
1414  */
1415 ibt_status_t ibt_join_mcg(ib_gid_t rgid, ibt_mcg_attr_t *mcg_attr,
1416     ibt_mcg_info_t *mcg_info_p,  ibt_mcg_handler_t func, void  *arg);
1417 
1418 /*
1419  * ibt_leave_mcg()
1420  *	The port associated with the port GID shall be removed from the
1421  *	multicast group specified by MGID (mc_gid) or from all the multicast
1422  *	groups of which it is a member if the MGID (mc_gid) is not specified
1423  *	(i.e. mc_gid.mgid_prefix must have 8-bits of 11111111 at the start of
1424  *	the GID to identify this as being a multicast GID).
1425  *
1426  *	The last full member to leave causes the destruction of the Multicast
1427  *	Group.
1428  */
1429 ibt_status_t ibt_leave_mcg(ib_gid_t rgid, ib_gid_t mc_gid, ib_gid_t port_gid,
1430     uint8_t mc_join_state);
1431 
1432 /*
1433  * ibt_query_mcg()
1434  *	Request information on multicast groups that match the parameters
1435  *	specified in mcg_attr. Information on each multicast group is returned
1436  *	to the caller in the form of an array of ibt_mcg_info_t.
1437  *	ibt_query_mcg() allocates the memory for this array and returns a
1438  *	pointer to the array (mcgs_p) and the number of entries in the array
1439  *	(entries_p). This memory should be freed by the client using
1440  *	ibt_free_mcg_info().
1441  */
1442 ibt_status_t ibt_query_mcg(ib_gid_t rgid, ibt_mcg_attr_t *mcg_attr,
1443     uint_t mcgs_max_num, ibt_mcg_info_t **mcgs_info_p, uint_t *entries_p);
1444 
1445 /*
1446  * ibt_free_mcg_info()
1447  *	Free the memory allocated by successful ibt_query_mcg()
1448  */
1449 void ibt_free_mcg_info(ibt_mcg_info_t *mcgs_info, uint_t entries);
1450 
1451 
1452 /*
1453  * ibt_register_subnet_notices()
1454  *	Register a handler to be called for subnet notifications.
1455  */
1456 void ibt_register_subnet_notices(ibt_clnt_hdl_t ibt_hdl,
1457     ibt_sm_notice_handler_t sm_notice_handler, void *private);
1458 
1459 
1460 /*
1461  * Protection Domain Functions.
1462  *
1463  * ibt_alloc_pd()
1464  * ibt_free_pd()
1465  * 	Allocate/Release a protection domain
1466  */
1467 ibt_status_t ibt_alloc_pd(ibt_hca_hdl_t hca_hdl, ibt_pd_flags_t flags,
1468     ibt_pd_hdl_t *pd);
1469 ibt_status_t ibt_free_pd(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd);
1470 
1471 /*
1472  * P_Key to P_Key Index conversion Functions.
1473  *
1474  * ibt_pkey2index_byguid
1475  * ibt_pkey2index	Convert a P_Key into a P_Key index.
1476  *
1477  * ibt_index2pkey_byguid
1478  * ibt_index2pkey	Convert a P_Key Index into a P_Key.
1479  */
1480 ibt_status_t ibt_pkey2index(ibt_hca_hdl_t hca_hdl, uint8_t port_num,
1481     ib_pkey_t pkey, uint16_t *pkey_ix);
1482 
1483 ibt_status_t ibt_index2pkey(ibt_hca_hdl_t hca_hdl, uint8_t port_num,
1484     uint16_t pkey_ix, ib_pkey_t *pkey);
1485 
1486 ibt_status_t ibt_pkey2index_byguid(ib_guid_t hca_guid, uint8_t port_num,
1487     ib_pkey_t pkey, uint16_t *pkey_ix);
1488 
1489 ibt_status_t ibt_index2pkey_byguid(ib_guid_t hca_guid, uint8_t port_num,
1490     uint16_t pkey_ix, ib_pkey_t *pkey);
1491 
1492 /*
1493  *  ibt_ci_data_in()
1494  *
1495  *  Pass CI specific userland data for CI objects to the CI.
1496  */
1497 ibt_status_t ibt_ci_data_in(ibt_hca_hdl_t hca, ibt_ci_data_flags_t flags,
1498     ibt_object_type_t object, void *ibt_object_handle, void *data_p,
1499     size_t data_sz);
1500 
1501 /*
1502  *  ibt_ci_data_out()
1503  *
1504  *  Obtain CI specific userland data for CI objects.
1505  */
1506 ibt_status_t ibt_ci_data_out(ibt_hca_hdl_t hca, ibt_ci_data_flags_t flags,
1507     ibt_object_type_t object, void *ibt_object_handle, void *data_p,
1508     size_t data_sz);
1509 
1510 
1511 /*
1512  * Node Information.
1513  */
1514 
1515 /* Node type : n_node_type */
1516 #define	IBT_NODE_TYPE_CHANNEL_ADAPTER	1	/* HCA or TCA */
1517 #define	IBT_NODE_TYPE_SWITCH		2
1518 #define	IBT_NODE_TYPE_ROUTER		3
1519 
1520 typedef struct ibt_node_info_s {
1521 	ib_guid_t	n_sys_img_guid;	/* System Image GUID */
1522 	ib_guid_t	n_node_guid;	/* Node GUID */
1523 	ib_guid_t	n_port_guid;	/* Port GUID */
1524 	uint16_t	n_dev_id;	/* Device ID */
1525 	uint32_t	n_revision;	/* Device Revision */
1526 	uint32_t	n_vendor_id:24;	/* Device Vendor ID */
1527 	uint8_t		n_num_ports;	/* Number of ports on this node. */
1528 	uint8_t		n_port_num;	/* Port number. */
1529 	uint8_t		n_node_type;	/* Node type */
1530 	char		n_description[64]; /* NULL terminated ASCII string */
1531 } ibt_node_info_t;
1532 
1533 
1534 /*
1535  * ibt_gid_to_node_info()
1536  *	Retrieve node information for the specified GID.
1537  */
1538 ibt_status_t ibt_gid_to_node_info(ib_gid_t gid, ibt_node_info_t *node_info_p);
1539 
1540 /*
1541  * ibt_reprobe_dev
1542  *	Reprobe properties for IOC device node.
1543  */
1544 ibt_status_t	ibt_reprobe_dev(dev_info_t *dip);
1545 
1546 /*
1547  * ibt_get_companion_port_gids()
1548  *
1549  *	Get list of GID's available on a companion port(s) of the specified
1550  *	GID or list of GIDs available on a specified Node GUID/System Image
1551  *	GUID.
1552  */
1553 ibt_status_t ibt_get_companion_port_gids(ib_gid_t gid, ib_guid_t hca_guid,
1554     ib_guid_t sysimg_guid, ib_gid_t **gids_p, uint_t *num_gids_p);
1555 
1556 /*
1557  * SHARED RECEIVE QUEUE
1558  */
1559 
1560 
1561 /*
1562  * ibt_alloc_srq()
1563  *	Allocate a shared receive queue.
1564  */
1565 ibt_status_t ibt_alloc_srq(ibt_hca_hdl_t hca_hdl, ibt_srq_flags_t flags,
1566     ibt_pd_hdl_t pd, ibt_srq_sizes_t *sizes, ibt_srq_hdl_t *ibt_srq_p,
1567     ibt_srq_sizes_t *real_size_p);
1568 
1569 /*
1570  * ibt_free_srq()
1571  *	Free allocated SRQ resources.
1572  */
1573 ibt_status_t ibt_free_srq(ibt_srq_hdl_t ibt_srq);
1574 
1575 /*
1576  * ibt_query_srq()
1577  *	Query a shared receive queue.
1578  */
1579 ibt_status_t ibt_query_srq(ibt_srq_hdl_t ibt_srq, ibt_pd_hdl_t *pd_p,
1580     ibt_srq_sizes_t *sizes_p, uint_t *limit_p);
1581 
1582 /*
1583  * ibt_modify_srq()
1584  *	Modify a shared receive queue.
1585  */
1586 ibt_status_t ibt_modify_srq(ibt_srq_hdl_t ibt_srq, ibt_srq_modify_flags_t flags,
1587     uint_t size, uint_t limit, uint_t *real_size_p);
1588 
1589 /*
1590  * ibt_set_srq_private()
1591  * ibt_get_srq_private()
1592  *	Set/get the SRQ client private data.
1593  */
1594 void ibt_set_srq_private(ibt_srq_hdl_t ibt_srq, void *clnt_private);
1595 void *ibt_get_srq_private(ibt_srq_hdl_t ibt_srq);
1596 
1597 /*
1598  * ibt_check_failure()
1599  * 	Function to test for special case failures
1600  */
1601 ibt_failure_type_t ibt_check_failure(ibt_status_t status, uint64_t *reserved_p);
1602 
1603 
1604 /*
1605  * ibt_hw_is_present() returns 0 when there is no IB hardware actively
1606  * running.  This is primarily useful for modules like rpcmod which needs a
1607  * quick check to decide whether or not it should try to use InfiniBand.
1608  */
1609 int ibt_hw_is_present();
1610 
1611 /*
1612  * Fast Memory Registration (FMR).
1613  *
1614  * ibt_create_fmr_pool
1615  *	Not fast-path.
1616  *	ibt_create_fmr_pool() verifies that the HCA supports FMR and allocates
1617  *	and initializes an "FMR pool".  This pool contains state specific to
1618  *	this registration, including the watermark setting to determine when
1619  *	to sync, and the total number of FMR regions available within this pool.
1620  *
1621  * ibt_destroy_fmr_pool
1622  *	ibt_destroy_fmr_pool() deallocates all of the FMR regions in a specific
1623  *	pool.  All state and information regarding the pool are destroyed and
1624  *	returned as free space once again.  No more use of FMR regions in this
1625  *	pool are possible without a subsequent call to ibt_create_fmr_pool().
1626  *
1627  * ibt_flush_fmr_pool
1628  *	ibt_flush_fmr_pool forces a flush to occur.  At the client's request,
1629  *	any unmapped FMR regions (See 'ibt_deregister_mr())') are returned to
1630  *	a free state.  This function allows for an asynchronous cleanup of
1631  *	formerly used FMR regions.  Sync operation is also performed internally
1632  *	by HCA driver, when 'watermark' settings for the number of free FMR
1633  *	regions left in the "pool" is reached.
1634  *
1635  * ibt_register_physical_fmr
1636  *	ibt_register_physical_fmr() assigns a "free" entry from the FMR Pool.
1637  *	It first consults the "FMR cache" to see if this is a duplicate memory
1638  *	registration to something already in use.  If not, then a free entry
1639  *	in the "pool" is marked used.
1640  *
1641  * ibt_deregister_fmr
1642  *	The ibt_deregister_fmr un-maps the resources reserved from the FMR
1643  *	pool by ibt_register_physical_fmr().   The ibt_deregister_fmr() will
1644  *	mark the region as free in the FMR Pool.
1645  */
1646 ibt_status_t ibt_create_fmr_pool(ibt_hca_hdl_t hca_hdl, ibt_pd_hdl_t pd,
1647     ibt_fmr_pool_attr_t *fmr_params, ibt_fmr_pool_hdl_t *fmr_pool_p);
1648 
1649 ibt_status_t ibt_destroy_fmr_pool(ibt_hca_hdl_t hca_hdl,
1650     ibt_fmr_pool_hdl_t fmr_pool);
1651 
1652 ibt_status_t ibt_flush_fmr_pool(ibt_hca_hdl_t hca_hdl,
1653     ibt_fmr_pool_hdl_t fmr_pool);
1654 
1655 ibt_status_t ibt_register_physical_fmr(ibt_hca_hdl_t hca_hdl,
1656     ibt_fmr_pool_hdl_t fmr_pool, ibt_pmr_attr_t *mem_pattr,
1657     ibt_mr_hdl_t *mr_hdl_p, ibt_pmr_desc_t *mem_desc_p);
1658 
1659 ibt_status_t ibt_deregister_fmr(ibt_hca_hdl_t hca, ibt_mr_hdl_t mr_hdl);
1660 
1661 /*
1662  * IP SUPPORT
1663  */
1664 
1665 /*
1666  * IP get_paths
1667  * Returns an array (or single) of paths and source IP addresses. In the
1668  * simplest form just the destination IP address is specified, and one path
1669  * is requested, then one ibt_path_info_t struct and one source IP.
1670  *
1671  * More than one path can be requested to a single destination, in which case
1672  * the requested number of ibt_path_info_t's are returned, and the same
1673  * number of SRC IP address, with the first SRC IP address corrosponding
1674  * to the first ibt_path_info_t, etc.
1675  *
1676  * Restrictions on the source end point can be specified, in the form of a
1677  * source IP address (this implicitly defines the HCA, HCA port and Pkey)
1678  * HCA, HCA port, and sgid (implicitly defines HCA and HCA port).
1679  * Combinations are allowed but they  must be consistent.
1680  *
1681  * Path attributes can also be specified, these can also affect local HCA
1682  * selection.
1683  *
1684  * ibt_get_ip_paths()  internally does (among other things):
1685  *
1686  *   o ibt_get_list_of_ibd_ipaddr_and_macaddr( OUT list_ipaddr_macaddr)
1687  *
1688  *   o extract_pkey_and_sgid(IN list_ipaddr_macaddr, OUT list_pkey_and_sgid)
1689  *
1690  *   o map_dst_ip_addr(IN dst_ip_addr, OUT dst_pkey, OUT dgid) - See Note
1691  *
1692  *   o filter_by_pkey(IN list_pkey_and_sgid, IN dst_pkey, OUT list_of_sgid)
1693  *
1694  *   o do_multipath_query(IN list_of_sgid, IN dst_pkey, IN dgid, OUT path_list)
1695  *
1696  *   o pick_a_good_path(IN path_list, OUT the_path)
1697  *
1698  *   o find_matching_src_ip(IN the_path, IN list_ipaddr_macaddr, OUT src_ip)
1699  *
1700  * The ibd instance which got the ARP response is only on one P_Key
1701  * knowing the ibd instance (or which IPonIB MCG) got the ARP response
1702  * determins the P_Key associated with a dgid. If the proposedi "ip2mac()"
1703  * API is used to get an IP to GID translations, then returned 'sockaddr_dl'
1704  * contains the interface name and index.
1705  *
1706  *
1707  * Example:
1708  *   ip_path_attr.ipa_dst_ip = dst_ip_addr;
1709  *   ip_path_attr.ipa_ndst = 1;
1710  *   ip_path_attr.ipa_max_paths = 1;
1711  *
1712  *   status = ibt_get_ip_paths(clnt_hdl, flags, &ip_path_attr, &paths,
1713  *      &num_paths_p, &src_ip);
1714  *
1715  *   sid = ibt_get_ip_sid(protocol_num, dst_port);
1716  *   path_info->sid = sid;
1717  *
1718  *   ip_cm_info.src_addr = src_ip;
1719  *   ip_cm_info.dst_addr = dst_ip_addr;
1720  *   ip_cm_info.src_port = src_port
1721  *
1722  *   ibt_format_ip_private_data(ip_cm_info, priv_data_len, &priv_data);
1723  *   ibt_open_rc_channel(chan, private_data);
1724  */
1725 typedef struct ibt_ip_path_attr_s {
1726 	ibt_ip_addr_t		*ipa_dst_ip;		/* Required */
1727 	ibt_ip_addr_t		ipa_src_ip;		/* Optional */
1728 	ib_guid_t		ipa_hca_guid;		/* Optional */
1729 	uint8_t			ipa_hca_port_num;	/* Optional */
1730 	uint8_t			ipa_max_paths;		/* Required */
1731 	uint8_t			ipa_ndst;		/* Required */
1732 	uint8_t			ipa_sl:4;		/* Optional */
1733 	ibt_mtu_req_t		ipa_mtu;		/* Optional */
1734 	ibt_srate_req_t		ipa_srate;		/* Optional */
1735 	ibt_pkt_lt_req_t	ipa_pkt_lt;		/* Optional */
1736 	uint_t			ipa_flow:20;		/* Optional */
1737 	uint8_t			ipa_hop;		/* Optional */
1738 	uint8_t			ipa_tclass;		/* Optional */
1739 } ibt_ip_path_attr_t;
1740 
1741 /*
1742  * Path SRC IP addresses
1743  */
1744 typedef struct ibt_path_ip_src_s {
1745 	ibt_ip_addr_t	ip_primary;
1746 	ibt_ip_addr_t	ip_alternate;
1747 } ibt_path_ip_src_t;
1748 
1749 
1750 ibt_status_t ibt_get_ip_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags,
1751     ibt_ip_path_attr_t *attr, ibt_path_info_t *paths_p, uint8_t *num_paths_p,
1752     ibt_path_ip_src_t *src_ip_p);
1753 
1754 ibt_status_t ibt_get_src_ip(ib_gid_t gid, ib_pkey_t pkey,
1755     ibt_ip_addr_t *src_ip);
1756 
1757 /*
1758  * Callback function that can be used in ibt_aget_ip_paths(), a Non-Blocking
1759  * version of ibt_get_ip_paths().
1760  */
1761 typedef void (*ibt_ip_path_handler_t)(void *arg, ibt_status_t retval,
1762     ibt_path_info_t *paths_p, uint8_t num_paths, ibt_path_ip_src_t *src_ip_p);
1763 
1764 /*
1765  * Find path(s) to a given destination or service asynchronously.
1766  * ibt_aget_ip_paths() is a Non-Blocking version of ibt_get_ip_paths().
1767  */
1768 ibt_status_t ibt_aget_ip_paths(ibt_clnt_hdl_t ibt_hdl, ibt_path_flags_t flags,
1769     ibt_ip_path_attr_t *attr, ibt_ip_path_handler_t func, void  *arg);
1770 
1771 /*
1772  * IP RDMA protocol functions
1773  */
1774 
1775 /*
1776  * IBTF manages the port number space for non well known ports. If a ULP
1777  * is not using TCP/UDP and a well known port, then ibt_get_ip_sid() returns
1778  * an sid based on the IP protocol number '0' (reserved) and an IBTF assigned
1779  * port number.  ibt_release_ip_sid() should be used to release the hold
1780  * of SID created by ibt_get_ip_sid().
1781  */
1782 ib_svc_id_t ibt_get_ip_sid(uint8_t protocol_num, in_port_t dst_port);
1783 ibt_status_t ibt_release_ip_sid(ib_svc_id_t sid);
1784 
1785 uint8_t ibt_get_ip_protocol_num(ib_svc_id_t sid);
1786 in_port_t ibt_get_ip_dst_port(ib_svc_id_t sid);
1787 
1788 /*
1789  * Functions to format/extract the RDMA IP CM private data
1790  */
1791 typedef struct ibt_ip_cm_info_s {
1792 	ibt_ip_addr_t	src_addr;
1793 	ibt_ip_addr_t	dst_addr;
1794 	in_port_t	src_port;
1795 } ibt_ip_cm_info_t;
1796 
1797 /*
1798  * If a ULP is using IP addressing as defined by the RDMA IP CM Service IBTA
1799  * Annex 11, then it must always allocate a private data buffer for use in
1800  * the ibt_open_rc_channel(9F) call. The minimum size of the buffer is
1801  * IBT_IP_HDR_PRIV_DATA_SZ, if the ULP has no ULP specific private data.
1802  * This allows ibt_format_ip_private_data() to place the RDMA IP CM service
1803  * hello message in the private data of the REQ. If the ULP has some ULP
1804  * specific private data then it should allocate a buffer big enough to
1805  * contain that data plus an additional IBT_IP_HDR_PRIV_DATA_SZ bytes.
1806  * The ULP should place its  ULP specific private data at offset
1807  * IBT_IP_HDR_PRIV_DATA_SZ in the allocated buffer before calling
1808  * ibt_format_ip_private_data().
1809  */
1810 ibt_status_t ibt_format_ip_private_data(ibt_ip_cm_info_t *ip_cm_info,
1811     ibt_priv_data_len_t priv_data_len, void *priv_data_p);
1812 ibt_status_t ibt_get_ip_data(ibt_priv_data_len_t priv_data_len,
1813     void *priv_data, ibt_ip_cm_info_t *ip_info_p);
1814 
1815 /*
1816  * The ibt_alt_ip_path_attr_t structure is used to specify additional optional
1817  * attributes when requesting an alternate path for an existing channel.
1818  *
1819  * Attributes that are don't care should be set to NULL or '0'.
1820  */
1821 typedef struct ibt_alt_ip_path_attr_s {
1822 	ibt_ip_addr_t		apa_dst_ip;
1823 	ibt_ip_addr_t		apa_src_ip;
1824 	ibt_srate_req_t		apa_srate;
1825 	ibt_pkt_lt_req_t	apa_pkt_lt;	/* Packet Life Time Request */
1826 	uint_t			apa_flow:20;
1827 	uint8_t			apa_sl:4;
1828 	uint8_t			apa_hop;
1829 	uint8_t			apa_tclass;
1830 } ibt_alt_ip_path_attr_t;
1831 
1832 ibt_status_t ibt_get_ip_alt_path(ibt_channel_hdl_t rc_chan,
1833     ibt_path_flags_t flags, ibt_alt_ip_path_attr_t *attr,
1834     ibt_alt_path_info_t *alt_path);
1835 
1836 /*
1837  * CONTRACT PRIVATE ONLY INTERFACES
1838  *
1839  * DO NOT USE THE FOLLOWING FUNCTIONS WITHOUT SIGNING THE CONTRACT
1840  * WITH IBTF GROUP.
1841  */
1842 
1843 /* Define an Address Record structure (data for ATS service records). */
1844 typedef struct ibt_ar_s {
1845 	ib_gid_t	ar_gid;		/* GID of local HCA port */
1846 	ib_pkey_t	ar_pkey;	/* P_Key valid on port of ar_gid */
1847 	uint8_t		ar_data[16];	/* Data affiliated with GID/P_Key */
1848 } ibt_ar_t;
1849 
1850 /*
1851  * ibt_register_ar()
1852  * ibt_deregister_ar()
1853  *	Register/deregister an Address Record with the SA.
1854  * ibt_query_ar()
1855  *	Query the SA for Address Records matching either GID/P_Key or Data.
1856  */
1857 ibt_status_t ibt_register_ar(ibt_clnt_hdl_t ibt_hdl, ibt_ar_t *arp);
1858 
1859 ibt_status_t ibt_deregister_ar(ibt_clnt_hdl_t ibt_hdl, ibt_ar_t *arp);
1860 
1861 ibt_status_t ibt_query_ar(ib_gid_t *sgid, ibt_ar_t *queryp, ibt_ar_t *resultp);
1862 
1863 
1864 /*
1865  * ibt_modify_system_image()
1866  * ibt_modify_system_image_byguid()
1867  *	Modify specified HCA's system image GUID.
1868  */
1869 ibt_status_t ibt_modify_system_image(ibt_hca_hdl_t hca_hdl, ib_guid_t sys_guid);
1870 
1871 ibt_status_t ibt_modify_system_image_byguid(ib_guid_t hca_guid,
1872     ib_guid_t sys_guid);
1873 
1874 
1875 /*
1876  * ibt_modify_port()
1877  * ibt_modify_port_byguid()
1878  *	Modify the specified port, or all ports attribute(s).
1879  */
1880 ibt_status_t ibt_modify_port(ibt_hca_hdl_t hca_hdl, uint8_t port,
1881     ibt_port_modify_flags_t flags, uint8_t init_type);
1882 
1883 ibt_status_t ibt_modify_port_byguid(ib_guid_t hca_guid, uint8_t port,
1884     ibt_port_modify_flags_t flags, uint8_t init_type);
1885 
1886 
1887 /*
1888  * ibt_get_port_state()
1889  * ibt_get_port_state_byguid()
1890  *	Return the most commonly requested attributes of an HCA port.
1891  *	If the link state is not IBT_PORT_ACTIVE, the other returned values
1892  *	are undefined.
1893  */
1894 ibt_status_t ibt_get_port_state(ibt_hca_hdl_t hca_hdl, uint8_t port,
1895     ib_gid_t *sgid_p, ib_lid_t *base_lid_p);
1896 
1897 ibt_status_t ibt_get_port_state_byguid(ib_guid_t hca_guid, uint8_t port,
1898     ib_gid_t *sgid_p, ib_lid_t *base_lid_p);
1899 
1900 /*
1901  * ibt_alloc_io_mem()
1902  * ibt_free_io_mem()
1903  *	Allocate and deallocate dma-able memory.
1904  */
1905 ibt_status_t ibt_alloc_io_mem(ibt_hca_hdl_t, size_t, ibt_mr_flags_t,
1906     caddr_t *, ibt_mem_alloc_hdl_t *);
1907 
1908 ibt_status_t ibt_free_io_mem(ibt_hca_hdl_t, ibt_mem_alloc_hdl_t);
1909 
1910 #ifdef __cplusplus
1911 }
1912 #endif
1913 
1914 #endif /* _SYS_IB_IBTL_IBTI_COMMON_H */
1915