xref: /trueos/contrib/ofed/management/opensm/include/iba/ib_types.h (revision 8fe640108653f13042f1b15213769e338aa524f6)
1 /*
2  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
3  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5  *
6  * This software is available to you under a choice of one of two
7  * licenses.  You may choose to be licensed under the terms of the GNU
8  * General Public License (GPL) Version 2, available from the file
9  * COPYING in the main directory of this source tree, or the
10  * OpenIB.org BSD license below:
11  *
12  *     Redistribution and use in source and binary forms, with or
13  *     without modification, are permitted provided that the following
14  *     conditions are met:
15  *
16  *      - Redistributions of source code must retain the above
17  *        copyright notice, this list of conditions and the following
18  *        disclaimer.
19  *
20  *      - Redistributions in binary form must reproduce the above
21  *        copyright notice, this list of conditions and the following
22  *        disclaimer in the documentation and/or other materials
23  *        provided with the distribution.
24  *
25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32  * SOFTWARE.
33  *
34  */
35 
36 #if !defined(__IB_TYPES_H__)
37 #define __IB_TYPES_H__
38 
39 #include <string.h>
40 #include <complib/cl_types.h>
41 #include <complib/cl_byteswap.h>
42 
43 #ifdef __cplusplus
44 #  define BEGIN_C_DECLS extern "C" {
45 #  define END_C_DECLS   }
46 #else				/* !__cplusplus */
47 #  define BEGIN_C_DECLS
48 #  define END_C_DECLS
49 #endif				/* __cplusplus */
50 
51 BEGIN_C_DECLS
52 #if defined( WIN32 ) || defined( _WIN64 )
53 #if defined( EXPORT_AL_SYMBOLS )
54 #define OSM_EXPORT	__declspec(dllexport)
55 #else
56 #define OSM_EXPORT	__declspec(dllimport)
57 #endif
58 #define OSM_API __stdcall
59 #define OSM_CDECL __cdecl
60 #else
61 #define OSM_EXPORT	extern
62 #define OSM_API
63 #define OSM_CDECL
64 #define __ptr64
65 #endif
66 /****h* IBA Base/Constants
67 * NAME
68 *	Constants
69 *
70 * DESCRIPTION
71 *	The following constants are used throughout the IBA code base.
72 *
73 *	Definitions are from the InfiniBand Architecture Specification v1.2
74 *
75 *********/
76 /****d* IBA Base: Constants/MAD_BLOCK_SIZE
77 * NAME
78 *	MAD_BLOCK_SIZE
79 *
80 * DESCRIPTION
81 *	Size of a non-RMPP MAD datagram.
82 *
83 * SOURCE
84 */
85 #define MAD_BLOCK_SIZE						256
86 /**********/
87 /****d* IBA Base: Constants/MAD_RMPP_HDR_SIZE
88 * NAME
89 *	MAD_RMPP_HDR_SIZE
90 *
91 * DESCRIPTION
92 *	Size of an RMPP header, including the common MAD header.
93 *
94 * SOURCE
95 */
96 #define MAD_RMPP_HDR_SIZE					36
97 /**********/
98 /****d* IBA Base: Constants/MAD_RMPP_DATA_SIZE
99 * NAME
100 *	MAD_RMPP_DATA_SIZE
101 *
102 * DESCRIPTION
103 *	Size of an RMPP transaction data section.
104 *
105 * SOURCE
106 */
107 #define MAD_RMPP_DATA_SIZE		(MAD_BLOCK_SIZE - MAD_RMPP_HDR_SIZE)
108 /**********/
109 /****d* IBA Base: Constants/MAD_BLOCK_GRH_SIZE
110 * NAME
111 *	MAD_BLOCK_GRH_SIZE
112 *
113 * DESCRIPTION
114 *	Size of a MAD datagram, including the GRH.
115 *
116 * SOURCE
117 */
118 #define MAD_BLOCK_GRH_SIZE					296
119 /**********/
120 /****d* IBA Base: Constants/IB_LID_PERMISSIVE
121 * NAME
122 *	IB_LID_PERMISSIVE
123 *
124 * DESCRIPTION
125 *	Permissive LID
126 *
127 * SOURCE
128 */
129 #define IB_LID_PERMISSIVE					0xFFFF
130 /**********/
131 /****d* IBA Base: Constants/IB_DEFAULT_PKEY
132 * NAME
133 *	IB_DEFAULT_PKEY
134 *
135 * DESCRIPTION
136 *	P_Key value for the default partition.
137 *
138 * SOURCE
139 */
140 #define IB_DEFAULT_PKEY						0xFFFF
141 /**********/
142 /****d* IBA Base: Constants/IB_QP1_WELL_KNOWN_Q_KEY
143 * NAME
144 *	IB_QP1_WELL_KNOWN_Q_KEY
145 *
146 * DESCRIPTION
147 *	Well-known Q_Key for QP1 privileged mode access (15.4.2).
148 *
149 * SOURCE
150 */
151 #define IB_QP1_WELL_KNOWN_Q_KEY				CL_HTON32(0x80010000)
152 /*********/
153 #define IB_QP0								0
154 #define IB_QP1								CL_HTON32(1)
155 #define IB_QP_PRIVILEGED_Q_KEY				CL_HTON32(0x80000000)
156 /****d* IBA Base: Constants/IB_LID_UCAST_START
157 * NAME
158 *	IB_LID_UCAST_START
159 *
160 * DESCRIPTION
161 *	Lowest valid unicast LID value.
162 *
163 * SOURCE
164 */
165 #define IB_LID_UCAST_START_HO				0x0001
166 #define IB_LID_UCAST_START					(CL_HTON16(IB_LID_UCAST_START_HO))
167 /**********/
168 /****d* IBA Base: Constants/IB_LID_UCAST_END
169 * NAME
170 *	IB_LID_UCAST_END
171 *
172 * DESCRIPTION
173 *	Highest valid unicast LID value.
174 *
175 * SOURCE
176 */
177 #define IB_LID_UCAST_END_HO					0xBFFF
178 #define IB_LID_UCAST_END					(CL_HTON16(IB_LID_UCAST_END_HO))
179 /**********/
180 /****d* IBA Base: Constants/IB_LID_MCAST_START
181 * NAME
182 *	IB_LID_MCAST_START
183 *
184 * DESCRIPTION
185 *	Lowest valid multicast LID value.
186 *
187 * SOURCE
188 */
189 #define IB_LID_MCAST_START_HO				0xC000
190 #define IB_LID_MCAST_START					(CL_HTON16(IB_LID_MCAST_START_HO))
191 /**********/
192 /****d* IBA Base: Constants/IB_LID_MCAST_END
193 * NAME
194 *	IB_LID_MCAST_END
195 *
196 * DESCRIPTION
197 *	Highest valid multicast LID value.
198 *
199 * SOURCE
200 */
201 #define IB_LID_MCAST_END_HO					0xFFFE
202 #define IB_LID_MCAST_END					(CL_HTON16(IB_LID_MCAST_END_HO))
203 /**********/
204 /****d* IBA Base: Constants/IB_DEFAULT_SUBNET_PREFIX
205 * NAME
206 *	IB_DEFAULT_SUBNET_PREFIX
207 *
208 * DESCRIPTION
209 *	Default subnet GID prefix.
210 *
211 * SOURCE
212 */
213 #define IB_DEFAULT_SUBNET_PREFIX			(CL_HTON64(0xFE80000000000000ULL))
214 /**********/
215 /****d* IBA Base: Constants/IB_NODE_NUM_PORTS_MAX
216 * NAME
217 *	IB_NODE_NUM_PORTS_MAX
218 *
219 * DESCRIPTION
220 *	Maximum number of ports in a single node (14.2.5.7).
221 * SOURCE
222 */
223 #define IB_NODE_NUM_PORTS_MAX				0xFE
224 /**********/
225 /****d* IBA Base: Constants/IB_INVALID_PORT_NUM
226 * NAME
227 *	IB_INVALID_PORT_NUM
228 *
229 * DESCRIPTION
230 *	Value used to indicate an invalid port number (14.2.5.10).
231 *
232 * SOURCE
233 */
234 #define IB_INVALID_PORT_NUM					0xFF
235 /*********/
236 /****d* IBA Base: Constants/IB_SUBNET_PATH_HOPS_MAX
237 * NAME
238 *	IB_SUBNET_PATH_HOPS_MAX
239 *
240 * DESCRIPTION
241 *	Maximum number of directed route switch hops in a subnet (14.2.1.2).
242 *
243 * SOURCE
244 */
245 #define IB_SUBNET_PATH_HOPS_MAX				64
246 /*********/
247 /****d* IBA Base: Constants/IB_HOPLIMIT_MAX
248 * NAME
249 *	IB_HOPLIMIT_MAX
250 *
251 * DESCRIPTION
252 *       Maximum number of router hops allowed.
253 *
254 * SOURCE
255 */
256 #define IB_HOPLIMIT_MAX					255
257 /*********/
258 /****d* IBA Base: Constants/IB_MC_SCOPE_*
259 * NAME
260 *	IB_MC_SCOPE_*
261 *
262 * DESCRIPTION
263 *	Scope component definitions from IBA 1.2 (Table 3 p. 146)
264 */
265 #define IB_MC_SCOPE_LINK_LOCAL		0x2
266 #define IB_MC_SCOPE_SITE_LOCAL		0x5
267 #define IB_MC_SCOPE_ORG_LOCAL		0x8
268 #define IB_MC_SCOPE_GLOBAL		0xE
269 /*********/
270 /****d* IBA Base: Constants/IB_PKEY_MAX_BLOCKS
271 * NAME
272 *	IB_PKEY_MAX_BLOCKS
273 *
274 * DESCRIPTION
275 *	Maximum number of PKEY blocks (14.2.5.7).
276 *
277 * SOURCE
278 */
279 #define IB_PKEY_MAX_BLOCKS					2048
280 /*********/
281 /****d* IBA Base: Constants/IB_MCAST_MAX_BLOCK_ID
282 * NAME
283 *	IB_MCAST_MAX_BLOCK_ID
284 *
285 * DESCRIPTION
286 *	Maximum number of Multicast port mask blocks
287 *
288 * SOURCE
289 */
290 #define IB_MCAST_MAX_BLOCK_ID				511
291 /*********/
292 /****d* IBA Base: Constants/IB_MCAST_BLOCK_ID_MASK_HO
293 * NAME
294 *	IB_MCAST_BLOCK_ID_MASK_HO
295 *
296 * DESCRIPTION
297 *	Mask (host order) to recover the Multicast block ID.
298 *
299 * SOURCE
300 */
301 #define IB_MCAST_BLOCK_ID_MASK_HO			0x000001FF
302 /*********/
303 /****d* IBA Base: Constants/IB_MCAST_BLOCK_SIZE
304 * NAME
305 *	IB_MCAST_BLOCK_SIZE
306 *
307 * DESCRIPTION
308 *	Number of port mask entries in a multicast forwarding table block.
309 *
310 * SOURCE
311 */
312 #define IB_MCAST_BLOCK_SIZE					32
313 /*********/
314 /****d* IBA Base: Constants/IB_MCAST_MASK_SIZE
315 * NAME
316 *	IB_MCAST_MASK_SIZE
317 *
318 * DESCRIPTION
319 *	Number of port mask bits in each entry in the multicast forwarding table.
320 *
321 * SOURCE
322 */
323 #define IB_MCAST_MASK_SIZE					16
324 /*********/
325 /****d* IBA Base: Constants/IB_MCAST_POSITION_MASK_HO
326 * NAME
327 *	IB_MCAST_POSITION_MASK_HO
328 *
329 * DESCRIPTION
330 *	Mask (host order) to recover the multicast block position.
331 *
332 * SOURCE
333 */
334 #define IB_MCAST_POSITION_MASK_HO				0xF0000000
335 /*********/
336 /****d* IBA Base: Constants/IB_MCAST_POSITION_MAX
337 * NAME
338 *	IB_MCAST_POSITION_MAX
339 *
340 * DESCRIPTION
341 *	Maximum value for the multicast block position.
342 *
343 * SOURCE
344 */
345 #define IB_MCAST_POSITION_MAX				0xF
346 /*********/
347 /****d* IBA Base: Constants/IB_MCAST_POSITION_SHIFT
348 * NAME
349 *	IB_MCAST_POSITION_SHIFT
350 *
351 * DESCRIPTION
352 *	Shift value to normalize the multicast block position value.
353 *
354 * SOURCE
355 */
356 #define IB_MCAST_POSITION_SHIFT				28
357 /*********/
358 /****d* IBA Base: Constants/IB_PKEY_ENTRIES_MAX
359 * NAME
360 *	IB_PKEY_ENTRIES_MAX
361 *
362 * DESCRIPTION
363 *	Maximum number of PKEY entries per port (14.2.5.7).
364 *
365 * SOURCE
366 */
367 #define IB_PKEY_ENTRIES_MAX (IB_PKEY_MAX_BLOCKS * IB_NUM_PKEY_ELEMENTS_IN_BLOCK)
368 /*********/
369 /****d* IBA Base: Constants/IB_PKEY_BASE_MASK
370 * NAME
371 *	IB_PKEY_BASE_MASK
372 *
373 * DESCRIPTION
374 *	Masks for the base P_Key value given a P_Key Entry.
375 *
376 * SOURCE
377 */
378 #define IB_PKEY_BASE_MASK					(CL_HTON16(0x7FFF))
379 /*********/
380 /****d* IBA Base: Constants/IB_PKEY_TYPE_MASK
381 * NAME
382 *	IB_PKEY_TYPE_MASK
383 *
384 * DESCRIPTION
385 *	Masks for the P_Key membership type given a P_Key Entry.
386 *
387 * SOURCE
388 */
389 #define IB_PKEY_TYPE_MASK					(CL_HTON16(0x8000))
390 /*********/
391 /****d* IBA Base: Constants/IB_DEFAULT_PARTIAL_PKEY
392 * NAME
393 *	IB_DEFAULT_PARTIAL_PKEY
394 *
395 * DESCRIPTION
396 *	0x7FFF in network order
397 *
398 * SOURCE
399 */
400 #define IB_DEFAULT_PARTIAL_PKEY				       (CL_HTON16(0x7FFF))
401 /**********/
402 /****d* IBA Base: Constants/IB_MCLASS_SUBN_LID
403 * NAME
404 *	IB_MCLASS_SUBN_LID
405 *
406 * DESCRIPTION
407 *	Subnet Management Class, Subnet Manager LID routed (13.4.4)
408 *
409 * SOURCE
410 */
411 #define IB_MCLASS_SUBN_LID					0x01
412 /**********/
413 /****d* IBA Base: Constants/IB_MCLASS_SUBN_DIR
414 * NAME
415 *	IB_MCLASS_SUBN_DIR
416 *
417 * DESCRIPTION
418 *	Subnet Management Class, Subnet Manager directed route (13.4.4)
419 *
420 * SOURCE
421 */
422 #define IB_MCLASS_SUBN_DIR					0x81
423 /**********/
424 /****d* IBA Base: Constants/IB_MCLASS_SUBN_ADM
425 * NAME
426 *	IB_MCLASS_SUBN_ADM
427 *
428 * DESCRIPTION
429 *	Management Class, Subnet Administration (13.4.4)
430 *
431 * SOURCE
432 */
433 #define IB_MCLASS_SUBN_ADM					0x03
434 /**********/
435 /****d* IBA Base: Constants/IB_MCLASS_PERF
436 * NAME
437 *	IB_MCLASS_PERF
438 *
439 * DESCRIPTION
440 *	Management Class, Performance Management (13.4.4)
441 *
442 * SOURCE
443 */
444 #define IB_MCLASS_PERF						0x04
445 /**********/
446 /****d* IBA Base: Constants/IB_MCLASS_BM
447 * NAME
448 *	IB_MCLASS_BM
449 *
450 * DESCRIPTION
451 *	Management Class, Baseboard Management (13.4.4)
452 *
453 * SOURCE
454 */
455 #define IB_MCLASS_BM						0x05
456 /**********/
457 /****d* IBA Base: Constants/IB_MCLASS_DEV_MGMT
458 * NAME
459 *	IB_MCLASS_DEV_MGMT
460 *
461 * DESCRIPTION
462 *	Management Class, Device Management (13.4.4)
463 *
464 * SOURCE
465 */
466 #define IB_MCLASS_DEV_MGMT					0x06
467 /**********/
468 /****d* IBA Base: Constants/IB_MCLASS_COMM_MGMT
469 * NAME
470 *	IB_MCLASS_COMM_MGMT
471 *
472 * DESCRIPTION
473 *	Management Class, Communication Management (13.4.4)
474 *
475 * SOURCE
476 */
477 #define IB_MCLASS_COMM_MGMT					0x07
478 /**********/
479 /****d* IBA Base: Constants/IB_MCLASS_SNMP
480 * NAME
481 *	IB_MCLASS_SNMP
482 *
483 * DESCRIPTION
484 *	Management Class, SNMP Tunneling (13.4.4)
485 *
486 * SOURCE
487 */
488 #define IB_MCLASS_SNMP						0x08
489 /**********/
490 /****d* IBA Base: Constants/IB_MCLASS_VENDOR_LOW_RANGE_MIN
491 * NAME
492 *	IB_MCLASS_VENDOR_LOW_RANGE_MIN
493 *
494 * DESCRIPTION
495 *	Management Class, Vendor Specific Low Range Start
496 *
497 * SOURCE
498 */
499 #define IB_MCLASS_VENDOR_LOW_RANGE_MIN 0x09
500 /**********/
501 /****d* IBA Base: Constants/IB_MCLASS_VENDOR_LOW_RANGE_MAX
502 * NAME
503 *	IB_MCLASS_VENDOR_LOW_RANGE_MAX
504 *
505 * DESCRIPTION
506 *	Management Class, Vendor Specific Low Range End
507 *
508 * SOURCE
509 */
510 #define IB_MCLASS_VENDOR_LOW_RANGE_MAX 0x0f
511 /**********/
512 /****d* IBA Base: Constants/IB_MCLASS_DEV_ADM
513 * NAME
514 *	IB_MCLASS_DEV_ADM
515 *
516 * DESCRIPTION
517 *	Management Class, Device Administration
518 *
519 * SOURCE
520 */
521 #define IB_MCLASS_DEV_ADM 0x10
522 /**********/
523 /****d* IBA Base: Constants/IB_MCLASS_BIS
524 * NAME
525 *	IB_MCLASS_BIS
526 *
527 * DESCRIPTION
528 *	Management Class, BIS
529 *
530 * SOURCE
531 */
532 #define IB_MCLASS_BIS 0x12
533 /**********/
534 /****d* IBA Base: Constants/IB_MCLASS_VENDOR_HIGH_RANGE_MIN
535 * NAME
536 *	IB_MCLASS_VENDOR_HIGH_RANGE_MIN
537 *
538 * DESCRIPTION
539 *	Management Class, Vendor Specific High Range Start
540 *
541 * SOURCE
542 */
543 #define IB_MCLASS_VENDOR_HIGH_RANGE_MIN 0x30
544 /**********/
545 /****d* IBA Base: Constants/IB_MCLASS_VENDOR_HIGH_RANGE_MAX
546 * NAME
547 *	IB_MCLASS_VENDOR_HIGH_RANGE_MAX
548 *
549 * DESCRIPTION
550 *	Management Class, Vendor Specific High Range End
551 *
552 * SOURCE
553 */
554 #define IB_MCLASS_VENDOR_HIGH_RANGE_MAX 0x4f
555 /**********/
556 /****f* IBA Base: Types/ib_class_is_vendor_specific_low
557 * NAME
558 *	ib_class_is_vendor_specific_low
559 *
560 * DESCRIPTION
561 *	Indicates if the Class Code if a vendor specific class from
562 *  the low range
563 *
564 * SYNOPSIS
565 */
566 static inline boolean_t OSM_API
ib_class_is_vendor_specific_low(IN const uint8_t class_code)567 ib_class_is_vendor_specific_low(IN const uint8_t class_code)
568 {
569 	return ((class_code >= IB_MCLASS_VENDOR_LOW_RANGE_MIN) &&
570 		(class_code <= IB_MCLASS_VENDOR_LOW_RANGE_MAX));
571 }
572 
573 /*
574 * PARAMETERS
575 *	class_code
576 *		[in] The Management Datagram Class Code
577 *
578 * RETURN VALUE
579 *	TRUE if the class is in the Low range of Vendor Specific MADs
580 *	FALSE otherwise.
581 *
582 * NOTES
583 *
584 * SEE ALSO
585 * IB_MCLASS_VENDOR_LOW_RANGE_MIN, IB_MCLASS_VENDOR_LOW_RANGE_MAX
586 *********/
587 
588 /****f* IBA Base: Types/ib_class_is_vendor_specific_high
589 * NAME
590 *	ib_class_is_vendor_specific_high
591 *
592 * DESCRIPTION
593 *	Indicates if the Class Code if a vendor specific class from
594 *  the high range
595 *
596 * SYNOPSIS
597 */
598 static inline boolean_t OSM_API
ib_class_is_vendor_specific_high(IN const uint8_t class_code)599 ib_class_is_vendor_specific_high(IN const uint8_t class_code)
600 {
601 	return ((class_code >= IB_MCLASS_VENDOR_HIGH_RANGE_MIN) &&
602 		(class_code <= IB_MCLASS_VENDOR_HIGH_RANGE_MAX));
603 }
604 
605 /*
606 * PARAMETERS
607 *	class_code
608 *		[in] The Management Datagram Class Code
609 *
610 * RETURN VALUE
611 *	TRUE if the class is in the High range of Vendor Specific MADs
612 *	FALSE otherwise.
613 *
614 * NOTES
615 *
616 * SEE ALSO
617 * IB_MCLASS_VENDOR_HIGH_RANGE_MIN, IB_MCLASS_VENDOR_HIGH_RANGE_MAX
618 *********/
619 
620 /****f* IBA Base: Types/ib_class_is_vendor_specific
621 * NAME
622 *	ib_class_is_vendor_specific
623 *
624 * DESCRIPTION
625 *	Indicates if the Class Code if a vendor specific class
626 *
627 * SYNOPSIS
628 */
629 static inline boolean_t OSM_API
ib_class_is_vendor_specific(IN const uint8_t class_code)630 ib_class_is_vendor_specific(IN const uint8_t class_code)
631 {
632 	return (ib_class_is_vendor_specific_low(class_code) ||
633 		ib_class_is_vendor_specific_high(class_code));
634 }
635 
636 /*
637 * PARAMETERS
638 *	class_code
639 *		[in] The Management Datagram Class Code
640 *
641 * RETURN VALUE
642 *	TRUE if the class is a Vendor Specific MAD
643 *	FALSE otherwise.
644 *
645 * NOTES
646 *
647 * SEE ALSO
648 *  ib_class_is_vendor_specific_low, ib_class_is_vendor_specific_high
649 *********/
650 
651 /****f* IBA Base: Types/ib_class_is_rmpp
652 * NAME
653 *	ib_class_is_rmpp
654 *
655 * DESCRIPTION
656 *	Indicates if the Class Code supports RMPP
657 *
658 * SYNOPSIS
659 */
ib_class_is_rmpp(IN const uint8_t class_code)660 static inline boolean_t OSM_API ib_class_is_rmpp(IN const uint8_t class_code)
661 {
662 	return ((class_code == IB_MCLASS_SUBN_ADM) ||
663 		(class_code == IB_MCLASS_DEV_MGMT) ||
664 		(class_code == IB_MCLASS_DEV_ADM) ||
665 		(class_code == IB_MCLASS_BIS) ||
666 		ib_class_is_vendor_specific_high(class_code));
667 }
668 
669 /*
670 * PARAMETERS
671 *	class_code
672 *		[in] The Management Datagram Class Code
673 *
674 * RETURN VALUE
675 *	TRUE if the class supports RMPP
676 *	FALSE otherwise.
677 *
678 * NOTES
679 *
680 *********/
681 
682 /*
683  *	MAD methods
684  */
685 
686 /****d* IBA Base: Constants/IB_MAX_METHOD
687 * NAME
688 *	IB_MAX_METHOD
689 *
690 * DESCRIPTION
691 *	Total number of methods available to a class, not including the R-bit.
692 *
693 * SOURCE
694 */
695 #define IB_MAX_METHODS						128
696 /**********/
697 
698 /****d* IBA Base: Constants/IB_MAD_METHOD_RESP_MASK
699 * NAME
700 *	IB_MAD_METHOD_RESP_MASK
701 *
702 * DESCRIPTION
703 *	Response mask to extract 'R' bit from the method field. (13.4.5)
704 *
705 * SOURCE
706 */
707 #define IB_MAD_METHOD_RESP_MASK				0x80
708 /**********/
709 
710 /****d* IBA Base: Constants/IB_MAD_METHOD_GET
711 * NAME
712 *	IB_MAD_METHOD_GET
713 *
714 * DESCRIPTION
715 *	Get() Method (13.4.5)
716 *
717 * SOURCE
718 */
719 #define IB_MAD_METHOD_GET					0x01
720 /**********/
721 
722 /****d* IBA Base: Constants/IB_MAD_METHOD_SET
723 * NAME
724 *	IB_MAD_METHOD_SET
725 *
726 * DESCRIPTION
727 *	Set() Method (13.4.5)
728 *
729 * SOURCE
730 */
731 #define IB_MAD_METHOD_SET					0x02
732 /**********/
733 
734 /****d* IBA Base: Constants/IB_MAD_METHOD_GET_RESP
735 * NAME
736 *	IB_MAD_METHOD_GET_RESP
737 *
738 * DESCRIPTION
739 *	GetResp() Method (13.4.5)
740 *
741 * SOURCE
742 */
743 #define IB_MAD_METHOD_GET_RESP				0x81
744 /**********/
745 
746 #define IB_MAD_METHOD_DELETE				0x15
747 
748 /****d* IBA Base: Constants/IB_MAD_METHOD_GETTABLE
749 * NAME
750 *	IB_MAD_METHOD_GETTABLE
751 *
752 * DESCRIPTION
753 *	SubnAdmGetTable() Method (15.2.2)
754 *
755 * SOURCE
756 */
757 #define IB_MAD_METHOD_GETTABLE				0x12
758 /**********/
759 
760 /****d* IBA Base: Constants/IB_MAD_METHOD_GETTABLE_RESP
761 * NAME
762 *	IB_MAD_METHOD_GETTABLE_RESP
763 *
764 * DESCRIPTION
765 *	SubnAdmGetTableResp() Method (15.2.2)
766 *
767 * SOURCE
768 */
769 #define IB_MAD_METHOD_GETTABLE_RESP			0x92
770 
771 /**********/
772 
773 #define IB_MAD_METHOD_GETTRACETABLE			0x13
774 #define IB_MAD_METHOD_GETMULTI				0x14
775 #define IB_MAD_METHOD_GETMULTI_RESP			0x94
776 
777 /****d* IBA Base: Constants/IB_MAD_METHOD_SEND
778 * NAME
779 *	IB_MAD_METHOD_SEND
780 *
781 * DESCRIPTION
782 *	Send() Method (13.4.5)
783 *
784 * SOURCE
785 */
786 #define IB_MAD_METHOD_SEND					0x03
787 /**********/
788 
789 /****d* IBA Base: Constants/IB_MAD_METHOD_TRAP
790 * NAME
791 *	IB_MAD_METHOD_TRAP
792 *
793 * DESCRIPTION
794 *	Trap() Method (13.4.5)
795 *
796 * SOURCE
797 */
798 #define IB_MAD_METHOD_TRAP					0x05
799 /**********/
800 
801 /****d* IBA Base: Constants/IB_MAD_METHOD_REPORT
802 * NAME
803 *	IB_MAD_METHOD_REPORT
804 *
805 * DESCRIPTION
806 *	Report() Method (13.4.5)
807 *
808 * SOURCE
809 */
810 #define IB_MAD_METHOD_REPORT				0x06
811 /**********/
812 
813 /****d* IBA Base: Constants/IB_MAD_METHOD_REPORT_RESP
814 * NAME
815 *	IB_MAD_METHOD_REPORT_RESP
816 *
817 * DESCRIPTION
818 *	ReportResp() Method (13.4.5)
819 *
820 * SOURCE
821 */
822 #define IB_MAD_METHOD_REPORT_RESP			0x86
823 /**********/
824 
825 /****d* IBA Base: Constants/IB_MAD_METHOD_TRAP_REPRESS
826 * NAME
827 *	IB_MAD_METHOD_TRAP_REPRESS
828 *
829 * DESCRIPTION
830 *	TrapRepress() Method (13.4.5)
831 *
832 * SOURCE
833 */
834 #define IB_MAD_METHOD_TRAP_REPRESS			0x07
835 /**********/
836 
837 /****d* IBA Base: Constants/IB_MAD_STATUS_BUSY
838 * NAME
839 *	IB_MAD_STATUS_BUSY
840 *
841 * DESCRIPTION
842 *	Temporarily busy, MAD discarded (13.4.7)
843 *
844 * SOURCE
845 */
846 #define IB_MAD_STATUS_BUSY				(CL_HTON16(0x0001))
847 /**********/
848 
849 /****d* IBA Base: Constants/IB_MAD_STATUS_REDIRECT
850 * NAME
851 *	IB_MAD_STATUS_REDIRECT
852 *
853 * DESCRIPTION
854 *	QP Redirection required (13.4.7)
855 *
856 * SOURCE
857 */
858 #define IB_MAD_STATUS_REDIRECT				(CL_HTON16(0x0002))
859 /**********/
860 
861 /****d* IBA Base: Constants/IB_MAD_STATUS_UNSUP_CLASS_VER
862 * NAME
863 *	IB_MAD_STATUS_UNSUP_CLASS_VER
864 *
865 * DESCRIPTION
866 *	Unsupported class version (13.4.7)
867 *
868 * SOURCE
869 */
870 #define IB_MAD_STATUS_UNSUP_CLASS_VER			(CL_HTON16(0x0004))
871 /**********/
872 
873 /****d* IBA Base: Constants/IB_MAD_STATUS_UNSUP_METHOD
874 * NAME
875 *	IB_MAD_STATUS_UNSUP_METHOD
876 *
877 * DESCRIPTION
878 *	Unsupported method (13.4.7)
879 *
880 * SOURCE
881 */
882 #define IB_MAD_STATUS_UNSUP_METHOD			(CL_HTON16(0x0008))
883 /**********/
884 
885 /****d* IBA Base: Constants/IB_MAD_STATUS_UNSUP_METHOD_ATTR
886 * NAME
887 *	IB_MAD_STATUS_UNSUP_METHOD_ATTR
888 *
889 * DESCRIPTION
890 *	Unsupported method/attribute combination (13.4.7)
891 *
892 * SOURCE
893 */
894 #define IB_MAD_STATUS_UNSUP_METHOD_ATTR			(CL_HTON16(0x000C))
895 /**********/
896 
897 /****d* IBA Base: Constants/IB_MAD_STATUS_INVALID_FIELD
898 * NAME
899 *	IB_MAD_STATUS_INVALID_FIELD
900 *
901 * DESCRIPTION
902 *	Attribute contains one or more invalid fields (13.4.7)
903 *
904 * SOURCE
905 */
906 #define IB_MAD_STATUS_INVALID_FIELD			(CL_HTON16(0x001C))
907 /**********/
908 
909 #define IB_MAD_STATUS_CLASS_MASK			(CL_HTON16(0xFF00))
910 
911 #define IB_SA_MAD_STATUS_SUCCESS			(CL_HTON16(0x0000))
912 #define IB_SA_MAD_STATUS_NO_RESOURCES			(CL_HTON16(0x0100))
913 #define IB_SA_MAD_STATUS_REQ_INVALID			(CL_HTON16(0x0200))
914 #define IB_SA_MAD_STATUS_NO_RECORDS			(CL_HTON16(0x0300))
915 #define IB_SA_MAD_STATUS_TOO_MANY_RECORDS		(CL_HTON16(0x0400))
916 #define IB_SA_MAD_STATUS_INVALID_GID			(CL_HTON16(0x0500))
917 #define IB_SA_MAD_STATUS_INSUF_COMPS			(CL_HTON16(0x0600))
918 #define IB_SA_MAD_STATUS_DENIED				(CL_HTON16(0x0700))
919 #define IB_SA_MAD_STATUS_PRIO_SUGGESTED			(CL_HTON16(0x0800))
920 
921 #define IB_DM_MAD_STATUS_NO_IOC_RESP			(CL_HTON16(0x0100))
922 #define IB_DM_MAD_STATUS_NO_SVC_ENTRIES			(CL_HTON16(0x0200))
923 #define IB_DM_MAD_STATUS_IOC_FAILURE			(CL_HTON16(0x8000))
924 
925 /****d* IBA Base: Constants/IB_MAD_ATTR_CLASS_PORT_INFO
926 * NAME
927 *	IB_MAD_ATTR_CLASS_PORT_INFO
928 *
929 * DESCRIPTION
930 *	ClassPortInfo attribute (13.4.8)
931 *
932 * SOURCE
933 */
934 #define IB_MAD_ATTR_CLASS_PORT_INFO			(CL_HTON16(0x0001))
935 /**********/
936 
937 /****d* IBA Base: Constants/IB_MAD_ATTR_NOTICE
938 * NAME
939 *	IB_MAD_ATTR_NOTICE
940 *
941 * DESCRIPTION
942 *	Notice attribute (13.4.8)
943 *
944 * SOURCE
945 */
946 #define IB_MAD_ATTR_NOTICE					(CL_HTON16(0x0002))
947 /**********/
948 
949 /****d* IBA Base: Constants/IB_MAD_ATTR_INFORM_INFO
950 * NAME
951 *	IB_MAD_ATTR_INFORM_INFO
952 *
953 * DESCRIPTION
954 *	InformInfo attribute (13.4.8)
955 *
956 * SOURCE
957 */
958 #define IB_MAD_ATTR_INFORM_INFO				(CL_HTON16(0x0003))
959 /**********/
960 
961 /****d* IBA Base: Constants/IB_MAD_ATTR_NODE_DESC
962 * NAME
963 *	IB_MAD_ATTR_NODE_DESC
964 *
965 * DESCRIPTION
966 *	NodeDescription attribute (14.2.5)
967 *
968 * SOURCE
969 */
970 #define IB_MAD_ATTR_NODE_DESC				(CL_HTON16(0x0010))
971 
972 /****d* IBA Base: Constants/IB_MAD_ATTR_PORT_SMPL_CTRL
973 * NAME
974 *	IB_MAD_ATTR_PORT_SMPL_CTRL
975 *
976 * DESCRIPTION
977 *	PortSamplesControl attribute (16.1.3)
978 *
979 * SOURCE
980 */
981 #define IB_MAD_ATTR_PORT_SMPL_CTRL			(CL_HTON16(0x0010))
982 /**********/
983 
984 /****d* IBA Base: Constants/IB_MAD_ATTR_NODE_INFO
985 * NAME
986 *	IB_MAD_ATTR_NODE_INFO
987 *
988 * DESCRIPTION
989 *	NodeInfo attribute (14.2.5)
990 *
991 * SOURCE
992 */
993 #define IB_MAD_ATTR_NODE_INFO				(CL_HTON16(0x0011))
994 /**********/
995 
996 /****d* IBA Base: Constants/IB_MAD_ATTR_PORT_SMPL_RSLT
997 * NAME
998 *	IB_MAD_ATTR_PORT_SMPL_RSLT
999 *
1000 * DESCRIPTION
1001 *	PortSamplesResult attribute (16.1.3)
1002 *
1003 * SOURCE
1004 */
1005 #define IB_MAD_ATTR_PORT_SMPL_RSLT			(CL_HTON16(0x0011))
1006 /**********/
1007 
1008 /****d* IBA Base: Constants/IB_MAD_ATTR_SWITCH_INFO
1009 * NAME
1010 *	IB_MAD_ATTR_SWITCH_INFO
1011 *
1012 * DESCRIPTION
1013 *	SwitchInfo attribute (14.2.5)
1014 *
1015 * SOURCE
1016 */
1017 #define IB_MAD_ATTR_SWITCH_INFO				(CL_HTON16(0x0012))
1018 /**********/
1019 
1020 /****d* IBA Base: Constants/IB_MAD_ATTR_PORT_CNTRS
1021 * NAME
1022 *	IB_MAD_ATTR_PORT_CNTRS
1023 *
1024 * DESCRIPTION
1025 *	PortCounters attribute (16.1.3)
1026 *
1027 * SOURCE
1028 */
1029 #define IB_MAD_ATTR_PORT_CNTRS				(CL_HTON16(0x0012))
1030 /**********/
1031 
1032 /****d* IBA Base: Constants/IB_MAD_ATTR_GUID_INFO
1033 * NAME
1034 *	IB_MAD_ATTR_GUID_INFO
1035 *
1036 * DESCRIPTION
1037 *	GUIDInfo attribute (14.2.5)
1038 *
1039 * SOURCE
1040 */
1041 #define IB_MAD_ATTR_GUID_INFO				(CL_HTON16(0x0014))
1042 /**********/
1043 
1044 /****d* IBA Base: Constants/IB_MAD_ATTR_PORT_INFO
1045 * NAME
1046 *	IB_MAD_ATTR_PORT_INFO
1047 *
1048 * DESCRIPTION
1049 *	PortInfo attribute (14.2.5)
1050 *
1051 * SOURCE
1052 */
1053 #define IB_MAD_ATTR_PORT_INFO				(CL_HTON16(0x0015))
1054 /**********/
1055 
1056 /****d* IBA Base: Constants/IB_MAD_ATTR_P_KEY_TABLE
1057 * NAME
1058 *	IB_MAD_ATTR_P_KEY_TABLE
1059 *
1060 * DESCRIPTION
1061 *	PartitionTable attribute (14.2.5)
1062 *
1063 * SOURCE
1064 */
1065 #define IB_MAD_ATTR_P_KEY_TABLE				(CL_HTON16(0x0016))
1066 /**********/
1067 
1068 /****d* IBA Base: Constants/IB_MAD_ATTR_SLVL_TABLE
1069 * NAME
1070 *	IB_MAD_ATTR_SLVL_TABLE
1071 *
1072 * DESCRIPTION
1073 *	SL VL Mapping Table attribute (14.2.5)
1074 *
1075 * SOURCE
1076 */
1077 #define IB_MAD_ATTR_SLVL_TABLE				(CL_HTON16(0x0017))
1078 /**********/
1079 
1080 /****d* IBA Base: Constants/IB_MAD_ATTR_VL_ARBITRATION
1081 * NAME
1082 *	IB_MAD_ATTR_VL_ARBITRATION
1083 *
1084 * DESCRIPTION
1085 *	VL Arbitration Table attribute (14.2.5)
1086 *
1087 * SOURCE
1088 */
1089 #define IB_MAD_ATTR_VL_ARBITRATION			(CL_HTON16(0x0018))
1090 /**********/
1091 
1092 /****d* IBA Base: Constants/IB_MAD_ATTR_LIN_FWD_TBL
1093 * NAME
1094 *	IB_MAD_ATTR_LIN_FWD_TBL
1095 *
1096 * DESCRIPTION
1097 *	Switch linear forwarding table
1098 *
1099 * SOURCE
1100 */
1101 #define IB_MAD_ATTR_LIN_FWD_TBL				(CL_HTON16(0x0019))
1102 /**********/
1103 
1104 /****d* IBA Base: Constants/IB_MAD_ATTR_RND_FWD_TBL
1105 * NAME
1106 *	IB_MAD_ATTR_RND_FWD_TBL
1107 *
1108 * DESCRIPTION
1109 *	Switch random forwarding table
1110 *
1111 * SOURCE
1112 */
1113 #define IB_MAD_ATTR_RND_FWD_TBL				(CL_HTON16(0x001A))
1114 /**********/
1115 
1116 /****d* IBA Base: Constants/IB_MAD_ATTR_MCAST_FWD_TBL
1117 * NAME
1118 *	IB_MAD_ATTR_MCAST_FWD_TBL
1119 *
1120 * DESCRIPTION
1121 *	Switch multicast forwarding table
1122 *
1123 * SOURCE
1124 */
1125 #define IB_MAD_ATTR_MCAST_FWD_TBL			(CL_HTON16(0x001B))
1126 /**********/
1127 
1128 /****d* IBA Base: Constants/IB_MAD_ATTR_NODE_RECORD
1129 * NAME
1130 *	IB_MAD_ATTR_NODE_RECORD
1131 *
1132 * DESCRIPTION
1133 *	NodeRecord attribute (15.2.5)
1134 *
1135 * SOURCE
1136 */
1137 #define IB_MAD_ATTR_NODE_RECORD				(CL_HTON16(0x0011))
1138 /**********/
1139 
1140 /****d* IBA Base: Constants/IB_MAD_ATTR_PORTINFO_RECORD
1141 * NAME
1142 *	IB_MAD_ATTR_PORTINFO_RECORD
1143 *
1144 * DESCRIPTION
1145 *	PortInfoRecord attribute (15.2.5)
1146 *
1147 * SOURCE
1148 */
1149 #define IB_MAD_ATTR_PORTINFO_RECORD			(CL_HTON16(0x0012))
1150 /**********/
1151 
1152 /****d* IBA Base: Constants/IB_MAD_ATTR_SWITCH_INFO_RECORD
1153 * NAME
1154 *       IB_MAD_ATTR_SWITCH_INFO_RECORD
1155 *
1156 * DESCRIPTION
1157 *       SwitchInfoRecord attribute (15.2.5)
1158 *
1159 * SOURCE
1160 */
1161 #define IB_MAD_ATTR_SWITCH_INFO_RECORD			(CL_HTON16(0x0014))
1162 /**********/
1163 
1164 /****d* IBA Base: Constants/IB_MAD_ATTR_LINK_RECORD
1165 * NAME
1166 *	IB_MAD_ATTR_LINK_RECORD
1167 *
1168 * DESCRIPTION
1169 *	LinkRecord attribute (15.2.5)
1170 *
1171 * SOURCE
1172 */
1173 #define IB_MAD_ATTR_LINK_RECORD				(CL_HTON16(0x0020))
1174 /**********/
1175 
1176 /****d* IBA Base: Constants/IB_MAD_ATTR_SM_INFO
1177 * NAME
1178 *	IB_MAD_ATTR_SM_INFO
1179 *
1180 * DESCRIPTION
1181 *	SMInfo attribute (14.2.5)
1182 *
1183 * SOURCE
1184 */
1185 #define IB_MAD_ATTR_SM_INFO				(CL_HTON16(0x0020))
1186 /**********/
1187 
1188 /****d* IBA Base: Constants/IB_MAD_ATTR_SMINFO_RECORD
1189 * NAME
1190 *	IB_MAD_ATTR_SMINFO_RECORD
1191 *
1192 * DESCRIPTION
1193 *	SMInfoRecord attribute (15.2.5)
1194 *
1195 * SOURCE
1196 */
1197 #define IB_MAD_ATTR_SMINFO_RECORD			(CL_HTON16(0x0018))
1198 /**********/
1199 
1200 /****d* IBA Base: Constants/IB_MAD_ATTR_GUIDINFO_RECORD
1201 * NAME
1202 *       IB_MAD_ATTR_GUIDINFO_RECORD
1203 *
1204 * DESCRIPTION
1205 *       GuidInfoRecord attribute (15.2.5)
1206 *
1207 * SOURCE
1208 */
1209 #define IB_MAD_ATTR_GUIDINFO_RECORD			(CL_HTON16(0x0030))
1210 /**********/
1211 
1212 /****d* IBA Base: Constants/IB_MAD_ATTR_VENDOR_DIAG
1213 * NAME
1214 *	IB_MAD_ATTR_VENDOR_DIAG
1215 *
1216 * DESCRIPTION
1217 *	VendorDiag attribute (14.2.5)
1218 *
1219 * SOURCE
1220 */
1221 #define IB_MAD_ATTR_VENDOR_DIAG				(CL_HTON16(0x0030))
1222 /**********/
1223 
1224 /****d* IBA Base: Constants/IB_MAD_ATTR_LED_INFO
1225 * NAME
1226 *	IB_MAD_ATTR_LED_INFO
1227 *
1228 * DESCRIPTION
1229 *	LedInfo attribute (14.2.5)
1230 *
1231 * SOURCE
1232 */
1233 #define IB_MAD_ATTR_LED_INFO				(CL_HTON16(0x0031))
1234 /**********/
1235 
1236 /****d* IBA Base: Constants/IB_MAD_ATTR_SERVICE_RECORD
1237 * NAME
1238 *	IB_MAD_ATTR_SERVICE_RECORD
1239 *
1240 * DESCRIPTION
1241 *	ServiceRecord attribute (15.2.5)
1242 *
1243 * SOURCE
1244 */
1245 #define IB_MAD_ATTR_SERVICE_RECORD			(CL_HTON16(0x0031))
1246 /**********/
1247 
1248 /****d* IBA Base: Constants/IB_MAD_ATTR_LFT_RECORD
1249 * NAME
1250 *	IB_MAD_ATTR_LFT_RECORD
1251 *
1252 * DESCRIPTION
1253 *	LinearForwardingTableRecord attribute (15.2.5.6)
1254 *
1255 * SOURCE
1256 */
1257 #define IB_MAD_ATTR_LFT_RECORD				(CL_HTON16(0x0015))
1258 /**********/
1259 
1260 /****d* IBA Base: Constants/IB_MAD_ATTR_MFT_RECORD
1261 * NAME
1262 *       IB_MAD_ATTR_MFT_RECORD
1263 *
1264 * DESCRIPTION
1265 *       MulticastForwardingTableRecord attribute (15.2.5.8)
1266 *
1267 * SOURCE
1268 */
1269 #define IB_MAD_ATTR_MFT_RECORD				(CL_HTON16(0x0017))
1270 /**********/
1271 
1272 /****d* IBA Base: Constants/IB_MAD_ATTR_PKEYTBL_RECORD
1273 * NAME
1274 *	IB_MAD_ATTR_PKEYTBL_RECORD
1275 *
1276 * DESCRIPTION
1277 *	PKEY Table Record attribute (15.2.5)
1278 *
1279 * SOURCE
1280 */
1281 #define IB_MAD_ATTR_PKEY_TBL_RECORD			(CL_HTON16(0x0033))
1282 /**********/
1283 
1284 /****d* IBA Base: Constants/IB_MAD_ATTR_PATH_RECORD
1285 * NAME
1286 *	IB_MAD_ATTR_PATH_RECORD
1287 *
1288 * DESCRIPTION
1289 *	PathRecord attribute (15.2.5)
1290 *
1291 * SOURCE
1292 */
1293 #define IB_MAD_ATTR_PATH_RECORD				(CL_HTON16(0x0035))
1294 /**********/
1295 
1296 /****d* IBA Base: Constants/IB_MAD_ATTR_VLARB_RECORD
1297 * NAME
1298 *	IB_MAD_ATTR_VLARB_RECORD
1299 *
1300 * DESCRIPTION
1301 *	VL Arbitration Table Record attribute (15.2.5)
1302 *
1303 * SOURCE
1304 */
1305 #define IB_MAD_ATTR_VLARB_RECORD			(CL_HTON16(0x0036))
1306 /**********/
1307 
1308 /****d* IBA Base: Constants/IB_MAD_ATTR_SLVL_RECORD
1309 * NAME
1310 *	IB_MAD_ATTR_SLVL_RECORD
1311 *
1312 * DESCRIPTION
1313 *	SLtoVL Mapping Table Record attribute (15.2.5)
1314 *
1315 * SOURCE
1316 */
1317 #define IB_MAD_ATTR_SLVL_RECORD				(CL_HTON16(0x0013))
1318 /**********/
1319 
1320 /****d* IBA Base: Constants/IB_MAD_ATTR_MCMEMBER_RECORD
1321 * NAME
1322 *	IB_MAD_ATTR_MCMEMBER_RECORD
1323 *
1324 * DESCRIPTION
1325 *	MCMemberRecord attribute (15.2.5)
1326 *
1327 * SOURCE
1328 */
1329 #define IB_MAD_ATTR_MCMEMBER_RECORD			(CL_HTON16(0x0038))
1330 /**********/
1331 
1332 /****d* IBA Base: Constants/IB_MAD_ATTR_TRACE_RECORD
1333 * NAME
1334 *	IB_MAD_ATTR_TRACE_RECORD
1335 *
1336 * DESCRIPTION
1337 *	TraceRecord attribute (15.2.5)
1338 *
1339 * SOURCE
1340 */
1341 #define IB_MAD_ATTR_TRACE_RECORD			(CL_HTON16(0x0039))
1342 /**********/
1343 
1344 /****d* IBA Base: Constants/IB_MAD_ATTR_MULTIPATH_RECORD
1345 * NAME
1346 *	IB_MAD_ATTR_MULTIPATH_RECORD
1347 *
1348 * DESCRIPTION
1349 *	MultiPathRecord attribute (15.2.5)
1350 *
1351 * SOURCE
1352 */
1353 #define IB_MAD_ATTR_MULTIPATH_RECORD			(CL_HTON16(0x003A))
1354 /**********/
1355 
1356 /****d* IBA Base: Constants/IB_MAD_ATTR_SVC_ASSOCIATION_RECORD
1357 * NAME
1358 *	IB_MAD_ATTR_SVC_ASSOCIATION_RECORD
1359 *
1360 * DESCRIPTION
1361 *	Service Association Record attribute (15.2.5)
1362 *
1363 * SOURCE
1364 */
1365 #define IB_MAD_ATTR_SVC_ASSOCIATION_RECORD		(CL_HTON16(0x003B))
1366 /**********/
1367 
1368 /****d* IBA Base: Constants/IB_MAD_ATTR_INFORM_INFO_RECORD
1369 * NAME
1370 *	IB_MAD_ATTR_INFORM_INFO_RECORD
1371 *
1372 * DESCRIPTION
1373 *	InformInfo Record attribute (15.2.5)
1374 *
1375 * SOURCE
1376 */
1377 #define IB_MAD_ATTR_INFORM_INFO_RECORD			(CL_HTON16(0x00F3))
1378 
1379 /****d* IBA Base: Constants/IB_MAD_ATTR_IO_UNIT_INFO
1380 * NAME
1381 *	IB_MAD_ATTR_IO_UNIT_INFO
1382 *
1383 * DESCRIPTION
1384 *	IOUnitInfo attribute (16.3.3)
1385 *
1386 * SOURCE
1387 */
1388 #define IB_MAD_ATTR_IO_UNIT_INFO			(CL_HTON16(0x0010))
1389 /**********/
1390 
1391 /****d* IBA Base: Constants/IB_MAD_ATTR_IO_CONTROLLER_PROFILE
1392 * NAME
1393 *	IB_MAD_ATTR_IO_CONTROLLER_PROFILE
1394 *
1395 * DESCRIPTION
1396 *	IOControllerProfile attribute (16.3.3)
1397 *
1398 * SOURCE
1399 */
1400 #define IB_MAD_ATTR_IO_CONTROLLER_PROFILE	(CL_HTON16(0x0011))
1401 /**********/
1402 
1403 /****d* IBA Base: Constants/IB_MAD_ATTR_SERVICE_ENTRIES
1404 * NAME
1405 *	IB_MAD_ATTR_SERVICE_ENTRIES
1406 *
1407 * DESCRIPTION
1408 *	ServiceEntries attribute (16.3.3)
1409 *
1410 * SOURCE
1411 */
1412 #define IB_MAD_ATTR_SERVICE_ENTRIES			(CL_HTON16(0x0012))
1413 /**********/
1414 
1415 /****d* IBA Base: Constants/IB_MAD_ATTR_DIAGNOSTIC_TIMEOUT
1416 * NAME
1417 *	IB_MAD_ATTR_DIAGNOSTIC_TIMEOUT
1418 *
1419 * DESCRIPTION
1420 *	DiagnosticTimeout attribute (16.3.3)
1421 *
1422 * SOURCE
1423 */
1424 #define IB_MAD_ATTR_DIAGNOSTIC_TIMEOUT		(CL_HTON16(0x0020))
1425 /**********/
1426 
1427 /****d* IBA Base: Constants/IB_MAD_ATTR_PREPARE_TO_TEST
1428 * NAME
1429 *	IB_MAD_ATTR_PREPARE_TO_TEST
1430 *
1431 * DESCRIPTION
1432 *	PrepareToTest attribute (16.3.3)
1433 *
1434 * SOURCE
1435 */
1436 #define IB_MAD_ATTR_PREPARE_TO_TEST			(CL_HTON16(0x0021))
1437 /**********/
1438 
1439 /****d* IBA Base: Constants/IB_MAD_ATTR_TEST_DEVICE_ONCE
1440 * NAME
1441 *	IB_MAD_ATTR_TEST_DEVICE_ONCE
1442 *
1443 * DESCRIPTION
1444 *	TestDeviceOnce attribute (16.3.3)
1445 *
1446 * SOURCE
1447 */
1448 #define IB_MAD_ATTR_TEST_DEVICE_ONCE		(CL_HTON16(0x0022))
1449 /**********/
1450 
1451 /****d* IBA Base: Constants/IB_MAD_ATTR_TEST_DEVICE_LOOP
1452 * NAME
1453 *	IB_MAD_ATTR_TEST_DEVICE_LOOP
1454 *
1455 * DESCRIPTION
1456 *	TestDeviceLoop attribute (16.3.3)
1457 *
1458 * SOURCE
1459 */
1460 #define IB_MAD_ATTR_TEST_DEVICE_LOOP		(CL_HTON16(0x0023))
1461 /**********/
1462 
1463 /****d* IBA Base: Constants/IB_MAD_ATTR_DIAG_CODE
1464 * NAME
1465 *	IB_MAD_ATTR_DIAG_CODE
1466 *
1467 * DESCRIPTION
1468 *	DiagCode attribute (16.3.3)
1469 *
1470 * SOURCE
1471 */
1472 #define IB_MAD_ATTR_DIAG_CODE				(CL_HTON16(0x0024))
1473 /**********/
1474 
1475 /****d* IBA Base: Constants/IB_MAD_ATTR_SVC_ASSOCIATION_RECORD
1476 * NAME
1477 *	IB_MAD_ATTR_SVC_ASSOCIATION_RECORD
1478 *
1479 * DESCRIPTION
1480 *	Service Association Record attribute (15.2.5)
1481 *
1482 * SOURCE
1483 */
1484 #define IB_MAD_ATTR_SVC_ASSOCIATION_RECORD	(CL_HTON16(0x003B))
1485 /**********/
1486 
1487 /****d* IBA Base: Constants/IB_NODE_TYPE_CA
1488 * NAME
1489 *	IB_NODE_TYPE_CA
1490 *
1491 * DESCRIPTION
1492 *	Encoded generic node type used in MAD attributes (13.4.8.2)
1493 *
1494 * SOURCE
1495 */
1496 #define IB_NODE_TYPE_CA						0x01
1497 /**********/
1498 
1499 /****d* IBA Base: Constants/IB_NODE_TYPE_SWITCH
1500 * NAME
1501 *	IB_NODE_TYPE_SWITCH
1502 *
1503 * DESCRIPTION
1504 *	Encoded generic node type used in MAD attributes (13.4.8.2)
1505 *
1506 * SOURCE
1507 */
1508 #define IB_NODE_TYPE_SWITCH					0x02
1509 /**********/
1510 
1511 /****d* IBA Base: Constants/IB_NODE_TYPE_ROUTER
1512 * NAME
1513 *	IB_NODE_TYPE_ROUTER
1514 *
1515 * DESCRIPTION
1516 *	Encoded generic node type used in MAD attributes (13.4.8.2)
1517 *
1518 * SOURCE
1519 */
1520 #define IB_NODE_TYPE_ROUTER					0x03
1521 /**********/
1522 
1523 /****d* IBA Base: Constants/IB_NOTICE_PRODUCER_TYPE_CA
1524 * NAME
1525 *	IB_NOTICE_PRODUCER_TYPE_CA
1526 *
1527 * DESCRIPTION
1528 *	Encoded generic producer type used in Notice attribute (13.4.8.2)
1529 *
1530 * SOURCE
1531 */
1532 #define IB_NOTICE_PRODUCER_TYPE_CA			(CL_HTON32(0x000001))
1533 /**********/
1534 
1535 /****d* IBA Base: Constants/IB_NOTICE_PRODUCER_TYPE_SWITCH
1536 * NAME
1537 *	IB_NOTICE_PRODUCER_TYPE_SWITCH
1538 *
1539 * DESCRIPTION
1540 *	Encoded generic producer type used in Notice attribute (13.4.8.2)
1541 *
1542 * SOURCE
1543 */
1544 #define IB_NOTICE_PRODUCER_TYPE_SWITCH			(CL_HTON32(0x000002))
1545 /**********/
1546 
1547 /****d* IBA Base: Constants/IB_NOTICE_PRODUCER_TYPE_ROUTER
1548 * NAME
1549 *	IB_NOTICE_PRODUCER_TYPE_ROUTER
1550 *
1551 * DESCRIPTION
1552 *	Encoded generic producer type used in Notice attribute (13.4.8.2)
1553 *
1554 * SOURCE
1555 */
1556 #define IB_NOTICE_PRODUCER_TYPE_ROUTER			(CL_HTON32(0x000003))
1557 /**********/
1558 
1559 /****d* IBA Base: Constants/IB_NOTICE_PRODUCER_TYPE_CLASS_MGR
1560 * NAME
1561 *	IB_NOTICE_PRODUCER_TYPE_CLASS_MGR
1562 *
1563 * DESCRIPTION
1564 *	Encoded generic producer type used in Notice attribute (13.4.8.2)
1565 *
1566 * SOURCE
1567 */
1568 #define IB_NOTICE_PRODUCER_TYPE_CLASS_MGR			(CL_HTON32(0x000004))
1569 /**********/
1570 
1571 /****d* IBA Base: Constants/IB_MTU_LEN_TYPE
1572 * NAME
1573 *	IB_MTU_LEN_TYPE
1574 *
1575 * DESCRIPTION
1576 *	Encoded path MTU.
1577 *		1: 256
1578 *		2: 512
1579 *		3: 1024
1580 *		4: 2048
1581 *		5: 4096
1582 *		others: reserved
1583 *
1584 * SOURCE
1585 */
1586 #define IB_MTU_LEN_256							1
1587 #define IB_MTU_LEN_512							2
1588 #define IB_MTU_LEN_1024							3
1589 #define IB_MTU_LEN_2048							4
1590 #define IB_MTU_LEN_4096							5
1591 
1592 #define IB_MIN_MTU    IB_MTU_LEN_256
1593 #define IB_MAX_MTU    IB_MTU_LEN_4096
1594 
1595 /**********/
1596 
1597 /****d* IBA Base: Constants/IB_PATH_SELECTOR_TYPE
1598 * NAME
1599 *	IB_PATH_SELECTOR_TYPE
1600 *
1601 * DESCRIPTION
1602 *	Path selector.
1603 *		0: greater than specified
1604 *		1: less than specified
1605 *		2: exactly the specified
1606 *		3: largest available
1607 *
1608 * SOURCE
1609 */
1610 #define IB_PATH_SELECTOR_GREATER_THAN		0
1611 #define IB_PATH_SELECTOR_LESS_THAN		1
1612 #define IB_PATH_SELECTOR_EXACTLY		2
1613 #define IB_PATH_SELECTOR_LARGEST		3
1614 /**********/
1615 
1616 /****d* IBA Base: Constants/IB_SMINFO_STATE_NOTACTIVE
1617 * NAME
1618 *	IB_SMINFO_STATE_NOTACTIVE
1619 *
1620 * DESCRIPTION
1621 *	Encoded state value used in the SMInfo attribute.
1622 *
1623 * SOURCE
1624 */
1625 #define IB_SMINFO_STATE_NOTACTIVE			0
1626 /**********/
1627 
1628 /****d* IBA Base: Constants/IB_SMINFO_STATE_DISCOVERING
1629 * NAME
1630 *	IB_SMINFO_STATE_DISCOVERING
1631 *
1632 * DESCRIPTION
1633 *	Encoded state value used in the SMInfo attribute.
1634 *
1635 * SOURCE
1636 */
1637 #define IB_SMINFO_STATE_DISCOVERING			1
1638 /**********/
1639 
1640 /****d* IBA Base: Constants/IB_SMINFO_STATE_STANDBY
1641 * NAME
1642 *	IB_SMINFO_STATE_STANDBY
1643 *
1644 * DESCRIPTION
1645 *	Encoded state value used in the SMInfo attribute.
1646 *
1647 * SOURCE
1648 */
1649 #define IB_SMINFO_STATE_STANDBY				2
1650 /**********/
1651 
1652 /****d* IBA Base: Constants/IB_SMINFO_STATE_MASTER
1653 * NAME
1654 *	IB_SMINFO_STATE_MASTER
1655 *
1656 * DESCRIPTION
1657 *	Encoded state value used in the SMInfo attribute.
1658 *
1659 * SOURCE
1660 */
1661 #define IB_SMINFO_STATE_MASTER				3
1662 /**********/
1663 
1664 /****d* IBA Base: Constants/IB_PATH_REC_SL_MASK
1665 * NAME
1666 *	IB_PATH_REC_SL_MASK
1667 *
1668 * DESCRIPTION
1669 *	Mask for the sl field for path record
1670 *
1671 * SOURCE
1672 */
1673 #define IB_PATH_REC_SL_MASK				0x000F
1674 
1675 /****d* IBA Base: Constants/IB_MULTIPATH_REC_SL_MASK
1676 * NAME
1677 *	IB_MILTIPATH_REC_SL_MASK
1678 *
1679 * DESCRIPTION
1680 *	Mask for the sl field for MultiPath record
1681 *
1682 * SOURCE
1683 */
1684 #define IB_MULTIPATH_REC_SL_MASK			0x000F
1685 
1686 /****d* IBA Base: Constants/IB_PATH_REC_QOS_CLASS_MASK
1687 * NAME
1688 *	IB_PATH_REC_QOS_CLASS_MASK
1689 *
1690 * DESCRIPTION
1691 *	Mask for the QoS class field for path record
1692 *
1693 * SOURCE
1694 */
1695 #define IB_PATH_REC_QOS_CLASS_MASK			0xFFF0
1696 
1697 /****d* IBA Base: Constants/IB_MULTIPATH_REC_QOS_CLASS_MASK
1698 * NAME
1699 *	IB_MULTIPATH_REC_QOS_CLASS_MASK
1700 *
1701 * DESCRIPTION
1702 *	Mask for the QoS class field for MultiPath record
1703 *
1704 * SOURCE
1705 */
1706 #define IB_MULTIPATH_REC_QOS_CLASS_MASK			0xFFF0
1707 
1708 /****d* IBA Base: Constants/IB_PATH_REC_SELECTOR_MASK
1709 * NAME
1710 *	IB_PATH_REC_SELECTOR_MASK
1711 *
1712 * DESCRIPTION
1713 *	Mask for the selector field for path record MTU, rate,
1714 *	and packet lifetime.
1715 *
1716 * SOURCE
1717 */
1718 #define IB_PATH_REC_SELECTOR_MASK			0xC0
1719 
1720 /****d* IBA Base: Constants/IB_MULTIPATH_REC_SELECTOR_MASK
1721 * NAME
1722 *       IB_MULTIPATH_REC_SELECTOR_MASK
1723 *
1724 * DESCRIPTION
1725 *       Mask for the selector field for multipath record MTU, rate,
1726 *       and packet lifetime.
1727 *
1728 * SOURCE
1729 */
1730 #define IB_MULTIPATH_REC_SELECTOR_MASK                       0xC0
1731 /**********/
1732 
1733 /****d* IBA Base: Constants/IB_PATH_REC_BASE_MASK
1734 * NAME
1735 *	IB_PATH_REC_BASE_MASK
1736 *
1737 * DESCRIPTION
1738 *	Mask for the base value field for path record MTU, rate,
1739 *	and packet lifetime.
1740 *
1741 * SOURCE
1742 */
1743 #define IB_PATH_REC_BASE_MASK				0x3F
1744 /**********/
1745 
1746 /****d* IBA Base: Constants/IB_MULTIPATH_REC_BASE_MASK
1747 * NAME
1748 *       IB_MULTIPATH_REC_BASE_MASK
1749 *
1750 * DESCRIPTION
1751 *       Mask for the base value field for multipath record MTU, rate,
1752 *       and packet lifetime.
1753 *
1754 * SOURCE
1755 */
1756 #define IB_MULTIPATH_REC_BASE_MASK                      0x3F
1757 /**********/
1758 
1759 /****h* IBA Base/Type Definitions
1760 * NAME
1761 *	Type Definitions
1762 *
1763 * DESCRIPTION
1764 *	Definitions are from the InfiniBand Architecture Specification v1.2
1765 *
1766 *********/
1767 
1768 /****d* IBA Base: Types/ib_net16_t
1769 * NAME
1770 *	ib_net16_t
1771 *
1772 * DESCRIPTION
1773 *	Defines the network ordered type for 16-bit values.
1774 *
1775 * SOURCE
1776 */
1777 typedef uint16_t ib_net16_t;
1778 /**********/
1779 
1780 /****d* IBA Base: Types/ib_net32_t
1781 * NAME
1782 *	ib_net32_t
1783 *
1784 * DESCRIPTION
1785 *	Defines the network ordered type for 32-bit values.
1786 *
1787 * SOURCE
1788 */
1789 typedef uint32_t ib_net32_t;
1790 /**********/
1791 
1792 /****d* IBA Base: Types/ib_net64_t
1793 * NAME
1794 *	ib_net64_t
1795 *
1796 * DESCRIPTION
1797 *	Defines the network ordered type for 64-bit values.
1798 *
1799 * SOURCE
1800 */
1801 typedef uint64_t ib_net64_t;
1802 /**********/
1803 
1804 /****d* IBA Base: Types/ib_gid_prefix_t
1805 * NAME
1806 *	ib_gid_prefix_t
1807 *
1808 * DESCRIPTION
1809 *
1810 * SOURCE
1811 */
1812 typedef ib_net64_t ib_gid_prefix_t;
1813 /**********/
1814 
1815 /****d* IBA Base: Constants/ib_link_states_t
1816 * NAME
1817 *	ib_link_states_t
1818 *
1819 * DESCRIPTION
1820 *	Defines the link states of a port.
1821 *
1822 * SOURCE
1823 */
1824 #define IB_LINK_NO_CHANGE 0
1825 #define IB_LINK_DOWN      1
1826 #define IB_LINK_INIT	  2
1827 #define IB_LINK_ARMED     3
1828 #define IB_LINK_ACTIVE    4
1829 #define IB_LINK_ACT_DEFER 5
1830 /**********/
1831 
1832 static const char *const __ib_node_type_str[] = {
1833 	"UNKNOWN",
1834 	"Channel Adapter",
1835 	"Switch",
1836 	"Router"
1837 };
1838 
1839 /****f* IBA Base: Types/ib_get_node_type_str
1840 * NAME
1841 *	ib_get_node_type_str
1842 *
1843 * DESCRIPTION
1844 *	Returns a string for the specified node type.
1845 *	14.2.5.3 NodeInfo
1846 *
1847 * SYNOPSIS
1848 */
ib_get_node_type_str(IN uint8_t node_type)1849 static inline const char *OSM_API ib_get_node_type_str(IN uint8_t node_type)
1850 {
1851 	if (node_type > IB_NODE_TYPE_ROUTER)
1852 		node_type = 0;
1853 	return (__ib_node_type_str[node_type]);
1854 }
1855 
1856 /*
1857 * PARAMETERS
1858 *	node_type
1859 *		[in] Encoded node type as returned in the NodeInfo attribute.
1860 
1861 * RETURN VALUES
1862 *	Pointer to the node type string.
1863 *
1864 * NOTES
1865 *
1866 * SEE ALSO
1867 * ib_node_info_t
1868 *********/
1869 
1870 static const char *const __ib_producer_type_str[] = {
1871 	"UNKNOWN",
1872 	"Channel Adapter",
1873 	"Switch",
1874 	"Router",
1875 	"Class Manager"
1876 };
1877 
1878 /****f* IBA Base: Types/ib_get_producer_type_str
1879 * NAME
1880 *	ib_get_producer_type_str
1881 *
1882 * DESCRIPTION
1883 *	Returns a string for the specified producer type
1884 *	13.4.8.2 Notice
1885 *	13.4.8.3 InformInfo
1886 *
1887 * SYNOPSIS
1888 */
1889 static inline const char *OSM_API
ib_get_producer_type_str(IN ib_net32_t producer_type)1890 ib_get_producer_type_str(IN ib_net32_t producer_type)
1891 {
1892 	if (cl_ntoh32(producer_type) >
1893 	    CL_NTOH32(IB_NOTICE_PRODUCER_TYPE_CLASS_MGR))
1894 		producer_type = 0;
1895 	return (__ib_producer_type_str[cl_ntoh32(producer_type)]);
1896 }
1897 
1898 /*
1899 * PARAMETERS
1900 *	producer_type
1901 *		[in] Encoded producer type from the Notice attribute
1902 
1903 * RETURN VALUES
1904 *	Pointer to the producer type string.
1905 *
1906 * NOTES
1907 *
1908 * SEE ALSO
1909 * ib_notice_get_prod_type
1910 *********/
1911 
1912 static const char *const __ib_port_state_str[] = {
1913 	"No State Change (NOP)",
1914 	"DOWN",
1915 	"INIT",
1916 	"ARMED",
1917 	"ACTIVE",
1918 	"ACTDEFER",
1919 	"UNKNOWN"
1920 };
1921 
1922 /****f* IBA Base: Types/ib_get_port_state_str
1923 * NAME
1924 *	ib_get_port_state_str
1925 *
1926 * DESCRIPTION
1927 *	Returns a string for the specified port state.
1928 *
1929 * SYNOPSIS
1930 */
ib_get_port_state_str(IN uint8_t port_state)1931 static inline const char *OSM_API ib_get_port_state_str(IN uint8_t port_state)
1932 {
1933 	if (port_state > IB_LINK_ACTIVE)
1934 		port_state = IB_LINK_ACTIVE + 1;
1935 	return (__ib_port_state_str[port_state]);
1936 }
1937 
1938 /*
1939 * PARAMETERS
1940 *	port_state
1941 *		[in] Encoded port state as returned in the PortInfo attribute.
1942 
1943 * RETURN VALUES
1944 *	Pointer to the port state string.
1945 *
1946 * NOTES
1947 *
1948 * SEE ALSO
1949 * ib_port_info_t
1950 *********/
1951 
1952 /****f* IBA Base: Types/ib_get_port_state_from_str
1953 * NAME
1954 *	ib_get_port_state_from_str
1955 *
1956 * DESCRIPTION
1957 *	Returns a string for the specified port state.
1958 *
1959 * SYNOPSIS
1960 */
1961 static inline uint8_t OSM_API
ib_get_port_state_from_str(IN char * p_port_state_str)1962 ib_get_port_state_from_str(IN char *p_port_state_str)
1963 {
1964 	if (!strncmp(p_port_state_str, "No State Change (NOP)", 12))
1965 		return (0);
1966 	else if (!strncmp(p_port_state_str, "DOWN", 4))
1967 		return (1);
1968 	else if (!strncmp(p_port_state_str, "INIT", 4))
1969 		return (2);
1970 	else if (!strncmp(p_port_state_str, "ARMED", 5))
1971 		return (3);
1972 	else if (!strncmp(p_port_state_str, "ACTIVE", 6))
1973 		return (4);
1974 	else if (!strncmp(p_port_state_str, "ACTDEFER", 8))
1975 		return (5);
1976 	return (6);
1977 }
1978 
1979 /*
1980 * PARAMETERS
1981 *	p_port_state_str
1982 *		[in] A string matching one returned by ib_get_port_state_str
1983 *
1984 * RETURN VALUES
1985 *	The appropriate code.
1986 *
1987 * NOTES
1988 *
1989 * SEE ALSO
1990 *	ib_port_info_t
1991 *********/
1992 
1993 /****d* IBA Base: Constants/Join States
1994 * NAME
1995 *	Join States
1996 *
1997 * DESCRIPTION
1998 *	Defines the join state flags for multicast group management.
1999 *
2000 * SOURCE
2001 */
2002 #define IB_JOIN_STATE_FULL		1
2003 #define IB_JOIN_STATE_NON		2
2004 #define IB_JOIN_STATE_SEND_ONLY		4
2005 /**********/
2006 
2007 /****f* IBA Base: Types/ib_pkey_get_base
2008 * NAME
2009 *	ib_pkey_get_base
2010 *
2011 * DESCRIPTION
2012 *	Returns the base P_Key value with the membership bit stripped.
2013 *
2014 * SYNOPSIS
2015 */
ib_pkey_get_base(IN const ib_net16_t pkey)2016 static inline ib_net16_t OSM_API ib_pkey_get_base(IN const ib_net16_t pkey)
2017 {
2018 	return ((ib_net16_t) (pkey & IB_PKEY_BASE_MASK));
2019 }
2020 
2021 /*
2022 * PARAMETERS
2023 *	pkey
2024 *		[in] P_Key value
2025 *
2026 * RETURN VALUE
2027 *	Returns the base P_Key value with the membership bit stripped.
2028 *
2029 * NOTES
2030 *
2031 * SEE ALSO
2032 *********/
2033 
2034 /****f* IBA Base: Types/ib_pkey_is_full_member
2035 * NAME
2036 *	ib_pkey_is_full_member
2037 *
2038 * DESCRIPTION
2039 *	Indicates if the port is a full member of the parition.
2040 *
2041 * SYNOPSIS
2042 */
ib_pkey_is_full_member(IN const ib_net16_t pkey)2043 static inline boolean_t OSM_API ib_pkey_is_full_member(IN const ib_net16_t pkey)
2044 {
2045 	return ((pkey & IB_PKEY_TYPE_MASK) == IB_PKEY_TYPE_MASK);
2046 }
2047 
2048 /*
2049 * PARAMETERS
2050 *	pkey
2051 *		[in] P_Key value
2052 *
2053 * RETURN VALUE
2054 *	TRUE if the port is a full member of the partition.
2055 *	FALSE otherwise.
2056 *
2057 * NOTES
2058 *
2059 * SEE ALSO
2060 * ib_pkey_get_base, ib_net16_t
2061 *********/
2062 
2063 /****f* IBA Base: Types/ib_pkey_is_invalid
2064 * NAME
2065 *	ib_pkey_is_invalid
2066 *
2067 * DESCRIPTION
2068 *	Returns TRUE if the given P_Key is an invalid P_Key
2069 *  C10-116: the CI shall regard a P_Key as invalid if its low-order
2070 *           15 bits are all zero...
2071 *
2072 * SYNOPSIS
2073 */
ib_pkey_is_invalid(IN const ib_net16_t pkey)2074 static inline boolean_t OSM_API ib_pkey_is_invalid(IN const ib_net16_t pkey)
2075 {
2076 	if (ib_pkey_get_base(pkey) == 0x0000)
2077 		return TRUE;
2078 
2079 	return FALSE;
2080 }
2081 
2082 /*
2083 * PARAMETERS
2084 *	pkey
2085 *		[in] P_Key value
2086 *
2087 * RETURN VALUE
2088 *	Returns the base P_Key value with the membership bit stripped.
2089 *
2090 * NOTES
2091 *
2092 * SEE ALSO
2093 *********/
2094 
2095 /****d* IBA Base: Types/ib_gid_t
2096 * NAME
2097 *	ib_gid_t
2098 *
2099 * DESCRIPTION
2100 *
2101 * SYNOPSIS
2102 */
2103 #include <complib/cl_packon.h>
2104 typedef union _ib_gid {
2105 	uint8_t raw[16];
2106 	struct _ib_gid_unicast {
2107 		ib_gid_prefix_t prefix;
2108 		ib_net64_t interface_id;
2109 
2110 	} PACK_SUFFIX unicast;
2111 
2112 	struct _ib_gid_multicast {
2113 		uint8_t header[2];
2114 		uint8_t raw_group_id[14];
2115 
2116 	} PACK_SUFFIX multicast;
2117 
2118 } PACK_SUFFIX ib_gid_t;
2119 #include <complib/cl_packoff.h>
2120 /*
2121 * FIELDS
2122 *	raw
2123 *		GID represented as an unformated byte array.
2124 *
2125 *	unicast
2126 *		Typical unicast representation with subnet prefix and
2127 *		port GUID.
2128 *
2129 *	multicast
2130 *		Representation for multicast use.
2131 *
2132 * SEE ALSO
2133 *********/
2134 
2135 /****f* IBA Base: Types/ib_gid_is_multicast
2136 * NAME
2137 *	ib_gid_is_multicast
2138 *
2139 * DESCRIPTION
2140 *       Returns a boolean indicating whether a GID is a multicast GID.
2141 *
2142 * SYNOPSIS
2143 */
ib_gid_is_multicast(IN const ib_gid_t * p_gid)2144 static inline boolean_t OSM_API ib_gid_is_multicast(IN const ib_gid_t * p_gid)
2145 {
2146 	return (p_gid->raw[0] == 0xFF);
2147 }
2148 
2149 /****f* IBA Base: Types/ib_gid_get_scope
2150 * NAME
2151 *	ib_gid_get_scope
2152 *
2153 * DESCRIPTION
2154 *	Returns scope of (assumed) multicast GID.
2155 *
2156 * SYNOPSIS
2157 */
ib_mgid_get_scope(IN const ib_gid_t * p_gid)2158 static inline uint8_t OSM_API ib_mgid_get_scope(IN const ib_gid_t * p_gid)
2159 {
2160 	return (p_gid->raw[1] & 0x0F);
2161 }
2162 
2163 /****f* IBA Base: Types/ib_gid_set_scope
2164 * NAME
2165 *	ib_gid_set_scope
2166 *
2167 * DESCRIPTION
2168 *	Sets scope of (assumed) multicast GID.
2169 *
2170 * SYNOPSIS
2171 */
2172 static inline void OSM_API
ib_mgid_set_scope(IN ib_gid_t * const p_gid,IN const uint8_t scope)2173 ib_mgid_set_scope(IN ib_gid_t * const p_gid, IN const uint8_t scope)
2174 {
2175 	p_gid->raw[1] &= 0xF0;
2176 	p_gid->raw[1] |= scope & 0x0F;
2177 }
2178 
2179 /****f* IBA Base: Types/ib_gid_set_default
2180 * NAME
2181 *	ib_gid_set_default
2182 *
2183 * DESCRIPTION
2184 *	Sets a GID to the default value.
2185 *
2186 * SYNOPSIS
2187 */
2188 static inline void OSM_API
ib_gid_set_default(IN ib_gid_t * const p_gid,IN const ib_net64_t interface_id)2189 ib_gid_set_default(IN ib_gid_t * const p_gid, IN const ib_net64_t interface_id)
2190 {
2191 	p_gid->unicast.prefix = IB_DEFAULT_SUBNET_PREFIX;
2192 	p_gid->unicast.interface_id = interface_id;
2193 }
2194 
2195 /*
2196 * PARAMETERS
2197 *	p_gid
2198 *		[in] Pointer to the GID object.
2199 *
2200 *	interface_id
2201 *		[in] Manufacturer assigned EUI64 value of a port.
2202 *
2203 * RETURN VALUES
2204 *	None.
2205 *
2206 * NOTES
2207 *
2208 * SEE ALSO
2209 *	ib_gid_t
2210 *********/
2211 
2212 /****f* IBA Base: Types/ib_gid_get_subnet_prefix
2213 * NAME
2214 *	ib_gid_get_subnet_prefix
2215 *
2216 * DESCRIPTION
2217 *	Gets the subnet prefix from a GID.
2218 *
2219 * SYNOPSIS
2220 */
2221 static inline ib_net64_t OSM_API
ib_gid_get_subnet_prefix(IN const ib_gid_t * const p_gid)2222 ib_gid_get_subnet_prefix(IN const ib_gid_t * const p_gid)
2223 {
2224 	return (p_gid->unicast.prefix);
2225 }
2226 
2227 /*
2228 * PARAMETERS
2229 *	p_gid
2230 *		[in] Pointer to the GID object.
2231 *
2232 * RETURN VALUES
2233 *	64-bit subnet prefix value.
2234 *
2235 * NOTES
2236 *
2237 * SEE ALSO
2238 *	ib_gid_t
2239 *********/
2240 
2241 /****f* IBA Base: Types/ib_gid_is_link_local
2242 * NAME
2243 *	ib_gid_is_link_local
2244 *
2245 * DESCRIPTION
2246 *	Returns TRUE if the unicast GID scoping indicates link local,
2247 *	FALSE otherwise.
2248 *
2249 * SYNOPSIS
2250 */
2251 static inline boolean_t OSM_API
ib_gid_is_link_local(IN const ib_gid_t * const p_gid)2252 ib_gid_is_link_local(IN const ib_gid_t * const p_gid)
2253 {
2254 	return ((ib_gid_get_subnet_prefix(p_gid) &
2255 		 CL_HTON64(0xFFC0000000000000ULL)) == IB_DEFAULT_SUBNET_PREFIX);
2256 }
2257 
2258 /*
2259 * PARAMETERS
2260 *	p_gid
2261 *		[in] Pointer to the GID object.
2262 *
2263 * RETURN VALUES
2264 *	Returns TRUE if the unicast GID scoping indicates link local,
2265 *	FALSE otherwise.
2266 *
2267 * NOTES
2268 *
2269 * SEE ALSO
2270 *	ib_gid_t
2271 *********/
2272 
2273 /****f* IBA Base: Types/ib_gid_is_site_local
2274 * NAME
2275 *	ib_gid_is_site_local
2276 *
2277 * DESCRIPTION
2278 *	Returns TRUE if the unicast GID scoping indicates site local,
2279 *	FALSE otherwise.
2280 *
2281 * SYNOPSIS
2282 */
2283 static inline boolean_t OSM_API
ib_gid_is_site_local(IN const ib_gid_t * const p_gid)2284 ib_gid_is_site_local(IN const ib_gid_t * const p_gid)
2285 {
2286 	return ((ib_gid_get_subnet_prefix(p_gid) &
2287 		 CL_HTON64(0xFFFFFFFFFFFF0000ULL)) ==
2288 		CL_HTON64(0xFEC0000000000000ULL));
2289 }
2290 
2291 /*
2292 * PARAMETERS
2293 *	p_gid
2294 *		[in] Pointer to the GID object.
2295 *
2296 * RETURN VALUES
2297 *	Returns TRUE if the unicast GID scoping indicates site local,
2298 *	FALSE otherwise.
2299 *
2300 * NOTES
2301 *
2302 * SEE ALSO
2303 *	ib_gid_t
2304 *********/
2305 
2306 /****f* IBA Base: Types/ib_gid_get_guid
2307 * NAME
2308 *	ib_gid_get_guid
2309 *
2310 * DESCRIPTION
2311 *	Gets the guid from a GID.
2312 *
2313 * SYNOPSIS
2314 */
2315 static inline ib_net64_t OSM_API
ib_gid_get_guid(IN const ib_gid_t * const p_gid)2316 ib_gid_get_guid(IN const ib_gid_t * const p_gid)
2317 {
2318 	return (p_gid->unicast.interface_id);
2319 }
2320 
2321 /*
2322 * PARAMETERS
2323 *	p_gid
2324 *		[in] Pointer to the GID object.
2325 *
2326 * RETURN VALUES
2327 *	64-bit GUID value.
2328 *
2329 * NOTES
2330 *
2331 * SEE ALSO
2332 *	ib_gid_t
2333 *********/
2334 
2335 /****s* IBA Base: Types/ib_path_rec_t
2336 * NAME
2337 *	ib_path_rec_t
2338 *
2339 * DESCRIPTION
2340 *	Path records encapsulate the properties of a given
2341 *	route between two end-points on a subnet.
2342 *
2343 * SYNOPSIS
2344 */
2345 #include <complib/cl_packon.h>
2346 typedef struct _ib_path_rec {
2347 	ib_net64_t service_id;
2348 	ib_gid_t dgid;
2349 	ib_gid_t sgid;
2350 	ib_net16_t dlid;
2351 	ib_net16_t slid;
2352 	ib_net32_t hop_flow_raw;
2353 	uint8_t tclass;
2354 	uint8_t num_path;
2355 	ib_net16_t pkey;
2356 	ib_net16_t qos_class_sl;
2357 	uint8_t mtu;
2358 	uint8_t rate;
2359 	uint8_t pkt_life;
2360 	uint8_t preference;
2361 	uint8_t resv2[6];
2362 
2363 } PACK_SUFFIX ib_path_rec_t;
2364 #include <complib/cl_packoff.h>
2365 /*
2366 * FIELDS
2367 *	service_id
2368 *		Service ID for QoS.
2369 *
2370 *	dgid
2371 *		GID of destination port.
2372 *
2373 *	sgid
2374 *		GID of source port.
2375 *
2376 *	dlid
2377 *		LID of destination port.
2378 *
2379 *	slid
2380 *		LID of source port.
2381 *
2382 *	hop_flow_raw
2383 *		Global routing parameters: hop count, flow label and raw bit.
2384 *
2385 *	tclass
2386 *		Another global routing parameter.
2387 *
2388 *	num_path
2389 *     Reversible path - 1 bit to say if path is reversible.
2390 *		num_path [6:0] In queries, maximum number of paths to return.
2391 *		In responses, undefined.
2392 *
2393 *	pkey
2394 *		Partition key (P_Key) to use on this path.
2395 *
2396 *	qos_class_sl
2397 *		QoS class and service level to use on this path.
2398 *
2399 *	mtu
2400 *		MTU and MTU selector fields to use on this path
2401 *
2402 *	rate
2403 *		Rate and rate selector fields to use on this path.
2404 *
2405 *	pkt_life
2406 *		Packet lifetime
2407 *
2408 *	preference
2409 *		Indicates the relative merit of this path versus other path
2410 *		records returned from the SA.  Lower numbers are better.
2411 *
2412 *	resv2
2413 *		Reserved bytes.
2414 * SEE ALSO
2415 *********/
2416 
2417 /* Path Record Component Masks */
2418 #define  IB_PR_COMPMASK_SERVICEID_MSB     (CL_HTON64(((uint64_t)1)<<0))
2419 #define  IB_PR_COMPMASK_SERVICEID_LSB     (CL_HTON64(((uint64_t)1)<<1))
2420 #define  IB_PR_COMPMASK_DGID              (CL_HTON64(((uint64_t)1)<<2))
2421 #define  IB_PR_COMPMASK_SGID              (CL_HTON64(((uint64_t)1)<<3))
2422 #define  IB_PR_COMPMASK_DLID              (CL_HTON64(((uint64_t)1)<<4))
2423 #define  IB_PR_COMPMASK_SLID              (CL_HTON64(((uint64_t)1)<<5))
2424 #define  IB_PR_COMPMASK_RAWTRAFFIC        (CL_HTON64(((uint64_t)1)<<6))
2425 #define  IB_PR_COMPMASK_RESV0             (CL_HTON64(((uint64_t)1)<<7))
2426 #define  IB_PR_COMPMASK_FLOWLABEL         (CL_HTON64(((uint64_t)1)<<8))
2427 #define  IB_PR_COMPMASK_HOPLIMIT          (CL_HTON64(((uint64_t)1)<<9))
2428 #define  IB_PR_COMPMASK_TCLASS            (CL_HTON64(((uint64_t)1)<<10))
2429 #define  IB_PR_COMPMASK_REVERSIBLE        (CL_HTON64(((uint64_t)1)<<11))
2430 #define  IB_PR_COMPMASK_NUMBPATH          (CL_HTON64(((uint64_t)1)<<12))
2431 #define  IB_PR_COMPMASK_PKEY              (CL_HTON64(((uint64_t)1)<<13))
2432 #define  IB_PR_COMPMASK_QOS_CLASS         (CL_HTON64(((uint64_t)1)<<14))
2433 #define  IB_PR_COMPMASK_SL                (CL_HTON64(((uint64_t)1)<<15))
2434 #define  IB_PR_COMPMASK_MTUSELEC          (CL_HTON64(((uint64_t)1)<<16))
2435 #define  IB_PR_COMPMASK_MTU               (CL_HTON64(((uint64_t)1)<<17))
2436 #define  IB_PR_COMPMASK_RATESELEC         (CL_HTON64(((uint64_t)1)<<18))
2437 #define  IB_PR_COMPMASK_RATE              (CL_HTON64(((uint64_t)1)<<19))
2438 #define  IB_PR_COMPMASK_PKTLIFETIMESELEC  (CL_HTON64(((uint64_t)1)<<20))
2439 #define  IB_PR_COMPMASK_PKTLIFETIME       (CL_HTON64(((uint64_t)1)<<21))
2440 
2441 /* Link Record Component Masks */
2442 #define IB_LR_COMPMASK_FROM_LID           (CL_HTON64(((uint64_t)1)<<0))
2443 #define IB_LR_COMPMASK_FROM_PORT          (CL_HTON64(((uint64_t)1)<<1))
2444 #define IB_LR_COMPMASK_TO_PORT            (CL_HTON64(((uint64_t)1)<<2))
2445 #define IB_LR_COMPMASK_TO_LID             (CL_HTON64(((uint64_t)1)<<3))
2446 
2447 /* VL Arbitration Record Masks */
2448 #define IB_VLA_COMPMASK_LID               (CL_HTON64(((uint64_t)1)<<0))
2449 #define IB_VLA_COMPMASK_OUT_PORT          (CL_HTON64(((uint64_t)1)<<1))
2450 #define IB_VLA_COMPMASK_BLOCK             (CL_HTON64(((uint64_t)1)<<2))
2451 
2452 /* SLtoVL Mapping Record Masks */
2453 #define IB_SLVL_COMPMASK_LID              (CL_HTON64(((uint64_t)1)<<0))
2454 #define IB_SLVL_COMPMASK_IN_PORT          (CL_HTON64(((uint64_t)1)<<1))
2455 #define IB_SLVL_COMPMASK_OUT_PORT         (CL_HTON64(((uint64_t)1)<<2))
2456 
2457 /* P_Key Table Record Masks */
2458 #define IB_PKEY_COMPMASK_LID              (CL_HTON64(((uint64_t)1)<<0))
2459 #define IB_PKEY_COMPMASK_BLOCK            (CL_HTON64(((uint64_t)1)<<1))
2460 #define IB_PKEY_COMPMASK_PORT             (CL_HTON64(((uint64_t)1)<<2))
2461 
2462 /* Switch Info Record Masks */
2463 #define IB_SWIR_COMPMASK_LID		  (CL_HTON64(((uint64_t)1)<<0))
2464 #define IB_SWIR_COMPMASK_RESERVED1	  (CL_HTON64(((uint64_t)1)<<1))
2465 
2466 /* LFT Record Masks */
2467 #define IB_LFTR_COMPMASK_LID              (CL_HTON64(((uint64_t)1)<<0))
2468 #define IB_LFTR_COMPMASK_BLOCK            (CL_HTON64(((uint64_t)1)<<1))
2469 
2470 /* MFT Record Masks */
2471 #define IB_MFTR_COMPMASK_LID		  (CL_HTON64(((uint64_t)1)<<0))
2472 #define IB_MFTR_COMPMASK_POSITION	  (CL_HTON64(((uint64_t)1)<<1))
2473 #define IB_MFTR_COMPMASK_RESERVED1	  (CL_HTON64(((uint64_t)1)<<2))
2474 #define IB_MFTR_COMPMASK_BLOCK		  (CL_HTON64(((uint64_t)1)<<3))
2475 #define IB_MFTR_COMPMASK_RESERVED2	  (CL_HTON64(((uint64_t)1)<<4))
2476 
2477 /* NodeInfo Record Masks */
2478 #define IB_NR_COMPMASK_LID                (CL_HTON64(((uint64_t)1)<<0))
2479 #define IB_NR_COMPMASK_RESERVED1          (CL_HTON64(((uint64_t)1)<<1))
2480 #define IB_NR_COMPMASK_BASEVERSION        (CL_HTON64(((uint64_t)1)<<2))
2481 #define IB_NR_COMPMASK_CLASSVERSION       (CL_HTON64(((uint64_t)1)<<3))
2482 #define IB_NR_COMPMASK_NODETYPE           (CL_HTON64(((uint64_t)1)<<4))
2483 #define IB_NR_COMPMASK_NUMPORTS           (CL_HTON64(((uint64_t)1)<<5))
2484 #define IB_NR_COMPMASK_SYSIMAGEGUID       (CL_HTON64(((uint64_t)1)<<6))
2485 #define IB_NR_COMPMASK_NODEGUID           (CL_HTON64(((uint64_t)1)<<7))
2486 #define IB_NR_COMPMASK_PORTGUID           (CL_HTON64(((uint64_t)1)<<8))
2487 #define IB_NR_COMPMASK_PARTCAP            (CL_HTON64(((uint64_t)1)<<9))
2488 #define IB_NR_COMPMASK_DEVID              (CL_HTON64(((uint64_t)1)<<10))
2489 #define IB_NR_COMPMASK_REV                (CL_HTON64(((uint64_t)1)<<11))
2490 #define IB_NR_COMPMASK_PORTNUM            (CL_HTON64(((uint64_t)1)<<12))
2491 #define IB_NR_COMPMASK_VENDID             (CL_HTON64(((uint64_t)1)<<13))
2492 #define IB_NR_COMPMASK_NODEDESC           (CL_HTON64(((uint64_t)1)<<14))
2493 
2494 /* Service Record Component Masks Sec 15.2.5.14 Ver 1.1*/
2495 #define IB_SR_COMPMASK_SID                (CL_HTON64(((uint64_t)1)<<0))
2496 #define IB_SR_COMPMASK_SGID               (CL_HTON64(((uint64_t)1)<<1))
2497 #define IB_SR_COMPMASK_SPKEY              (CL_HTON64(((uint64_t)1)<<2))
2498 #define IB_SR_COMPMASK_RES1               (CL_HTON64(((uint64_t)1)<<3))
2499 #define IB_SR_COMPMASK_SLEASE             (CL_HTON64(((uint64_t)1)<<4))
2500 #define IB_SR_COMPMASK_SKEY               (CL_HTON64(((uint64_t)1)<<5))
2501 #define IB_SR_COMPMASK_SNAME              (CL_HTON64(((uint64_t)1)<<6))
2502 #define IB_SR_COMPMASK_SDATA8_0           (CL_HTON64(((uint64_t)1)<<7))
2503 #define IB_SR_COMPMASK_SDATA8_1           (CL_HTON64(((uint64_t)1)<<8))
2504 #define IB_SR_COMPMASK_SDATA8_2           (CL_HTON64(((uint64_t)1)<<9))
2505 #define IB_SR_COMPMASK_SDATA8_3           (CL_HTON64(((uint64_t)1)<<10))
2506 #define IB_SR_COMPMASK_SDATA8_4           (CL_HTON64(((uint64_t)1)<<11))
2507 #define IB_SR_COMPMASK_SDATA8_5           (CL_HTON64(((uint64_t)1)<<12))
2508 #define IB_SR_COMPMASK_SDATA8_6           (CL_HTON64(((uint64_t)1)<<13))
2509 #define IB_SR_COMPMASK_SDATA8_7           (CL_HTON64(((uint64_t)1)<<14))
2510 #define IB_SR_COMPMASK_SDATA8_8           (CL_HTON64(((uint64_t)1)<<15))
2511 #define IB_SR_COMPMASK_SDATA8_9           (CL_HTON64(((uint64_t)1)<<16))
2512 #define IB_SR_COMPMASK_SDATA8_10       (CL_HTON64(((uint64_t)1)<<17))
2513 #define IB_SR_COMPMASK_SDATA8_11       (CL_HTON64(((uint64_t)1)<<18))
2514 #define IB_SR_COMPMASK_SDATA8_12       (CL_HTON64(((uint64_t)1)<<19))
2515 #define IB_SR_COMPMASK_SDATA8_13       (CL_HTON64(((uint64_t)1)<<20))
2516 #define IB_SR_COMPMASK_SDATA8_14       (CL_HTON64(((uint64_t)1)<<21))
2517 #define IB_SR_COMPMASK_SDATA8_15       (CL_HTON64(((uint64_t)1)<<22))
2518 #define IB_SR_COMPMASK_SDATA16_0       (CL_HTON64(((uint64_t)1)<<23))
2519 #define IB_SR_COMPMASK_SDATA16_1       (CL_HTON64(((uint64_t)1)<<24))
2520 #define IB_SR_COMPMASK_SDATA16_2       (CL_HTON64(((uint64_t)1)<<25))
2521 #define IB_SR_COMPMASK_SDATA16_3       (CL_HTON64(((uint64_t)1)<<26))
2522 #define IB_SR_COMPMASK_SDATA16_4       (CL_HTON64(((uint64_t)1)<<27))
2523 #define IB_SR_COMPMASK_SDATA16_5       (CL_HTON64(((uint64_t)1)<<28))
2524 #define IB_SR_COMPMASK_SDATA16_6       (CL_HTON64(((uint64_t)1)<<29))
2525 #define IB_SR_COMPMASK_SDATA16_7       (CL_HTON64(((uint64_t)1)<<30))
2526 #define IB_SR_COMPMASK_SDATA32_0       (CL_HTON64(((uint64_t)1)<<31))
2527 #define IB_SR_COMPMASK_SDATA32_1       (CL_HTON64(((uint64_t)1)<<32))
2528 #define IB_SR_COMPMASK_SDATA32_2       (CL_HTON64(((uint64_t)1)<<33))
2529 #define IB_SR_COMPMASK_SDATA32_3       (CL_HTON64(((uint64_t)1)<<34))
2530 #define IB_SR_COMPMASK_SDATA64_0       (CL_HTON64(((uint64_t)1)<<35))
2531 #define IB_SR_COMPMASK_SDATA64_1       (CL_HTON64(((uint64_t)1)<<36))
2532 
2533 /* Port Info Record Component Masks */
2534 #define IB_PIR_COMPMASK_LID              (CL_HTON64(((uint64_t)1)<<0))
2535 #define IB_PIR_COMPMASK_PORTNUM          (CL_HTON64(((uint64_t)1)<<1))
2536 #define IB_PIR_COMPMASK_RESV1            (CL_HTON64(((uint64_t)1)<<2))
2537 #define IB_PIR_COMPMASK_MKEY             (CL_HTON64(((uint64_t)1)<<3))
2538 #define IB_PIR_COMPMASK_GIDPRE           (CL_HTON64(((uint64_t)1)<<4))
2539 #define IB_PIR_COMPMASK_BASELID          (CL_HTON64(((uint64_t)1)<<5))
2540 #define IB_PIR_COMPMASK_SMLID            (CL_HTON64(((uint64_t)1)<<6))
2541 #define IB_PIR_COMPMASK_CAPMASK          (CL_HTON64(((uint64_t)1)<<7))
2542 #define IB_PIR_COMPMASK_DIAGCODE         (CL_HTON64(((uint64_t)1)<<8))
2543 #define IB_PIR_COMPMASK_MKEYLEASEPRD     (CL_HTON64(((uint64_t)1)<<9))
2544 #define IB_PIR_COMPMASK_LOCALPORTNUM     (CL_HTON64(((uint64_t)1)<<10))
2545 #define IB_PIR_COMPMASK_LINKWIDTHENABLED (CL_HTON64(((uint64_t)1)<<11))
2546 #define IB_PIR_COMPMASK_LNKWIDTHSUPPORT  (CL_HTON64(((uint64_t)1)<<12))
2547 #define IB_PIR_COMPMASK_LNKWIDTHACTIVE   (CL_HTON64(((uint64_t)1)<<13))
2548 #define IB_PIR_COMPMASK_LNKSPEEDSUPPORT  (CL_HTON64(((uint64_t)1)<<14))
2549 #define IB_PIR_COMPMASK_PORTSTATE        (CL_HTON64(((uint64_t)1)<<15))
2550 #define IB_PIR_COMPMASK_PORTPHYSTATE     (CL_HTON64(((uint64_t)1)<<16))
2551 #define IB_PIR_COMPMASK_LINKDWNDFLTSTATE (CL_HTON64(((uint64_t)1)<<17))
2552 #define IB_PIR_COMPMASK_MKEYPROTBITS     (CL_HTON64(((uint64_t)1)<<18))
2553 #define IB_PIR_COMPMASK_RESV2            (CL_HTON64(((uint64_t)1)<<19))
2554 #define IB_PIR_COMPMASK_LMC              (CL_HTON64(((uint64_t)1)<<20))
2555 #define IB_PIR_COMPMASK_LINKSPEEDACTIVE  (CL_HTON64(((uint64_t)1)<<21))
2556 #define IB_PIR_COMPMASK_LINKSPEEDENABLE  (CL_HTON64(((uint64_t)1)<<22))
2557 #define IB_PIR_COMPMASK_NEIGHBORMTU      (CL_HTON64(((uint64_t)1)<<23))
2558 #define IB_PIR_COMPMASK_MASTERSMSL       (CL_HTON64(((uint64_t)1)<<24))
2559 #define IB_PIR_COMPMASK_VLCAP            (CL_HTON64(((uint64_t)1)<<25))
2560 #define IB_PIR_COMPMASK_INITTYPE         (CL_HTON64(((uint64_t)1)<<26))
2561 #define IB_PIR_COMPMASK_VLHIGHLIMIT      (CL_HTON64(((uint64_t)1)<<27))
2562 #define IB_PIR_COMPMASK_VLARBHIGHCAP     (CL_HTON64(((uint64_t)1)<<28))
2563 #define IB_PIR_COMPMASK_VLARBLOWCAP      (CL_HTON64(((uint64_t)1)<<29))
2564 #define IB_PIR_COMPMASK_INITTYPEREPLY    (CL_HTON64(((uint64_t)1)<<30))
2565 #define IB_PIR_COMPMASK_MTUCAP           (CL_HTON64(((uint64_t)1)<<31))
2566 #define IB_PIR_COMPMASK_VLSTALLCNT       (CL_HTON64(((uint64_t)1)<<32))
2567 #define IB_PIR_COMPMASK_HOQLIFE          (CL_HTON64(((uint64_t)1)<<33))
2568 #define IB_PIR_COMPMASK_OPVLS            (CL_HTON64(((uint64_t)1)<<34))
2569 #define IB_PIR_COMPMASK_PARENFIN         (CL_HTON64(((uint64_t)1)<<35))
2570 #define IB_PIR_COMPMASK_PARENFOUT        (CL_HTON64(((uint64_t)1)<<36))
2571 #define IB_PIR_COMPMASK_FILTERRAWIN      (CL_HTON64(((uint64_t)1)<<37))
2572 #define IB_PIR_COMPMASK_FILTERRAWOUT     (CL_HTON64(((uint64_t)1)<<38))
2573 #define IB_PIR_COMPMASK_MKEYVIO          (CL_HTON64(((uint64_t)1)<<39))
2574 #define IB_PIR_COMPMASK_PKEYVIO          (CL_HTON64(((uint64_t)1)<<40))
2575 #define IB_PIR_COMPMASK_QKEYVIO          (CL_HTON64(((uint64_t)1)<<41))
2576 #define IB_PIR_COMPMASK_GUIDCAP          (CL_HTON64(((uint64_t)1)<<42))
2577 #define IB_PIR_COMPMASK_RESV3            (CL_HTON64(((uint64_t)1)<<43))
2578 #define IB_PIR_COMPMASK_SUBNTO           (CL_HTON64(((uint64_t)1)<<44))
2579 #define IB_PIR_COMPMASK_RESV4            (CL_HTON64(((uint64_t)1)<<45))
2580 #define IB_PIR_COMPMASK_RESPTIME         (CL_HTON64(((uint64_t)1)<<46))
2581 #define IB_PIR_COMPMASK_LOCALPHYERR      (CL_HTON64(((uint64_t)1)<<47))
2582 #define IB_PIR_COMPMASK_OVERRUNERR       (CL_HTON64(((uint64_t)1)<<48))
2583 
2584 /* Multicast Member Record Component Masks */
2585 #define IB_MCR_COMPMASK_GID         (CL_HTON64(((uint64_t)1)<<0))
2586 #define IB_MCR_COMPMASK_MGID        (CL_HTON64(((uint64_t)1)<<0))
2587 #define IB_MCR_COMPMASK_PORT_GID    (CL_HTON64(((uint64_t)1)<<1))
2588 #define IB_MCR_COMPMASK_QKEY        (CL_HTON64(((uint64_t)1)<<2))
2589 #define IB_MCR_COMPMASK_MLID        (CL_HTON64(((uint64_t)1)<<3))
2590 #define IB_MCR_COMPMASK_MTU_SEL     (CL_HTON64(((uint64_t)1)<<4))
2591 #define IB_MCR_COMPMASK_MTU         (CL_HTON64(((uint64_t)1)<<5))
2592 #define IB_MCR_COMPMASK_TCLASS      (CL_HTON64(((uint64_t)1)<<6))
2593 #define IB_MCR_COMPMASK_PKEY        (CL_HTON64(((uint64_t)1)<<7))
2594 #define IB_MCR_COMPMASK_RATE_SEL    (CL_HTON64(((uint64_t)1)<<8))
2595 #define IB_MCR_COMPMASK_RATE        (CL_HTON64(((uint64_t)1)<<9))
2596 #define IB_MCR_COMPMASK_LIFE_SEL    (CL_HTON64(((uint64_t)1)<<10))
2597 #define IB_MCR_COMPMASK_LIFE        (CL_HTON64(((uint64_t)1)<<11))
2598 #define IB_MCR_COMPMASK_SL          (CL_HTON64(((uint64_t)1)<<12))
2599 #define IB_MCR_COMPMASK_FLOW        (CL_HTON64(((uint64_t)1)<<13))
2600 #define IB_MCR_COMPMASK_HOP         (CL_HTON64(((uint64_t)1)<<14))
2601 #define IB_MCR_COMPMASK_SCOPE       (CL_HTON64(((uint64_t)1)<<15))
2602 #define IB_MCR_COMPMASK_JOIN_STATE  (CL_HTON64(((uint64_t)1)<<16))
2603 #define IB_MCR_COMPMASK_PROXY       (CL_HTON64(((uint64_t)1)<<17))
2604 
2605 /* GUID Info Record Component Masks */
2606 #define IB_GIR_COMPMASK_LID		(CL_HTON64(((uint64_t)1)<<0))
2607 #define IB_GIR_COMPMASK_BLOCKNUM	(CL_HTON64(((uint64_t)1)<<1))
2608 #define IB_GIR_COMPMASK_RESV1		(CL_HTON64(((uint64_t)1)<<2))
2609 #define IB_GIR_COMPMASK_RESV2		(CL_HTON64(((uint64_t)1)<<3))
2610 #define IB_GIR_COMPMASK_GID0		(CL_HTON64(((uint64_t)1)<<4))
2611 #define IB_GIR_COMPMASK_GID1		(CL_HTON64(((uint64_t)1)<<5))
2612 #define IB_GIR_COMPMASK_GID2		(CL_HTON64(((uint64_t)1)<<6))
2613 #define IB_GIR_COMPMASK_GID3		(CL_HTON64(((uint64_t)1)<<7))
2614 #define IB_GIR_COMPMASK_GID4		(CL_HTON64(((uint64_t)1)<<8))
2615 #define IB_GIR_COMPMASK_GID5		(CL_HTON64(((uint64_t)1)<<9))
2616 #define IB_GIR_COMPMASK_GID6		(CL_HTON64(((uint64_t)1)<<10))
2617 #define IB_GIR_COMPMASK_GID7		(CL_HTON64(((uint64_t)1)<<11))
2618 
2619 /* MultiPath Record Component Masks */
2620 #define IB_MPR_COMPMASK_RAWTRAFFIC	(CL_HTON64(((uint64_t)1)<<0))
2621 #define IB_MPR_COMPMASK_RESV0		(CL_HTON64(((uint64_t)1)<<1))
2622 #define IB_MPR_COMPMASK_FLOWLABEL	(CL_HTON64(((uint64_t)1)<<2))
2623 #define IB_MPR_COMPMASK_HOPLIMIT	(CL_HTON64(((uint64_t)1)<<3))
2624 #define IB_MPR_COMPMASK_TCLASS		(CL_HTON64(((uint64_t)1)<<4))
2625 #define IB_MPR_COMPMASK_REVERSIBLE	(CL_HTON64(((uint64_t)1)<<5))
2626 #define IB_MPR_COMPMASK_NUMBPATH	(CL_HTON64(((uint64_t)1)<<6))
2627 #define IB_MPR_COMPMASK_PKEY		(CL_HTON64(((uint64_t)1)<<7))
2628 #define IB_MPR_COMPMASK_QOS_CLASS	(CL_HTON64(((uint64_t)1)<<8))
2629 #define IB_MPR_COMPMASK_SL		(CL_HTON64(((uint64_t)1)<<9))
2630 #define IB_MPR_COMPMASK_MTUSELEC	(CL_HTON64(((uint64_t)1)<<10))
2631 #define IB_MPR_COMPMASK_MTU		(CL_HTON64(((uint64_t)1)<<11))
2632 #define IB_MPR_COMPMASK_RATESELEC	(CL_HTON64(((uint64_t)1)<<12))
2633 #define IB_MPR_COMPMASK_RATE		(CL_HTON64(((uint64_t)1)<<13))
2634 #define IB_MPR_COMPMASK_PKTLIFETIMESELEC (CL_HTON64(((uint64_t)1)<<14))
2635 #define IB_MPR_COMPMASK_PKTLIFETIME	(CL_HTON64(((uint64_t)1)<<15))
2636 #define IB_MPR_COMPMASK_SERVICEID_MSB	(CL_HTON64(((uint64_t)1)<<16))
2637 #define IB_MPR_COMPMASK_INDEPSELEC	(CL_HTON64(((uint64_t)1)<<17))
2638 #define IB_MPR_COMPMASK_RESV3		(CL_HTON64(((uint64_t)1)<<18))
2639 #define IB_MPR_COMPMASK_SGIDCOUNT	(CL_HTON64(((uint64_t)1)<<19))
2640 #define IB_MPR_COMPMASK_DGIDCOUNT	(CL_HTON64(((uint64_t)1)<<20))
2641 #define IB_MPR_COMPMASK_SERVICEID_LSB	(CL_HTON64(((uint64_t)1)<<21))
2642 
2643 /* SMInfo Record Component Masks */
2644 #define IB_SMIR_COMPMASK_LID		(CL_HTON64(((uint64_t)1)<<0))
2645 #define IB_SMIR_COMPMASK_RESV0		(CL_HTON64(((uint64_t)1)<<1))
2646 #define IB_SMIR_COMPMASK_GUID		(CL_HTON64(((uint64_t)1)<<2))
2647 #define IB_SMIR_COMPMASK_SMKEY		(CL_HTON64(((uint64_t)1)<<3))
2648 #define IB_SMIR_COMPMASK_ACTCOUNT	(CL_HTON64(((uint64_t)1)<<4))
2649 #define IB_SMIR_COMPMASK_PRIORITY	(CL_HTON64(((uint64_t)1)<<5))
2650 #define IB_SMIR_COMPMASK_SMSTATE	(CL_HTON64(((uint64_t)1)<<6))
2651 
2652 /* InformInfo Record Component Masks */
2653 #define IB_IIR_COMPMASK_SUBSCRIBERGID	(CL_HTON64(((uint64_t)1)<<0))
2654 #define IB_IIR_COMPMASK_ENUM		(CL_HTON64(((uint64_t)1)<<1))
2655 #define IB_IIR_COMPMASK_RESV0		(CL_HTON64(((uint64_t)1)<<2))
2656 #define IB_IIR_COMPMASK_GID		(CL_HTON64(((uint64_t)1)<<3))
2657 #define IB_IIR_COMPMASK_LIDRANGEBEGIN	(CL_HTON64(((uint64_t)1)<<4))
2658 #define IB_IIR_COMPMASK_LIDRANGEEND	(CL_HTON64(((uint64_t)1)<<5))
2659 #define IB_IIR_COMPMASK_RESV1		(CL_HTON64(((uint64_t)1)<<6))
2660 #define IB_IIR_COMPMASK_ISGENERIC	(CL_HTON64(((uint64_t)1)<<7))
2661 #define IB_IIR_COMPMASK_SUBSCRIBE	(CL_HTON64(((uint64_t)1)<<8))
2662 #define IB_IIR_COMPMASK_TYPE		(CL_HTON64(((uint64_t)1)<<9))
2663 #define IB_IIR_COMPMASK_TRAPNUMB	(CL_HTON64(((uint64_t)1)<<10))
2664 #define IB_IIR_COMPMASK_DEVICEID	(CL_HTON64(((uint64_t)1)<<10))
2665 #define IB_IIR_COMPMASK_QPN		(CL_HTON64(((uint64_t)1)<<11))
2666 #define IB_IIR_COMPMASK_RESV2		(CL_HTON64(((uint64_t)1)<<12))
2667 #define IB_IIR_COMPMASK_RESPTIME	(CL_HTON64(((uint64_t)1)<<13))
2668 #define IB_IIR_COMPMASK_RESV3		(CL_HTON64(((uint64_t)1)<<14))
2669 #define IB_IIR_COMPMASK_PRODTYPE	(CL_HTON64(((uint64_t)1)<<15))
2670 #define IB_IIR_COMPMASK_VENDID		(CL_HTON64(((uint64_t)1)<<15))
2671 
2672 /****f* IBA Base: Types/ib_path_rec_init_local
2673 * NAME
2674 *	ib_path_rec_init_local
2675 *
2676 * DESCRIPTION
2677 *	Initializes a subnet local path record.
2678 *
2679 * SYNOPSIS
2680 */
2681 static inline void OSM_API
ib_path_rec_init_local(IN ib_path_rec_t * const p_rec,IN ib_gid_t * const p_dgid,IN ib_gid_t * const p_sgid,IN ib_net16_t dlid,IN ib_net16_t slid,IN uint8_t num_path,IN ib_net16_t pkey,IN uint8_t sl,IN uint16_t qos_class,IN uint8_t mtu_selector,IN uint8_t mtu,IN uint8_t rate_selector,IN uint8_t rate,IN uint8_t pkt_life_selector,IN uint8_t pkt_life,IN uint8_t preference)2682 ib_path_rec_init_local(IN ib_path_rec_t * const p_rec,
2683 		       IN ib_gid_t * const p_dgid,
2684 		       IN ib_gid_t * const p_sgid,
2685 		       IN ib_net16_t dlid,
2686 		       IN ib_net16_t slid,
2687 		       IN uint8_t num_path,
2688 		       IN ib_net16_t pkey,
2689 		       IN uint8_t sl,
2690 		       IN uint16_t qos_class,
2691 		       IN uint8_t mtu_selector,
2692 		       IN uint8_t mtu,
2693 		       IN uint8_t rate_selector,
2694 		       IN uint8_t rate,
2695 		       IN uint8_t pkt_life_selector,
2696 		       IN uint8_t pkt_life, IN uint8_t preference)
2697 {
2698 	p_rec->dgid = *p_dgid;
2699 	p_rec->sgid = *p_sgid;
2700 	p_rec->dlid = dlid;
2701 	p_rec->slid = slid;
2702 	p_rec->num_path = num_path;
2703 	p_rec->pkey = pkey;
2704 	p_rec->qos_class_sl = cl_hton16((sl & IB_PATH_REC_SL_MASK) |
2705 					(qos_class << 4));
2706 	p_rec->mtu = (uint8_t) ((mtu & IB_PATH_REC_BASE_MASK) |
2707 				(uint8_t) (mtu_selector << 6));
2708 	p_rec->rate = (uint8_t) ((rate & IB_PATH_REC_BASE_MASK) |
2709 				 (uint8_t) (rate_selector << 6));
2710 	p_rec->pkt_life = (uint8_t) ((pkt_life & IB_PATH_REC_BASE_MASK) |
2711 				     (uint8_t) (pkt_life_selector << 6));
2712 	p_rec->preference = preference;
2713 
2714 	/* Clear global routing fields for local path records */
2715 	p_rec->hop_flow_raw = 0;
2716 	p_rec->tclass = 0;
2717 	p_rec->service_id = 0;
2718 
2719 	*((uint32_t *) p_rec->resv2) = 0;
2720 	*((uint16_t *) p_rec->resv2 + 2) = 0;
2721 }
2722 
2723 /*
2724 * PARAMETERS
2725 *	p_rec
2726 *		[in] Pointer to the path record object.
2727 *
2728 *	dgid
2729 *		[in] GID of destination port.
2730 *
2731 *	sgid
2732 *		[in] GID of source port.
2733 *
2734 *	dlid
2735 *		[in] LID of destination port.
2736 *
2737 *	slid
2738 *		[in] LID of source port.
2739 *
2740 *	num_path
2741 *     [in] Reversible path - 1 bit to say if path is reversible.
2742 *		num_path [6:0] In queries, maximum number of paths to return.
2743 *		In responses, undefined.
2744 *
2745 *	pkey
2746 *		[in] Partition key (P_Key) to use on this path.
2747 *
2748 *	qos_class
2749 *		[in] QoS class to use on this path.  Lower 12-bits are valid.
2750 *
2751 *	sl
2752 *		[in] Service level to use on this path.  Lower 4-bits are valid.
2753 *
2754 *	mtu_selector
2755 *		[in] Encoded MTU selector value to use on this path
2756 *
2757 *	mtu
2758 *		[in] Encoded MTU to use on this path
2759 *
2760 *	rate_selector
2761 *		[in] Encoded rate selector value to use on this path.
2762 *
2763 *	rate
2764 *		[in] Encoded rate to use on this path.
2765 *
2766 *	pkt_life_selector
2767 *		[in] Encoded Packet selector value lifetime for this path.
2768 *
2769 *	pkt_life
2770 *		[in] Encoded Packet lifetime for this path.
2771 *
2772 *	preference
2773 *		[in] Indicates the relative merit of this path versus other path
2774 *		records returned from the SA.  Lower numbers are better.
2775 *
2776 * RETURN VALUES
2777 *	None.
2778 *
2779 * NOTES
2780 *
2781 * SEE ALSO
2782 *	ib_gid_t
2783 *********/
2784 
2785 /****f* IBA Base: Types/ib_path_rec_num_path
2786 * NAME
2787 *	ib_path_rec_num_path
2788 *
2789 * DESCRIPTION
2790 *	Get max number of paths to return.
2791 *
2792 * SYNOPSIS
2793 */
2794 static inline uint8_t OSM_API
ib_path_rec_num_path(IN const ib_path_rec_t * const p_rec)2795 ib_path_rec_num_path(IN const ib_path_rec_t * const p_rec)
2796 {
2797 	return (p_rec->num_path & 0x7F);
2798 }
2799 
2800 /*
2801 * PARAMETERS
2802 *	p_rec
2803 *		[in] Pointer to the path record object.
2804 *
2805 * RETURN VALUES
2806 *	Maximum number of paths to return for each unique SGID_DGID combination.
2807 *
2808 * NOTES
2809 *
2810 * SEE ALSO
2811 *	ib_path_rec_t
2812 *********/
2813 
2814 /****f* IBA Base: Types/ib_path_rec_set_sl
2815 * NAME
2816 *	ib_path_rec_set_sl
2817 *
2818 * DESCRIPTION
2819 *	Set path service level.
2820 *
2821 * SYNOPSIS
2822 */
2823 static inline void OSM_API
ib_path_rec_set_sl(IN ib_path_rec_t * const p_rec,IN const uint8_t sl)2824 ib_path_rec_set_sl(IN ib_path_rec_t * const p_rec, IN const uint8_t sl)
2825 {
2826 	p_rec->qos_class_sl =
2827 	    (p_rec->qos_class_sl & CL_HTON16(IB_PATH_REC_QOS_CLASS_MASK)) |
2828 	    cl_hton16(sl & IB_PATH_REC_SL_MASK);
2829 }
2830 
2831 /*
2832 * PARAMETERS
2833 *	p_rec
2834 *		[in] Pointer to the path record object.
2835 *
2836 *	sl
2837 *		[in] Service level to set.
2838 *
2839 * RETURN VALUES
2840 *	None
2841 *
2842 * NOTES
2843 *
2844 * SEE ALSO
2845 *	ib_path_rec_t
2846 *********/
2847 
2848 /****f* IBA Base: Types/ib_path_rec_sl
2849 * NAME
2850 *	ib_path_rec_sl
2851 *
2852 * DESCRIPTION
2853 *	Get path service level.
2854 *
2855 * SYNOPSIS
2856 */
2857 static inline uint8_t OSM_API
ib_path_rec_sl(IN const ib_path_rec_t * const p_rec)2858 ib_path_rec_sl(IN const ib_path_rec_t * const p_rec)
2859 {
2860 	return (uint8_t)(cl_ntoh16(p_rec->qos_class_sl) & IB_PATH_REC_SL_MASK);
2861 }
2862 
2863 /*
2864 * PARAMETERS
2865 *	p_rec
2866 *		[in] Pointer to the path record object.
2867 *
2868 * RETURN VALUES
2869 *	SL.
2870 *
2871 * NOTES
2872 *
2873 * SEE ALSO
2874 *	ib_path_rec_t
2875 *********/
2876 
2877 /****f* IBA Base: Types/ib_path_rec_set_qos_class
2878 * NAME
2879 *	ib_path_rec_set_qos_class
2880 *
2881 * DESCRIPTION
2882 *	Set path QoS class.
2883 *
2884 * SYNOPSIS
2885 */
2886 static inline void OSM_API
ib_path_rec_set_qos_class(IN ib_path_rec_t * const p_rec,IN const uint16_t qos_class)2887 ib_path_rec_set_qos_class(IN ib_path_rec_t * const p_rec,
2888 			  IN const uint16_t qos_class)
2889 {
2890 	p_rec->qos_class_sl =
2891 	    (p_rec->qos_class_sl & CL_HTON16(IB_PATH_REC_SL_MASK)) |
2892 	    cl_hton16(qos_class << 4);
2893 }
2894 
2895 /*
2896 * PARAMETERS
2897 *	p_rec
2898 *		[in] Pointer to the path record object.
2899 *
2900 *	qos_class
2901 *		[in] QoS class to set.
2902 *
2903 * RETURN VALUES
2904 *	None
2905 *
2906 * NOTES
2907 *
2908 * SEE ALSO
2909 *	ib_path_rec_t
2910 *********/
2911 
2912 /****f* IBA Base: Types/ib_path_rec_qos_class
2913 * NAME
2914 *	ib_path_rec_qos_class
2915 *
2916 * DESCRIPTION
2917 *	Get QoS class.
2918 *
2919 * SYNOPSIS
2920 */
2921 static inline uint16_t OSM_API
ib_path_rec_qos_class(IN const ib_path_rec_t * const p_rec)2922 ib_path_rec_qos_class(IN const ib_path_rec_t * const p_rec)
2923 {
2924 	return (cl_ntoh16(p_rec->qos_class_sl) >> 4);
2925 }
2926 
2927 /*
2928 * PARAMETERS
2929 *	p_rec
2930 *		[in] Pointer to the path record object.
2931 *
2932 * RETURN VALUES
2933 *	QoS class of the path record.
2934 *
2935 * NOTES
2936 *
2937 * SEE ALSO
2938 *	ib_path_rec_t
2939 *********/
2940 
2941 /****f* IBA Base: Types/ib_path_rec_mtu
2942 * NAME
2943 *	ib_path_rec_mtu
2944 *
2945 * DESCRIPTION
2946 *	Get encoded path MTU.
2947 *
2948 * SYNOPSIS
2949 */
2950 static inline uint8_t OSM_API
ib_path_rec_mtu(IN const ib_path_rec_t * const p_rec)2951 ib_path_rec_mtu(IN const ib_path_rec_t * const p_rec)
2952 {
2953 	return ((uint8_t) (p_rec->mtu & IB_PATH_REC_BASE_MASK));
2954 }
2955 
2956 /*
2957 * PARAMETERS
2958 *	p_rec
2959 *		[in] Pointer to the path record object.
2960 *
2961 * RETURN VALUES
2962 *	Encoded path MTU.
2963 *		1: 256
2964 *		2: 512
2965 *		3: 1024
2966 *		4: 2048
2967 *		5: 4096
2968 *		others: reserved
2969 *
2970 * NOTES
2971 *
2972 * SEE ALSO
2973 *	ib_path_rec_t
2974 *********/
2975 
2976 /****f* IBA Base: Types/ib_path_rec_mtu_sel
2977 * NAME
2978 *	ib_path_rec_mtu_sel
2979 *
2980 * DESCRIPTION
2981 *	Get encoded path MTU selector.
2982 *
2983 * SYNOPSIS
2984 */
2985 static inline uint8_t OSM_API
ib_path_rec_mtu_sel(IN const ib_path_rec_t * const p_rec)2986 ib_path_rec_mtu_sel(IN const ib_path_rec_t * const p_rec)
2987 {
2988 	return ((uint8_t) ((p_rec->mtu & IB_PATH_REC_SELECTOR_MASK) >> 6));
2989 }
2990 
2991 /*
2992 * PARAMETERS
2993 *	p_rec
2994 *		[in] Pointer to the path record object.
2995 *
2996 * RETURN VALUES
2997 *	Encoded path MTU selector value (for queries).
2998 *		0: greater than MTU specified
2999 *		1: less than MTU specified
3000 *		2: exactly the MTU specified
3001 *		3: largest MTU available
3002 *
3003 * NOTES
3004 *
3005 * SEE ALSO
3006 *	ib_path_rec_t
3007 *********/
3008 
3009 /****f* IBA Base: Types/ib_path_rec_rate
3010 * NAME
3011 *	ib_path_rec_rate
3012 *
3013 * DESCRIPTION
3014 *	Get encoded path rate.
3015 *
3016 * SYNOPSIS
3017 */
3018 static inline uint8_t OSM_API
ib_path_rec_rate(IN const ib_path_rec_t * const p_rec)3019 ib_path_rec_rate(IN const ib_path_rec_t * const p_rec)
3020 {
3021 	return ((uint8_t) (p_rec->rate & IB_PATH_REC_BASE_MASK));
3022 }
3023 
3024 /*
3025 * PARAMETERS
3026 *	p_rec
3027 *		[in] Pointer to the path record object.
3028 *
3029 * RETURN VALUES
3030 *	Encoded path rate.
3031 *		2: 2.5 Gb/sec.
3032 *		3: 10 Gb/sec.
3033 *		4: 30 Gb/sec.
3034 *		5: 5 Gb/sec.
3035 *		6: 20 Gb/sec.
3036 *		7: 40 Gb/sec.
3037 *		8: 60 Gb/sec.
3038 *		9: 80 Gb/sec.
3039 *		10: 120 Gb/sec.
3040 *		others: reserved
3041 *
3042 * NOTES
3043 *
3044 * SEE ALSO
3045 *	ib_path_rec_t
3046 *********/
3047 
3048 /****f* IBA Base: Types/ib_path_rec_rate_sel
3049 * NAME
3050 *	ib_path_rec_rate_sel
3051 *
3052 * DESCRIPTION
3053 *	Get encoded path rate selector.
3054 *
3055 * SYNOPSIS
3056 */
3057 static inline uint8_t OSM_API
ib_path_rec_rate_sel(IN const ib_path_rec_t * const p_rec)3058 ib_path_rec_rate_sel(IN const ib_path_rec_t * const p_rec)
3059 {
3060 	return ((uint8_t) ((p_rec->rate & IB_PATH_REC_SELECTOR_MASK) >> 6));
3061 }
3062 
3063 /*
3064 * PARAMETERS
3065 *	p_rec
3066 *		[in] Pointer to the path record object.
3067 *
3068 * RETURN VALUES
3069 *	Encoded path rate selector value (for queries).
3070 *		0: greater than rate specified
3071 *		1: less than rate specified
3072 *		2: exactly the rate specified
3073 *		3: largest rate available
3074 *
3075 * NOTES
3076 *
3077 * SEE ALSO
3078 *	ib_path_rec_t
3079 *********/
3080 
3081 /****f* IBA Base: Types/ib_path_rec_pkt_life
3082 * NAME
3083 *	ib_path_rec_pkt_life
3084 *
3085 * DESCRIPTION
3086 *	Get encoded path pkt_life.
3087 *
3088 * SYNOPSIS
3089 */
3090 static inline uint8_t OSM_API
ib_path_rec_pkt_life(IN const ib_path_rec_t * const p_rec)3091 ib_path_rec_pkt_life(IN const ib_path_rec_t * const p_rec)
3092 {
3093 	return ((uint8_t) (p_rec->pkt_life & IB_PATH_REC_BASE_MASK));
3094 }
3095 
3096 /*
3097 * PARAMETERS
3098 *	p_rec
3099 *		[in] Pointer to the path record object.
3100 *
3101 * RETURN VALUES
3102 *	Encoded path pkt_life = 4.096 usec * 2 ** PacketLifeTime.
3103 *
3104 * NOTES
3105 *
3106 * SEE ALSO
3107 *	ib_path_rec_t
3108 *********/
3109 
3110 /****f* IBA Base: Types/ib_path_rec_pkt_life_sel
3111 * NAME
3112 *	ib_path_rec_pkt_life_sel
3113 *
3114 * DESCRIPTION
3115 *	Get encoded path pkt_lifetime selector.
3116 *
3117 * SYNOPSIS
3118 */
3119 static inline uint8_t OSM_API
ib_path_rec_pkt_life_sel(IN const ib_path_rec_t * const p_rec)3120 ib_path_rec_pkt_life_sel(IN const ib_path_rec_t * const p_rec)
3121 {
3122 	return ((uint8_t) ((p_rec->pkt_life & IB_PATH_REC_SELECTOR_MASK) >> 6));
3123 }
3124 
3125 /*
3126 * PARAMETERS
3127 *	p_rec
3128 *		[in] Pointer to the path record object.
3129 *
3130 * RETURN VALUES
3131 *	Encoded path pkt_lifetime selector value (for queries).
3132 *		0: greater than rate specified
3133 *		1: less than rate specified
3134 *		2: exactly the rate specified
3135 *		3: smallest packet lifetime available
3136 *
3137 * NOTES
3138 *
3139 * SEE ALSO
3140 *	ib_path_rec_t
3141 *********/
3142 
3143 /****f* IBA Base: Types/ib_path_rec_flow_lbl
3144 * NAME
3145 *	ib_path_rec_flow_lbl
3146 *
3147 * DESCRIPTION
3148 *	Get flow label.
3149 *
3150 * SYNOPSIS
3151 */
3152 static inline uint32_t OSM_API
ib_path_rec_flow_lbl(IN const ib_path_rec_t * const p_rec)3153 ib_path_rec_flow_lbl(IN const ib_path_rec_t * const p_rec)
3154 {
3155 	return (((cl_ntoh32(p_rec->hop_flow_raw) >> 8) & 0x000FFFFF));
3156 }
3157 
3158 /*
3159 * PARAMETERS
3160 *	p_rec
3161 *		[in] Pointer to the path record object.
3162 *
3163 * RETURN VALUES
3164 *	Flow label of the path record.
3165 *
3166 * NOTES
3167 *
3168 * SEE ALSO
3169 *	ib_path_rec_t
3170 *********/
3171 
3172 /****f* IBA Base: Types/ib_path_rec_hop_limit
3173 * NAME
3174 *	ib_path_rec_hop_limit
3175 *
3176 * DESCRIPTION
3177 *	Get hop limit.
3178 *
3179 * SYNOPSIS
3180 */
3181 static inline uint8_t OSM_API
ib_path_rec_hop_limit(IN const ib_path_rec_t * const p_rec)3182 ib_path_rec_hop_limit(IN const ib_path_rec_t * const p_rec)
3183 {
3184 	return ((uint8_t) (cl_ntoh32(p_rec->hop_flow_raw) & 0x000000FF));
3185 }
3186 
3187 /*
3188 * PARAMETERS
3189 *	p_rec
3190 *		[in] Pointer to the path record object.
3191 *
3192 * RETURN VALUES
3193 *	Hop limit of the path record.
3194 *
3195 * NOTES
3196 *
3197 * SEE ALSO
3198 *	ib_path_rec_t
3199 *********/
3200 
3201 /****s* IBA Base: Constants/IB_CLASS_CAP_TRAP
3202 * NAME
3203 *	IB_CLASS_CAP_TRAP
3204 *
3205 * DESCRIPTION
3206 *	ClassPortInfo CapabilityMask bits.  This bit will be set
3207 *	if the class supports Trap() MADs (13.4.8.1).
3208 *
3209 * SEE ALSO
3210 *	ib_class_port_info_t, IB_CLASS_CAP_GETSET
3211 *
3212 * SOURCE
3213 */
3214 #define IB_CLASS_CAP_TRAP					0x0001
3215 /*********/
3216 
3217 /****s* IBA Base: Constants/IB_CLASS_CAP_GETSET
3218 * NAME
3219 *	IB_CLASS_CAP_GETSET
3220 *
3221 * DESCRIPTION
3222 *	ClassPortInfo CapabilityMask bits.  This bit will be set
3223 *	if the class supports Get(Notice) and Set(Notice) MADs (13.4.8.1).
3224 *
3225 * SEE ALSO
3226 *	ib_class_port_info_t, IB_CLASS_CAP_TRAP
3227 *
3228 * SOURCE
3229 */
3230 #define IB_CLASS_CAP_GETSET					0x0002
3231 /*********/
3232 
3233 /****s* IBA Base: Constants/IB_CLASS_RESP_TIME_MASK
3234 * NAME
3235 *	IB_CLASS_RESP_TIME_MASK
3236 *
3237 * DESCRIPTION
3238 *	Mask bits to extract the reponse time value from the
3239 *	resp_time_val field of ib_class_port_info_t.
3240 *
3241 * SEE ALSO
3242 *	ib_class_port_info_t
3243 *
3244 * SOURCE
3245 */
3246 #define IB_CLASS_RESP_TIME_MASK				0x1F
3247 /*********/
3248 
3249 /****s* IBA Base: Types/ib_class_port_info_t
3250 * NAME
3251 *	ib_class_port_info_t
3252 *
3253 * DESCRIPTION
3254 *	IBA defined ClassPortInfo attribute (13.4.8.1)
3255 *	route between two end-points on a subnet.
3256 *
3257 * SYNOPSIS
3258 */
3259 #include <complib/cl_packon.h>
3260 typedef struct _ib_class_port_info {
3261 	uint8_t base_ver;
3262 	uint8_t class_ver;
3263 	ib_net16_t cap_mask;
3264 	ib_net32_t cap_mask2_resp_time;
3265 	ib_gid_t redir_gid;
3266 	ib_net32_t redir_tc_sl_fl;
3267 	ib_net16_t redir_lid;
3268 	ib_net16_t redir_pkey;
3269 	ib_net32_t redir_qp;
3270 	ib_net32_t redir_qkey;
3271 	ib_gid_t trap_gid;
3272 	ib_net32_t trap_tc_sl_fl;
3273 	ib_net16_t trap_lid;
3274 	ib_net16_t trap_pkey;
3275 	ib_net32_t trap_hop_qp;
3276 	ib_net32_t trap_qkey;
3277 
3278 } PACK_SUFFIX ib_class_port_info_t;
3279 #include <complib/cl_packoff.h>
3280 /*
3281 * FIELDS
3282 *	base_ver
3283 *		Maximum supported MAD Base Version.
3284 *
3285 *	class_ver
3286 *		Maximum supported management class version.
3287 *
3288 *	cap_mask
3289 *		Supported capabilities of this management class.
3290 *
3291 *	cap_mask2_resp_time
3292 *		Maximum expected response time and additional
3293 *		supported capabilities of this management class.
3294 *
3295 *	redr_gid
3296 *		GID to use for redirection, or zero
3297 *
3298 *	recdir_tc_sl_fl
3299 *		Traffic class, service level and flow label the requester
3300 *		should use if the service is redirected.
3301 *
3302 *	redir_lid
3303 *		LID used for redirection, or zero
3304 *
3305 *	redir_pkey
3306 *		P_Key used for redirection
3307 *
3308 *	redir_qp
3309 *		QP number used for redirection
3310 *
3311 *	redir_qkey
3312 *		Q_Key associated with the redirected QP.  This shall be the
3313 *		well known Q_Key value.
3314 *
3315 *	trap_gid
3316 *		GID value used for trap messages from this service.
3317 *
3318 *	trap_tc_sl_fl
3319 *		Traffic class, service level and flow label used for
3320 *		trap messages originated by this service.
3321 *
3322 *	trap_lid
3323 *		LID used for trap messages, or zero
3324 *
3325 *	trap_pkey
3326 *		P_Key used for trap messages
3327 *
3328 *	trap_hop_qp
3329 *		Hop limit (upper 8 bits) and QP number used for trap messages
3330 *
3331 *	trap_qkey
3332 *		Q_Key associated with the trap messages QP.
3333 *
3334 * SEE ALSO
3335 *	IB_CLASS_CAP_GETSET, IB_CLASS_CAP_TRAP
3336 *
3337 *********/
3338 
3339 /****f* IBA Base: Types/ib_class_set_resp_time_val
3340 * NAME
3341 *	ib_class_set_resp_time_val
3342 *
3343 * DESCRIPTION
3344 *	Set maximum expected response time.
3345 *
3346 * SYNOPSIS
3347 */
3348 static inline void OSM_API
ib_class_set_resp_time_val(IN ib_class_port_info_t * const p_cpi,IN const uint8_t val)3349 ib_class_set_resp_time_val(IN ib_class_port_info_t * const p_cpi,
3350 			   IN const uint8_t val)
3351 {
3352 	p_cpi->cap_mask2_resp_time =
3353 	    (p_cpi->cap_mask2_resp_time & CL_HTON32(~IB_CLASS_RESP_TIME_MASK)) |
3354 	    cl_hton32(val & IB_CLASS_RESP_TIME_MASK);
3355 }
3356 
3357 /*
3358 * PARAMETERS
3359 *	p_cpi
3360 *		[in] Pointer to the class port info object.
3361 *
3362 *	val
3363 *		[in] Response time value to set.
3364 *
3365 * RETURN VALUES
3366 *	None
3367 *
3368 * NOTES
3369 *
3370 * SEE ALSO
3371 *	ib_class_port_info_t
3372 *********/
3373 
3374 /****f* IBA Base: Types/ib_class_resp_time_val
3375 * NAME
3376 *	ib_class_resp_time_val
3377 *
3378 * DESCRIPTION
3379 *	Get response time value.
3380 *
3381 * SYNOPSIS
3382 */
3383 static inline uint8_t OSM_API
ib_class_resp_time_val(IN ib_class_port_info_t * const p_cpi)3384 ib_class_resp_time_val(IN ib_class_port_info_t * const p_cpi)
3385 {
3386 	return (uint8_t)(cl_ntoh32(p_cpi->cap_mask2_resp_time) &
3387 			 IB_CLASS_RESP_TIME_MASK);
3388 }
3389 
3390 /*
3391 * PARAMETERS
3392 *	p_cpi
3393 *		[in] Pointer to the class port info object.
3394 *
3395 * RETURN VALUES
3396 *	Response time value.
3397 *
3398 * NOTES
3399 *
3400 * SEE ALSO
3401 *	ib_class_port_info_t
3402 *********/
3403 
3404 /****f* IBA Base: Types/ib_class_set_cap_mask2
3405 * NAME
3406 *	ib_class_set_cap_mask2
3407 *
3408 * DESCRIPTION
3409 *	Set ClassPortInfo:CapabilityMask2.
3410 *
3411 * SYNOPSIS
3412 */
3413 static inline void OSM_API
ib_class_set_cap_mask2(IN ib_class_port_info_t * const p_cpi,IN const uint32_t cap_mask2)3414 ib_class_set_cap_mask2(IN ib_class_port_info_t * const p_cpi,
3415 		       IN const uint32_t cap_mask2)
3416 {
3417 	p_cpi->cap_mask2_resp_time = (p_cpi->cap_mask2_resp_time &
3418 		CL_HTON32(IB_CLASS_RESP_TIME_MASK)) |
3419 		cl_hton32(cap_mask2 << 5);
3420 }
3421 
3422 /*
3423 * PARAMETERS
3424 *	p_cpi
3425 *		[in] Pointer to the class port info object.
3426 *
3427 *	cap_mask2
3428 *		[in] CapabilityMask2 value to set.
3429 *
3430 * RETURN VALUES
3431 *	None
3432 *
3433 * NOTES
3434 *
3435 * SEE ALSO
3436 *	ib_class_port_info_t
3437 *********/
3438 
3439 /****f* IBA Base: Types/ib_class_cap_mask2
3440 * NAME
3441 *	ib_class_cap_mask2
3442 *
3443 * DESCRIPTION
3444 *	Get ClassPortInfo:CapabilityMask2.
3445 *
3446 * SYNOPSIS
3447 */
3448 static inline uint32_t OSM_API
ib_class_cap_mask2(IN const ib_class_port_info_t * const p_cpi)3449 ib_class_cap_mask2(IN const ib_class_port_info_t * const p_cpi)
3450 {
3451 	return (cl_ntoh32(p_cpi->cap_mask2_resp_time) >> 5);
3452 }
3453 
3454 /*
3455 * PARAMETERS
3456 *	p_cpi
3457 *		[in] Pointer to the class port info object.
3458 *
3459 * RETURN VALUES
3460 *	CapabilityMask2 of the ClassPortInfo.
3461 *
3462 * NOTES
3463 *
3464 * SEE ALSO
3465 *	ib_class_port_info_t
3466 *********/
3467 
3468 /****s* IBA Base: Types/ib_sm_info_t
3469 * NAME
3470 *	ib_sm_info_t
3471 *
3472 * DESCRIPTION
3473 *	SMInfo structure (14.2.5.13).
3474 *
3475 * SYNOPSIS
3476 */
3477 #include <complib/cl_packon.h>
3478 typedef struct _ib_sm_info {
3479 	ib_net64_t guid;
3480 	ib_net64_t sm_key;
3481 	ib_net32_t act_count;
3482 	uint8_t pri_state;
3483 
3484 } PACK_SUFFIX ib_sm_info_t;
3485 #include <complib/cl_packoff.h>
3486 /*
3487 * FIELDS
3488 *	guid
3489 *		Port GUID for this SM.
3490 *
3491 *	sm_key
3492 *		SM_Key of this SM.
3493 *
3494 *	act_count
3495 *		Activity counter used as a heartbeat.
3496 *
3497 *	pri_state
3498 *		Priority and State information
3499 *
3500 * SEE ALSO
3501 *********/
3502 
3503 /****f* IBA Base: Types/ib_sminfo_get_priority
3504 * NAME
3505 *	ib_sminfo_get_priority
3506 *
3507 * DESCRIPTION
3508 *	Returns the priority value.
3509 *
3510 * SYNOPSIS
3511 */
3512 static inline uint8_t OSM_API
ib_sminfo_get_priority(IN const ib_sm_info_t * const p_smi)3513 ib_sminfo_get_priority(IN const ib_sm_info_t * const p_smi)
3514 {
3515 	return ((uint8_t) ((p_smi->pri_state & 0xF0) >> 4));
3516 }
3517 
3518 /*
3519 * PARAMETERS
3520 *	p_smi
3521 *		[in] Pointer to the SMInfo Attribute.
3522 *
3523 * RETURN VALUES
3524 *	Returns the priority value.
3525 *
3526 * NOTES
3527 *
3528 * SEE ALSO
3529 *********/
3530 
3531 /****f* IBA Base: Types/ib_sminfo_get_state
3532 * NAME
3533 *	ib_sminfo_get_state
3534 *
3535 * DESCRIPTION
3536 *	Returns the state value.
3537 *
3538 * SYNOPSIS
3539 */
3540 static inline uint8_t OSM_API
ib_sminfo_get_state(IN const ib_sm_info_t * const p_smi)3541 ib_sminfo_get_state(IN const ib_sm_info_t * const p_smi)
3542 {
3543 	return ((uint8_t) (p_smi->pri_state & 0x0F));
3544 }
3545 
3546 /*
3547 * PARAMETERS
3548 *	p_smi
3549 *		[in] Pointer to the SMInfo Attribute.
3550 *
3551 * RETURN VALUES
3552 *	Returns the state value.
3553 *
3554 * NOTES
3555 *
3556 * SEE ALSO
3557 *********/
3558 
3559 /****s* IBA Base: Types/ib_mad_t
3560 * NAME
3561 *	ib_mad_t
3562 *
3563 * DESCRIPTION
3564 *	IBA defined MAD header (13.4.3)
3565 *
3566 * SYNOPSIS
3567 */
3568 #include <complib/cl_packon.h>
3569 typedef struct _ib_mad {
3570 	uint8_t base_ver;
3571 	uint8_t mgmt_class;
3572 	uint8_t class_ver;
3573 	uint8_t method;
3574 	ib_net16_t status;
3575 	ib_net16_t class_spec;
3576 	ib_net64_t trans_id;
3577 	ib_net16_t attr_id;
3578 	ib_net16_t resv;
3579 	ib_net32_t attr_mod;
3580 } PACK_SUFFIX ib_mad_t;
3581 #include <complib/cl_packoff.h>
3582 /*
3583 * FIELDS
3584 *	base_ver
3585 *		MAD base format.
3586 *
3587 *	mgmt_class
3588 *		Class of operation.
3589 *
3590 *	class_ver
3591 *		Version of MAD class-specific format.
3592 *
3593 *	method
3594 *		Method to perform, including 'R' bit.
3595 *
3596 *	status
3597 *		Status of operation.
3598 *
3599 *	class_spec
3600 *		Reserved for subnet management.
3601 *
3602 *	trans_id
3603 *		Transaction ID.
3604 *
3605 *	attr_id
3606 *		Attribute ID.
3607 *
3608 *	resv
3609 *		Reserved field.
3610 *
3611 *	attr_mod
3612 *		Attribute modifier.
3613 *
3614 * SEE ALSO
3615 *********/
3616 
3617 /****s* IBA Base: Types/ib_rmpp_mad_t
3618 * NAME
3619 *	ib_rmpp_mad_t
3620 *
3621 * DESCRIPTION
3622 *	IBA defined MAD RMPP header (13.6.2.1)
3623 *
3624 * SYNOPSIS
3625 */
3626 #include <complib/cl_packon.h>
3627 typedef struct _ib_rmpp_mad {
3628 	ib_mad_t common_hdr;
3629 
3630 	uint8_t rmpp_version;
3631 	uint8_t rmpp_type;
3632 	uint8_t rmpp_flags;
3633 	uint8_t rmpp_status;
3634 
3635 	ib_net32_t seg_num;
3636 	ib_net32_t paylen_newwin;
3637 
3638 } PACK_SUFFIX ib_rmpp_mad_t;
3639 #include <complib/cl_packoff.h>
3640 /*
3641 * SEE ALSO
3642 *	ib_mad_t
3643 *********/
3644 
3645 /****f* IBA Base: Types/ib_mad_init_new
3646 * NAME
3647 *	ib_mad_init_new
3648 *
3649 * DESCRIPTION
3650 *	Initializes a MAD common header.
3651 *
3652 * SYNOPSIS
3653 */
3654 static inline void OSM_API
ib_mad_init_new(IN ib_mad_t * const p_mad,IN const uint8_t mgmt_class,IN const uint8_t class_ver,IN const uint8_t method,IN const ib_net64_t trans_id,IN const ib_net16_t attr_id,IN const ib_net32_t attr_mod)3655 ib_mad_init_new(IN ib_mad_t * const p_mad,
3656 		IN const uint8_t mgmt_class,
3657 		IN const uint8_t class_ver,
3658 		IN const uint8_t method,
3659 		IN const ib_net64_t trans_id,
3660 		IN const ib_net16_t attr_id, IN const ib_net32_t attr_mod)
3661 {
3662 	CL_ASSERT(p_mad);
3663 	p_mad->base_ver = 1;
3664 	p_mad->mgmt_class = mgmt_class;
3665 	p_mad->class_ver = class_ver;
3666 	p_mad->method = method;
3667 	p_mad->status = 0;
3668 	p_mad->class_spec = 0;
3669 	p_mad->trans_id = trans_id;
3670 	p_mad->attr_id = attr_id;
3671 	p_mad->resv = 0;
3672 	p_mad->attr_mod = attr_mod;
3673 }
3674 
3675 /*
3676 * PARAMETERS
3677 *	p_mad
3678 *		[in] Pointer to the MAD common header.
3679 *
3680 *	mgmt_class
3681 *		[in] Class of operation.
3682 *
3683 *	class_ver
3684 *		[in] Version of MAD class-specific format.
3685 *
3686 *	method
3687 *		[in] Method to perform, including 'R' bit.
3688 *
3689 *	trans_Id
3690 *		[in] Transaction ID.
3691 *
3692 *	attr_id
3693 *		[in] Attribute ID.
3694 *
3695 *	attr_mod
3696 *		[in] Attribute modifier.
3697 *
3698 * RETURN VALUES
3699 *	None.
3700 *
3701 * NOTES
3702 *
3703 * SEE ALSO
3704 *	ib_mad_t
3705 *********/
3706 
3707 /****f* IBA Base: Types/ib_mad_init_response
3708 * NAME
3709 *	ib_mad_init_response
3710 *
3711 * DESCRIPTION
3712 *	Initializes a MAD common header as a response.
3713 *
3714 * SYNOPSIS
3715 */
3716 static inline void OSM_API
ib_mad_init_response(IN const ib_mad_t * const p_req_mad,IN ib_mad_t * const p_mad,IN const ib_net16_t status)3717 ib_mad_init_response(IN const ib_mad_t * const p_req_mad,
3718 		     IN ib_mad_t * const p_mad, IN const ib_net16_t status)
3719 {
3720 	CL_ASSERT(p_req_mad);
3721 	CL_ASSERT(p_mad);
3722 	*p_mad = *p_req_mad;
3723 	p_mad->status = status;
3724 	if (p_mad->method == IB_MAD_METHOD_SET)
3725 		p_mad->method = IB_MAD_METHOD_GET;
3726 	p_mad->method |= IB_MAD_METHOD_RESP_MASK;
3727 }
3728 
3729 /*
3730 * PARAMETERS
3731 *	p_req_mad
3732 *		[in] Pointer to the MAD common header in the original request MAD.
3733 *
3734 *	p_mad
3735 *		[in] Pointer to the MAD common header to initialize.
3736 *
3737 *	status
3738 *		[in] MAD Status value to return;
3739 *
3740 * RETURN VALUES
3741 *	None.
3742 *
3743 * NOTES
3744 *	p_req_mad and p_mad may point to the same MAD.
3745 *
3746 * SEE ALSO
3747 *	ib_mad_t
3748 *********/
3749 
3750 /****f* IBA Base: Types/ib_mad_is_response
3751 * NAME
3752 *	ib_mad_is_response
3753 *
3754 * DESCRIPTION
3755 *	Returns TRUE if the MAD is a response ('R' bit set),
3756 *	FALSE otherwise.
3757 *
3758 * SYNOPSIS
3759 */
3760 static inline boolean_t OSM_API
ib_mad_is_response(IN const ib_mad_t * const p_mad)3761 ib_mad_is_response(IN const ib_mad_t * const p_mad)
3762 {
3763 	CL_ASSERT(p_mad);
3764 	return ((p_mad->method & IB_MAD_METHOD_RESP_MASK) ==
3765 		IB_MAD_METHOD_RESP_MASK);
3766 }
3767 
3768 /*
3769 * PARAMETERS
3770 *	p_mad
3771 *		[in] Pointer to the MAD.
3772 *
3773 * RETURN VALUES
3774 *	Returns TRUE if the MAD is a response ('R' bit set),
3775 *	FALSE otherwise.
3776 *
3777 * NOTES
3778 *
3779 * SEE ALSO
3780 *	ib_mad_t
3781 *********/
3782 
3783 #define IB_RMPP_TYPE_DATA		1
3784 #define IB_RMPP_TYPE_ACK		2
3785 #define IB_RMPP_TYPE_STOP		3
3786 #define IB_RMPP_TYPE_ABORT		4
3787 
3788 #define IB_RMPP_NO_RESP_TIME		0x1F
3789 #define IB_RMPP_FLAG_ACTIVE		0x01
3790 #define IB_RMPP_FLAG_FIRST		0x02
3791 #define IB_RMPP_FLAG_LAST		0x04
3792 
3793 #define IB_RMPP_STATUS_SUCCESS		0
3794 #define IB_RMPP_STATUS_RESX		1	/* resources exhausted */
3795 #define IB_RMPP_STATUS_T2L		118	/* time too long */
3796 #define IB_RMPP_STATUS_BAD_LEN		119	/* incon. last and payload len */
3797 #define IB_RMPP_STATUS_BAD_SEG		120	/* incon. first and segment no */
3798 #define IB_RMPP_STATUS_BADT		121	/* bad rmpp type */
3799 #define IB_RMPP_STATUS_W2S		122	/* newwindowlast too small */
3800 #define IB_RMPP_STATUS_S2B		123	/* segment no too big */
3801 #define IB_RMPP_STATUS_BAD_STATUS	124	/* illegal status */
3802 #define IB_RMPP_STATUS_UNV		125	/* unsupported version */
3803 #define IB_RMPP_STATUS_TMR		126	/* too many retries */
3804 #define IB_RMPP_STATUS_UNSPEC		127	/* unspecified */
3805 
3806 /****f* IBA Base: Types/ib_rmpp_is_flag_set
3807 * NAME
3808 *	ib_rmpp_is_flag_set
3809 *
3810 * DESCRIPTION
3811 *	Returns TRUE if the MAD has the given RMPP flag set.
3812 *
3813 * SYNOPSIS
3814 */
3815 static inline boolean_t OSM_API
ib_rmpp_is_flag_set(IN const ib_rmpp_mad_t * const p_rmpp_mad,IN const uint8_t flag)3816 ib_rmpp_is_flag_set(IN const ib_rmpp_mad_t * const p_rmpp_mad,
3817 		    IN const uint8_t flag)
3818 {
3819 	CL_ASSERT(p_rmpp_mad);
3820 	return ((p_rmpp_mad->rmpp_flags & flag) == flag);
3821 }
3822 
3823 /*
3824 * PARAMETERS
3825 *	ib_rmpp_mad_t
3826 *		[in] Pointer to a MAD with an RMPP header.
3827 *
3828 *	flag
3829 *		[in] The RMPP flag being examined.
3830 *
3831 * RETURN VALUES
3832 *	Returns TRUE if the MAD has the given RMPP flag set.
3833 *
3834 * NOTES
3835 *
3836 * SEE ALSO
3837 *	ib_mad_t, ib_rmpp_mad_t
3838 *********/
3839 
3840 static inline void OSM_API
ib_rmpp_set_resp_time(IN ib_rmpp_mad_t * const p_rmpp_mad,IN const uint8_t resp_time)3841 ib_rmpp_set_resp_time(IN ib_rmpp_mad_t * const p_rmpp_mad,
3842 		      IN const uint8_t resp_time)
3843 {
3844 	CL_ASSERT(p_rmpp_mad);
3845 	p_rmpp_mad->rmpp_flags |= (resp_time << 3);
3846 }
3847 
3848 static inline uint8_t OSM_API
ib_rmpp_get_resp_time(IN const ib_rmpp_mad_t * const p_rmpp_mad)3849 ib_rmpp_get_resp_time(IN const ib_rmpp_mad_t * const p_rmpp_mad)
3850 {
3851 	CL_ASSERT(p_rmpp_mad);
3852 	return ((uint8_t) (p_rmpp_mad->rmpp_flags >> 3));
3853 }
3854 
3855 /****d* IBA Base: Constants/IB_SMP_DIRECTION
3856 * NAME
3857 *	IB_SMP_DIRECTION
3858 *
3859 * DESCRIPTION
3860 *	The Direction bit for directed route SMPs.
3861 *
3862 * SOURCE
3863 */
3864 #define IB_SMP_DIRECTION_HO		0x8000
3865 #define IB_SMP_DIRECTION		(CL_HTON16(IB_SMP_DIRECTION_HO))
3866 /**********/
3867 
3868 /****d* IBA Base: Constants/IB_SMP_STATUS_MASK
3869 * NAME
3870 *	IB_SMP_STATUS_MASK
3871 *
3872 * DESCRIPTION
3873 *	Mask value for extracting status from a directed route SMP.
3874 *
3875 * SOURCE
3876 */
3877 #define IB_SMP_STATUS_MASK_HO		0x7FFF
3878 #define IB_SMP_STATUS_MASK		(CL_HTON16(IB_SMP_STATUS_MASK_HO))
3879 /**********/
3880 
3881 /****s* IBA Base: Types/ib_smp_t
3882 * NAME
3883 *	ib_smp_t
3884 *
3885 * DESCRIPTION
3886 *	IBA defined SMP. (14.2.1.2)
3887 *
3888 * SYNOPSIS
3889 */
3890 #define IB_SMP_DATA_SIZE 64
3891 #include <complib/cl_packon.h>
3892 typedef struct _ib_smp {
3893 	uint8_t base_ver;
3894 	uint8_t mgmt_class;
3895 	uint8_t class_ver;
3896 	uint8_t method;
3897 	ib_net16_t status;
3898 	uint8_t hop_ptr;
3899 	uint8_t hop_count;
3900 	ib_net64_t trans_id;
3901 	ib_net16_t attr_id;
3902 	ib_net16_t resv;
3903 	ib_net32_t attr_mod;
3904 	ib_net64_t m_key;
3905 	ib_net16_t dr_slid;
3906 	ib_net16_t dr_dlid;
3907 	uint32_t resv1[7];
3908 	uint8_t data[IB_SMP_DATA_SIZE];
3909 	uint8_t initial_path[IB_SUBNET_PATH_HOPS_MAX];
3910 	uint8_t return_path[IB_SUBNET_PATH_HOPS_MAX];
3911 
3912 } PACK_SUFFIX ib_smp_t;
3913 #include <complib/cl_packoff.h>
3914 /*
3915 * FIELDS
3916 *	base_ver
3917 *		MAD base format.
3918 *
3919 *	mgmt_class
3920 *		Class of operation.
3921 *
3922 *	class_ver
3923 *		Version of MAD class-specific format.
3924 *
3925 *	method
3926 *		Method to perform, including 'R' bit.
3927 *
3928 *	status
3929 *		Status of operation.
3930 *
3931 *	hop_ptr
3932 *		Hop pointer for directed route MADs.
3933 *
3934 *	hop_count
3935 *		Hop count for directed route MADs.
3936 *
3937 *	trans_Id
3938 *		Transaction ID.
3939 *
3940 *	attr_id
3941 *		Attribute ID.
3942 *
3943 *	resv
3944 *		Reserved field.
3945 *
3946 *	attr_mod
3947 *		Attribute modifier.
3948 *
3949 *	m_key
3950 *		Management key value.
3951 *
3952 *	dr_slid
3953 *		Directed route source LID.
3954 *
3955 *	dr_dlid
3956 *		Directed route destination LID.
3957 *
3958 *	resv0
3959 *		Reserved for 64 byte alignment.
3960 *
3961 *	data
3962 *		MAD data payload.
3963 *
3964 *	initial_path
3965 *		Outbound port list.
3966 *
3967 *	return_path
3968 *		Inbound port list.
3969 *
3970 * SEE ALSO
3971 *********/
3972 
3973 /****f* IBA Base: Types/ib_smp_get_status
3974 * NAME
3975 *	ib_smp_get_status
3976 *
3977 * DESCRIPTION
3978 *	Returns the SMP status value in network order.
3979 *
3980 * SYNOPSIS
3981 */
3982 static inline ib_net16_t OSM_API
ib_smp_get_status(IN const ib_smp_t * const p_smp)3983 ib_smp_get_status(IN const ib_smp_t * const p_smp)
3984 {
3985 	return ((ib_net16_t) (p_smp->status & IB_SMP_STATUS_MASK));
3986 }
3987 
3988 /*
3989 * PARAMETERS
3990 *	p_smp
3991 *		[in] Pointer to the SMP packet.
3992 *
3993 * RETURN VALUES
3994 *	Returns the SMP status value in network order.
3995 *
3996 * NOTES
3997 *
3998 * SEE ALSO
3999 *	ib_smp_t
4000 *********/
4001 
4002 /****f* IBA Base: Types/ib_smp_is_response
4003 * NAME
4004 *	ib_smp_is_response
4005 *
4006 * DESCRIPTION
4007 *	Returns TRUE if the SMP is a response MAD, FALSE otherwise.
4008 *
4009 * SYNOPSIS
4010 */
4011 static inline boolean_t OSM_API
ib_smp_is_response(IN const ib_smp_t * const p_smp)4012 ib_smp_is_response(IN const ib_smp_t * const p_smp)
4013 {
4014 	return (ib_mad_is_response((const ib_mad_t *)p_smp));
4015 }
4016 
4017 /*
4018 * PARAMETERS
4019 *	p_smp
4020 *		[in] Pointer to the SMP packet.
4021 *
4022 * RETURN VALUES
4023 *	Returns TRUE if the SMP is a response MAD, FALSE otherwise.
4024 *
4025 * NOTES
4026 *
4027 * SEE ALSO
4028 *	ib_smp_t
4029 *********/
4030 
4031 /****f* IBA Base: Types/ib_smp_is_d
4032 * NAME
4033 *	ib_smp_is_d
4034 *
4035 * DESCRIPTION
4036 *	Returns TRUE if the SMP 'D' (direction) bit is set.
4037 *
4038 * SYNOPSIS
4039 */
ib_smp_is_d(IN const ib_smp_t * const p_smp)4040 static inline boolean_t OSM_API ib_smp_is_d(IN const ib_smp_t * const p_smp)
4041 {
4042 	return ((p_smp->status & IB_SMP_DIRECTION) == IB_SMP_DIRECTION);
4043 }
4044 
4045 /*
4046 * PARAMETERS
4047 *	p_smp
4048 *		[in] Pointer to the SMP packet.
4049 *
4050 * RETURN VALUES
4051 *	Returns TRUE if the SMP 'D' (direction) bit is set.
4052 *
4053 * NOTES
4054 *
4055 * SEE ALSO
4056 *	ib_smp_t
4057 *********/
4058 
4059 /****f* IBA Base: Types/ib_smp_init_new
4060 * NAME
4061 *	ib_smp_init_new
4062 *
4063 * DESCRIPTION
4064 *	Initializes a MAD common header.
4065 *
4066 * TODO
4067 *	This is too big for inlining, but leave it here for now
4068 *	since there is not yet another convient spot.
4069 *
4070 * SYNOPSIS
4071 */
4072 static inline void OSM_API
ib_smp_init_new(IN ib_smp_t * const p_smp,IN const uint8_t method,IN const ib_net64_t trans_id,IN const ib_net16_t attr_id,IN const ib_net32_t attr_mod,IN const uint8_t hop_count,IN const ib_net64_t m_key,IN const uint8_t * path_out,IN const ib_net16_t dr_slid,IN const ib_net16_t dr_dlid)4073 ib_smp_init_new(IN ib_smp_t * const p_smp,
4074 		IN const uint8_t method,
4075 		IN const ib_net64_t trans_id,
4076 		IN const ib_net16_t attr_id,
4077 		IN const ib_net32_t attr_mod,
4078 		IN const uint8_t hop_count,
4079 		IN const ib_net64_t m_key,
4080 		IN const uint8_t * path_out,
4081 		IN const ib_net16_t dr_slid, IN const ib_net16_t dr_dlid)
4082 {
4083 	CL_ASSERT(p_smp);
4084 	CL_ASSERT(hop_count < IB_SUBNET_PATH_HOPS_MAX);
4085 	p_smp->base_ver = 1;
4086 	p_smp->mgmt_class = IB_MCLASS_SUBN_DIR;
4087 	p_smp->class_ver = 1;
4088 	p_smp->method = method;
4089 	p_smp->status = 0;
4090 	p_smp->hop_ptr = 0;
4091 	p_smp->hop_count = hop_count;
4092 	p_smp->trans_id = trans_id;
4093 	p_smp->attr_id = attr_id;
4094 	p_smp->resv = 0;
4095 	p_smp->attr_mod = attr_mod;
4096 	p_smp->m_key = m_key;
4097 	p_smp->dr_slid = dr_slid;
4098 	p_smp->dr_dlid = dr_dlid;
4099 
4100 	memset(p_smp->resv1, 0,
4101 	       sizeof(p_smp->resv1) +
4102 	       sizeof(p_smp->data) +
4103 	       sizeof(p_smp->initial_path) + sizeof(p_smp->return_path));
4104 
4105 	/* copy the path */
4106 	memcpy(&p_smp->initial_path, path_out, sizeof(p_smp->initial_path));
4107 }
4108 
4109 /*
4110 * PARAMETERS
4111 *	p_smp
4112 *		[in] Pointer to the SMP packet.
4113 *
4114 *	method
4115 *		[in] Method to perform, including 'R' bit.
4116 *
4117 *	trans_Id
4118 *		[in] Transaction ID.
4119 *
4120 *	attr_id
4121 *		[in] Attribute ID.
4122 *
4123 *	attr_mod
4124 *		[in] Attribute modifier.
4125 *
4126 *	hop_count
4127 *		[in] Number of hops in the path.
4128 *
4129 *	m_key
4130 *		[in] Management key for this SMP.
4131 *
4132 *	path_out
4133 *		[in] Port array for outbound path.
4134 *
4135 *
4136 * RETURN VALUES
4137 *	None.
4138 *
4139 * NOTES
4140 *	Payload area is initialized to zero.
4141 *
4142 *
4143 * SEE ALSO
4144 *	ib_mad_t
4145 *********/
4146 
4147 /****f* IBA Base: Types/ib_smp_get_payload_ptr
4148 * NAME
4149 *	ib_smp_get_payload_ptr
4150 *
4151 * DESCRIPTION
4152 *	Gets a pointer to the SMP payload area.
4153 *
4154 * SYNOPSIS
4155 */
4156 static inline void *OSM_API
ib_smp_get_payload_ptr(IN const ib_smp_t * const p_smp)4157 ib_smp_get_payload_ptr(IN const ib_smp_t * const p_smp)
4158 {
4159 	return ((void *)p_smp->data);
4160 }
4161 
4162 /*
4163 * PARAMETERS
4164 *	p_smp
4165 *		[in] Pointer to the SMP packet.
4166 *
4167 * RETURN VALUES
4168 *	Pointer to SMP payload area.
4169 *
4170 * NOTES
4171 *
4172 * SEE ALSO
4173 *	ib_mad_t
4174 *********/
4175 
4176 /****s* IBA Base: Types/ib_node_info_t
4177 * NAME
4178 *	ib_node_info_t
4179 *
4180 * DESCRIPTION
4181 *	IBA defined NodeInfo. (14.2.5.3)
4182 *
4183 * SYNOPSIS
4184 */
4185 #include <complib/cl_packon.h>
4186 typedef struct _ib_node_info {
4187 	uint8_t base_version;
4188 	uint8_t class_version;
4189 	uint8_t node_type;
4190 	uint8_t num_ports;
4191 	ib_net64_t sys_guid;
4192 	ib_net64_t node_guid;
4193 	ib_net64_t port_guid;
4194 	ib_net16_t partition_cap;
4195 	ib_net16_t device_id;
4196 	ib_net32_t revision;
4197 	ib_net32_t port_num_vendor_id;
4198 
4199 } PACK_SUFFIX ib_node_info_t;
4200 #include <complib/cl_packoff.h>
4201 /************/
4202 
4203 /****s* IBA Base: Types/ib_sa_mad_t
4204 * NAME
4205 *	ib_sa_mad_t
4206 *
4207 * DESCRIPTION
4208 *	IBA defined SA MAD format. (15.2.1)
4209 *
4210 * SYNOPSIS
4211 */
4212 #define IB_SA_DATA_SIZE 200
4213 
4214 #include <complib/cl_packon.h>
4215 typedef struct _ib_sa_mad {
4216 	uint8_t base_ver;
4217 	uint8_t mgmt_class;
4218 	uint8_t class_ver;
4219 	uint8_t method;
4220 	ib_net16_t status;
4221 	ib_net16_t resv;
4222 	ib_net64_t trans_id;
4223 	ib_net16_t attr_id;
4224 	ib_net16_t resv1;
4225 	ib_net32_t attr_mod;
4226 
4227 	uint8_t rmpp_version;
4228 	uint8_t rmpp_type;
4229 	uint8_t rmpp_flags;
4230 	uint8_t rmpp_status;
4231 
4232 	ib_net32_t seg_num;
4233 	ib_net32_t paylen_newwin;
4234 
4235 	ib_net64_t sm_key;
4236 
4237 	ib_net16_t attr_offset;
4238 	ib_net16_t resv3;
4239 
4240 	ib_net64_t comp_mask;
4241 
4242 	uint8_t data[IB_SA_DATA_SIZE];
4243 } PACK_SUFFIX ib_sa_mad_t;
4244 #include <complib/cl_packoff.h>
4245 /**********/
4246 #define IB_SA_MAD_HDR_SIZE (sizeof(ib_sa_mad_t) - IB_SA_DATA_SIZE)
4247 
ib_get_attr_size(IN const ib_net16_t attr_offset)4248 static inline uint32_t OSM_API ib_get_attr_size(IN const ib_net16_t attr_offset)
4249 {
4250 	return (((uint32_t) cl_ntoh16(attr_offset)) << 3);
4251 }
4252 
ib_get_attr_offset(IN const uint32_t attr_size)4253 static inline ib_net16_t OSM_API ib_get_attr_offset(IN const uint32_t attr_size)
4254 {
4255 	return (cl_hton16((uint16_t) (attr_size >> 3)));
4256 }
4257 
4258 /****f* IBA Base: Types/ib_sa_mad_get_payload_ptr
4259 * NAME
4260 *	ib_sa_mad_get_payload_ptr
4261 *
4262 * DESCRIPTION
4263 *	Gets a pointer to the SA MAD's payload area.
4264 *
4265 * SYNOPSIS
4266 */
4267 static inline void *OSM_API
ib_sa_mad_get_payload_ptr(IN const ib_sa_mad_t * const p_sa_mad)4268 ib_sa_mad_get_payload_ptr(IN const ib_sa_mad_t * const p_sa_mad)
4269 {
4270 	return ((void *)p_sa_mad->data);
4271 }
4272 
4273 /*
4274 * PARAMETERS
4275 *	p_sa_mad
4276 *		[in] Pointer to the SA MAD packet.
4277 *
4278 * RETURN VALUES
4279 *	Pointer to SA MAD payload area.
4280 *
4281 * NOTES
4282 *
4283 * SEE ALSO
4284 *	ib_mad_t
4285 *********/
4286 
4287 #define IB_NODE_INFO_PORT_NUM_MASK		(CL_HTON32(0xFF000000))
4288 #define IB_NODE_INFO_VEND_ID_MASK		(CL_HTON32(0x00FFFFFF))
4289 #if CPU_LE
4290 #define IB_NODE_INFO_PORT_NUM_SHIFT 0
4291 #else
4292 #define IB_NODE_INFO_PORT_NUM_SHIFT 24
4293 #endif
4294 
4295 /****f* IBA Base: Types/ib_node_info_get_local_port_num
4296 * NAME
4297 *	ib_node_info_get_local_port_num
4298 *
4299 * DESCRIPTION
4300 *	Gets a the local port number from the NodeInfo attribute.
4301 *
4302 * SYNOPSIS
4303 */
4304 static inline uint8_t OSM_API
ib_node_info_get_local_port_num(IN const ib_node_info_t * const p_ni)4305 ib_node_info_get_local_port_num(IN const ib_node_info_t * const p_ni)
4306 {
4307 	return ((uint8_t) ((p_ni->port_num_vendor_id &
4308 			    IB_NODE_INFO_PORT_NUM_MASK)
4309 			   >> IB_NODE_INFO_PORT_NUM_SHIFT));
4310 }
4311 
4312 /*
4313 * PARAMETERS
4314 *	p_ni
4315 *		[in] Pointer to a NodeInfo attribute.
4316 *
4317 * RETURN VALUES
4318 *	Local port number that returned the attribute.
4319 *
4320 * NOTES
4321 *
4322 * SEE ALSO
4323 *	ib_node_info_t
4324 *********/
4325 
4326 /****f* IBA Base: Types/ib_node_info_get_vendor_id
4327 * NAME
4328 *	ib_node_info_get_vendor_id
4329 *
4330 * DESCRIPTION
4331 *	Gets the VendorID from the NodeInfo attribute.
4332 *
4333 * SYNOPSIS
4334 */
4335 static inline ib_net32_t OSM_API
ib_node_info_get_vendor_id(IN const ib_node_info_t * const p_ni)4336 ib_node_info_get_vendor_id(IN const ib_node_info_t * const p_ni)
4337 {
4338 	return ((ib_net32_t) (p_ni->port_num_vendor_id &
4339 			      IB_NODE_INFO_VEND_ID_MASK));
4340 }
4341 
4342 /*
4343 * PARAMETERS
4344 *	p_ni
4345 *		[in] Pointer to a NodeInfo attribute.
4346 *
4347 * RETURN VALUES
4348 *	VendorID that returned the attribute.
4349 *
4350 * NOTES
4351 *
4352 * SEE ALSO
4353 *	ib_node_info_t
4354 *********/
4355 
4356 #define IB_NODE_DESCRIPTION_SIZE 64
4357 
4358 #include <complib/cl_packon.h>
4359 typedef struct _ib_node_desc {
4360 	// Node String is an array of UTF-8 character that
4361 	// describes the node in text format
4362 	// Note that this string is NOT NULL TERMINATED!
4363 	uint8_t description[IB_NODE_DESCRIPTION_SIZE];
4364 
4365 } PACK_SUFFIX ib_node_desc_t;
4366 #include <complib/cl_packoff.h>
4367 
4368 #include <complib/cl_packon.h>
4369 typedef struct _ib_node_record_t {
4370 	ib_net16_t lid;
4371 	ib_net16_t resv;
4372 	ib_node_info_t node_info;
4373 	ib_node_desc_t node_desc;
4374 	uint8_t pad[4];
4375 
4376 } PACK_SUFFIX ib_node_record_t;
4377 #include <complib/cl_packoff.h>
4378 
4379 /****s* IBA Base: Types/ib_port_info_t
4380 * NAME
4381 *	ib_port_info_t
4382 *
4383 * DESCRIPTION
4384 *	IBA defined PortInfo. (14.2.5.6)
4385 *
4386 * SYNOPSIS
4387 */
4388 #include <complib/cl_packon.h>
4389 typedef struct _ib_port_info {
4390 	ib_net64_t m_key;
4391 	ib_net64_t subnet_prefix;
4392 	ib_net16_t base_lid;
4393 	ib_net16_t master_sm_base_lid;
4394 	ib_net32_t capability_mask;
4395 	ib_net16_t diag_code;
4396 	ib_net16_t m_key_lease_period;
4397 	uint8_t local_port_num;
4398 	uint8_t link_width_enabled;
4399 	uint8_t link_width_supported;
4400 	uint8_t link_width_active;
4401 	uint8_t state_info1;	/* LinkSpeedSupported and PortState */
4402 	uint8_t state_info2;	/* PortPhysState and LinkDownDefaultState */
4403 	uint8_t mkey_lmc;
4404 	uint8_t link_speed;	/* LinkSpeedEnabled and LinkSpeedActive */
4405 	uint8_t mtu_smsl;
4406 	uint8_t vl_cap;		/* VLCap and InitType */
4407 	uint8_t vl_high_limit;
4408 	uint8_t vl_arb_high_cap;
4409 	uint8_t vl_arb_low_cap;
4410 	uint8_t mtu_cap;
4411 	uint8_t vl_stall_life;
4412 	uint8_t vl_enforce;
4413 	ib_net16_t m_key_violations;
4414 	ib_net16_t p_key_violations;
4415 	ib_net16_t q_key_violations;
4416 	uint8_t guid_cap;
4417 	uint8_t subnet_timeout;	/* cli_rereg(1b), resrv(
4418 				   2b), timeout(5b) */
4419 	uint8_t resp_time_value;
4420 	uint8_t error_threshold;
4421 
4422 } PACK_SUFFIX ib_port_info_t;
4423 #include <complib/cl_packoff.h>
4424 /************/
4425 
4426 #define IB_PORT_STATE_MASK			0x0F
4427 #define IB_PORT_LMC_MASK			0x07
4428 #define IB_PORT_LMC_MAX				0x07
4429 #define IB_PORT_MPB_MASK			0xC0
4430 #define IB_PORT_MPB_SHIFT			6
4431 #define IB_PORT_LINK_SPEED_SHIFT		4
4432 #define IB_PORT_LINK_SPEED_SUPPORTED_MASK	0xF0
4433 #define IB_PORT_LINK_SPEED_ACTIVE_MASK		0xF0
4434 #define IB_PORT_LINK_SPEED_ENABLED_MASK		0x0F
4435 #define IB_PORT_PHYS_STATE_MASK			0xF0
4436 #define IB_PORT_PHYS_STATE_SHIFT		4
4437 #define IB_PORT_PHYS_STATE_NO_CHANGE		0
4438 #define IB_PORT_PHYS_STATE_SLEEP		1
4439 #define IB_PORT_PHYS_STATE_POLLING		2
4440 #define IB_PORT_PHYS_STATE_DISABLED		3
4441 #define IB_PORT_PHYS_STATE_PORTCONFTRAIN	4
4442 #define IB_PORT_PHYS_STATE_LINKUP	        5
4443 #define IB_PORT_PHYS_STATE_LINKERRRECOVER	6
4444 #define IB_PORT_PHYS_STATE_PHYTEST	        7
4445 #define IB_PORT_LNKDWNDFTSTATE_MASK		0x0F
4446 
4447 #define IB_PORT_CAP_RESV0         (CL_HTON32(0x00000001))
4448 #define IB_PORT_CAP_IS_SM         (CL_HTON32(0x00000002))
4449 #define IB_PORT_CAP_HAS_NOTICE    (CL_HTON32(0x00000004))
4450 #define IB_PORT_CAP_HAS_TRAP      (CL_HTON32(0x00000008))
4451 #define IB_PORT_CAP_HAS_IPD       (CL_HTON32(0x00000010))
4452 #define IB_PORT_CAP_HAS_AUTO_MIG  (CL_HTON32(0x00000020))
4453 #define IB_PORT_CAP_HAS_SL_MAP    (CL_HTON32(0x00000040))
4454 #define IB_PORT_CAP_HAS_NV_MKEY   (CL_HTON32(0x00000080))
4455 #define IB_PORT_CAP_HAS_NV_PKEY   (CL_HTON32(0x00000100))
4456 #define IB_PORT_CAP_HAS_LED_INFO  (CL_HTON32(0x00000200))
4457 #define IB_PORT_CAP_SM_DISAB      (CL_HTON32(0x00000400))
4458 #define IB_PORT_CAP_HAS_SYS_IMG_GUID  (CL_HTON32(0x00000800))
4459 #define IB_PORT_CAP_HAS_PKEY_SW_EXT_PORT_TRAP (CL_HTON32(0x00001000))
4460 #define IB_PORT_CAP_RESV13        (CL_HTON32(0x00002000))
4461 #define IB_PORT_CAP_RESV14        (CL_HTON32(0x00004000))
4462 #define IB_PORT_CAP_RESV15        (CL_HTON32(0x00008000))
4463 #define IB_PORT_CAP_HAS_COM_MGT   (CL_HTON32(0x00010000))
4464 #define IB_PORT_CAP_HAS_SNMP      (CL_HTON32(0x00020000))
4465 #define IB_PORT_CAP_REINIT        (CL_HTON32(0x00040000))
4466 #define IB_PORT_CAP_HAS_DEV_MGT   (CL_HTON32(0x00080000))
4467 #define IB_PORT_CAP_HAS_VEND_CLS  (CL_HTON32(0x00100000))
4468 #define IB_PORT_CAP_HAS_DR_NTC    (CL_HTON32(0x00200000))
4469 #define IB_PORT_CAP_HAS_CAP_NTC   (CL_HTON32(0x00400000))
4470 #define IB_PORT_CAP_HAS_BM        (CL_HTON32(0x00800000))
4471 #define IB_PORT_CAP_HAS_LINK_RT_LATENCY (CL_HTON32(0x01000000))
4472 #define IB_PORT_CAP_HAS_CLIENT_REREG (CL_HTON32(0x02000000))
4473 #define IB_PORT_CAP_HAS_OTHER_LOCAL_CHANGES_NTC (CL_HTON32(0x04000000))
4474 #define IB_PORT_CAP_HAS_LINK_SPEED_WIDTH_PAIRS_TBL (CL_HTON32(0x08000000))
4475 #define IB_PORT_CAP_RESV28        (CL_HTON32(0x10000000))
4476 #define IB_PORT_CAP_RESV29        (CL_HTON32(0x20000000))
4477 #define IB_PORT_CAP_RESV30        (CL_HTON32(0x40000000))
4478 #define IB_PORT_CAP_RESV31        (CL_HTON32(0x80000000))
4479 
4480 /****f* IBA Base: Types/ib_port_info_get_port_state
4481 * NAME
4482 *	ib_port_info_get_port_state
4483 *
4484 * DESCRIPTION
4485 *	Returns the port state.
4486 *
4487 * SYNOPSIS
4488 */
4489 static inline uint8_t OSM_API
ib_port_info_get_port_state(IN const ib_port_info_t * const p_pi)4490 ib_port_info_get_port_state(IN const ib_port_info_t * const p_pi)
4491 {
4492 	return ((uint8_t) (p_pi->state_info1 & IB_PORT_STATE_MASK));
4493 }
4494 
4495 /*
4496 * PARAMETERS
4497 *	p_pi
4498 *		[in] Pointer to a PortInfo attribute.
4499 *
4500 * RETURN VALUES
4501 *	Port state.
4502 *
4503 * NOTES
4504 *
4505 * SEE ALSO
4506 *********/
4507 
4508 /****f* IBA Base: Types/ib_port_info_set_port_state
4509 * NAME
4510 *	ib_port_info_set_port_state
4511 *
4512 * DESCRIPTION
4513 *	Sets the port state.
4514 *
4515 * SYNOPSIS
4516 */
4517 static inline void OSM_API
ib_port_info_set_port_state(IN ib_port_info_t * const p_pi,IN const uint8_t port_state)4518 ib_port_info_set_port_state(IN ib_port_info_t * const p_pi,
4519 			    IN const uint8_t port_state)
4520 {
4521 	p_pi->state_info1 = (uint8_t) ((p_pi->state_info1 & 0xF0) | port_state);
4522 }
4523 
4524 /*
4525 * PARAMETERS
4526 *	p_pi
4527 *		[in] Pointer to a PortInfo attribute.
4528 *
4529 *	port_state
4530 *		[in] Port state value to set.
4531 *
4532 * RETURN VALUES
4533 *	None.
4534 *
4535 * NOTES
4536 *
4537 * SEE ALSO
4538 *********/
4539 
4540 /****f* IBA Base: Types/ib_port_info_get_vl_cap
4541 * NAME
4542 *	ib_port_info_get_vl_cap
4543 *
4544 * DESCRIPTION
4545 *	Gets the VL Capability of a port.
4546 *
4547 * SYNOPSIS
4548 */
4549 static inline uint8_t OSM_API
ib_port_info_get_vl_cap(IN const ib_port_info_t * const p_pi)4550 ib_port_info_get_vl_cap(IN const ib_port_info_t * const p_pi)
4551 {
4552 	return ((p_pi->vl_cap >> 4) & 0x0F);
4553 }
4554 
4555 /*
4556 * PARAMETERS
4557 *	p_pi
4558 *		[in] Pointer to a PortInfo attribute.
4559 *
4560 * RETURN VALUES
4561 *	VL_CAP field
4562 *
4563 * NOTES
4564 *
4565 * SEE ALSO
4566 *********/
4567 
4568 /****f* IBA Base: Types/ib_port_info_get_init_type
4569 * NAME
4570 *	ib_port_info_get_init_type
4571 *
4572 * DESCRIPTION
4573 *	Gets the init type of a port.
4574 *
4575 * SYNOPSIS
4576 */
4577 static inline uint8_t OSM_API
ib_port_info_get_init_type(IN const ib_port_info_t * const p_pi)4578 ib_port_info_get_init_type(IN const ib_port_info_t * const p_pi)
4579 {
4580 	return (uint8_t) (p_pi->vl_cap & 0x0F);
4581 }
4582 
4583 /*
4584 * PARAMETERS
4585 *	p_pi
4586 *		[in] Pointer to a PortInfo attribute.
4587 *
4588 * RETURN VALUES
4589 *	InitType field
4590 *
4591 * NOTES
4592 *
4593 * SEE ALSO
4594 *********/
4595 
4596 /****f* IBA Base: Types/ib_port_info_get_op_vls
4597 * NAME
4598 *	ib_port_info_get_op_vls
4599 *
4600 * DESCRIPTION
4601 *	Gets the operational VLs on a port.
4602 *
4603 * SYNOPSIS
4604 */
4605 static inline uint8_t OSM_API
ib_port_info_get_op_vls(IN const ib_port_info_t * const p_pi)4606 ib_port_info_get_op_vls(IN const ib_port_info_t * const p_pi)
4607 {
4608 	return ((p_pi->vl_enforce >> 4) & 0x0F);
4609 }
4610 
4611 /*
4612 * PARAMETERS
4613 *	p_pi
4614 *		[in] Pointer to a PortInfo attribute.
4615 *
4616 * RETURN VALUES
4617 *	OP_VLS field
4618 *
4619 * NOTES
4620 *
4621 * SEE ALSO
4622 *********/
4623 
4624 /****f* IBA Base: Types/ib_port_info_set_op_vls
4625 * NAME
4626 *	ib_port_info_set_op_vls
4627 *
4628 * DESCRIPTION
4629 *	Sets the operational VLs on a port.
4630 *
4631 * SYNOPSIS
4632 */
4633 static inline void OSM_API
ib_port_info_set_op_vls(IN ib_port_info_t * const p_pi,IN const uint8_t op_vls)4634 ib_port_info_set_op_vls(IN ib_port_info_t * const p_pi, IN const uint8_t op_vls)
4635 {
4636 	p_pi->vl_enforce =
4637 	    (uint8_t) ((p_pi->vl_enforce & 0x0F) | (op_vls << 4));
4638 }
4639 
4640 /*
4641 * PARAMETERS
4642 *	p_pi
4643 *		[in] Pointer to a PortInfo attribute.
4644 *
4645 *	op_vls
4646 *		[in] Encoded operation VLs value.
4647 *
4648 * RETURN VALUES
4649 *	None.
4650 *
4651 * NOTES
4652 *
4653 * SEE ALSO
4654 *********/
4655 
4656 /****f* IBA Base: Types/ib_port_info_set_state_no_change
4657 * NAME
4658 *	ib_port_info_set_state_no_change
4659 *
4660 * DESCRIPTION
4661 *	Sets the port state fields to the value for "no change".
4662 *
4663 * SYNOPSIS
4664 */
4665 static inline void OSM_API
ib_port_info_set_state_no_change(IN ib_port_info_t * const p_pi)4666 ib_port_info_set_state_no_change(IN ib_port_info_t * const p_pi)
4667 {
4668 	ib_port_info_set_port_state(p_pi, IB_LINK_NO_CHANGE);
4669 	p_pi->state_info2 = 0;
4670 }
4671 
4672 /*
4673 * PARAMETERS
4674 *	p_pi
4675 *		[in] Pointer to a PortInfo attribute.
4676 *
4677 * RETURN VALUES
4678 *	None.
4679 *
4680 * NOTES
4681 *
4682 * SEE ALSO
4683 *********/
4684 
4685 /****f* IBA Base: Types/ib_port_info_get_link_speed_sup
4686 * NAME
4687 *	ib_port_info_get_link_speed_sup
4688 *
4689 * DESCRIPTION
4690 *	Returns the encoded value for the link speed supported.
4691 *
4692 * SYNOPSIS
4693 */
4694 static inline uint8_t OSM_API
ib_port_info_get_link_speed_sup(IN const ib_port_info_t * const p_pi)4695 ib_port_info_get_link_speed_sup(IN const ib_port_info_t * const p_pi)
4696 {
4697 	return ((uint8_t) ((p_pi->state_info1 &
4698 			    IB_PORT_LINK_SPEED_SUPPORTED_MASK) >>
4699 			   IB_PORT_LINK_SPEED_SHIFT));
4700 }
4701 
4702 /*
4703 * PARAMETERS
4704 *	p_pi
4705 *		[in] Pointer to a PortInfo attribute.
4706 *
4707 * RETURN VALUES
4708 *	Returns the encoded value for the link speed supported.
4709 *
4710 * NOTES
4711 *
4712 * SEE ALSO
4713 *********/
4714 
4715 /****f* IBA Base: Types/ib_port_info_set_link_speed_sup
4716 * NAME
4717 *	ib_port_info_set_link_speed_sup
4718 *
4719 * DESCRIPTION
4720 *	Given an integer of the supported link speed supported.
4721 *	Set the appropriate bits in state_info1
4722 *
4723 * SYNOPSIS
4724 */
4725 static inline void OSM_API
ib_port_info_set_link_speed_sup(IN uint8_t const speed,IN ib_port_info_t * p_pi)4726 ib_port_info_set_link_speed_sup(IN uint8_t const speed,
4727 				IN ib_port_info_t * p_pi)
4728 {
4729 	p_pi->state_info1 =
4730 	    (~IB_PORT_LINK_SPEED_SUPPORTED_MASK & p_pi->state_info1) |
4731 	    (IB_PORT_LINK_SPEED_SUPPORTED_MASK &
4732 	     (speed << IB_PORT_LINK_SPEED_SHIFT));
4733 }
4734 
4735 /*
4736 * PARAMETERS
4737 *	speed
4738 *		[in] Supported Speeds Code.
4739 *
4740 *	p_pi
4741 *		[in] Pointer to a PortInfo attribute.
4742 *
4743 * RETURN VALUES
4744 *	This function does not return a value.
4745 *
4746 * NOTES
4747 *
4748 * SEE ALSO
4749 *********/
4750 
4751 /****f* IBA Base: Types/ib_port_info_get_port_phys_state
4752 * NAME
4753 *	ib_port_info_get_port_phys_state
4754 *
4755 * DESCRIPTION
4756 *	Returns the encoded value for the port physical state.
4757 *
4758 * SYNOPSIS
4759 */
4760 static inline uint8_t OSM_API
ib_port_info_get_port_phys_state(IN const ib_port_info_t * const p_pi)4761 ib_port_info_get_port_phys_state(IN const ib_port_info_t * const p_pi)
4762 {
4763 	return ((uint8_t) ((p_pi->state_info2 &
4764 			    IB_PORT_PHYS_STATE_MASK) >>
4765 			   IB_PORT_PHYS_STATE_SHIFT));
4766 }
4767 
4768 /*
4769 * PARAMETERS
4770 *	p_pi
4771 *		[in] Pointer to a PortInfo attribute.
4772 *
4773 * RETURN VALUES
4774 *	Returns the encoded value for the port physical state.
4775 *
4776 * NOTES
4777 *
4778 * SEE ALSO
4779 *********/
4780 
4781 /****f* IBA Base: Types/ib_port_info_set_port_phys_state
4782 * NAME
4783 *	ib_port_info_set_port_phys_state
4784 *
4785 * DESCRIPTION
4786 *	Given an integer of the port physical state,
4787 *	Set the appropriate bits in state_info2
4788 *
4789 * SYNOPSIS
4790 */
4791 static inline void OSM_API
ib_port_info_set_port_phys_state(IN uint8_t const phys_state,IN ib_port_info_t * p_pi)4792 ib_port_info_set_port_phys_state(IN uint8_t const phys_state,
4793 				 IN ib_port_info_t * p_pi)
4794 {
4795 	p_pi->state_info2 =
4796 	    (~IB_PORT_PHYS_STATE_MASK & p_pi->state_info2) |
4797 	    (IB_PORT_PHYS_STATE_MASK &
4798 	     (phys_state << IB_PORT_PHYS_STATE_SHIFT));
4799 }
4800 
4801 /*
4802 * PARAMETERS
4803 *	phys_state
4804 *		[in] port physical state.
4805 *
4806 *	p_pi
4807 *		[in] Pointer to a PortInfo attribute.
4808 *
4809 * RETURN VALUES
4810 *	This function does not return a value.
4811 *
4812 * NOTES
4813 *
4814 * SEE ALSO
4815 *********/
4816 
4817 /****f* IBA Base: Types/ib_port_info_get_link_down_def_state
4818 * NAME
4819 *	ib_port_info_get_link_down_def_state
4820 *
4821 * DESCRIPTION
4822 *	Returns the link down default state.
4823 *
4824 * SYNOPSIS
4825 */
4826 static inline uint8_t OSM_API
ib_port_info_get_link_down_def_state(IN const ib_port_info_t * const p_pi)4827 ib_port_info_get_link_down_def_state(IN const ib_port_info_t * const p_pi)
4828 {
4829 	return ((uint8_t) (p_pi->state_info2 & IB_PORT_LNKDWNDFTSTATE_MASK));
4830 }
4831 
4832 /*
4833 * PARAMETERS
4834 *	p_pi
4835 *		[in] Pointer to a PortInfo attribute.
4836 *
4837 * RETURN VALUES
4838 *	link down default state of the port.
4839 *
4840 * NOTES
4841 *
4842 * SEE ALSO
4843 *********/
4844 
4845 /****f* IBA Base: Types/ib_port_info_set_link_down_def_state
4846 * NAME
4847 *	ib_port_info_set_link_down_def_state
4848 *
4849 * DESCRIPTION
4850 *	Sets the link down default state of the port.
4851 *
4852 * SYNOPSIS
4853 */
4854 static inline void OSM_API
ib_port_info_set_link_down_def_state(IN ib_port_info_t * const p_pi,IN const uint8_t link_dwn_state)4855 ib_port_info_set_link_down_def_state(IN ib_port_info_t * const p_pi,
4856 				     IN const uint8_t link_dwn_state)
4857 {
4858 	p_pi->state_info2 =
4859 	    (uint8_t) ((p_pi->state_info2 & 0xF0) | link_dwn_state);
4860 }
4861 
4862 /*
4863 * PARAMETERS
4864 *	p_pi
4865 *		[in] Pointer to a PortInfo attribute.
4866 *
4867 *	link_dwn_state
4868 *		[in] Link down default state of the port.
4869 *
4870 * RETURN VALUES
4871 *	None.
4872 *
4873 * NOTES
4874 *
4875 * SEE ALSO
4876 *********/
4877 
4878 /****f* IBA Base: Types/ib_port_info_get_link_speed_active
4879 * NAME
4880 *	ib_port_info_get_link_speed_active
4881 *
4882 * DESCRIPTION
4883 *	Returns the Link Speed Active value assigned to this port.
4884 *
4885 * SYNOPSIS
4886 */
4887 static inline uint8_t OSM_API
ib_port_info_get_link_speed_active(IN const ib_port_info_t * const p_pi)4888 ib_port_info_get_link_speed_active(IN const ib_port_info_t * const p_pi)
4889 {
4890 	return ((uint8_t) ((p_pi->link_speed &
4891 			    IB_PORT_LINK_SPEED_ACTIVE_MASK) >>
4892 			   IB_PORT_LINK_SPEED_SHIFT));
4893 }
4894 
4895 /*
4896 * PARAMETERS
4897 *	p_pi
4898 *		[in] Pointer to a PortInfo attribute.
4899 *
4900 * RETURN VALUES
4901 *	Returns the link speed active value assigned to this port.
4902 *
4903 * NOTES
4904 *
4905 * SEE ALSO
4906 *********/
4907 
4908 #define IB_LINK_WIDTH_ACTIVE_1X			1
4909 #define IB_LINK_WIDTH_ACTIVE_4X			2
4910 #define IB_LINK_WIDTH_ACTIVE_8X			4
4911 #define IB_LINK_WIDTH_ACTIVE_12X 		8
4912 #define IB_LINK_SPEED_ACTIVE_2_5		1
4913 #define IB_LINK_SPEED_ACTIVE_5			2
4914 #define IB_LINK_SPEED_ACTIVE_10			4
4915 
4916 /* following v1 ver1.2 p901 */
4917 #define IB_PATH_RECORD_RATE_2_5_GBS		2
4918 #define IB_PATH_RECORD_RATE_10_GBS		3
4919 #define IB_PATH_RECORD_RATE_30_GBS		4
4920 #define IB_PATH_RECORD_RATE_5_GBS		5
4921 #define IB_PATH_RECORD_RATE_20_GBS		6
4922 #define IB_PATH_RECORD_RATE_40_GBS		7
4923 #define IB_PATH_RECORD_RATE_60_GBS		8
4924 #define IB_PATH_RECORD_RATE_80_GBS		9
4925 #define IB_PATH_RECORD_RATE_120_GBS		10
4926 
4927 #define IB_MIN_RATE    IB_PATH_RECORD_RATE_2_5_GBS
4928 #define IB_MAX_RATE    IB_PATH_RECORD_RATE_120_GBS
4929 
4930 /****f* IBA Base: Types/ib_port_info_compute_rate
4931 * NAME
4932 *	ib_port_info_compute_rate
4933 *
4934 * DESCRIPTION
4935 *	Returns the encoded value for the path rate.
4936 *
4937 * SYNOPSIS
4938 */
4939 static inline uint8_t OSM_API
ib_port_info_compute_rate(IN const ib_port_info_t * const p_pi)4940 ib_port_info_compute_rate(IN const ib_port_info_t * const p_pi)
4941 {
4942 	uint8_t rate = 0;
4943 
4944 	switch (ib_port_info_get_link_speed_active(p_pi)) {
4945 	case IB_LINK_SPEED_ACTIVE_2_5:
4946 		switch (p_pi->link_width_active) {
4947 		case IB_LINK_WIDTH_ACTIVE_1X:
4948 			rate = IB_PATH_RECORD_RATE_2_5_GBS;
4949 			break;
4950 
4951 		case IB_LINK_WIDTH_ACTIVE_4X:
4952 			rate = IB_PATH_RECORD_RATE_10_GBS;
4953 			break;
4954 
4955 		case IB_LINK_WIDTH_ACTIVE_8X:
4956 			rate = IB_PATH_RECORD_RATE_20_GBS;
4957 			break;
4958 
4959 		case IB_LINK_WIDTH_ACTIVE_12X:
4960 			rate = IB_PATH_RECORD_RATE_30_GBS;
4961 			break;
4962 
4963 		default:
4964 			rate = IB_PATH_RECORD_RATE_2_5_GBS;
4965 			break;
4966 		}
4967 		break;
4968 	case IB_LINK_SPEED_ACTIVE_5:
4969 		switch (p_pi->link_width_active) {
4970 		case IB_LINK_WIDTH_ACTIVE_1X:
4971 			rate = IB_PATH_RECORD_RATE_5_GBS;
4972 			break;
4973 
4974 		case IB_LINK_WIDTH_ACTIVE_4X:
4975 			rate = IB_PATH_RECORD_RATE_20_GBS;
4976 			break;
4977 
4978 		case IB_LINK_WIDTH_ACTIVE_8X:
4979 			rate = IB_PATH_RECORD_RATE_40_GBS;
4980 			break;
4981 
4982 		case IB_LINK_WIDTH_ACTIVE_12X:
4983 			rate = IB_PATH_RECORD_RATE_60_GBS;
4984 			break;
4985 
4986 		default:
4987 			rate = IB_PATH_RECORD_RATE_5_GBS;
4988 			break;
4989 		}
4990 		break;
4991 	case IB_LINK_SPEED_ACTIVE_10:
4992 		switch (p_pi->link_width_active) {
4993 		case IB_LINK_WIDTH_ACTIVE_1X:
4994 			rate = IB_PATH_RECORD_RATE_10_GBS;
4995 			break;
4996 
4997 		case IB_LINK_WIDTH_ACTIVE_4X:
4998 			rate = IB_PATH_RECORD_RATE_40_GBS;
4999 			break;
5000 
5001 		case IB_LINK_WIDTH_ACTIVE_8X:
5002 			rate = IB_PATH_RECORD_RATE_80_GBS;
5003 			break;
5004 
5005 		case IB_LINK_WIDTH_ACTIVE_12X:
5006 			rate = IB_PATH_RECORD_RATE_120_GBS;
5007 			break;
5008 
5009 		default:
5010 			rate = IB_PATH_RECORD_RATE_10_GBS;
5011 			break;
5012 		}
5013 		break;
5014 	default:
5015 		rate = IB_PATH_RECORD_RATE_2_5_GBS;
5016 		break;
5017 	}
5018 
5019 	return rate;
5020 }
5021 
5022 /*
5023 * PARAMETERS
5024 *	p_pi
5025 *		[in] Pointer to a PortInfo attribute.
5026 *
5027 * RETURN VALUES
5028 *	Returns the encoded value for the link speed supported.
5029 *
5030 * NOTES
5031 *
5032 * SEE ALSO
5033 *********/
5034 
5035 /****f* IBA Base: Types/ib_path_get_ipd
5036 * NAME
5037 *	ib_path_get_ipd
5038 *
5039 * DESCRIPTION
5040 *	Returns the encoded value for the inter packet delay.
5041 *
5042 * SYNOPSIS
5043 */
5044 static inline uint8_t OSM_API
ib_path_get_ipd(IN uint8_t local_link_width_supported,IN uint8_t path_rec_rate)5045 ib_path_get_ipd(IN uint8_t local_link_width_supported, IN uint8_t path_rec_rate)
5046 {
5047 	uint8_t ipd = 0;
5048 
5049 	switch (local_link_width_supported) {
5050 		/* link_width_supported = 1: 1x */
5051 	case 1:
5052 		break;
5053 
5054 		/* link_width_supported = 3: 1x or 4x */
5055 	case 3:
5056 		switch (path_rec_rate & 0x3F) {
5057 		case IB_PATH_RECORD_RATE_2_5_GBS:
5058 			ipd = 3;
5059 			break;
5060 		default:
5061 			break;
5062 		}
5063 		break;
5064 
5065 		/* link_width_supported = 11: 1x or 4x or 12x */
5066 	case 11:
5067 		switch (path_rec_rate & 0x3F) {
5068 		case IB_PATH_RECORD_RATE_2_5_GBS:
5069 			ipd = 11;
5070 			break;
5071 		case IB_PATH_RECORD_RATE_10_GBS:
5072 			ipd = 2;
5073 			break;
5074 		default:
5075 			break;
5076 		}
5077 		break;
5078 
5079 	default:
5080 		break;
5081 	}
5082 
5083 	return ipd;
5084 }
5085 
5086 /*
5087 * PARAMETERS
5088 *	local_link_width_supported
5089 *		[in] link with supported for this port
5090 *
5091 *	path_rec_rate
5092 *		[in] rate field of the path record
5093 *
5094 * RETURN VALUES
5095 *	Returns the ipd
5096 *
5097 * NOTES
5098 *
5099 * SEE ALSO
5100 *********/
5101 
5102 /****f* IBA Base: Types/ib_port_info_get_mtu_cap
5103 * NAME
5104 *	ib_port_info_get_mtu_cap
5105 *
5106 * DESCRIPTION
5107 *	Returns the encoded value for the maximum MTU supported by this port.
5108 *
5109 * SYNOPSIS
5110 */
5111 static inline uint8_t OSM_API
ib_port_info_get_mtu_cap(IN const ib_port_info_t * const p_pi)5112 ib_port_info_get_mtu_cap(IN const ib_port_info_t * const p_pi)
5113 {
5114 	return ((uint8_t) (p_pi->mtu_cap & 0x0F));
5115 }
5116 
5117 /*
5118 * PARAMETERS
5119 *	p_pi
5120 *		[in] Pointer to a PortInfo attribute.
5121 *
5122 * RETURN VALUES
5123 *	Returns the encooded value for the maximum MTU supported by this port.
5124 *
5125 * NOTES
5126 *
5127 * SEE ALSO
5128 *********/
5129 
5130 /****f* IBA Base: Types/ib_port_info_get_neighbor_mtu
5131 * NAME
5132 *	ib_port_info_get_neighbor_mtu
5133 *
5134 * DESCRIPTION
5135 *	Returns the encoded value for the neighbor MTU supported by this port.
5136 *
5137 * SYNOPSIS
5138 */
5139 static inline uint8_t OSM_API
ib_port_info_get_neighbor_mtu(IN const ib_port_info_t * const p_pi)5140 ib_port_info_get_neighbor_mtu(IN const ib_port_info_t * const p_pi)
5141 {
5142 	return ((uint8_t) ((p_pi->mtu_smsl & 0xF0) >> 4));
5143 }
5144 
5145 /*
5146 * PARAMETERS
5147 *	p_pi
5148 *		[in] Pointer to a PortInfo attribute.
5149 *
5150 * RETURN VALUES
5151 *	Returns the encoded value for the neighbor MTU at this port.
5152 *
5153 * NOTES
5154 *
5155 * SEE ALSO
5156 *********/
5157 
5158 /****f* IBA Base: Types/ib_port_info_set_neighbor_mtu
5159 * NAME
5160 *	ib_port_info_set_neighbor_mtu
5161 *
5162 * DESCRIPTION
5163 *	Sets the Neighbor MTU value in the PortInfo attribute.
5164 *
5165 * SYNOPSIS
5166 */
5167 static inline void OSM_API
ib_port_info_set_neighbor_mtu(IN ib_port_info_t * const p_pi,IN const uint8_t mtu)5168 ib_port_info_set_neighbor_mtu(IN ib_port_info_t * const p_pi,
5169 			      IN const uint8_t mtu)
5170 {
5171 	CL_ASSERT(mtu <= 5);
5172 	CL_ASSERT(mtu != 0);
5173 	p_pi->mtu_smsl = (uint8_t) ((p_pi->mtu_smsl & 0x0F) | (mtu << 4));
5174 }
5175 
5176 /*
5177 * PARAMETERS
5178 *	p_pi
5179 *		[in] Pointer to a PortInfo attribute.
5180 *
5181 *	mtu
5182 *		[in] Encoded MTU value to set
5183 *
5184 * RETURN VALUES
5185 *	None.
5186 *
5187 * NOTES
5188 *
5189 * SEE ALSO
5190 *********/
5191 
5192 /****f* IBA Base: Types/ib_port_info_get_master_smsl
5193 * NAME
5194 *	ib_port_info_get_master_smsl
5195 *
5196 * DESCRIPTION
5197 *	Returns the encoded value for the Master SMSL at this port.
5198 *
5199 * SYNOPSIS
5200 */
5201 static inline uint8_t OSM_API
ib_port_info_get_master_smsl(IN const ib_port_info_t * const p_pi)5202 ib_port_info_get_master_smsl(IN const ib_port_info_t * const p_pi)
5203 {
5204 	return (uint8_t) (p_pi->mtu_smsl & 0x0F);
5205 }
5206 
5207 /*
5208 * PARAMETERS
5209 *	p_pi
5210 *		[in] Pointer to a PortInfo attribute.
5211 *
5212 * RETURN VALUES
5213 *	Returns the encoded value for the Master SMSL at this port.
5214 *
5215 * NOTES
5216 *
5217 * SEE ALSO
5218 *********/
5219 
5220 /****f* IBA Base: Types/ib_port_info_set_master_smsl
5221 * NAME
5222 *	ib_port_info_set_master_smsl
5223 *
5224 * DESCRIPTION
5225 *	Sets the Master SMSL value in the PortInfo attribute.
5226 *
5227 * SYNOPSIS
5228 */
5229 static inline void OSM_API
ib_port_info_set_master_smsl(IN ib_port_info_t * const p_pi,IN const uint8_t smsl)5230 ib_port_info_set_master_smsl(IN ib_port_info_t * const p_pi,
5231 			     IN const uint8_t smsl)
5232 {
5233 	p_pi->mtu_smsl = (uint8_t) ((p_pi->mtu_smsl & 0xF0) | smsl);
5234 }
5235 
5236 /*
5237 * PARAMETERS
5238 *	p_pi
5239 *		[in] Pointer to a PortInfo attribute.
5240 *
5241 *	mtu
5242 *		[in] Encoded Master SMSL value to set
5243 *
5244 * RETURN VALUES
5245 *	None.
5246 *
5247 * NOTES
5248 *
5249 * SEE ALSO
5250 *********/
5251 
5252 /****f* IBA Base: Types/ib_port_info_set_timeout
5253 * NAME
5254 *	ib_port_info_set_timeout
5255 *
5256 * DESCRIPTION
5257 *	Sets the encoded subnet timeout value in the PortInfo attribute.
5258 *
5259 * SYNOPSIS
5260 */
5261 static inline void OSM_API
ib_port_info_set_timeout(IN ib_port_info_t * const p_pi,IN const uint8_t timeout)5262 ib_port_info_set_timeout(IN ib_port_info_t * const p_pi,
5263 			 IN const uint8_t timeout)
5264 {
5265 	CL_ASSERT(timeout <= 0x1F);
5266 	p_pi->subnet_timeout =
5267 	    (uint8_t) ((p_pi->subnet_timeout & 0x80) | (timeout & 0x1F));
5268 }
5269 
5270 /*
5271 * PARAMETERS
5272 *	p_pi
5273 *		[in] Pointer to a PortInfo attribute.
5274 *
5275 *	timeout
5276 *		[in] Encoded timeout value to set
5277 *
5278 * RETURN VALUES
5279 *	None.
5280 *
5281 * NOTES
5282 *
5283 * SEE ALSO
5284 *********/
5285 
5286 /****f* IBA Base: Types/ib_port_info_set_client_rereg
5287 * NAME
5288 *	ib_port_info_set_client_rereg
5289 *
5290 * DESCRIPTION
5291 *	Sets the encoded client reregistration bit value in the PortInfo attribute.
5292 *
5293 * SYNOPSIS
5294 */
5295 static inline void OSM_API
ib_port_info_set_client_rereg(IN ib_port_info_t * const p_pi,IN const uint8_t client_rereg)5296 ib_port_info_set_client_rereg(IN ib_port_info_t * const p_pi,
5297 			      IN const uint8_t client_rereg)
5298 {
5299 	CL_ASSERT(client_rereg <= 0x1);
5300 	p_pi->subnet_timeout =
5301 	    (uint8_t) ((p_pi->
5302 			subnet_timeout & 0x1F) | ((client_rereg << 7) & 0x80));
5303 }
5304 
5305 /*
5306 * PARAMETERS
5307 *	p_pi
5308 *		[in] Pointer to a PortInfo attribute.
5309 *
5310 *	client_rereg
5311 *		[in] Client reregistration value to set (either 1 or 0).
5312 *
5313 * RETURN VALUES
5314 *	None.
5315 *
5316 * NOTES
5317 *
5318 * SEE ALSO
5319 *********/
5320 
5321 /****f* IBA Base: Types/ib_port_info_get_timeout
5322 * NAME
5323 *	ib_port_info_get_timeout
5324 *
5325 * DESCRIPTION
5326 *	Gets the encoded subnet timeout value in the PortInfo attribute.
5327 *
5328 * SYNOPSIS
5329 */
5330 static inline uint8_t OSM_API
ib_port_info_get_timeout(IN ib_port_info_t const * p_pi)5331 ib_port_info_get_timeout(IN ib_port_info_t const *p_pi)
5332 {
5333 	return (p_pi->subnet_timeout & 0x1F);
5334 }
5335 
5336 /*
5337 * PARAMETERS
5338 *	p_pi
5339 *		[in] Pointer to a PortInfo attribute.
5340 *
5341 * RETURN VALUES
5342 *	The encoded timeout value
5343 *
5344 * NOTES
5345 *
5346 * SEE ALSO
5347 *********/
5348 
5349 /****f* IBA Base: Types/ib_port_info_get_client_rereg
5350 * NAME
5351 *	ib_port_info_get_client_rereg
5352 *
5353 * DESCRIPTION
5354 *	Gets the encoded client reregistration bit value in the PortInfo attribute.
5355 *
5356 * SYNOPSIS
5357 */
5358 static inline uint8_t OSM_API
ib_port_info_get_client_rereg(IN ib_port_info_t const * p_pi)5359 ib_port_info_get_client_rereg(IN ib_port_info_t const *p_pi)
5360 {
5361 	return ((p_pi->subnet_timeout & 0x80) >> 7);
5362 }
5363 
5364 /*
5365 * PARAMETERS
5366 *	p_pi
5367 *		[in] Pointer to a PortInfo attribute.
5368 *
5369 * RETURN VALUES
5370 *	Client reregistration value (either 1 or 0).
5371 *
5372 * NOTES
5373 *
5374 * SEE ALSO
5375 *********/
5376 
5377 /****f* IBA Base: Types/ib_port_info_set_hoq_lifetime
5378 * NAME
5379 *	ib_port_info_set_hoq_lifetime
5380 *
5381 * DESCRIPTION
5382 *	Sets the Head of Queue Lifetime for which a packet can live in the head
5383 *  of VL queue
5384 *
5385 * SYNOPSIS
5386 */
5387 static inline void OSM_API
ib_port_info_set_hoq_lifetime(IN ib_port_info_t * const p_pi,IN const uint8_t hoq_life)5388 ib_port_info_set_hoq_lifetime(IN ib_port_info_t * const p_pi,
5389 			      IN const uint8_t hoq_life)
5390 {
5391 	p_pi->vl_stall_life = (uint8_t) ((hoq_life & 0x1f) |
5392 					 (p_pi->vl_stall_life & 0xe0));
5393 }
5394 
5395 /*
5396 * PARAMETERS
5397 *	p_pi
5398 *		[in] Pointer to a PortInfo attribute.
5399 *
5400 *	hoq_life
5401 *		[in] Encoded lifetime value to set
5402 *
5403 * RETURN VALUES
5404 *	None.
5405 *
5406 * NOTES
5407 *
5408 * SEE ALSO
5409 *********/
5410 
5411 /****f* IBA Base: Types/ib_port_info_get_hoq_lifetime
5412 * NAME
5413 *	ib_port_info_get_hoq_lifetime
5414 *
5415 * DESCRIPTION
5416 *	Gets the Head of Queue Lifetime for which a packet can live in the head
5417 *  of VL queue
5418 *
5419 * SYNOPSIS
5420 */
5421 static inline uint8_t OSM_API
ib_port_info_get_hoq_lifetime(IN const ib_port_info_t * const p_pi)5422 ib_port_info_get_hoq_lifetime(IN const ib_port_info_t * const p_pi)
5423 {
5424 	return ((uint8_t) (p_pi->vl_stall_life & 0x1f));
5425 }
5426 
5427 /*
5428 * PARAMETERS
5429 *	p_pi
5430 *		[in] Pointer to a PortInfo attribute.
5431 *
5432 * RETURN VALUES
5433 *     Encoded lifetime value
5434 *
5435 * NOTES
5436 *
5437 * SEE ALSO
5438 *********/
5439 
5440 /****f* IBA Base: Types/ib_port_info_set_vl_stall_count
5441 * NAME
5442 *	ib_port_info_set_vl_stall_count
5443 *
5444 * DESCRIPTION
5445 *	Sets the VL Stall Count which define the number of contiguous
5446 *  HLL (hoq) drops that will put the VL into stalled mode.
5447 *
5448 * SYNOPSIS
5449 */
5450 static inline void OSM_API
ib_port_info_set_vl_stall_count(IN ib_port_info_t * const p_pi,IN const uint8_t vl_stall_count)5451 ib_port_info_set_vl_stall_count(IN ib_port_info_t * const p_pi,
5452 				IN const uint8_t vl_stall_count)
5453 {
5454 	p_pi->vl_stall_life = (uint8_t) ((p_pi->vl_stall_life & 0x1f) |
5455 					 ((vl_stall_count << 5) & 0xe0));
5456 }
5457 
5458 /*
5459 * PARAMETERS
5460 *	p_pi
5461 *		[in] Pointer to a PortInfo attribute.
5462 *
5463 *	vl_stall_count
5464 *		[in] value to set
5465 *
5466 * RETURN VALUES
5467 *	None.
5468 *
5469 * NOTES
5470 *
5471 * SEE ALSO
5472 *********/
5473 
5474 /****f* IBA Base: Types/ib_port_info_get_vl_stall_count
5475 * NAME
5476 *	ib_port_info_get_vl_stall_count
5477 *
5478 * DESCRIPTION
5479 *	Gets the VL Stall Count which define the number of contiguous
5480 *  HLL (hoq) drops that will put the VL into stalled mode
5481 *
5482 * SYNOPSIS
5483 */
5484 static inline uint8_t OSM_API
ib_port_info_get_vl_stall_count(IN const ib_port_info_t * const p_pi)5485 ib_port_info_get_vl_stall_count(IN const ib_port_info_t * const p_pi)
5486 {
5487 	return ((uint8_t) (p_pi->vl_stall_life & 0xe0) >> 5);
5488 }
5489 
5490 /*
5491 * PARAMETERS
5492 *	p_pi
5493 *		[in] Pointer to a PortInfo attribute.
5494 *
5495 * RETURN VALUES
5496 *     vl stall count
5497 *
5498 * NOTES
5499 *
5500 * SEE ALSO
5501 *********/
5502 
5503 /****f* IBA Base: Types/ib_port_info_get_lmc
5504 * NAME
5505 *	ib_port_info_get_lmc
5506 *
5507 * DESCRIPTION
5508 *	Returns the LMC value assigned to this port.
5509 *
5510 * SYNOPSIS
5511 */
5512 static inline uint8_t OSM_API
ib_port_info_get_lmc(IN const ib_port_info_t * const p_pi)5513 ib_port_info_get_lmc(IN const ib_port_info_t * const p_pi)
5514 {
5515 	return ((uint8_t) (p_pi->mkey_lmc & IB_PORT_LMC_MASK));
5516 }
5517 
5518 /*
5519 * PARAMETERS
5520 *	p_pi
5521 *		[in] Pointer to a PortInfo attribute.
5522 *
5523 * RETURN VALUES
5524 *	Returns the LMC value assigned to this port.
5525 *
5526 * NOTES
5527 *
5528 * SEE ALSO
5529 *********/
5530 
5531 /****f* IBA Base: Types/ib_port_info_set_lmc
5532 * NAME
5533 *	ib_port_info_set_lmc
5534 *
5535 * DESCRIPTION
5536 *	Sets the LMC value in the PortInfo attribute.
5537 *
5538 * SYNOPSIS
5539 */
5540 static inline void OSM_API
ib_port_info_set_lmc(IN ib_port_info_t * const p_pi,IN const uint8_t lmc)5541 ib_port_info_set_lmc(IN ib_port_info_t * const p_pi, IN const uint8_t lmc)
5542 {
5543 	CL_ASSERT(lmc <= IB_PORT_LMC_MAX);
5544 	p_pi->mkey_lmc = (uint8_t) ((p_pi->mkey_lmc & 0xF8) | lmc);
5545 }
5546 
5547 /*
5548 * PARAMETERS
5549 *	p_pi
5550 *		[in] Pointer to a PortInfo attribute.
5551 *
5552 *	lmc
5553 *		[in] LMC value to set, must be less than 7.
5554 *
5555 * RETURN VALUES
5556 *	None.
5557 *
5558 * NOTES
5559 *
5560 * SEE ALSO
5561 *********/
5562 
5563 /****f* IBA Base: Types/ib_port_info_get_link_speed_enabled
5564 * NAME
5565 *	ib_port_info_get_link_speed_enabled
5566 *
5567 * DESCRIPTION
5568 *	Returns the link speed enabled value assigned to this port.
5569 *
5570 * SYNOPSIS
5571 */
5572 static inline uint8_t OSM_API
ib_port_info_get_link_speed_enabled(IN const ib_port_info_t * const p_pi)5573 ib_port_info_get_link_speed_enabled(IN const ib_port_info_t * const p_pi)
5574 {
5575 	return ((uint8_t) (p_pi->link_speed & IB_PORT_LINK_SPEED_ENABLED_MASK));
5576 }
5577 
5578 /*
5579 * PARAMETERS
5580 *	p_pi
5581 *		[in] Pointer to a PortInfo attribute.
5582 *
5583 * RETURN VALUES
5584 *	Port state.
5585 *
5586 * NOTES
5587 *
5588 * SEE ALSO
5589 *********/
5590 
5591 /****f* IBA Base: Types/ib_port_info_set_link_speed_enabled
5592 * NAME
5593 *	ib_port_info_set_link_speed_enabled
5594 *
5595 * DESCRIPTION
5596 *	Sets the link speed enabled value in the PortInfo attribute.
5597 *
5598 * SYNOPSIS
5599 */
5600 static inline void OSM_API
ib_port_info_set_link_speed_enabled(IN ib_port_info_t * const p_pi,IN const uint8_t link_speed_enabled)5601 ib_port_info_set_link_speed_enabled(IN ib_port_info_t * const p_pi,
5602 				    IN const uint8_t link_speed_enabled)
5603 {
5604 	p_pi->link_speed =
5605 	    (uint8_t) ((p_pi->link_speed & 0xF0) | link_speed_enabled);
5606 }
5607 
5608 /*
5609 * PARAMETERS
5610 *	p_pi
5611 *		[in] Pointer to a PortInfo attribute.
5612 *
5613 *	link_speed_enabled
5614 *		[in] link speed enabled value to set.
5615 *
5616 * RETURN VALUES
5617 *	None.
5618 *
5619 * NOTES
5620 *
5621 * SEE ALSO
5622 *********/
5623 
5624 /****f* IBA Base: Types/ib_port_info_get_mpb
5625 * NAME
5626 *	ib_port_info_get_mpb
5627 *
5628 * DESCRIPTION
5629 *	Returns the M_Key protect bits assigned to this port.
5630 *
5631 * SYNOPSIS
5632 */
5633 static inline uint8_t OSM_API
ib_port_info_get_mpb(IN const ib_port_info_t * const p_pi)5634 ib_port_info_get_mpb(IN const ib_port_info_t * const p_pi)
5635 {
5636 	return ((uint8_t) ((p_pi->mkey_lmc & IB_PORT_MPB_MASK) >>
5637 			   IB_PORT_MPB_SHIFT));
5638 }
5639 
5640 /*
5641 * PARAMETERS
5642 *	p_ni
5643 *		[in] Pointer to a PortInfo attribute.
5644 *
5645 * RETURN VALUES
5646 *	Returns the M_Key protect bits assigned to this port.
5647 *
5648 * NOTES
5649 *
5650 * SEE ALSO
5651 *********/
5652 
5653 /****f* IBA Base: Types/ib_port_info_set_mpb
5654 * NAME
5655 *	ib_port_info_set_mpb
5656 *
5657 * DESCRIPTION
5658 *	Set the M_Key protect bits of this port.
5659 *
5660 * SYNOPSIS
5661 */
5662 static inline void OSM_API
ib_port_info_set_mpb(IN ib_port_info_t * p_pi,IN uint8_t mpb)5663 ib_port_info_set_mpb(IN ib_port_info_t * p_pi, IN uint8_t mpb)
5664 {
5665 	p_pi->mkey_lmc =
5666 	    (~IB_PORT_MPB_MASK & p_pi->mkey_lmc) |
5667 	    (IB_PORT_MPB_MASK & (mpb << IB_PORT_MPB_SHIFT));
5668 }
5669 
5670 /*
5671 * PARAMETERS
5672 *	mpb
5673 *		[in] M_Key protect bits
5674 *	p_ni
5675 *		[in] Pointer to a PortInfo attribute.
5676 *
5677 * RETURN VALUES
5678 *
5679 * NOTES
5680 *
5681 * SEE ALSO
5682 *********/
5683 
5684 /****f* IBA Base: Types/ib_port_info_get_local_phy_err_thd
5685 * NAME
5686 *	ib_port_info_get_local_phy_err_thd
5687 *
5688 * DESCRIPTION
5689 *	Returns the Phy Link Threshold
5690 *
5691 * SYNOPSIS
5692 */
5693 static inline uint8_t OSM_API
ib_port_info_get_local_phy_err_thd(IN const ib_port_info_t * const p_pi)5694 ib_port_info_get_local_phy_err_thd(IN const ib_port_info_t * const p_pi)
5695 {
5696 	return (uint8_t) ((p_pi->error_threshold & 0xF0) >> 4);
5697 }
5698 
5699 /*
5700 * PARAMETERS
5701 *	p_pi
5702 *		[in] Pointer to a PortInfo attribute.
5703 *
5704 * RETURN VALUES
5705 *	Returns the Phy Link error threshold assigned to this port.
5706 *
5707 * NOTES
5708 *
5709 * SEE ALSO
5710 *********/
5711 
5712 /****f* IBA Base: Types/ib_port_info_get_overrun_err_thd
5713 * NAME
5714 *	ib_port_info_get_local_overrun_err_thd
5715 *
5716 * DESCRIPTION
5717 *	Returns the Credits Overrun Errors Threshold
5718 *
5719 * SYNOPSIS
5720 */
5721 static inline uint8_t OSM_API
ib_port_info_get_overrun_err_thd(IN const ib_port_info_t * const p_pi)5722 ib_port_info_get_overrun_err_thd(IN const ib_port_info_t * const p_pi)
5723 {
5724 	return (uint8_t) (p_pi->error_threshold & 0x0F);
5725 }
5726 
5727 /*
5728 * PARAMETERS
5729 *	p_pi
5730 *		[in] Pointer to a PortInfo attribute.
5731 *
5732 * RETURN VALUES
5733 *	Returns the Credits Overrun errors threshold assigned to this port.
5734 *
5735 * NOTES
5736 *
5737 * SEE ALSO
5738 *********/
5739 
5740 /****f* IBA Base: Types/ib_port_info_set_phy_and_overrun_err_thd
5741 * NAME
5742 *	ib_port_info_set_phy_and_overrun_err_thd
5743 *
5744 * DESCRIPTION
5745 *	Sets the Phy Link and Credits Overrun Errors Threshold
5746 *
5747 * SYNOPSIS
5748 */
5749 static inline void OSM_API
ib_port_info_set_phy_and_overrun_err_thd(IN ib_port_info_t * const p_pi,IN uint8_t phy_threshold,IN uint8_t overrun_threshold)5750 ib_port_info_set_phy_and_overrun_err_thd(IN ib_port_info_t * const p_pi,
5751 					 IN uint8_t phy_threshold,
5752 					 IN uint8_t overrun_threshold)
5753 {
5754 	p_pi->error_threshold =
5755 	    (uint8_t) (((phy_threshold & 0x0F) << 4) |
5756 		       (overrun_threshold & 0x0F));
5757 }
5758 
5759 /*
5760 * PARAMETERS
5761 *	p_pi
5762 *		[in] Pointer to a PortInfo attribute.
5763 *
5764 *	phy_threshold
5765 *		[in] Physical Link Errors Threshold above which Trap 129 is generated
5766 *
5767 *  overrun_threshold
5768 *     [in] Credits overrun Errors Threshold above which Trap 129 is generated
5769 *
5770 * RETURN VALUES
5771 *	None.
5772 *
5773 * NOTES
5774 *
5775 * SEE ALSO
5776 *********/
5777 
5778 typedef uint8_t ib_svc_name_t[64];
5779 
5780 #include <complib/cl_packon.h>
5781 typedef struct _ib_service_record {
5782 	ib_net64_t service_id;
5783 	ib_gid_t service_gid;
5784 	ib_net16_t service_pkey;
5785 	ib_net16_t resv;
5786 	ib_net32_t service_lease;
5787 	uint8_t service_key[16];
5788 	ib_svc_name_t service_name;
5789 	uint8_t service_data8[16];
5790 	ib_net16_t service_data16[8];
5791 	ib_net32_t service_data32[4];
5792 	ib_net64_t service_data64[2];
5793 
5794 } PACK_SUFFIX ib_service_record_t;
5795 #include <complib/cl_packoff.h>
5796 
5797 #include <complib/cl_packon.h>
5798 typedef struct _ib_portinfo_record {
5799 	ib_net16_t lid;
5800 	uint8_t port_num;
5801 	uint8_t resv;
5802 	ib_port_info_t port_info;
5803 	uint8_t pad[6];
5804 
5805 } PACK_SUFFIX ib_portinfo_record_t;
5806 #include <complib/cl_packoff.h>
5807 
5808 #include <complib/cl_packon.h>
5809 typedef struct _ib_link_record {
5810 	ib_net16_t from_lid;
5811 	uint8_t from_port_num;
5812 	uint8_t to_port_num;
5813 	ib_net16_t to_lid;
5814 	uint8_t pad[2];
5815 
5816 } PACK_SUFFIX ib_link_record_t;
5817 #include <complib/cl_packoff.h>
5818 
5819 #include <complib/cl_packon.h>
5820 typedef struct _ib_sminfo_record {
5821 	ib_net16_t lid;
5822 	uint16_t resv0;
5823 	ib_sm_info_t sm_info;
5824 	uint8_t pad[7];
5825 
5826 } PACK_SUFFIX ib_sminfo_record_t;
5827 #include <complib/cl_packoff.h>
5828 
5829 /****s* IBA Base: Types/ib_lft_record_t
5830 * NAME
5831 *	ib_lft_record_t
5832 *
5833 * DESCRIPTION
5834 *	IBA defined LinearForwardingTableRecord (15.2.5.6)
5835 *
5836 * SYNOPSIS
5837 */
5838 #include <complib/cl_packon.h>
5839 typedef struct _ib_lft_record {
5840 	ib_net16_t lid;
5841 	ib_net16_t block_num;
5842 	uint32_t resv0;
5843 	uint8_t lft[64];
5844 } PACK_SUFFIX ib_lft_record_t;
5845 #include <complib/cl_packoff.h>
5846 /************/
5847 
5848 /****s* IBA Base: Types/ib_mft_record_t
5849 * NAME
5850 *	ib_mft_record_t
5851 *
5852 * DESCRIPTION
5853 *	IBA defined MulticastForwardingTableRecord (15.2.5.8)
5854 *
5855 * SYNOPSIS
5856 */
5857 #include <complib/cl_packon.h>
5858 typedef struct _ib_mft_record {
5859 	ib_net16_t lid;
5860 	ib_net16_t position_block_num;
5861 	uint32_t resv0;
5862 	ib_net16_t mft[IB_MCAST_BLOCK_SIZE];
5863 } PACK_SUFFIX ib_mft_record_t;
5864 #include <complib/cl_packoff.h>
5865 /************/
5866 
5867 /****s* IBA Base: Types/ib_switch_info_t
5868 * NAME
5869 *	ib_switch_info_t
5870 *
5871 * DESCRIPTION
5872 *	IBA defined SwitchInfo. (14.2.5.4)
5873 *
5874 * SYNOPSIS
5875 */
5876 #include <complib/cl_packon.h>
5877 typedef struct _ib_switch_info {
5878 	ib_net16_t lin_cap;
5879 	ib_net16_t rand_cap;
5880 	ib_net16_t mcast_cap;
5881 	ib_net16_t lin_top;
5882 	uint8_t def_port;
5883 	uint8_t def_mcast_pri_port;
5884 	uint8_t def_mcast_not_port;
5885 	uint8_t life_state;
5886 	ib_net16_t lids_per_port;
5887 	ib_net16_t enforce_cap;
5888 	uint8_t flags;
5889 
5890 } PACK_SUFFIX ib_switch_info_t;
5891 #include <complib/cl_packoff.h>
5892 /************/
5893 
5894 #include <complib/cl_packon.h>
5895 typedef struct _ib_switch_info_record {
5896 	ib_net16_t lid;
5897 	uint16_t resv0;
5898 	ib_switch_info_t switch_info;
5899 	uint8_t pad[3];
5900 
5901 } PACK_SUFFIX ib_switch_info_record_t;
5902 #include <complib/cl_packoff.h>
5903 
5904 #define IB_SWITCH_PSC 0x04
5905 
5906 /****f* IBA Base: Types/ib_switch_info_get_state_change
5907 * NAME
5908 *	ib_switch_info_get_state_change
5909 *
5910 * DESCRIPTION
5911 *	Returns the value of the state change flag.
5912 *
5913 * SYNOPSIS
5914 */
5915 static inline boolean_t OSM_API
ib_switch_info_get_state_change(IN const ib_switch_info_t * const p_si)5916 ib_switch_info_get_state_change(IN const ib_switch_info_t * const p_si)
5917 {
5918 	return ((p_si->life_state & IB_SWITCH_PSC) == IB_SWITCH_PSC);
5919 }
5920 
5921 /*
5922 * PARAMETERS
5923 *	p_si
5924 *		[in] Pointer to a SwitchInfo attribute.
5925 *
5926 * RETURN VALUES
5927 *	Returns the value of the state change flag.
5928 *
5929 * NOTES
5930 *
5931 * SEE ALSO
5932 *********/
5933 
5934 /****f* IBA Base: Types/ib_switch_info_clear_state_change
5935 * NAME
5936 *	ib_switch_info_clear_state_change
5937 *
5938 * DESCRIPTION
5939 *	Clears the switch's state change bit.
5940 *
5941 * SYNOPSIS
5942 */
5943 static inline void OSM_API
ib_switch_info_clear_state_change(IN ib_switch_info_t * const p_si)5944 ib_switch_info_clear_state_change(IN ib_switch_info_t * const p_si)
5945 {
5946 	p_si->life_state = (uint8_t) (p_si->life_state & 0xFB);
5947 }
5948 
5949 /*
5950 * PARAMETERS
5951 *	p_ni
5952 *		[in] Pointer to a PortInfo attribute.
5953 *
5954 * RETURN VALUES
5955 *	Returns the LMC value assigned to this port.
5956 *
5957 * NOTES
5958 *
5959 * SEE ALSO
5960 *********/
5961 
5962 /****f* IBA Base: Types/ib_switch_info_is_enhanced_port0
5963 * NAME
5964 *	ib_switch_info_is_enhanced_port0
5965 *
5966 * DESCRIPTION
5967 *	Returns TRUE if the enhancedPort0 bit is on (meaning the switch
5968 *  port zero supports enhanced functions).
5969 *  Returns FALSE otherwise.
5970 *
5971 * SYNOPSIS
5972 */
5973 static inline boolean_t OSM_API
ib_switch_info_is_enhanced_port0(IN const ib_switch_info_t * const p_si)5974 ib_switch_info_is_enhanced_port0(IN const ib_switch_info_t * const p_si)
5975 {
5976 	return ((p_si->flags & 0x08) == 0x08);
5977 }
5978 
5979 /*
5980 * PARAMETERS
5981 *	p_si
5982 *		[in] Pointer to a SwitchInfo attribute.
5983 *
5984 * RETURN VALUES
5985 *	Returns TRUE if the switch supports enhanced port 0. FALSE otherwise.
5986 *
5987 * NOTES
5988 *
5989 * SEE ALSO
5990 *********/
5991 
5992 /****s* IBA Base: Types/ib_guid_info_t
5993 * NAME
5994 *	ib_guid_info_t
5995 *
5996 * DESCRIPTION
5997 *	IBA defined GuidInfo. (14.2.5.5)
5998 *
5999 * SYNOPSIS
6000 */
6001 #define	GUID_TABLE_MAX_ENTRIES		8
6002 
6003 #include <complib/cl_packon.h>
6004 typedef struct _ib_guid_info {
6005 	ib_net64_t guid[GUID_TABLE_MAX_ENTRIES];
6006 
6007 } PACK_SUFFIX ib_guid_info_t;
6008 #include <complib/cl_packoff.h>
6009 /************/
6010 
6011 #include <complib/cl_packon.h>
6012 typedef struct _ib_guidinfo_record {
6013 	ib_net16_t lid;
6014 	uint8_t block_num;
6015 	uint8_t resv;
6016 	uint32_t reserved;
6017 	ib_guid_info_t guid_info;
6018 } PACK_SUFFIX ib_guidinfo_record_t;
6019 #include <complib/cl_packoff.h>
6020 
6021 #define IB_MULTIPATH_MAX_GIDS 11	/* Support max that can fit into first MAD (for now) */
6022 
6023 #include <complib/cl_packon.h>
6024 typedef struct _ib_multipath_rec_t {
6025 	ib_net32_t hop_flow_raw;
6026 	uint8_t tclass;
6027 	uint8_t num_path;
6028 	ib_net16_t pkey;
6029 	ib_net16_t qos_class_sl;
6030 	uint8_t mtu;
6031 	uint8_t rate;
6032 	uint8_t pkt_life;
6033 	uint8_t service_id_8msb;
6034 	uint8_t independence;	/* formerly resv2 */
6035 	uint8_t sgid_count;
6036 	uint8_t dgid_count;
6037 	uint8_t service_id_56lsb[7];
6038 	ib_gid_t gids[IB_MULTIPATH_MAX_GIDS];
6039 } PACK_SUFFIX ib_multipath_rec_t;
6040 #include <complib/cl_packoff.h>
6041 /*
6042 * FIELDS
6043 *       hop_flow_raw
6044 *               Global routing parameters: hop count, flow label and raw bit.
6045 *
6046 *       tclass
6047 *               Another global routing parameter.
6048 *
6049 *       num_path
6050 *     Reversible path - 1 bit to say if path is reversible.
6051 *               num_path [6:0] In queries, maximum number of paths to return.
6052 *               In responses, undefined.
6053 *
6054 *       pkey
6055 *               Partition key (P_Key) to use on this path.
6056 *
6057 *       qos_class_sl
6058 *               QoS class and service level to use on this path.
6059 *
6060 *       mtu
6061 *               MTU and MTU selector fields to use on this path
6062 *       rate
6063 *               Rate and rate selector fields to use on this path.
6064 *
6065 *       pkt_life
6066 *               Packet lifetime
6067 *
6068 *	service_id_8msb
6069 *		8 most significant bits of Service ID
6070 *
6071 *	service_id_56lsb
6072 *		56 least significant bits of Service ID
6073 *
6074 *       preference
6075 *               Indicates the relative merit of this path versus other path
6076 *               records returned from the SA.  Lower numbers are better.
6077 *
6078 * SEE ALSO
6079 *********/
6080 
6081 /****f* IBA Base: Types/ib_multipath_rec_num_path
6082 * NAME
6083 *       ib_multipath_rec_num_path
6084 *
6085 * DESCRIPTION
6086 *       Get max number of paths to return.
6087 *
6088 * SYNOPSIS
6089 */
6090 static inline uint8_t OSM_API
ib_multipath_rec_num_path(IN const ib_multipath_rec_t * const p_rec)6091 ib_multipath_rec_num_path(IN const ib_multipath_rec_t * const p_rec)
6092 {
6093 	return (p_rec->num_path & 0x7F);
6094 }
6095 
6096 /*
6097 * PARAMETERS
6098 *       p_rec
6099 *               [in] Pointer to the multipath record object.
6100 *
6101 * RETURN VALUES
6102 *       Maximum number of paths to return for each unique SGID_DGID combination.
6103 *
6104 * NOTES
6105 *
6106 * SEE ALSO
6107 *       ib_multipath_rec_t
6108 *********/
6109 
6110 /****f* IBA Base: Types/ib_multipath_rec_set_sl
6111 * NAME
6112 *	ib_multipath_rec_set_sl
6113 *
6114 * DESCRIPTION
6115 *	Set path service level.
6116 *
6117 * SYNOPSIS
6118 */
6119 static inline void	OSM_API
ib_multipath_rec_set_sl(IN ib_multipath_rec_t * const p_rec,IN const uint8_t sl)6120 ib_multipath_rec_set_sl(
6121 	IN ib_multipath_rec_t* const p_rec,
6122 	IN const uint8_t sl )
6123 {
6124 	p_rec->qos_class_sl =
6125 		(p_rec->qos_class_sl & CL_HTON16(IB_MULTIPATH_REC_QOS_CLASS_MASK)) |
6126 			cl_hton16(sl & IB_MULTIPATH_REC_SL_MASK);
6127 }
6128 /*
6129 * PARAMETERS
6130 *	p_rec
6131 *		[in] Pointer to the MultiPath record object.
6132 *
6133 *	sl
6134 *		[in] Service level to set.
6135 *
6136 * RETURN VALUES
6137 *	None
6138 *
6139 * NOTES
6140 *
6141 * SEE ALSO
6142 *	ib_multipath_rec_t
6143 *********/
6144 
6145 /****f* IBA Base: Types/ib_multipath_rec_sl
6146 * NAME
6147 *       ib_multipath_rec_sl
6148 *
6149 * DESCRIPTION
6150 *       Get multipath service level.
6151 *
6152 * SYNOPSIS
6153 */
6154 static inline uint8_t OSM_API
ib_multipath_rec_sl(IN const ib_multipath_rec_t * const p_rec)6155 ib_multipath_rec_sl(IN const ib_multipath_rec_t * const p_rec)
6156 {
6157 	return ((uint8_t) ((cl_ntoh16(p_rec->qos_class_sl)) & IB_MULTIPATH_REC_SL_MASK));
6158 }
6159 
6160 /*
6161 * PARAMETERS
6162 *       p_rec
6163 *               [in] Pointer to the multipath record object.
6164 *
6165 * RETURN VALUES
6166 *	SL.
6167 *
6168 * NOTES
6169 *
6170 * SEE ALSO
6171 *       ib_multipath_rec_t
6172 *********/
6173 
6174 /****f* IBA Base: Types/ib_multipath_rec_set_qos_class
6175 * NAME
6176 *	ib_multipath_rec_set_qos_class
6177 *
6178 * DESCRIPTION
6179 *	Set path QoS class.
6180 *
6181 * SYNOPSIS
6182 */
6183 static inline void	OSM_API
ib_multipath_rec_set_qos_class(IN ib_multipath_rec_t * const p_rec,IN const uint16_t qos_class)6184 ib_multipath_rec_set_qos_class(
6185 	IN ib_multipath_rec_t* const p_rec,
6186 	IN const uint16_t qos_class )
6187 {
6188 	p_rec->qos_class_sl =
6189 		(p_rec->qos_class_sl & CL_HTON16(IB_MULTIPATH_REC_SL_MASK)) |
6190 			cl_hton16(qos_class << 4);
6191 }
6192 /*
6193 * PARAMETERS
6194 *	p_rec
6195 *		[in] Pointer to the MultiPath record object.
6196 *
6197 *	qos_class
6198 *		[in] QoS class to set.
6199 *
6200 * RETURN VALUES
6201 *	None
6202 *
6203 * NOTES
6204 *
6205 * SEE ALSO
6206 *	ib_multipath_rec_t
6207 *********/
6208 
6209 /****f* IBA Base: Types/ib_multipath_rec_qos_class
6210 * NAME
6211 *	ib_multipath_rec_qos_class
6212 *
6213 * DESCRIPTION
6214 *	Get QoS class.
6215 *
6216 * SYNOPSIS
6217 */
6218 static inline uint16_t	OSM_API
ib_multipath_rec_qos_class(IN const ib_multipath_rec_t * const p_rec)6219 ib_multipath_rec_qos_class(
6220 	IN	const	ib_multipath_rec_t* const	p_rec )
6221 {
6222 	return (cl_ntoh16( p_rec->qos_class_sl ) >> 4);
6223 }
6224 /*
6225 * PARAMETERS
6226 *	p_rec
6227 *		[in] Pointer to the MultiPath record object.
6228 *
6229 * RETURN VALUES
6230 *	QoS class of the MultiPath record.
6231 *
6232 * NOTES
6233 *
6234 * SEE ALSO
6235 *	ib_multipath_rec_t
6236 *********/
6237 
6238 /****f* IBA Base: Types/ib_multipath_rec_mtu
6239 * NAME
6240 *       ib_multipath_rec_mtu
6241 *
6242 * DESCRIPTION
6243 *       Get encoded path MTU.
6244 *
6245 * SYNOPSIS
6246 */
6247 static inline uint8_t OSM_API
ib_multipath_rec_mtu(IN const ib_multipath_rec_t * const p_rec)6248 ib_multipath_rec_mtu(IN const ib_multipath_rec_t * const p_rec)
6249 {
6250 	return ((uint8_t) (p_rec->mtu & IB_MULTIPATH_REC_BASE_MASK));
6251 }
6252 
6253 /*
6254 * PARAMETERS
6255 *       p_rec
6256 *               [in] Pointer to the multipath record object.
6257 *
6258 * RETURN VALUES
6259 *       Encoded path MTU.
6260 *               1: 256
6261 *               2: 512
6262 *               3: 1024
6263 *               4: 2048
6264 *               5: 4096
6265 *               others: reserved
6266 *
6267 * NOTES
6268 *
6269 * SEE ALSO
6270 *       ib_multipath_rec_t
6271 *********/
6272 
6273 /****f* IBA Base: Types/ib_multipath_rec_mtu_sel
6274 * NAME
6275 *       ib_multipath_rec_mtu_sel
6276 *
6277 * DESCRIPTION
6278 *       Get encoded multipath MTU selector.
6279 *
6280 * SYNOPSIS
6281 */
6282 static inline uint8_t OSM_API
ib_multipath_rec_mtu_sel(IN const ib_multipath_rec_t * const p_rec)6283 ib_multipath_rec_mtu_sel(IN const ib_multipath_rec_t * const p_rec)
6284 {
6285 	return ((uint8_t) ((p_rec->mtu & IB_MULTIPATH_REC_SELECTOR_MASK) >> 6));
6286 }
6287 
6288 /*
6289 * PARAMETERS
6290 *       p_rec
6291 *               [in] Pointer to the multipath record object.
6292 *
6293 * RETURN VALUES
6294 *       Encoded path MTU selector value (for queries).
6295 *               0: greater than MTU specified
6296 *               1: less than MTU specified
6297 *               2: exactly the MTU specified
6298 *               3: largest MTU available
6299 *
6300 * NOTES
6301 *
6302 * SEE ALSO
6303 *       ib_multipath_rec_t
6304 *********/
6305 
6306 /****f* IBA Base: Types/ib_multipath_rec_rate
6307 * NAME
6308 *       ib_multipath_rec_rate
6309 *
6310 * DESCRIPTION
6311 *       Get encoded multipath rate.
6312 *
6313 * SYNOPSIS
6314 */
6315 static inline uint8_t OSM_API
ib_multipath_rec_rate(IN const ib_multipath_rec_t * const p_rec)6316 ib_multipath_rec_rate(IN const ib_multipath_rec_t * const p_rec)
6317 {
6318 	return ((uint8_t) (p_rec->rate & IB_MULTIPATH_REC_BASE_MASK));
6319 }
6320 
6321 /*
6322 * PARAMETERS
6323 *       p_rec
6324 *               [in] Pointer to the multipath record object.
6325 *
6326 * RETURN VALUES
6327 *       Encoded multipath rate.
6328 *               2: 2.5 Gb/sec.
6329 *               3: 10 Gb/sec.
6330 *               4: 30 Gb/sec.
6331 *               others: reserved
6332 *
6333 * NOTES
6334 *
6335 * SEE ALSO
6336 *       ib_multipath_rec_t
6337 *********/
6338 
6339 /****f* IBA Base: Types/ib_multipath_rec_rate_sel
6340 * NAME
6341 *       ib_multipath_rec_rate_sel
6342 *
6343 * DESCRIPTION
6344 *       Get encoded multipath rate selector.
6345 *
6346 * SYNOPSIS
6347 */
6348 static inline uint8_t OSM_API
ib_multipath_rec_rate_sel(IN const ib_multipath_rec_t * const p_rec)6349 ib_multipath_rec_rate_sel(IN const ib_multipath_rec_t * const p_rec)
6350 {
6351 	return ((uint8_t)
6352 		((p_rec->rate & IB_MULTIPATH_REC_SELECTOR_MASK) >> 6));
6353 }
6354 
6355 /*
6356 * PARAMETERS
6357 *       p_rec
6358 *               [in] Pointer to the multipath record object.
6359 *
6360 * RETURN VALUES
6361 *       Encoded path rate selector value (for queries).
6362 *               0: greater than rate specified
6363 *               1: less than rate specified
6364 *               2: exactly the rate specified
6365 *               3: largest rate available
6366 *
6367 * NOTES
6368 *
6369 * SEE ALSO
6370 *       ib_multipath_rec_t
6371 *********/
6372 
6373 /****f* IBA Base: Types/ib_multipath_rec_pkt_life
6374 * NAME
6375 *       ib_multipath_rec_pkt_life
6376 *
6377 * DESCRIPTION
6378 *       Get encoded multipath pkt_life.
6379 *
6380 * SYNOPSIS
6381 */
6382 static inline uint8_t OSM_API
ib_multipath_rec_pkt_life(IN const ib_multipath_rec_t * const p_rec)6383 ib_multipath_rec_pkt_life(IN const ib_multipath_rec_t * const p_rec)
6384 {
6385 	return ((uint8_t) (p_rec->pkt_life & IB_MULTIPATH_REC_BASE_MASK));
6386 }
6387 
6388 /*
6389 * PARAMETERS
6390 *       p_rec
6391 *               [in] Pointer to the multipath record object.
6392 *
6393 * RETURN VALUES
6394 *       Encoded multipath pkt_life = 4.096 usec * 2 ** PacketLifeTime.
6395 *
6396 * NOTES
6397 *
6398 * SEE ALSO
6399 *       ib_multipath_rec_t
6400 *********/
6401 
6402 /****f* IBA Base: Types/ib_multipath_rec_pkt_life_sel
6403 * NAME
6404 *       ib_multipath_rec_pkt_life_sel
6405 *
6406 * DESCRIPTION
6407 *       Get encoded multipath pkt_lifetime selector.
6408 *
6409 * SYNOPSIS
6410 */
6411 static inline uint8_t OSM_API
ib_multipath_rec_pkt_life_sel(IN const ib_multipath_rec_t * const p_rec)6412 ib_multipath_rec_pkt_life_sel(IN const ib_multipath_rec_t * const p_rec)
6413 {
6414 	return ((uint8_t)
6415 		((p_rec->pkt_life & IB_MULTIPATH_REC_SELECTOR_MASK) >> 6));
6416 }
6417 
6418 /*
6419 * PARAMETERS
6420 *       p_rec
6421 *               [in] Pointer to the multipath record object.
6422 *
6423 * RETURN VALUES
6424 *       Encoded path pkt_lifetime selector value (for queries).
6425 *               0: greater than rate specified
6426 *               1: less than rate specified
6427 *               2: exactly the rate specified
6428 *               3: smallest packet lifetime available
6429 *
6430 * NOTES
6431 *
6432 * SEE ALSO
6433 *       ib_multipath_rec_t
6434 *********/
6435 
6436 /****f* IBA Base: Types/ib_multipath_rec_service_id
6437 * NAME
6438 *	ib_multipath_rec_service_id
6439 *
6440 * DESCRIPTION
6441 *	Get multipath service id.
6442 *
6443 * SYNOPSIS
6444 */
6445 static inline ib_net64_t OSM_API
ib_multipath_rec_service_id(IN const ib_multipath_rec_t * const p_rec)6446 ib_multipath_rec_service_id(IN const ib_multipath_rec_t * const p_rec)
6447 {
6448 	union {
6449 		ib_net64_t sid;
6450 		uint8_t sid_arr[8];
6451 	} sid_union;
6452 	sid_union.sid_arr[0] = p_rec->service_id_8msb;
6453 	memcpy(&sid_union.sid_arr[1], p_rec->service_id_56lsb, 7);
6454 	return sid_union.sid;
6455 }
6456 
6457 /*
6458 * PARAMETERS
6459 *	p_rec
6460 *		[in] Pointer to the multipath record object.
6461 *
6462 * RETURN VALUES
6463 *	Service ID
6464 *
6465 * NOTES
6466 *
6467 * SEE ALSO
6468 *	ib_multipath_rec_t
6469 *********/
6470 
6471 #define IB_NUM_PKEY_ELEMENTS_IN_BLOCK		32
6472 /****s* IBA Base: Types/ib_pkey_table_t
6473 * NAME
6474 *	ib_pkey_table_t
6475 *
6476 * DESCRIPTION
6477 *	IBA defined PKey table. (14.2.5.7)
6478 *
6479 * SYNOPSIS
6480 */
6481 
6482 #include <complib/cl_packon.h>
6483 typedef struct _ib_pkey_table {
6484 	ib_net16_t pkey_entry[IB_NUM_PKEY_ELEMENTS_IN_BLOCK];
6485 
6486 } PACK_SUFFIX ib_pkey_table_t;
6487 #include <complib/cl_packoff.h>
6488 /************/
6489 
6490 /****s* IBA Base: Types/ib_pkey_table_record_t
6491 * NAME
6492 *	ib_pkey_table_record_t
6493 *
6494 * DESCRIPTION
6495 *	IBA defined P_Key Table Record for SA Query. (15.2.5.11)
6496 *
6497 * SYNOPSIS
6498 */
6499 #include <complib/cl_packon.h>
6500 typedef struct _ib_pkey_table_record {
6501 	ib_net16_t lid;		// for CA: lid of port, for switch lid of port 0
6502 	uint16_t block_num;
6503 	uint8_t port_num;	// for switch: port number, for CA: reserved
6504 	uint8_t reserved1;
6505 	uint16_t reserved2;
6506 	ib_pkey_table_t pkey_tbl;
6507 
6508 } PACK_SUFFIX ib_pkey_table_record_t;
6509 #include <complib/cl_packoff.h>
6510 /************/
6511 
6512 #define IB_DROP_VL 15
6513 #define IB_MAX_NUM_VLS 16
6514 /****s* IBA Base: Types/ib_slvl_table_t
6515 * NAME
6516 *	ib_slvl_table_t
6517 *
6518 * DESCRIPTION
6519 *	IBA defined SL2VL Mapping Table Attribute. (14.2.5.8)
6520 *
6521 * SYNOPSIS
6522 */
6523 #include <complib/cl_packon.h>
6524 typedef struct _ib_slvl_table {
6525 	uint8_t raw_vl_by_sl[IB_MAX_NUM_VLS / 2];
6526 } PACK_SUFFIX ib_slvl_table_t;
6527 #include <complib/cl_packoff.h>
6528 /************/
6529 
6530 /****s* IBA Base: Types/ib_slvl_table_record_t
6531 * NAME
6532 *	ib_slvl_table_record_t
6533 *
6534 * DESCRIPTION
6535 *	IBA defined SL to VL Mapping Table Record for SA Query. (15.2.5.4)
6536 *
6537 * SYNOPSIS
6538 */
6539 #include <complib/cl_packon.h>
6540 typedef struct _ib_slvl_table_record {
6541 	ib_net16_t lid;		// for CA: lid of port, for switch lid of port 0
6542 	uint8_t in_port_num;	// reserved for CAs
6543 	uint8_t out_port_num;	// reserved for CAs
6544 	uint32_t resv;
6545 	ib_slvl_table_t slvl_tbl;
6546 
6547 } PACK_SUFFIX ib_slvl_table_record_t;
6548 #include <complib/cl_packoff.h>
6549 /************/
6550 
6551 /****f* IBA Base: Types/ib_slvl_table_set
6552 * NAME
6553 *	ib_slvl_table_set
6554 *
6555 * DESCRIPTION
6556 *	Set slvl table entry.
6557 *
6558 * SYNOPSIS
6559 */
6560 static inline void OSM_API
ib_slvl_table_set(IN ib_slvl_table_t * p_slvl_tbl,IN uint8_t sl_index,IN uint8_t vl)6561 ib_slvl_table_set(IN ib_slvl_table_t * p_slvl_tbl,
6562 		  IN uint8_t sl_index, IN uint8_t vl)
6563 {
6564 	uint8_t idx = sl_index / 2;
6565 	CL_ASSERT(vl <= 15);
6566 	CL_ASSERT(sl_index <= 15);
6567 
6568 	if (sl_index % 2) {
6569 		/* this is an odd sl. Need to update the ls bits */
6570 		p_slvl_tbl->raw_vl_by_sl[idx] =
6571 		    (p_slvl_tbl->raw_vl_by_sl[idx] & 0xF0) | vl;
6572 	} else {
6573 		/* this is an even sl. Need to update the ms bits */
6574 		p_slvl_tbl->raw_vl_by_sl[idx] =
6575 		    (vl << 4) | (p_slvl_tbl->raw_vl_by_sl[idx] & 0x0F);
6576 	}
6577 }
6578 
6579 /*
6580 * PARAMETERS
6581 *	p_slvl_tbl
6582 *		[in] pointer to ib_slvl_table_t object.
6583 *
6584 *	sl_index
6585 *		[in] the sl index in the table to be updated.
6586 *
6587 *	vl
6588 *		[in] the vl value to update for that sl.
6589 *
6590 * RETURN VALUES
6591 *	None
6592 *
6593 * NOTES
6594 *
6595 * SEE ALSO
6596 *	ib_slvl_table_t
6597 *********/
6598 
6599 /****f* IBA Base: Types/ib_slvl_table_get
6600 * NAME
6601 *	ib_slvl_table_get
6602 *
6603 * DESCRIPTION
6604 *	Get slvl table entry.
6605 *
6606 * SYNOPSIS
6607 */
6608 static inline uint8_t OSM_API
ib_slvl_table_get(IN const ib_slvl_table_t * p_slvl_tbl,IN uint8_t sl_index)6609 ib_slvl_table_get(IN const ib_slvl_table_t * p_slvl_tbl, IN uint8_t sl_index)
6610 {
6611 	uint8_t idx = sl_index / 2;
6612 	CL_ASSERT(sl_index <= 15);
6613 
6614 	if (sl_index % 2) {
6615 		/* this is an odd sl. Need to return the ls bits. */
6616 		return (p_slvl_tbl->raw_vl_by_sl[idx] & 0x0F);
6617 	} else {
6618 		/* this is an even sl. Need to return the ms bits. */
6619 		return ((p_slvl_tbl->raw_vl_by_sl[idx] & 0xF0) >> 4);
6620 	}
6621 }
6622 
6623 /*
6624 * PARAMETERS
6625 *	p_slvl_tbl
6626 *		[in] pointer to ib_slvl_table_t object.
6627 *
6628 *	sl_index
6629 *		[in] the sl index in the table whose value should be returned.
6630 *
6631 * RETURN VALUES
6632 *	vl for the requested sl_index.
6633 *
6634 * NOTES
6635 *
6636 * SEE ALSO
6637 *	ib_slvl_table_t
6638 *********/
6639 
6640 /****s* IBA Base: Types/ib_vl_arb_element_t
6641 * NAME
6642 *	ib_vl_arb_element_t
6643 *
6644 * DESCRIPTION
6645 *	IBA defined VL Arbitration Table Element. (14.2.5.9)
6646 *
6647 * SYNOPSIS
6648 */
6649 #include <complib/cl_packon.h>
6650 typedef struct _ib_vl_arb_element {
6651 	uint8_t vl;
6652 	uint8_t weight;
6653 } PACK_SUFFIX ib_vl_arb_element_t;
6654 #include <complib/cl_packoff.h>
6655 /************/
6656 
6657 #define IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK 32
6658 
6659 /****s* IBA Base: Types/ib_vl_arb_table_t
6660 * NAME
6661 *	ib_vl_arb_table_t
6662 *
6663 * DESCRIPTION
6664 *	IBA defined VL Arbitration Table. (14.2.5.9)
6665 *
6666 * SYNOPSIS
6667 */
6668 #include <complib/cl_packon.h>
6669 typedef struct _ib_vl_arb_table {
6670 	ib_vl_arb_element_t vl_entry[IB_NUM_VL_ARB_ELEMENTS_IN_BLOCK];
6671 } PACK_SUFFIX ib_vl_arb_table_t;
6672 #include <complib/cl_packoff.h>
6673 /************/
6674 
6675 /****s* IBA Base: Types/ib_vl_arb_table_record_t
6676 * NAME
6677 *	ib_vl_arb_table_record_t
6678 *
6679 * DESCRIPTION
6680 *	IBA defined VL Arbitration Table Record for SA Query. (15.2.5.9)
6681 *
6682 * SYNOPSIS
6683 */
6684 #include <complib/cl_packon.h>
6685 typedef struct _ib_vl_arb_table_record {
6686 	ib_net16_t lid;		// for CA: lid of port, for switch lid of port 0
6687 	uint8_t port_num;
6688 	uint8_t block_num;
6689 	uint32_t reserved;
6690 	ib_vl_arb_table_t vl_arb_tbl;
6691 } PACK_SUFFIX ib_vl_arb_table_record_t;
6692 #include <complib/cl_packoff.h>
6693 /************/
6694 
6695 /*
6696  *	Global route header information received with unreliable datagram messages
6697  */
6698 #include <complib/cl_packon.h>
6699 typedef struct _ib_grh {
6700 	ib_net32_t ver_class_flow;
6701 	ib_net16_t resv1;
6702 	uint8_t resv2;
6703 	uint8_t hop_limit;
6704 	ib_gid_t src_gid;
6705 	ib_gid_t dest_gid;
6706 } PACK_SUFFIX ib_grh_t;
6707 #include <complib/cl_packoff.h>
6708 
6709 /****f* IBA Base: Types/ib_grh_get_ver_class_flow
6710 * NAME
6711 *	ib_grh_get_ver_class_flow
6712 *
6713 * DESCRIPTION
6714 *	Get encoded version, traffic class and flow label in grh
6715 *
6716 * SYNOPSIS
6717 */
6718 static inline void OSM_API
ib_grh_get_ver_class_flow(IN const ib_net32_t ver_class_flow,OUT uint8_t * const p_ver,OUT uint8_t * const p_tclass,OUT uint32_t * const p_flow_lbl)6719 ib_grh_get_ver_class_flow(IN const ib_net32_t ver_class_flow,
6720 			  OUT uint8_t * const p_ver,
6721 			  OUT uint8_t * const p_tclass,
6722 			  OUT uint32_t * const p_flow_lbl)
6723 {
6724 	ib_net32_t tmp_ver_class_flow;
6725 
6726 	if (p_ver)
6727 		*p_ver = (uint8_t) (ver_class_flow & 0x0f);
6728 
6729 	tmp_ver_class_flow = ver_class_flow >> 4;
6730 
6731 	if (p_tclass)
6732 		*p_tclass = (uint8_t) (tmp_ver_class_flow & 0xff);
6733 
6734 	tmp_ver_class_flow = tmp_ver_class_flow >> 8;
6735 
6736 	if (p_flow_lbl)
6737 		*p_flow_lbl = tmp_ver_class_flow & 0xfffff;
6738 }
6739 
6740 /*
6741 * PARAMETERS
6742 *	ver_class_flow
6743 *		[in] the version, traffic class and flow label info.
6744 *
6745 * RETURN VALUES
6746 *	p_ver
6747 *		[out] pointer to the version info.
6748 *
6749 *	p_tclass
6750 *		[out] pointer to the traffic class info.
6751 *
6752 *	p_flow_lbl
6753 *		[out] pointer to the flow label info
6754 *
6755 * NOTES
6756 *
6757 * SEE ALSO
6758 *	ib_grh_t
6759 *********/
6760 
6761 /****f* IBA Base: Types/ib_grh_set_ver_class_flow
6762 * NAME
6763 *	ib_grh_set_ver_class_flow
6764 *
6765 * DESCRIPTION
6766 *	Set encoded version, traffic class and flow label in grh
6767 *
6768 * SYNOPSIS
6769 */
6770 static inline ib_net32_t OSM_API
ib_grh_set_ver_class_flow(IN const uint8_t ver,IN const uint8_t tclass,IN const uint32_t flow_lbl)6771 ib_grh_set_ver_class_flow(IN const uint8_t ver,
6772 			  IN const uint8_t tclass, IN const uint32_t flow_lbl)
6773 {
6774 	ib_net32_t ver_class_flow;
6775 
6776 	ver_class_flow = flow_lbl;
6777 	ver_class_flow = ver_class_flow << 8;
6778 	ver_class_flow = ver_class_flow | tclass;
6779 	ver_class_flow = ver_class_flow << 4;
6780 	ver_class_flow = ver_class_flow | ver;
6781 	return (ver_class_flow);
6782 }
6783 
6784 /*
6785 * PARAMETERS
6786 *	ver
6787 *		[in] the version info.
6788 *
6789 *	tclass
6790 *		[in] the traffic class info.
6791 *
6792 *	flow_lbl
6793 *		[in] the flow label info
6794 *
6795 * RETURN VALUES
6796 *	ver_class_flow
6797 *		[out] the version, traffic class and flow label info.
6798 *
6799 * NOTES
6800 *
6801 * SEE ALSO
6802 *	ib_grh_t
6803 *********/
6804 
6805 /****s* IBA Base: Types/ib_member_rec_t
6806 * NAME
6807 *	ib_member_rec_t
6808 *
6809 * DESCRIPTION
6810 *	Multicast member record, used to create, join, and leave multicast
6811 *	groups.
6812 *
6813 * SYNOPSIS
6814 */
6815 #include <complib/cl_packon.h>
6816 typedef struct _ib_member_rec {
6817 	ib_gid_t mgid;
6818 	ib_gid_t port_gid;
6819 	ib_net32_t qkey;
6820 	ib_net16_t mlid;
6821 	uint8_t mtu;
6822 	uint8_t tclass;
6823 	ib_net16_t pkey;
6824 	uint8_t rate;
6825 	uint8_t pkt_life;
6826 	ib_net32_t sl_flow_hop;
6827 	uint8_t scope_state;
6828 	uint8_t proxy_join:1;
6829 	uint8_t reserved[2];
6830 	uint8_t pad[4];
6831 
6832 } PACK_SUFFIX ib_member_rec_t;
6833 #include <complib/cl_packoff.h>
6834 /*
6835 * FIELDS
6836 *	mgid
6837 *		Multicast GID address for this multicast group.
6838 *
6839 *	port_gid
6840 *		Valid GID of the endpoint joining this multicast group.
6841 *
6842 *	qkey
6843 *		Q_Key to be sued by this multicast group.
6844 *
6845 *	mlid
6846 *		Multicast LID for this multicast group.
6847 *
6848 *	mtu
6849 *		MTU and MTU selector fields to use on this path
6850 *
6851 *	tclass
6852 *		Another global routing parameter.
6853 *
6854 *	pkey
6855 *		Partition key (P_Key) to use for this member.
6856 *
6857 *	rate
6858 *		Rate and rate selector fields to use on this path.
6859 *
6860 *	pkt_life
6861 *		Packet lifetime
6862 *
6863 *	sl_flow_hop
6864 *		Global routing parameters: service level, hop count, and flow label.
6865 *
6866 *	scope_state
6867 *		MGID scope and JoinState of multicast request.
6868 *
6869 *	proxy_join
6870 *		Enables others in the Partition to proxy add/remove from the group
6871 *
6872 * SEE ALSO
6873 *********/
6874 
6875 /****f* IBA Base: Types/ib_member_get_sl_flow_hop
6876 * NAME
6877 *	ib_member_get_sl_flow_hop
6878 *
6879 * DESCRIPTION
6880 *	Get encoded sl, flow label, and hop limit
6881 *
6882 * SYNOPSIS
6883 */
6884 static inline void OSM_API
ib_member_get_sl_flow_hop(IN const ib_net32_t sl_flow_hop,OUT uint8_t * const p_sl,OUT uint32_t * const p_flow_lbl,OUT uint8_t * const p_hop)6885 ib_member_get_sl_flow_hop(IN const ib_net32_t sl_flow_hop,
6886 			  OUT uint8_t * const p_sl,
6887 			  OUT uint32_t * const p_flow_lbl,
6888 			  OUT uint8_t * const p_hop)
6889 {
6890 	uint32_t tmp;
6891 
6892 	tmp = cl_ntoh32(sl_flow_hop);
6893 	if (p_hop)
6894 		*p_hop = (uint8_t) tmp;
6895 	tmp >>= 8;
6896 
6897 	if (p_flow_lbl)
6898 		*p_flow_lbl = (uint32_t) (tmp & 0xfffff);
6899 	tmp >>= 20;
6900 
6901 	if (p_sl)
6902 		*p_sl = (uint8_t) tmp;
6903 }
6904 
6905 /*
6906 * PARAMETERS
6907 *	sl_flow_hop
6908 *		[in] the sl, flow label, and hop limit of MC Group
6909 *
6910 * RETURN VALUES
6911 *	p_sl
6912 *		[out] pointer to the service level
6913 *
6914 *	p_flow_lbl
6915 *		[out] pointer to the flow label info
6916 *
6917 *	p_hop
6918 *		[out] pointer to the hop count limit.
6919 *
6920 * NOTES
6921 *
6922 * SEE ALSO
6923 *	ib_member_rec_t
6924 *********/
6925 
6926 /****f* IBA Base: Types/ib_member_set_sl_flow_hop
6927 * NAME
6928 *	ib_member_set_sl_flow_hop
6929 *
6930 * DESCRIPTION
6931 *	Set encoded sl, flow label, and hop limit
6932 *
6933 * SYNOPSIS
6934 */
6935 static inline ib_net32_t OSM_API
ib_member_set_sl_flow_hop(IN const uint8_t sl,IN const uint32_t flow_label,IN const uint8_t hop_limit)6936 ib_member_set_sl_flow_hop(IN const uint8_t sl,
6937 			  IN const uint32_t flow_label,
6938 			  IN const uint8_t hop_limit)
6939 {
6940 	uint32_t tmp;
6941 
6942 	tmp = (sl << 28) | ((flow_label & 0xfffff) << 8) | hop_limit;
6943 	return cl_hton32(tmp);
6944 }
6945 
6946 /*
6947 * PARAMETERS
6948 *	sl
6949 *		[in] the service level.
6950 *
6951 *	flow_lbl
6952 *		[in] the flow label info
6953 *
6954 *	hop_limit
6955 *		[in] the hop limit.
6956 *
6957 * RETURN VALUES
6958 *	sl_flow_hop
6959 *		[out] the encoded sl, flow label, and hop limit
6960 *
6961 * NOTES
6962 *
6963 * SEE ALSO
6964 *	ib_member_rec_t
6965 *********/
6966 
6967 /****f* IBA Base: Types/ib_member_get_scope_state
6968 * NAME
6969 *	ib_member_get_scope_state
6970 *
6971 * DESCRIPTION
6972 *	Get encoded MGID scope and JoinState
6973 *
6974 * SYNOPSIS
6975 */
6976 static inline void OSM_API
ib_member_get_scope_state(IN const uint8_t scope_state,OUT uint8_t * const p_scope,OUT uint8_t * const p_state)6977 ib_member_get_scope_state(IN const uint8_t scope_state,
6978 			  OUT uint8_t * const p_scope,
6979 			  OUT uint8_t * const p_state)
6980 {
6981 	uint8_t tmp_scope_state;
6982 
6983 	if (p_state)
6984 		*p_state = (uint8_t) (scope_state & 0x0f);
6985 
6986 	tmp_scope_state = scope_state >> 4;
6987 
6988 	if (p_scope)
6989 		*p_scope = (uint8_t) (tmp_scope_state & 0x0f);
6990 
6991 }
6992 
6993 /*
6994 * PARAMETERS
6995 *	scope_state
6996 *		[in] the scope and state
6997 *
6998 * RETURN VALUES
6999 *	p_scope
7000 *		[out] pointer to the MGID scope
7001 *
7002 *	p_state
7003 *		[out] pointer to the join state
7004 *
7005 * NOTES
7006 *
7007 * SEE ALSO
7008 *	ib_member_rec_t
7009 *********/
7010 
7011 /****f* IBA Base: Types/ib_member_set_scope_state
7012 * NAME
7013 *	ib_member_set_scope_state
7014 *
7015 * DESCRIPTION
7016 *	Set encoded version, MGID scope and JoinState
7017 *
7018 * SYNOPSIS
7019 */
7020 static inline uint8_t OSM_API
ib_member_set_scope_state(IN const uint8_t scope,IN const uint8_t state)7021 ib_member_set_scope_state(IN const uint8_t scope, IN const uint8_t state)
7022 {
7023 	uint8_t scope_state;
7024 
7025 	scope_state = scope;
7026 	scope_state = scope_state << 4;
7027 	scope_state = scope_state | state;
7028 	return (scope_state);
7029 }
7030 
7031 /*
7032 * PARAMETERS
7033 *	scope
7034 *		[in] the MGID scope
7035 *
7036 *	state
7037 *		[in] the JoinState
7038 *
7039 * RETURN VALUES
7040 *	scope_state
7041 *		[out] the encoded one
7042 *
7043 * NOTES
7044 *
7045 * SEE ALSO
7046 *	ib_member_rec_t
7047 *********/
7048 
7049 /****f* IBA Base: Types/ib_member_set_join_state
7050 * NAME
7051 *	ib_member_set_join_state
7052 *
7053 * DESCRIPTION
7054 *	Set JoinState
7055 *
7056 * SYNOPSIS
7057 */
7058 static inline void OSM_API
ib_member_set_join_state(IN OUT ib_member_rec_t * p_mc_rec,IN const uint8_t state)7059 ib_member_set_join_state(IN OUT ib_member_rec_t * p_mc_rec,
7060 			 IN const uint8_t state)
7061 {
7062 	/* keep the scope as it is */
7063 	p_mc_rec->scope_state = (p_mc_rec->scope_state & 0xF0) | (0x0f & state);
7064 }
7065 
7066 /*
7067 * PARAMETERS
7068 *	p_mc_rec
7069 *		[in] pointer to the member record
7070 *
7071 *	state
7072 *		[in] the JoinState
7073 *
7074 * RETURN VALUES
7075 *	NONE
7076 *
7077 * NOTES
7078 *
7079 * SEE ALSO
7080 *	ib_member_rec_t
7081 *********/
7082 
7083 /*
7084  * Join State Codes:
7085  */
7086 #define IB_MC_REC_STATE_FULL_MEMBER 0x01
7087 #define IB_MC_REC_STATE_NON_MEMBER 0x02
7088 #define IB_MC_REC_STATE_SEND_ONLY_NON_MEMBER 0x04
7089 
7090 /*
7091  *	Generic MAD notice types
7092  */
7093 #define IB_NOTICE_TYPE_FATAL				0x00
7094 #define IB_NOTICE_TYPE_URGENT				0x01
7095 #define IB_NOTICE_TYPE_SECURITY				0x02
7096 #define IB_NOTICE_TYPE_SUBN_MGMT			0x03
7097 #define IB_NOTICE_TYPE_INFO				0x04
7098 #define IB_NOTICE_TYPE_EMPTY				0x7F
7099 
7100 #include <complib/cl_packon.h>
7101 typedef struct _ib_mad_notice_attr	// Total Size calc  Accumulated
7102 {
7103 	uint8_t generic_type;	// 1                1
7104 
7105 	union _notice_g_or_v {
7106 		struct _notice_generic	// 5                6
7107 		{
7108 			uint8_t prod_type_msb;
7109 			ib_net16_t prod_type_lsb;
7110 			ib_net16_t trap_num;
7111 		} PACK_SUFFIX generic;
7112 
7113 		struct _notice_vend {
7114 			uint8_t vend_id_msb;
7115 			ib_net16_t vend_id_lsb;
7116 			ib_net16_t dev_id;
7117 		} PACK_SUFFIX vend;
7118 	} g_or_v;
7119 
7120 	ib_net16_t issuer_lid;	// 2                 8
7121 	ib_net16_t toggle_count;	// 2                 10
7122 
7123 	union _data_details	// 54                64
7124 	{
7125 		struct _raw_data {
7126 			uint8_t details[54];
7127 		} PACK_SUFFIX raw_data;
7128 
7129 		struct _ntc_64_67 {
7130 			uint8_t res[6];
7131 			ib_gid_t gid;	// the Node or Multicast Group that came in/out
7132 		} PACK_SUFFIX ntc_64_67;
7133 
7134 		struct _ntc_128 {
7135 			ib_net16_t sw_lid;	// the sw lid of which link state changed
7136 		} PACK_SUFFIX ntc_128;
7137 
7138 		struct _ntc_129_131 {
7139 			ib_net16_t pad;
7140 			ib_net16_t lid;	// lid and port number of the violation
7141 			uint8_t port_num;
7142 		} PACK_SUFFIX ntc_129_131;
7143 
7144 		struct _ntc_144 {
7145 			ib_net16_t pad1;
7146 			ib_net16_t lid;             // lid where change occured
7147 			uint8_t    pad2;            // reserved
7148 			uint8_t    local_changes;   // 7b reserved 1b local changes
7149 			ib_net32_t new_cap_mask;    // new capability mask
7150 			ib_net16_t change_flgs;     // 13b reserved 3b change flags
7151 		} PACK_SUFFIX ntc_144;
7152 
7153 		struct _ntc_145 {
7154 			ib_net16_t pad1;
7155 			ib_net16_t lid;	// lid where sys guid changed
7156 			ib_net16_t pad2;
7157 			ib_net64_t new_sys_guid;	// new system image guid
7158 		} PACK_SUFFIX ntc_145;
7159 
7160 		struct _ntc_256 {	// total: 54
7161 			ib_net16_t pad1;	// 2
7162 			ib_net16_t lid;	// 2
7163 			ib_net16_t dr_slid;	// 2
7164 			uint8_t method;	// 1
7165 			uint8_t pad2;	// 1
7166 			ib_net16_t attr_id;	// 2
7167 			ib_net32_t attr_mod;	// 4
7168 			ib_net64_t mkey;	// 8
7169 			uint8_t pad3;	// 1
7170 			uint8_t dr_trunc_hop;	// 1
7171 			uint8_t dr_rtn_path[30];	// 30
7172 		} PACK_SUFFIX ntc_256;
7173 
7174 		struct _ntc_257_258	// violation of p/q_key // 49
7175 		{
7176 			ib_net16_t pad1;	// 2
7177 			ib_net16_t lid1;	// 2
7178 			ib_net16_t lid2;	// 2
7179 			ib_net32_t key;	// 2
7180 			uint8_t sl;	// 1
7181 			ib_net32_t qp1;	// 4
7182 			ib_net32_t qp2;	// 4
7183 			ib_gid_t gid1;	// 16
7184 			ib_gid_t gid2;	// 16
7185 		} PACK_SUFFIX ntc_257_258;
7186 
7187 		struct _ntc_259	// pkey violation from switch 51
7188 		{
7189 			ib_net16_t data_valid;	// 2
7190 			ib_net16_t lid1;	// 2
7191 			ib_net16_t lid2;	// 2
7192 			ib_net16_t pkey;	// 2
7193 			ib_net32_t sl_qp1; // 4b sl, 4b pad, 24b qp1
7194 			ib_net32_t qp2; // 8b pad, 24b qp2
7195 			ib_gid_t gid1;	// 16
7196 			ib_gid_t gid2;	// 16
7197 			ib_net16_t sw_lid;	// 2
7198 			uint8_t port_no;	// 1
7199 		} PACK_SUFFIX ntc_259;
7200 
7201 	} data_details;
7202 
7203 	ib_gid_t issuer_gid;	// 16          80
7204 
7205 } PACK_SUFFIX ib_mad_notice_attr_t;
7206 #include <complib/cl_packoff.h>
7207 
7208 /**
7209  * Trap 259 masks
7210  */
7211 #define TRAP_259_MASK_SL (CL_HTON32(0xF0000000))
7212 #define TRAP_259_MASK_QP (CL_HTON32(0x00FFFFFF))
7213 
7214 /**
7215  * Trap 144 masks
7216  */
7217 #define TRAP_144_MASK_OTHER_LOCAL_CHANGES      0x01
7218 #define TRAP_144_MASK_SM_PRIORITY_CHANGE       (CL_HTON16(0x0008))
7219 #define TRAP_144_MASK_LINK_SPEED_ENABLE_CHANGE (CL_HTON16(0x0004))
7220 #define TRAP_144_MASK_LINK_WIDTH_ENABLE_CHANGE (CL_HTON16(0x0002))
7221 #define TRAP_144_MASK_NODE_DESCRIPTION_CHANGE  (CL_HTON16(0x0001))
7222 
7223 /****f* IBA Base: Types/ib_notice_is_generic
7224 * NAME
7225 *	ib_notice_is_generic
7226 *
7227 * DESCRIPTION
7228 *	Check if the notice is generic
7229 *
7230 * SYNOPSIS
7231 */
7232 static inline boolean_t OSM_API
ib_notice_is_generic(IN const ib_mad_notice_attr_t * p_ntc)7233 ib_notice_is_generic(IN const ib_mad_notice_attr_t * p_ntc)
7234 {
7235 	return (p_ntc->generic_type & 0x80);
7236 }
7237 
7238 /*
7239 * PARAMETERS
7240 *	p_ntc
7241 *		[in] Pointer to  the notice MAD attribute
7242 *
7243 * RETURN VALUES
7244 *	TRUE if mad is generic
7245 *
7246 * SEE ALSO
7247 *	ib_mad_notice_attr_t
7248 *********/
7249 
7250 /****f* IBA Base: Types/ib_notice_get_type
7251 * NAME
7252 *	ib_notice_get_type
7253 *
7254 * DESCRIPTION
7255 *	Get the notice type
7256 *
7257 * SYNOPSIS
7258 */
7259 static inline uint8_t OSM_API
ib_notice_get_type(IN const ib_mad_notice_attr_t * p_ntc)7260 ib_notice_get_type(IN const ib_mad_notice_attr_t * p_ntc)
7261 {
7262 	return p_ntc->generic_type & 0x7f;
7263 }
7264 
7265 /*
7266 * PARAMETERS
7267 *	p_ntc
7268 *		[in] Pointer to  the notice MAD attribute
7269 *
7270 * RETURN VALUES
7271 *	TRUE if mad is generic
7272 *
7273 * SEE ALSO
7274 *	ib_mad_notice_attr_t
7275 *********/
7276 
7277 /****f* IBA Base: Types/ib_notice_get_prod_type
7278 * NAME
7279 *	ib_notice_get_prod_type
7280 *
7281 * DESCRIPTION
7282 *	Get the notice Producer Type of Generic Notice
7283 *
7284 * SYNOPSIS
7285 */
7286 static inline ib_net32_t OSM_API
ib_notice_get_prod_type(IN const ib_mad_notice_attr_t * p_ntc)7287 ib_notice_get_prod_type(IN const ib_mad_notice_attr_t * p_ntc)
7288 {
7289 	uint32_t pt;
7290 
7291 	pt = cl_ntoh16(p_ntc->g_or_v.generic.prod_type_lsb) |
7292 	    (p_ntc->g_or_v.generic.prod_type_msb << 16);
7293 	return cl_hton32(pt);
7294 }
7295 
7296 /*
7297 * PARAMETERS
7298 *	p_ntc
7299 *		[in] Pointer to the notice MAD attribute
7300 *
7301 * RETURN VALUES
7302 *	The producer type
7303 *
7304 * SEE ALSO
7305 *	ib_mad_notice_attr_t
7306 *********/
7307 
7308 /****f* IBA Base: Types/ib_notice_set_prod_type
7309 * NAME
7310 *	ib_notice_set_prod_type
7311 *
7312 * DESCRIPTION
7313 *	Set the notice Producer Type of Generic Notice
7314 *
7315 * SYNOPSIS
7316 */
7317 static inline void OSM_API
ib_notice_set_prod_type(IN ib_mad_notice_attr_t * p_ntc,IN ib_net32_t prod_type_val)7318 ib_notice_set_prod_type(IN ib_mad_notice_attr_t * p_ntc,
7319 			IN ib_net32_t prod_type_val)
7320 {
7321 	uint32_t ptv = cl_ntoh32(prod_type_val);
7322 	p_ntc->g_or_v.generic.prod_type_lsb =
7323 	    cl_hton16((uint16_t) (ptv & 0x0000ffff));
7324 	p_ntc->g_or_v.generic.prod_type_msb =
7325 	    (uint8_t) ((ptv & 0x00ff0000) >> 16);
7326 }
7327 
7328 /*
7329 * PARAMETERS
7330 *	p_ntc
7331 *		[in] Pointer to the notice MAD attribute
7332 *
7333 *  prod_type
7334 *     [in] The producer Type code
7335 *
7336 * RETURN VALUES
7337 *	None
7338 *
7339 * SEE ALSO
7340 *	ib_mad_notice_attr_t
7341 *********/
7342 
7343 /****f* IBA Base: Types/ib_notice_set_prod_type_ho
7344 * NAME
7345 *	ib_notice_set_prod_type_ho
7346 *
7347 * DESCRIPTION
7348 *	Set the notice Producer Type of Generic Notice given Host Order
7349 *
7350 * SYNOPSIS
7351 */
7352 static inline void OSM_API
ib_notice_set_prod_type_ho(IN ib_mad_notice_attr_t * p_ntc,IN uint32_t prod_type_val_ho)7353 ib_notice_set_prod_type_ho(IN ib_mad_notice_attr_t * p_ntc,
7354 			   IN uint32_t prod_type_val_ho)
7355 {
7356 	p_ntc->g_or_v.generic.prod_type_lsb =
7357 	    cl_hton16((uint16_t) (prod_type_val_ho & 0x0000ffff));
7358 	p_ntc->g_or_v.generic.prod_type_msb =
7359 	    (uint8_t) ((prod_type_val_ho & 0x00ff0000) >> 16);
7360 }
7361 
7362 /*
7363 * PARAMETERS
7364 *	p_ntc
7365 *		[in] Pointer to the notice MAD attribute
7366 *
7367 *	prod_type
7368 *		[in] The producer Type code in host order
7369 *
7370 * RETURN VALUES
7371 *	None
7372 *
7373 * SEE ALSO
7374 *	ib_mad_notice_attr_t
7375 *********/
7376 
7377 /****f* IBA Base: Types/ib_notice_get_vend_id
7378 * NAME
7379 *	ib_notice_get_vend_id
7380 *
7381 * DESCRIPTION
7382 *	Get the Vendor Id of Vendor type Notice
7383 *
7384 * SYNOPSIS
7385 */
7386 static inline ib_net32_t OSM_API
ib_notice_get_vend_id(IN const ib_mad_notice_attr_t * p_ntc)7387 ib_notice_get_vend_id(IN const ib_mad_notice_attr_t * p_ntc)
7388 {
7389 	uint32_t vi;
7390 
7391 	vi = cl_ntoh16(p_ntc->g_or_v.vend.vend_id_lsb) |
7392 	    (p_ntc->g_or_v.vend.vend_id_msb << 16);
7393 	return cl_hton32(vi);
7394 }
7395 
7396 /*
7397 * PARAMETERS
7398 *	p_ntc
7399 *		[in] Pointer to the notice MAD attribute
7400 *
7401 * RETURN VALUES
7402 *	The Vendor Id of Vendor type Notice
7403 *
7404 * SEE ALSO
7405 *	ib_mad_notice_attr_t
7406 *********/
7407 
7408 /****f* IBA Base: Types/ib_notice_set_vend_id
7409 * NAME
7410 *	ib_notice_set_vend_id
7411 *
7412 * DESCRIPTION
7413 *	Set the notice Producer Type of Generic Notice
7414 *
7415 * SYNOPSIS
7416 */
7417 static inline void OSM_API
ib_notice_set_vend_id(IN ib_mad_notice_attr_t * p_ntc,IN ib_net32_t vend_id)7418 ib_notice_set_vend_id(IN ib_mad_notice_attr_t * p_ntc, IN ib_net32_t vend_id)
7419 {
7420 	uint32_t vi = cl_ntoh32(vend_id);
7421 	p_ntc->g_or_v.vend.vend_id_lsb =
7422 	    cl_hton16((uint16_t) (vi & 0x0000ffff));
7423 	p_ntc->g_or_v.vend.vend_id_msb = (uint8_t) ((vi & 0x00ff0000) >> 16);
7424 }
7425 
7426 /*
7427 * PARAMETERS
7428 *	p_ntc
7429 *		[in] Pointer to the notice MAD attribute
7430 *
7431 *	vend_id
7432 *		[in] The producer Type code
7433 *
7434 * RETURN VALUES
7435 *	None
7436 *
7437 * SEE ALSO
7438 *	ib_mad_notice_attr_t
7439 *********/
7440 
7441 /****f* IBA Base: Types/ib_notice_set_vend_id_ho
7442 * NAME
7443 *	ib_notice_set_vend_id_ho
7444 *
7445 * DESCRIPTION
7446 *	Set the notice Producer Type of Generic Notice given a host order value
7447 *
7448 * SYNOPSIS
7449 */
7450 static inline void OSM_API
ib_notice_set_vend_id_ho(IN ib_mad_notice_attr_t * p_ntc,IN uint32_t vend_id_ho)7451 ib_notice_set_vend_id_ho(IN ib_mad_notice_attr_t * p_ntc,
7452 			 IN uint32_t vend_id_ho)
7453 {
7454 	p_ntc->g_or_v.vend.vend_id_lsb =
7455 	    cl_hton16((uint16_t) (vend_id_ho & 0x0000ffff));
7456 	p_ntc->g_or_v.vend.vend_id_msb =
7457 	    (uint8_t) ((vend_id_ho & 0x00ff0000) >> 16);
7458 }
7459 
7460 /*
7461 * PARAMETERS
7462 *	p_ntc
7463 *		[in] Pointer to the notice MAD attribute
7464 *
7465 *	vend_id_ho
7466 *		[in] The producer Type code in host order
7467 *
7468 * RETURN VALUES
7469 *	None
7470 *
7471 * SEE ALSO
7472 *	ib_mad_notice_attr_t
7473 *********/
7474 
7475 #include <complib/cl_packon.h>
7476 typedef struct _ib_inform_info {
7477 	ib_gid_t gid;
7478 	ib_net16_t lid_range_begin;
7479 	ib_net16_t lid_range_end;
7480 	ib_net16_t reserved1;
7481 	uint8_t is_generic;
7482 	uint8_t subscribe;
7483 	ib_net16_t trap_type;
7484 	union _inform_g_or_v {
7485 		struct _inform_generic {
7486 			ib_net16_t trap_num;
7487 			ib_net32_t qpn_resp_time_val;
7488 			uint8_t reserved2;
7489 			uint8_t node_type_msb;
7490 			ib_net16_t node_type_lsb;
7491 		} PACK_SUFFIX generic;
7492 
7493 		struct _inform_vend {
7494 			ib_net16_t dev_id;
7495 			ib_net32_t qpn_resp_time_val;
7496 			uint8_t reserved2;
7497 			uint8_t vendor_id_msb;
7498 			ib_net16_t vendor_id_lsb;
7499 		} PACK_SUFFIX vend;
7500 
7501 	} PACK_SUFFIX g_or_v;
7502 
7503 } PACK_SUFFIX ib_inform_info_t;
7504 #include <complib/cl_packoff.h>
7505 
7506 /****f* IBA Base: Types/ib_inform_info_get_qpn_resp_time
7507 * NAME
7508 *	ib_inform_info_get_qpn_resp_time
7509 *
7510 * DESCRIPTION
7511 *	Get QPN of the inform info
7512 *
7513 * SYNOPSIS
7514 */
7515 static inline void OSM_API
ib_inform_info_get_qpn_resp_time(IN const ib_net32_t qpn_resp_time_val,OUT ib_net32_t * const p_qpn,OUT uint8_t * const p_resp_time_val)7516 ib_inform_info_get_qpn_resp_time(IN const ib_net32_t qpn_resp_time_val,
7517 				 OUT ib_net32_t * const p_qpn,
7518 				 OUT uint8_t * const p_resp_time_val)
7519 {
7520 	uint32_t tmp = cl_ntoh32(qpn_resp_time_val);
7521 
7522 	if (p_qpn)
7523 		*p_qpn = cl_hton32((tmp & 0xffffff00) >> 8);
7524 
7525 	if (p_resp_time_val)
7526 		*p_resp_time_val = (uint8_t) (tmp & 0x0000001f);
7527 }
7528 
7529 /*
7530 * PARAMETERS
7531 *	qpn_resp_time_val
7532 *		[in] the  qpn and resp time val from the mad
7533 *
7534 * RETURN VALUES
7535 *	p_qpn
7536 *		[out] pointer to the qpn
7537 *
7538 *	p_state
7539 *		[out] pointer to the resp time val
7540 *
7541 * NOTES
7542 *
7543 * SEE ALSO
7544 *	ib_inform_info_t
7545 *********/
7546 
7547 /****f* IBA Base: Types/ib_inform_info_set_qpn
7548 * NAME
7549 *	ib_inform_info_set_qpn
7550 *
7551 * DESCRIPTION
7552 *	Set the QPN of the inform info
7553 *
7554 * SYNOPSIS
7555 */
7556 static inline void OSM_API
ib_inform_info_set_qpn(IN ib_inform_info_t * p_ii,IN ib_net32_t const qpn)7557 ib_inform_info_set_qpn(IN ib_inform_info_t * p_ii, IN ib_net32_t const qpn)
7558 {
7559 	uint32_t tmp = cl_ntoh32(p_ii->g_or_v.generic.qpn_resp_time_val);
7560 
7561 	p_ii->g_or_v.generic.qpn_resp_time_val =
7562 	    cl_hton32((tmp & 0x000000ff) | ((cl_ntoh32(qpn) << 8) & 0xffffff00)
7563 	    );
7564 }
7565 
7566 /*
7567 * PARAMETERS
7568 *
7569 * NOTES
7570 *
7571 * SEE ALSO
7572 *	ib_inform_info_t
7573 *********/
7574 
7575 /****f* IBA Base: Types/ib_inform_info_get_prod_type
7576 * NAME
7577 *	ib_inform_info_get_prod_type
7578 *
7579 * DESCRIPTION
7580 *	Get Producer Type of the Inform Info
7581 *	13.4.8.3 InformInfo
7582 *
7583 * SYNOPSIS
7584 */
7585 static inline ib_net32_t OSM_API
ib_inform_info_get_prod_type(IN const ib_inform_info_t * p_inf)7586 ib_inform_info_get_prod_type(IN const ib_inform_info_t * p_inf)
7587 {
7588 	uint32_t nt;
7589 
7590 	nt = cl_ntoh16(p_inf->g_or_v.generic.node_type_lsb) |
7591 	    (p_inf->g_or_v.generic.node_type_msb << 16);
7592 	return cl_hton32(nt);
7593 }
7594 
7595 /*
7596 * PARAMETERS
7597 *	p_inf
7598 *		[in] pointer to an inform info
7599 *
7600 * RETURN VALUES
7601 *     The producer type
7602 *
7603 * NOTES
7604 *
7605 * SEE ALSO
7606 *	ib_inform_info_t
7607 *********/
7608 
7609 /****f* IBA Base: Types/ib_inform_info_get_vend_id
7610 * NAME
7611 *	ib_inform_info_get_vend_id
7612 *
7613 * DESCRIPTION
7614 *	Get Node Type of the Inform Info
7615 *
7616 * SYNOPSIS
7617 */
7618 static inline ib_net32_t OSM_API
ib_inform_info_get_vend_id(IN const ib_inform_info_t * p_inf)7619 ib_inform_info_get_vend_id(IN const ib_inform_info_t * p_inf)
7620 {
7621 	uint32_t vi;
7622 
7623 	vi = cl_ntoh16(p_inf->g_or_v.vend.vendor_id_lsb) |
7624 	    (p_inf->g_or_v.vend.vendor_id_msb << 16);
7625 	return cl_hton32(vi);
7626 }
7627 
7628 /*
7629 * PARAMETERS
7630 *	p_inf
7631 *		[in] pointer to an inform info
7632 *
7633 * RETURN VALUES
7634 *     The node type
7635 *
7636 * NOTES
7637 *
7638 * SEE ALSO
7639 *	ib_inform_info_t
7640 *********/
7641 
7642 /****s* IBA Base: Types/ib_inform_info_record_t
7643 * NAME
7644 *	ib_inform_info_record_t
7645 *
7646 * DESCRIPTION
7647 *	IBA defined InformInfo Record. (15.2.5.12)
7648 *
7649 * SYNOPSIS
7650 */
7651 #include <complib/cl_packon.h>
7652 typedef struct _ib_inform_info_record {
7653 	ib_gid_t subscriber_gid;
7654 	ib_net16_t subscriber_enum;
7655 	uint8_t reserved[6];
7656 	ib_inform_info_t inform_info;
7657 	uint8_t pad[4];
7658 } PACK_SUFFIX ib_inform_info_record_t;
7659 #include <complib/cl_packoff.h>
7660 
7661 /****s* IBA Base: Types/ib_perfmgt_mad_t
7662 * NAME
7663 *	ib_perfmgt_mad_t
7664 *
7665 * DESCRIPTION
7666 *	IBA defined Perf Management MAD (16.3.1)
7667 *
7668 * SYNOPSIS
7669 */
7670 #include <complib/cl_packon.h>
7671 typedef struct _ib_perfmgt_mad {
7672 	ib_mad_t header;
7673 	uint8_t resv[40];
7674 
7675 #define	IB_PM_DATA_SIZE		192
7676 	uint8_t data[IB_PM_DATA_SIZE];
7677 
7678 } PACK_SUFFIX ib_perfmgt_mad_t;
7679 #include <complib/cl_packoff.h>
7680 /*
7681 * FIELDS
7682 *	header
7683 *		Common MAD header.
7684 *
7685 *	resv
7686 *		Reserved.
7687 *
7688 *	data
7689 *		Performance Management payload.  The structure and content of this field
7690 *		depends upon the method, attr_id, and attr_mod fields in the header.
7691 *
7692 * SEE ALSO
7693 * ib_mad_t
7694 *********/
7695 
7696 /****s* IBA Base: Types/ib_port_counters
7697 * NAME
7698 *	ib_port_counters_t
7699 *
7700 * DESCRIPTION
7701 *	IBA defined PortCounters Attribute. (16.1.3.5)
7702 *
7703 * SYNOPSIS
7704 */
7705 #include <complib/cl_packon.h>
7706 typedef struct _ib_port_counters {
7707 	uint8_t reserved;
7708 	uint8_t port_select;
7709 	ib_net16_t counter_select;
7710 	ib_net16_t symbol_err_cnt;
7711 	uint8_t link_err_recover;
7712 	uint8_t link_downed;
7713 	ib_net16_t rcv_err;
7714 	ib_net16_t rcv_rem_phys_err;
7715 	ib_net16_t rcv_switch_relay_err;
7716 	ib_net16_t xmit_discards;
7717 	uint8_t xmit_constraint_err;
7718 	uint8_t rcv_constraint_err;
7719 	uint8_t res1;
7720 	uint8_t link_int_buffer_overrun;
7721 	ib_net16_t res2;
7722 	ib_net16_t vl15_dropped;
7723 	ib_net32_t xmit_data;
7724 	ib_net32_t rcv_data;
7725 	ib_net32_t xmit_pkts;
7726 	ib_net32_t rcv_pkts;
7727 } PACK_SUFFIX ib_port_counters_t;
7728 #include <complib/cl_packoff.h>
7729 
7730 #define PC_LINK_INT(integ_buf_over) ((integ_buf_over & 0xF0) >> 4)
7731 #define PC_BUF_OVERRUN(integ_buf_over) (integ_buf_over & 0x0F)
7732 
7733 /****s* IBA Base: Types/ib_port_counters_ext
7734 * NAME
7735 *	ib_port_counters_ext_t
7736 *
7737 * DESCRIPTION
7738 *	IBA defined PortCounters Extended Attribute. (16.1.4.11)
7739 *
7740 * SYNOPSIS
7741 */
7742 #include <complib/cl_packon.h>
7743 typedef struct _ib_port_counters_ext {
7744 	uint8_t reserved;
7745 	uint8_t port_select;
7746 	ib_net16_t counter_select;
7747 	ib_net32_t reserved2;
7748 	ib_net64_t xmit_data;
7749 	ib_net64_t rcv_data;
7750 	ib_net64_t xmit_pkts;
7751 	ib_net64_t rcv_pkts;
7752 	ib_net64_t unicast_xmit_pkts;
7753 	ib_net64_t unicast_rcv_pkts;
7754 	ib_net64_t multicast_xmit_pkts;
7755 	ib_net64_t multicast_rcv_pkts;
7756 } PACK_SUFFIX ib_port_counters_ext_t;
7757 #include <complib/cl_packoff.h>
7758 
7759 /****s* IBA Base: Types/ib_port_samples_control
7760 * NAME
7761 *	ib_port_samples_control_t
7762 *
7763 * DESCRIPTION
7764 *	IBA defined PortSamplesControl Attribute. (16.1.3.2)
7765 *
7766 * SYNOPSIS
7767 */
7768 #include <complib/cl_packon.h>
7769 typedef struct _ib_port_samples_control {
7770 	uint8_t op_code;
7771 	uint8_t port_select;
7772 	uint8_t tick;
7773 	uint8_t counter_width;	/* 5 bits res : 3bits counter_width */
7774 	ib_net32_t counter_mask;	/* 2 bits res : 3 bits counter_mask : 27 bits counter_masks_1to9 */
7775 	ib_net16_t counter_mask_10to14;	/* 1 bits res : 15 bits counter_masks_10to14 */
7776 	uint8_t sample_mech;
7777 	uint8_t sample_status;	/* 6 bits res : 2 bits sample_status */
7778 	ib_net64_t option_mask;
7779 	ib_net64_t vendor_mask;
7780 	ib_net32_t sample_start;
7781 	ib_net32_t sample_interval;
7782 	ib_net16_t tag;
7783 	ib_net16_t counter_select0;
7784 	ib_net16_t counter_select1;
7785 	ib_net16_t counter_select2;
7786 	ib_net16_t counter_select3;
7787 	ib_net16_t counter_select4;
7788 	ib_net16_t counter_select5;
7789 	ib_net16_t counter_select6;
7790 	ib_net16_t counter_select7;
7791 	ib_net16_t counter_select8;
7792 	ib_net16_t counter_select9;
7793 	ib_net16_t counter_select10;
7794 	ib_net16_t counter_select11;
7795 	ib_net16_t counter_select12;
7796 	ib_net16_t counter_select13;
7797 	ib_net16_t counter_select14;
7798 } PACK_SUFFIX ib_port_samples_control_t;
7799 #include <complib/cl_packoff.h>
7800 
7801 /****d* IBA Base: Types/CounterSelect values
7802 * NAME
7803 *       Counter select values
7804 *
7805 * DESCRIPTION
7806 *	Mandatory counter select values (16.1.3.3)
7807 *
7808 * SYNOPSIS
7809 */
7810 #define IB_CS_PORT_XMIT_DATA (CL_HTON16(0x0001))
7811 #define IB_CS_PORT_RCV_DATA  (CL_HTON16(0x0002))
7812 #define IB_CS_PORT_XMIT_PKTS (CL_HTON16(0x0003))
7813 #define IB_CS_PORT_RCV_PKTS  (CL_HTON16(0x0004))
7814 #define IB_CS_PORT_XMIT_WAIT (CL_HTON16(0x0005))
7815 
7816 /****s* IBA Base: Types/ib_port_samples_result
7817 * NAME
7818 *	ib_port_samples_result_t
7819 *
7820 * DESCRIPTION
7821 *	IBA defined PortSamplesControl Attribute. (16.1.3.2)
7822 *
7823 * SYNOPSIS
7824 */
7825 #include <complib/cl_packon.h>
7826 typedef struct _ib_port_samples_result {
7827 	ib_net16_t tag;
7828 	ib_net16_t sample_status;	/* 14 bits res : 2 bits sample_status */
7829 	ib_net32_t counter0;
7830 	ib_net32_t counter1;
7831 	ib_net32_t counter2;
7832 	ib_net32_t counter3;
7833 	ib_net32_t counter4;
7834 	ib_net32_t counter5;
7835 	ib_net32_t counter6;
7836 	ib_net32_t counter7;
7837 	ib_net32_t counter8;
7838 	ib_net32_t counter9;
7839 	ib_net32_t counter10;
7840 	ib_net32_t counter11;
7841 	ib_net32_t counter12;
7842 	ib_net32_t counter13;
7843 	ib_net32_t counter14;
7844 } PACK_SUFFIX ib_port_samples_result_t;
7845 #include <complib/cl_packoff.h>
7846 
7847 /****d* IBA Base: Types/DM_SVC_NAME
7848 * NAME
7849 *	DM_SVC_NAME
7850 *
7851 * DESCRIPTION
7852 *	IBA defined Device Management service name (16.3)
7853 *
7854 * SYNOPSIS
7855 */
7856 #define	DM_SVC_NAME				"DeviceManager.IBTA"
7857 /*
7858 * SEE ALSO
7859 *********/
7860 
7861 /****s* IBA Base: Types/ib_dm_mad_t
7862 * NAME
7863 *	ib_dm_mad_t
7864 *
7865 * DESCRIPTION
7866 *	IBA defined Device Management MAD (16.3.1)
7867 *
7868 * SYNOPSIS
7869 */
7870 #include <complib/cl_packon.h>
7871 typedef struct _ib_dm_mad {
7872 	ib_mad_t header;
7873 	uint8_t resv[40];
7874 
7875 #define	IB_DM_DATA_SIZE		192
7876 	uint8_t data[IB_DM_DATA_SIZE];
7877 
7878 } PACK_SUFFIX ib_dm_mad_t;
7879 #include <complib/cl_packoff.h>
7880 /*
7881 * FIELDS
7882 *	header
7883 *		Common MAD header.
7884 *
7885 *	resv
7886 *		Reserved.
7887 *
7888 *	data
7889 *		Device Management payload.  The structure and content of this field
7890 *		depend upon the method, attr_id, and attr_mod fields in the header.
7891 *
7892 * SEE ALSO
7893 * ib_mad_t
7894 *********/
7895 
7896 /****s* IBA Base: Types/ib_iou_info_t
7897 * NAME
7898 *	ib_iou_info_t
7899 *
7900 * DESCRIPTION
7901 *	IBA defined IO Unit information structure (16.3.3.3)
7902 *
7903 * SYNOPSIS
7904 */
7905 #include <complib/cl_packon.h>
7906 typedef struct _ib_iou_info {
7907 	ib_net16_t change_id;
7908 	uint8_t max_controllers;
7909 	uint8_t diag_rom;
7910 
7911 #define	IB_DM_CTRL_LIST_SIZE	128
7912 
7913 	uint8_t controller_list[IB_DM_CTRL_LIST_SIZE];
7914 #define	IOC_NOT_INSTALLED		0x0
7915 #define	IOC_INSTALLED			0x1
7916 //              Reserved values                         0x02-0xE
7917 #define	SLOT_DOES_NOT_EXIST		0xF
7918 
7919 } PACK_SUFFIX ib_iou_info_t;
7920 #include <complib/cl_packoff.h>
7921 /*
7922 * FIELDS
7923 *	change_id
7924 *		Value incremented, with rollover, by any change to the controller_list.
7925 *
7926 *	max_controllers
7927 *		Number of slots in controller_list.
7928 *
7929 *	diag_rom
7930 *		A byte containing two fields: DiagDeviceID and OptionROM.
7931 *		These fields may be read using the ib_iou_info_diag_dev_id
7932 *		and ib_iou_info_option_rom functions.
7933 *
7934 *	controller_list
7935 *		A series of 4-bit nibbles, with each nibble representing a slot
7936 *		in the IO Unit.  Individual nibbles may be read using the
7937 *		ioc_at_slot function.
7938 *
7939 * SEE ALSO
7940 * ib_dm_mad_t, ib_iou_info_diag_dev_id, ib_iou_info_option_rom, ioc_at_slot
7941 *********/
7942 
7943 /****f* IBA Base: Types/ib_iou_info_diag_dev_id
7944 * NAME
7945 *	ib_iou_info_diag_dev_id
7946 *
7947 * DESCRIPTION
7948 *	Returns the DiagDeviceID.
7949 *
7950 * SYNOPSIS
7951 */
7952 static inline uint8_t OSM_API
ib_iou_info_diag_dev_id(IN const ib_iou_info_t * const p_iou_info)7953 ib_iou_info_diag_dev_id(IN const ib_iou_info_t * const p_iou_info)
7954 {
7955 	return ((uint8_t) (p_iou_info->diag_rom >> 6 & 1));
7956 }
7957 
7958 /*
7959 * PARAMETERS
7960 *	p_iou_info
7961 *		[in] Pointer to the IO Unit information structure.
7962 *
7963 * RETURN VALUES
7964 *	DiagDeviceID field of the IO Unit information.
7965 *
7966 * NOTES
7967 *
7968 * SEE ALSO
7969 *	ib_iou_info_t
7970 *********/
7971 
7972 /****f* IBA Base: Types/ib_iou_info_option_rom
7973 * NAME
7974 *	ib_iou_info_option_rom
7975 *
7976 * DESCRIPTION
7977 *	Returns the OptionROM.
7978 *
7979 * SYNOPSIS
7980 */
7981 static inline uint8_t OSM_API
ib_iou_info_option_rom(IN const ib_iou_info_t * const p_iou_info)7982 ib_iou_info_option_rom(IN const ib_iou_info_t * const p_iou_info)
7983 {
7984 	return ((uint8_t) (p_iou_info->diag_rom >> 7));
7985 }
7986 
7987 /*
7988 * PARAMETERS
7989 *	p_iou_info
7990 *		[in] Pointer to the IO Unit information structure.
7991 *
7992 * RETURN VALUES
7993 *	OptionROM field of the IO Unit information.
7994 *
7995 * NOTES
7996 *
7997 * SEE ALSO
7998 *	ib_iou_info_t
7999 *********/
8000 
8001 /****f* IBA Base: Types/ioc_at_slot
8002 * NAME
8003 *	ioc_at_slot
8004 *
8005 * DESCRIPTION
8006 *	Returns the IOC value at the specified slot.
8007 *
8008 * SYNOPSIS
8009 */
8010 static inline uint8_t OSM_API
ioc_at_slot(IN const ib_iou_info_t * const p_iou_info,IN uint8_t slot)8011 ioc_at_slot(IN const ib_iou_info_t * const p_iou_info, IN uint8_t slot)
8012 {
8013 	if (slot >= IB_DM_CTRL_LIST_SIZE)
8014 		return SLOT_DOES_NOT_EXIST;
8015 	else
8016 		return (int8_t)
8017 		    ((slot % 2) ?
8018 		     ((p_iou_info->controller_list[slot / 2] & 0xf0) >> 4) :
8019 		     (p_iou_info->controller_list[slot / 2] & 0x0f));
8020 }
8021 
8022 /*
8023 * PARAMETERS
8024 *	p_iou_info
8025 *		[in] Pointer to the IO Unit information structure.
8026 *
8027 *	slot
8028 *		[in] Pointer to the IO Unit information structure.
8029 *
8030 * RETURN VALUES
8031 *	OptionROM field of the IO Unit information.
8032 *
8033 * NOTES
8034 *
8035 * SEE ALSO
8036 *	ib_iou_info_t
8037 *********/
8038 
8039 /****s* IBA Base: Types/ib_ioc_profile_t
8040 * NAME
8041 *	ib_ioc_profile_t
8042 *
8043 * DESCRIPTION
8044 *	IBA defined IO Controller profile structure (16.3.3.4)
8045 *
8046 * SYNOPSIS
8047 */
8048 #include <complib/cl_packon.h>
8049 typedef struct _ib_ioc_profile {
8050 	ib_net64_t ioc_guid;
8051 
8052 	ib_net32_t vend_id;
8053 
8054 	ib_net32_t dev_id;
8055 	ib_net16_t dev_ver;
8056 	ib_net16_t resv2;
8057 
8058 	ib_net32_t subsys_vend_id;
8059 	ib_net32_t subsys_id;
8060 
8061 	ib_net16_t io_class;
8062 	ib_net16_t io_subclass;
8063 	ib_net16_t protocol;
8064 	ib_net16_t protocol_ver;
8065 
8066 	ib_net32_t resv3;
8067 	ib_net16_t send_msg_depth;
8068 	uint8_t resv4;
8069 	uint8_t rdma_read_depth;
8070 	ib_net32_t send_msg_size;
8071 	ib_net32_t rdma_size;
8072 
8073 	uint8_t ctrl_ops_cap;
8074 #define	CTRL_OPS_CAP_ST		0x01
8075 #define	CTRL_OPS_CAP_SF		0x02
8076 #define	CTRL_OPS_CAP_RT		0x04
8077 #define	CTRL_OPS_CAP_RF		0x08
8078 #define	CTRL_OPS_CAP_WT		0x10
8079 #define	CTRL_OPS_CAP_WF		0x20
8080 #define	CTRL_OPS_CAP_AT		0x40
8081 #define	CTRL_OPS_CAP_AF		0x80
8082 
8083 	uint8_t resv5;
8084 
8085 	uint8_t num_svc_entries;
8086 #define	MAX_NUM_SVC_ENTRIES	0xff
8087 
8088 	uint8_t resv6[9];
8089 
8090 #define	CTRL_ID_STRING_LEN	64
8091 	char id_string[CTRL_ID_STRING_LEN];
8092 
8093 } PACK_SUFFIX ib_ioc_profile_t;
8094 #include <complib/cl_packoff.h>
8095 /*
8096 * FIELDS
8097 *	ioc_guid
8098 *		An EUI-64 GUID used to uniquely identify the IO controller.
8099 *
8100 *	vend_id
8101 *		IO controller vendor ID, IEEE format.
8102 *
8103 *	dev_id
8104 *		A number assigned by the vendor to identify the type of controller.
8105 *
8106 *	dev_ver
8107 *		A number assigned by the vendor to identify the divice version.
8108 *
8109 *	subsys_vend_id
8110 *		ID of the vendor of the enclosure, if any, in which the IO controller
8111 *		resides in IEEE format; otherwise zero.
8112 *
8113 *	subsys_id
8114 *		A number identifying the subsystem where the controller resides.
8115 *
8116 *	io_class
8117 *		0x0000 - 0xfffe = reserved for IO classes encompased by InfiniBand
8118 *		Architecture.  0xffff = Vendor specific.
8119 *
8120 *	io_subclass
8121 *		0x0000 - 0xfffe = reserved for IO subclasses encompased by InfiniBand
8122 *		Architecture.  0xffff = Vendor specific.  This shall be set to 0xfff
8123 *		if the io_class component is 0xffff.
8124 *
8125 *	protocol
8126 *		0x0000 - 0xfffe = reserved for IO subclasses encompased by InfiniBand
8127 *		Architecture.  0xffff = Vendor specific.  This shall be set to 0xfff
8128 *		if the io_class component is 0xffff.
8129 *
8130 *	protocol_ver
8131 *		Protocol specific.
8132 *
8133 *	send_msg_depth
8134 *		Maximum depth of the send message queue.
8135 *
8136 *	rdma_read_depth
8137 *		Maximum depth of the per-channel RDMA read queue.
8138 *
8139 *	send_msg_size
8140 *		Maximum size of send messages.
8141 *
8142 *	ctrl_ops_cap
8143 *		Supported operation types of this IO controller.  A bit set to one
8144 *		for affirmation of supported capability.
8145 *
8146 *	num_svc_entries
8147 *		Number of entries in the service entries table.
8148 *
8149 *	id_string
8150 *		UTF-8 encoded string for identifying the controller to an operator.
8151 *
8152 * SEE ALSO
8153 * ib_dm_mad_t
8154 *********/
8155 
8156 static inline uint32_t OSM_API
ib_ioc_profile_get_vend_id(IN const ib_ioc_profile_t * const p_ioc_profile)8157 ib_ioc_profile_get_vend_id(IN const ib_ioc_profile_t * const p_ioc_profile)
8158 {
8159 	return (cl_ntoh32(p_ioc_profile->vend_id) >> 8);
8160 }
8161 
8162 static inline void OSM_API
ib_ioc_profile_set_vend_id(IN ib_ioc_profile_t * const p_ioc_profile,IN const uint32_t vend_id)8163 ib_ioc_profile_set_vend_id(IN ib_ioc_profile_t * const p_ioc_profile,
8164 			   IN const uint32_t vend_id)
8165 {
8166 	p_ioc_profile->vend_id = (cl_hton32(vend_id) << 8);
8167 }
8168 
8169 /****s* IBA Base: Types/ib_svc_entry_t
8170 * NAME
8171 *	ib_svc_entry_t
8172 *
8173 * DESCRIPTION
8174 *	IBA defined IO Controller service entry structure (16.3.3.5)
8175 *
8176 * SYNOPSIS
8177 */
8178 #include <complib/cl_packon.h>
8179 typedef struct _ib_svc_entry {
8180 #define	MAX_SVC_ENTRY_NAME_LEN		40
8181 	char name[MAX_SVC_ENTRY_NAME_LEN];
8182 
8183 	ib_net64_t id;
8184 
8185 } PACK_SUFFIX ib_svc_entry_t;
8186 #include <complib/cl_packoff.h>
8187 /*
8188 * FIELDS
8189 *	name
8190 *		UTF-8 encoded, null-terminated name of the service.
8191 *
8192 *	id
8193 *		An identifier of the associated Service.
8194 *
8195 * SEE ALSO
8196 * ib_svc_entries_t
8197 *********/
8198 
8199 /****s* IBA Base: Types/ib_svc_entries_t
8200 * NAME
8201 *	ib_svc_entries_t
8202 *
8203 * DESCRIPTION
8204 *	IBA defined IO Controller service entry array (16.3.3.5)
8205 *
8206 * SYNOPSIS
8207 */
8208 #include <complib/cl_packon.h>
8209 typedef struct _ib_svc_entries {
8210 #define	SVC_ENTRY_COUNT			4
8211 	ib_svc_entry_t service_entry[SVC_ENTRY_COUNT];
8212 
8213 } PACK_SUFFIX ib_svc_entries_t;
8214 #include <complib/cl_packoff.h>
8215 /*
8216 * FIELDS
8217 *	service_entry
8218 *		An array of IO controller service entries.
8219 *
8220 * SEE ALSO
8221 * ib_dm_mad_t, ib_svc_entry_t
8222 *********/
8223 
8224 static inline void OSM_API
ib_dm_get_slot_lo_hi(IN const ib_net32_t slot_lo_hi,OUT uint8_t * const p_slot,OUT uint8_t * const p_lo,OUT uint8_t * const p_hi)8225 ib_dm_get_slot_lo_hi(IN const ib_net32_t slot_lo_hi,
8226 		     OUT uint8_t * const p_slot,
8227 		     OUT uint8_t * const p_lo, OUT uint8_t * const p_hi)
8228 {
8229 	ib_net32_t tmp_slot_lo_hi = CL_NTOH32(slot_lo_hi);
8230 
8231 	if (p_slot)
8232 		*p_slot = (uint8_t) ((tmp_slot_lo_hi >> 16) & 0x0f);
8233 
8234 	if (p_hi)
8235 		*p_hi = (uint8_t) ((tmp_slot_lo_hi >> 8) & 0xff);
8236 
8237 	if (p_lo)
8238 		*p_lo = (uint8_t) ((tmp_slot_lo_hi >> 0) & 0xff);
8239 }
8240 
8241 /*
8242  *	IBA defined information describing an I/O controller
8243  */
8244 #include <complib/cl_packon.h>
8245 typedef struct _ib_ioc_info {
8246 	ib_net64_t module_guid;
8247 	ib_net64_t iou_guid;
8248 	ib_ioc_profile_t ioc_profile;
8249 	ib_net64_t access_key;
8250 	uint16_t initiators_conf;
8251 	uint8_t resv[38];
8252 
8253 } PACK_SUFFIX ib_ioc_info_t;
8254 #include <complib/cl_packoff.h>
8255 
8256 /*
8257  *	The following definitions are shared between the Access Layer and VPD
8258  */
8259 typedef struct _ib_ca *__ptr64 ib_ca_handle_t;
8260 typedef struct _ib_pd *__ptr64 ib_pd_handle_t;
8261 typedef struct _ib_rdd *__ptr64 ib_rdd_handle_t;
8262 typedef struct _ib_mr *__ptr64 ib_mr_handle_t;
8263 typedef struct _ib_mw *__ptr64 ib_mw_handle_t;
8264 typedef struct _ib_qp *__ptr64 ib_qp_handle_t;
8265 typedef struct _ib_eec *__ptr64 ib_eec_handle_t;
8266 typedef struct _ib_cq *__ptr64 ib_cq_handle_t;
8267 typedef struct _ib_av *__ptr64 ib_av_handle_t;
8268 typedef struct _ib_mcast *__ptr64 ib_mcast_handle_t;
8269 
8270 /* Currently for windows branch, use the extended version of ib special verbs struct
8271 	in order to be compliant with Infinicon ib_types; later we'll change it to support
8272 	OpenSM ib_types.h */
8273 
8274 #ifndef WIN32
8275 /****d* Access Layer/ib_api_status_t
8276 * NAME
8277 *	ib_api_status_t
8278 *
8279 * DESCRIPTION
8280 *	Function return codes indicating the success or failure of an API call.
8281 *	Note that success is indicated by the return value IB_SUCCESS, which
8282 *	is always zero.
8283 *
8284 * NOTES
8285 *	IB_VERBS_PROCESSING_DONE is used by UVP library to terminate a verbs call
8286 *	in the pre-ioctl step itself.
8287 *
8288 * SYNOPSIS
8289 */
8290 typedef enum _ib_api_status_t {
8291 	IB_SUCCESS,
8292 	IB_INSUFFICIENT_RESOURCES,
8293 	IB_INSUFFICIENT_MEMORY,
8294 	IB_INVALID_PARAMETER,
8295 	IB_INVALID_SETTING,
8296 	IB_NOT_FOUND,
8297 	IB_TIMEOUT,
8298 	IB_CANCELED,
8299 	IB_INTERRUPTED,
8300 	IB_INVALID_PERMISSION,
8301 	IB_UNSUPPORTED,
8302 	IB_OVERFLOW,
8303 	IB_MAX_MCAST_QPS_REACHED,
8304 	IB_INVALID_QP_STATE,
8305 	IB_INVALID_EEC_STATE,
8306 	IB_INVALID_APM_STATE,
8307 	IB_INVALID_PORT_STATE,
8308 	IB_INVALID_STATE,
8309 	IB_RESOURCE_BUSY,
8310 	IB_INVALID_PKEY,
8311 	IB_INVALID_LKEY,
8312 	IB_INVALID_RKEY,
8313 	IB_INVALID_MAX_WRS,
8314 	IB_INVALID_MAX_SGE,
8315 	IB_INVALID_CQ_SIZE,
8316 	IB_INVALID_SERVICE_TYPE,
8317 	IB_INVALID_GID,
8318 	IB_INVALID_LID,
8319 	IB_INVALID_GUID,
8320 	IB_INVALID_CA_HANDLE,
8321 	IB_INVALID_AV_HANDLE,
8322 	IB_INVALID_CQ_HANDLE,
8323 	IB_INVALID_EEC_HANDLE,
8324 	IB_INVALID_QP_HANDLE,
8325 	IB_INVALID_PD_HANDLE,
8326 	IB_INVALID_MR_HANDLE,
8327 	IB_INVALID_MW_HANDLE,
8328 	IB_INVALID_RDD_HANDLE,
8329 	IB_INVALID_MCAST_HANDLE,
8330 	IB_INVALID_CALLBACK,
8331 	IB_INVALID_AL_HANDLE,	/* InfiniBand Access Layer */
8332 	IB_INVALID_HANDLE,	/* InfiniBand Access Layer */
8333 	IB_ERROR,		/* InfiniBand Access Layer */
8334 	IB_REMOTE_ERROR,	/* Infiniband Access Layer */
8335 	IB_VERBS_PROCESSING_DONE,	/* See Notes above         */
8336 	IB_INVALID_WR_TYPE,
8337 	IB_QP_IN_TIMEWAIT,
8338 	IB_EE_IN_TIMEWAIT,
8339 	IB_INVALID_PORT,
8340 	IB_NOT_DONE,
8341 	IB_UNKNOWN_ERROR	/* ALWAYS LAST ENUM VALUE! */
8342 } ib_api_status_t;
8343 /*****/
8344 
8345 OSM_EXPORT const char *ib_error_str[];
8346 
8347 /****f* IBA Base: Types/ib_get_err_str
8348 * NAME
8349 *	ib_get_err_str
8350 *
8351 * DESCRIPTION
8352 *	Returns a string for the specified status value.
8353 *
8354 * SYNOPSIS
8355 */
ib_get_err_str(IN ib_api_status_t status)8356 static inline const char *OSM_API ib_get_err_str(IN ib_api_status_t status)
8357 {
8358 	if (status > IB_UNKNOWN_ERROR)
8359 		status = IB_UNKNOWN_ERROR;
8360 	return (ib_error_str[status]);
8361 }
8362 
8363 /*
8364 * PARAMETERS
8365 *	status
8366 *		[in] status value
8367 *
8368 * RETURN VALUES
8369 *	Pointer to the status description string.
8370 *
8371 * NOTES
8372 *
8373 * SEE ALSO
8374 *********/
8375 
8376 /****d* Verbs/ib_async_event_t
8377 * NAME
8378 *	ib_async_event_t -- Async event types
8379 *
8380 * DESCRIPTION
8381 *	This type indicates the reason the async callback was called.
8382 *	The context in the ib_event_rec_t indicates the resource context
8383 *	that associated with the callback.  For example, for IB_AE_CQ_ERROR
8384 *	the context provided during the ib_create_cq is returned in the event.
8385 *
8386 * SYNOPSIS
8387 */
8388 typedef enum _ib_async_event_t {
8389 	IB_AE_SQ_ERROR = 1,
8390 	IB_AE_SQ_DRAINED,
8391 	IB_AE_RQ_ERROR,
8392 	IB_AE_CQ_ERROR,
8393 	IB_AE_QP_FATAL,
8394 	IB_AE_QP_COMM,
8395 	IB_AE_QP_APM,
8396 	IB_AE_EEC_FATAL,
8397 	IB_AE_EEC_COMM,
8398 	IB_AE_EEC_APM,
8399 	IB_AE_LOCAL_FATAL,
8400 	IB_AE_PKEY_TRAP,
8401 	IB_AE_QKEY_TRAP,
8402 	IB_AE_MKEY_TRAP,
8403 	IB_AE_PORT_TRAP,
8404 	IB_AE_SYSIMG_GUID_TRAP,
8405 	IB_AE_BUF_OVERRUN,
8406 	IB_AE_LINK_INTEGRITY,
8407 	IB_AE_FLOW_CTRL_ERROR,
8408 	IB_AE_BKEY_TRAP,
8409 	IB_AE_QP_APM_ERROR,
8410 	IB_AE_EEC_APM_ERROR,
8411 	IB_AE_WQ_REQ_ERROR,
8412 	IB_AE_WQ_ACCESS_ERROR,
8413 	IB_AE_PORT_ACTIVE,
8414 	IB_AE_PORT_DOWN,
8415 	IB_AE_UNKNOWN		/* ALWAYS LAST ENUM VALUE */
8416 } ib_async_event_t;
8417 /*
8418 * VALUES
8419 *	IB_AE_SQ_ERROR
8420 *		An error occurred when accessing the send queue of the QP or EEC.
8421 *		This event is optional.
8422 *
8423 *	IB_AE_SQ_DRAINED
8424 *		The send queue of the specified QP has completed the outstanding
8425 *		messages in progress when the state change was requested and, if
8426 *		applicable, has received all acknowledgements for those messages.
8427 *
8428 *	IB_AE_RQ_ERROR
8429 *		An error occurred when accessing the receive queue of the QP or EEC.
8430 *		This event is optional.
8431 *
8432 *	IB_AE_CQ_ERROR
8433 *		An error occurred when writing an entry to the CQ.
8434 *
8435 *	IB_AE_QP_FATAL
8436 *		A catastrophic error occurred while accessing or processing the
8437 *		work queue that prevents reporting of completions.
8438 *
8439 *	IB_AE_QP_COMM
8440 *		The first packet has arrived for the receive work queue where the
8441 *		QP is still in the RTR state.
8442 *
8443 *	IB_AE_QP_APM
8444 *		If alternate path migration is supported, this event indicates that
8445 *		the QP connection has migrated to the alternate path.
8446 *
8447 *	IB_AE_EEC_FATAL
8448 *		If reliable datagram service is supported, this event indicates that
8449 *		a catastrophic error occurred while accessing or processing the EEC
8450 *		that prevents reporting of completions.
8451 *
8452 *	IB_AE_EEC_COMM
8453 *		If reliable datagram service is supported, this event indicates that
8454 *		the first packet has arrived for the receive work queue where the
8455 *		EEC is still in the RTR state.
8456 *
8457 *	IB_AE_EEC_APM
8458 *		If reliable datagram service and alternate path migration is supported,
8459 *		this event indicates that the EEC connection has migrated to the
8460 *		alternate path.
8461 *
8462 *	IB_AE_LOCAL_FATAL
8463 *		A catastrophic HCA error occurred which cannot be attributed to any
8464 *		resource; behavior is indeterminate.
8465 *
8466 *	IB_AE_PKEY_TRAP
8467 *		A PKEY violation was detected.  This event is optional.
8468 *
8469 *	IB_AE_QKEY_TRAP
8470 *		A QKEY violation was detected.  This event is optional.
8471 *
8472 *	IB_AE_MKEY_TRAP
8473 *		An MKEY violation was detected.  This event is optional.
8474 *
8475 *	IB_AE_PORT_TRAP
8476 *		A port capability change was detected.  This event is optional.
8477 *
8478 *	IB_AE_SYSIMG_GUID_TRAP
8479 *		If the system image GUID is supported, this event indicates that the
8480 *		system image GUID of this HCA has been changed.  This event is
8481 *		optional.
8482 *
8483 *	IB_AE_BUF_OVERRUN
8484 *		The number of consecutive flow control update periods with at least
8485 *		one overrun error in each period has exceeded the threshold specified
8486 *		in the port info attributes.  This event is optional.
8487 *
8488 *	IB_AE_LINK_INTEGRITY
8489 *		The detection of excessively frequent local physical errors has
8490 *		exceeded the threshold specified in the port info attributes.  This
8491 *		event is optional.
8492 *
8493 *	IB_AE_FLOW_CTRL_ERROR
8494 *		An HCA watchdog timer monitoring the arrival of flow control updates
8495 *		has expired without receiving an update.  This event is optional.
8496 *
8497 *	IB_AE_BKEY_TRAP
8498 *		An BKEY violation was detected.  This event is optional.
8499 *
8500 *	IB_AE_QP_APM_ERROR
8501 *		If alternate path migration is supported, this event indicates that
8502 *		an incoming path migration request to this QP was not accepted.
8503 *
8504 *	IB_AE_EEC_APM_ERROR
8505 *		If reliable datagram service and alternate path migration is supported,
8506 *		this event indicates that an incoming path migration request to this
8507 *		EEC was not accepted.
8508 *
8509 *	IB_AE_WQ_REQ_ERROR
8510 *		An OpCode violation was detected at the responder.
8511 *
8512 *	IB_AE_WQ_ACCESS_ERROR
8513 *		An access violation was detected at the responder.
8514 *
8515 *	IB_AE_PORT_ACTIVE
8516 *		If the port active event is supported, this event is generated
8517 *		when the link becomes active: IB_LINK_ACTIVE.
8518 *
8519 *	IB_AE_PORT_DOWN
8520 *		The link is declared unavailable: IB_LINK_INIT, IB_LINK_ARMED,
8521 *		IB_LINK_DOWN.
8522 *
8523 *	IB_AE_UNKNOWN
8524 *		An unknown error occurred which cannot be attributed to any
8525 *		resource; behavior is indeterminate.
8526 *
8527 *****/
8528 
8529 OSM_EXPORT const char *ib_async_event_str[];
8530 
8531 /****f* IBA Base: Types/ib_get_async_event_str
8532 * NAME
8533 *	ib_get_async_event_str
8534 *
8535 * DESCRIPTION
8536 *	Returns a string for the specified asynchronous event.
8537 *
8538 * SYNOPSIS
8539 */
8540 static inline const char *OSM_API
ib_get_async_event_str(IN ib_async_event_t event)8541 ib_get_async_event_str(IN ib_async_event_t event)
8542 {
8543 	if (event > IB_AE_UNKNOWN)
8544 		event = IB_AE_UNKNOWN;
8545 	return (ib_async_event_str[event]);
8546 }
8547 
8548 /*
8549 * PARAMETERS
8550 *	event
8551 *		[in] event value
8552 *
8553 * RETURN VALUES
8554 *	Pointer to the asynchronous event description string.
8555 *
8556 * NOTES
8557 *
8558 * SEE ALSO
8559 *********/
8560 
8561 /****s* Verbs/ib_event_rec_t
8562 * NAME
8563 *	ib_event_rec_t -- Async event notification record
8564 *
8565 * DESCRIPTION
8566 *	When an async event callback is made, this structure is passed to indicate
8567 *	the type of event, the source of event that caused it, and the context
8568 *	associated with this event.
8569 *
8570 *	context -- Context of the resource that caused the event.
8571 *		-- ca_context if this is a port/adapter event.
8572 *		-- qp_context if the source is a QP event
8573 *		-- cq_context if the source is a CQ event.
8574 *		-- ee_context if the source is an EE event.
8575 *
8576 * SYNOPSIS
8577 */
8578 typedef struct _ib_event_rec {
8579 	void *context;
8580 	ib_async_event_t type;
8581 
8582 	/* HCA vendor specific event information. */
8583 	uint64_t vendor_specific;
8584 
8585 	/* The following structures are valid only for trap types. */
8586 	union _trap {
8587 		struct {
8588 			uint16_t lid;
8589 			ib_net64_t port_guid;
8590 			uint8_t port_num;
8591 
8592 			/*
8593 			 * The following structure is valid only for
8594 			 * P_KEY, Q_KEY, and M_KEY violation traps.
8595 			 */
8596 			struct {
8597 				uint8_t sl;
8598 				uint16_t src_lid;
8599 				uint16_t dest_lid;
8600 				union _key {
8601 					uint16_t pkey;
8602 					uint32_t qkey;
8603 					uint64_t mkey;
8604 				} key;
8605 				uint32_t src_qp;
8606 				uint32_t dest_qp;
8607 				ib_gid_t src_gid;
8608 				ib_gid_t dest_gid;
8609 
8610 			} violation;
8611 
8612 		} info;
8613 
8614 		ib_net64_t sysimg_guid;
8615 
8616 	} trap;
8617 
8618 } ib_event_rec_t;
8619 /*******/
8620 
8621 /****d* Access Layer/ib_atomic_t
8622 * NAME
8623 *	ib_atomic_t
8624 *
8625 * DESCRIPTION
8626 *	Indicates atomicity levels supported by an adapter.
8627 *
8628 * SYNOPSIS
8629 */
8630 typedef enum _ib_atomic_t {
8631 	IB_ATOMIC_NONE,
8632 	IB_ATOMIC_LOCAL,
8633 	IB_ATOMIC_GLOBAL
8634 } ib_atomic_t;
8635 /*
8636 * VALUES
8637 *	IB_ATOMIC_NONE
8638 *		Atomic operations not supported.
8639 *
8640 *	IB_ATOMIC_LOCAL
8641 *		Atomic operations guaranteed between QPs of a single CA.
8642 *
8643 *	IB_ATOMIC_GLOBAL
8644 *		Atomic operations are guaranteed between CA and any other entity
8645 *		in the system.
8646 *****/
8647 
8648 /****s* Access Layer/ib_port_cap_t
8649 * NAME
8650 *	ib_port_cap_t
8651 *
8652 * DESCRIPTION
8653 *	Indicates which management agents are currently available on the specified
8654 *	port.
8655 *
8656 * SYNOPSIS
8657 */
8658 typedef struct _ib_port_cap {
8659 	boolean_t cm;
8660 	boolean_t snmp;
8661 	boolean_t dev_mgmt;
8662 	boolean_t vend;
8663 	boolean_t sm;
8664 	boolean_t sm_disable;
8665 	boolean_t qkey_ctr;
8666 	boolean_t pkey_ctr;
8667 	boolean_t notice;
8668 	boolean_t trap;
8669 	boolean_t apm;
8670 	boolean_t slmap;
8671 	boolean_t pkey_nvram;
8672 	boolean_t mkey_nvram;
8673 	boolean_t sysguid;
8674 	boolean_t dr_notice;
8675 	boolean_t boot_mgmt;
8676 	boolean_t capm_notice;
8677 	boolean_t reinit;
8678 	boolean_t ledinfo;
8679 	boolean_t port_active;
8680 
8681 } ib_port_cap_t;
8682 /*****/
8683 
8684 /****d* Access Layer/ib_init_type_t
8685 * NAME
8686 *	ib_init_type_t
8687 *
8688 * DESCRIPTION
8689 *	If supported by the HCA, the type of initialization requested by
8690 *	this port before SM moves it to the active or armed state.  If the
8691 *	SM implements reinitialization, it shall set these bits to indicate
8692 *	the type of initialization performed prior to activating the port.
8693 *	Otherwise, these bits shall be set to 0.
8694 *
8695 * SYNOPSIS
8696 */
8697 typedef uint8_t ib_init_type_t;
8698 #define IB_INIT_TYPE_NO_LOAD			0x01
8699 #define IB_INIT_TYPE_PRESERVE_CONTENT		0x02
8700 #define IB_INIT_TYPE_PRESERVE_PRESENCE		0x04
8701 #define IB_INIT_TYPE_DO_NOT_RESUSCITATE		0x08
8702 /*****/
8703 
8704 /****s* Access Layer/ib_port_attr_mod_t
8705 * NAME
8706 *	ib_port_attr_mod_t
8707 *
8708 * DESCRIPTION
8709 *	Port attributes that may be modified.
8710 *
8711 * SYNOPSIS
8712 */
8713 typedef struct _ib_port_attr_mod {
8714 	ib_port_cap_t cap;
8715 	uint16_t pkey_ctr;
8716 	uint16_t qkey_ctr;
8717 
8718 	ib_init_type_t init_type;
8719 	ib_net64_t system_image_guid;
8720 
8721 } ib_port_attr_mod_t;
8722 /*
8723 * SEE ALSO
8724 *	ib_port_cap_t
8725 *****/
8726 
8727 /****s* Access Layer/ib_port_attr_t
8728 * NAME
8729 *	ib_port_attr_t
8730 *
8731 * DESCRIPTION
8732 *	Information about a port on a given channel adapter.
8733 *
8734 * SYNOPSIS
8735 */
8736 typedef struct _ib_port_attr {
8737 	ib_net64_t port_guid;
8738 	uint8_t port_num;
8739 	uint8_t mtu;
8740 	uint64_t max_msg_size;
8741 	ib_net16_t lid;
8742 	uint8_t lmc;
8743 
8744 	/*
8745 	 * LinkWidthSupported as defined in PortInfo.  Required to calculate
8746 	 * inter-packet delay (a.k.a. static rate).
8747 	 */
8748 	uint8_t link_width_supported;
8749 
8750 	uint16_t max_vls;
8751 
8752 	ib_net16_t sm_lid;
8753 	uint8_t sm_sl;
8754 	uint8_t link_state;
8755 
8756 	ib_init_type_t init_type_reply;	/* Optional */
8757 
8758 	/*
8759 	 * subnet_timeout:
8760 	 * The maximum expected subnet propagation delay to reach any port on
8761 	 * the subnet.  This value also determines the rate at which traps can
8762 	 * be generated from this node.
8763 	 *
8764 	 * timeout = 4.096 microseconds * 2^subnet_timeout
8765 	 */
8766 	uint8_t subnet_timeout;
8767 
8768 	ib_port_cap_t cap;
8769 	uint16_t pkey_ctr;
8770 	uint16_t qkey_ctr;
8771 
8772 	uint16_t num_gids;
8773 	uint16_t num_pkeys;
8774 	/*
8775 	 * Pointers at the end of the structure to allow doing a simple
8776 	 * memory comparison of contents up to the first pointer.
8777 	 */
8778 	ib_gid_t *p_gid_table;
8779 	ib_net16_t *p_pkey_table;
8780 
8781 } ib_port_attr_t;
8782 /*
8783 * SEE ALSO
8784 *	uint8_t, ib_port_cap_t, ib_link_states_t
8785 *****/
8786 
8787 /****s* Access Layer/ib_ca_attr_t
8788 * NAME
8789 *	ib_ca_attr_t
8790 *
8791 * DESCRIPTION
8792 *	Information about a channel adapter.
8793 *
8794 * SYNOPSIS
8795 */
8796 typedef struct _ib_ca_attr {
8797 	ib_net64_t ca_guid;
8798 
8799 	uint32_t vend_id;
8800 	uint16_t dev_id;
8801 	uint16_t revision;
8802 	uint64_t fw_ver;
8803 
8804 	/*
8805 	 * Total size of the ca attributes in bytes
8806 	 */
8807 	uint32_t size;
8808 	uint32_t max_qps;
8809 	uint32_t max_wrs;
8810 
8811 	uint32_t max_sges;
8812 	uint32_t max_rd_sges;
8813 
8814 	uint32_t max_cqs;
8815 	uint32_t max_cqes;
8816 
8817 	uint32_t max_pds;
8818 
8819 	uint32_t init_regions;
8820 	uint64_t init_region_size;
8821 
8822 	uint32_t init_windows;
8823 	uint32_t max_addr_handles;
8824 
8825 	uint32_t max_partitions;
8826 
8827 	ib_atomic_t atomicity;
8828 
8829 	uint8_t max_qp_resp_res;
8830 	uint8_t max_eec_resp_res;
8831 	uint8_t max_resp_res;
8832 
8833 	uint8_t max_qp_init_depth;
8834 	uint8_t max_eec_init_depth;
8835 
8836 	uint32_t max_eecs;
8837 	uint32_t max_rdds;
8838 
8839 	uint32_t max_ipv6_qps;
8840 	uint32_t max_ether_qps;
8841 
8842 	uint32_t max_mcast_grps;
8843 	uint32_t max_mcast_qps;
8844 	uint32_t max_qps_per_mcast_grp;
8845 	uint32_t max_fmr;
8846 	uint32_t max_map_per_fmr;
8847 
8848 	/*
8849 	 * local_ack_delay:
8850 	 * Specifies the maximum time interval between the local CA receiving
8851 	 * a message and the transmission of the associated ACK or NAK.
8852 	 *
8853 	 * timeout = 4.096 microseconds * 2^local_ack_delay
8854 	 */
8855 	uint8_t local_ack_delay;
8856 
8857 	boolean_t bad_pkey_ctr_support;
8858 	boolean_t bad_qkey_ctr_support;
8859 	boolean_t raw_mcast_support;
8860 	boolean_t apm_support;
8861 	boolean_t av_port_check;
8862 	boolean_t change_primary_port;
8863 	boolean_t modify_wr_depth;
8864 	boolean_t current_qp_state_support;
8865 	boolean_t shutdown_port_capability;
8866 	boolean_t init_type_support;
8867 	boolean_t port_active_event_support;
8868 	boolean_t system_image_guid_support;
8869 	boolean_t hw_agents;
8870 
8871 	ib_net64_t system_image_guid;
8872 
8873 	uint32_t num_page_sizes;
8874 	uint8_t num_ports;
8875 
8876 	uint32_t *p_page_size;
8877 	ib_port_attr_t *p_port_attr;
8878 
8879 } ib_ca_attr_t;
8880 /*
8881 * FIELDS
8882 *	ca_guid
8883 *		GUID for this adapter.
8884 *
8885 *	vend_id
8886 *		IEEE vendor ID for this adapter
8887 *
8888 *	dev_id
8889 *		Device ID of this adapter. (typically from PCI device ID)
8890 *
8891 *	revision
8892 *		Revision ID of this adapter
8893 *
8894 *	fw_ver
8895 *		Device Firmware version.
8896 *
8897 *	size
8898 *		Total size in bytes for the HCA attributes.  This size includes total
8899 *		size required for all the variable members of the structure.  If a
8900 *		vendor requires to pass vendor specific fields beyond this structure,
8901 *		the HCA vendor can choose to report a larger size.  If a vendor is
8902 *		reporting extended vendor specific features, they should also provide
8903 *		appropriate access functions to aid with the required interpretation.
8904 *
8905 *	max_qps
8906 *		Maximum number of QP's supported by this HCA.
8907 *
8908 *	max_wrs
8909 *		Maximum number of work requests supported by this HCA.
8910 *
8911 *	max_sges
8912 *		Maximum number of scatter gather elements supported per work request.
8913 *
8914 *	max_rd_sges
8915 *		Maximum number of scatter gather elements supported for READ work
8916 *		requests for a Reliable Datagram QP.  This value must be zero if RD
8917 *		service is not supported.
8918 *
8919 *	max_cqs
8920 *		Maximum number of Completion Queues supported.
8921 *
8922 *	max_cqes
8923 *		Maximum number of CQ elements supported per CQ.
8924 *
8925 *	max_pds
8926 *		Maximum number of protection domains supported.
8927 *
8928 *	init_regions
8929 *		Initial number of memory regions supported.  These are only informative
8930 *		values.  HCA vendors can extended and grow these limits on demand.
8931 *
8932 *	init_region_size
8933 *		Initial limit on the size of the registered memory region.
8934 *
8935 *	init_windows
8936 *		Initial number of window entries supported.
8937 *
8938 *	max_addr_handles
8939 *		Maximum number of address handles supported.
8940 *
8941 *	max_partitions
8942 *		Maximum number of partitions supported.
8943 *
8944 *	atomicity
8945 *		Indicates level of atomic operations supported by this HCA.
8946 *
8947 *	max_qp_resp_res
8948 *	max_eec_resp_res
8949 *		Maximum limit on number of responder resources for incoming RDMA
8950 *		operations, on QPs and EEC's respectively.
8951 *
8952 *	max_resp_res
8953 *		Maximum number of responder resources per HCA, with this HCA used as
8954 *		the target.
8955 *
8956 *	max_qp_init_depth
8957 *	max_eec_init_depth
8958 *		Maximimum initiator depth per QP or EEC for initiating RDMA reads and
8959 *		atomic operations.
8960 *
8961 *	max_eecs
8962 *		Maximimum number of EEC's supported by the HCA.
8963 *
8964 *	max_rdds
8965 *		Maximum number of Reliable datagram domains supported.
8966 *
8967 *	max_ipv6_qps
8968 *	max_ether_qps
8969 *		Maximum number of IPV6 and raw ether QP's supported by this HCA.
8970 *
8971 *	max_mcast_grps
8972 *		Maximum number of multicast groups supported.
8973 *
8974 *	max_mcast_qps
8975 *		Maximum number of QP's that can support multicast operations.
8976 *
8977 *	max_qps_per_mcast_grp
8978 *		Maximum number of multicast QP's per multicast group.
8979 *
8980 *	local_ack_delay
8981 *		Specifies the maximum time interval between the local CA receiving
8982 *		a message and the transmission of the associated ACK or NAK.
8983 *		timeout = 4.096 microseconds * 2^local_ack_delay
8984 *
8985 *	bad_pkey_ctr_support
8986 *	bad_qkey_ctr_support
8987 *		Indicates support for the bad pkey and qkey counters.
8988 *
8989 *	raw_mcast_support
8990 *		Indicates support for raw packet multicast.
8991 *
8992 *	apm_support
8993 *		Indicates support for Automatic Path Migration.
8994 *
8995 *	av_port_check
8996 *		Indicates ability to check port number in address handles.
8997 *
8998 *	change_primary_port
8999 *		Indicates ability to change primary port for a QP or EEC during a
9000 *		SQD->RTS transition.
9001 *
9002 *	modify_wr_depth
9003 *		Indicates ability to modify QP depth during a modify QP operation.
9004 *		Check the verb specification for permitted states.
9005 *
9006 *	current_qp_state_support
9007 *		Indicates ability of the HCA to support the current QP state modifier
9008 *		during a modify QP operation.
9009 *
9010 *	shutdown_port_capability
9011 *		Shutdown port capability support indicator.
9012 *
9013 *	init_type_support
9014 *		Indicates init_type_reply and ability to set init_type is supported.
9015 *
9016 *	port_active_event_support
9017 *		Port active event support indicator.
9018 *
9019 *	system_image_guid_support
9020 *		System image GUID support indicator.
9021 *
9022 *	hw_agents
9023 *		Indicates SMA is implemented in HW.
9024 *
9025 *	system_image_guid
9026 *		Optional system image GUID.  This field is valid only if the
9027 *		system_image_guid_support flag is set.
9028 *
9029 *	num_page_sizes
9030 *		Indicates support for different page sizes supported by the HCA.
9031 *		The variable size array can be obtained from p_page_size.
9032 *
9033 *	num_ports
9034 *		Number of physical ports supported on this HCA.
9035 *
9036 *	p_page_size
9037 *		Array holding different page size supported.
9038 *
9039 *	p_port_attr
9040 *		Array holding port attributes.
9041 *
9042 * NOTES
9043 *	This structure contains the attributes of a channel adapter.  Users must
9044 *	call ib_copy_ca_attr to copy the contents of this structure to a new
9045 *	memory region.
9046 *
9047 * SEE ALSO
9048 *	ib_port_attr_t, ib_atomic_t, ib_copy_ca_attr
9049 *****/
9050 
9051 /****f* Access layer/ib_copy_ca_attr
9052 * NAME
9053 *	ib_copy_ca_attr
9054 *
9055 * DESCRIPTION
9056 *	Copies CA attributes.
9057 *
9058 * SYNOPSIS
9059 */
9060 ib_ca_attr_t *ib_copy_ca_attr(IN ib_ca_attr_t * const p_dest,
9061 			      IN const ib_ca_attr_t * const p_src);
9062 /*
9063 * PARAMETERS
9064 *	p_dest
9065 *		Pointer to the buffer that is the destination of the copy.
9066 *
9067 *	p_src
9068 *		Pointer to the CA attributes to copy.
9069 *
9070 * RETURN VALUE
9071 *	Pointer to the copied CA attributes.
9072 *
9073 * NOTES
9074 *	The buffer pointed to by the p_dest parameter must be at least the size
9075 *	specified in the size field of the buffer pointed to by p_src.
9076 *
9077 * SEE ALSO
9078 *	ib_ca_attr_t, ib_dup_ca_attr, ib_free_ca_attr
9079 *****/
9080 
9081 /****s* Access Layer/ib_av_attr_t
9082 * NAME
9083 *	ib_av_attr_t
9084 *
9085 * DESCRIPTION
9086 *	IBA address vector.
9087 *
9088 * SYNOPSIS
9089 */
9090 typedef struct _ib_av_attr {
9091 	uint8_t port_num;
9092 
9093 	uint8_t sl;
9094 	ib_net16_t dlid;
9095 
9096 	boolean_t grh_valid;
9097 	ib_grh_t grh;
9098 	uint8_t static_rate;
9099 	uint8_t path_bits;
9100 
9101 	struct _av_conn {
9102 		uint8_t path_mtu;
9103 		uint8_t local_ack_timeout;
9104 		uint8_t seq_err_retry_cnt;
9105 		uint8_t rnr_retry_cnt;
9106 
9107 	} conn;
9108 
9109 } ib_av_attr_t;
9110 /*
9111 * SEE ALSO
9112 *	ib_gid_t
9113 *****/
9114 
9115 /****d* Access Layer/ib_qp_type_t
9116 * NAME
9117 *	ib_qp_type_t
9118 *
9119 * DESCRIPTION
9120 *	Indicates the type of queue pair being created.
9121 *
9122 * SYNOPSIS
9123 */
9124 typedef enum _ib_qp_type {
9125 	IB_QPT_RELIABLE_CONN = 0,	/* Matches CM REQ transport type */
9126 	IB_QPT_UNRELIABLE_CONN = 1,	/* Matches CM REQ transport type */
9127 	IB_QPT_RELIABLE_DGRM = 2,	/* Matches CM REQ transport type */
9128 	IB_QPT_UNRELIABLE_DGRM,
9129 	IB_QPT_QP0,
9130 	IB_QPT_QP1,
9131 	IB_QPT_RAW_IPV6,
9132 	IB_QPT_RAW_ETHER,
9133 	IB_QPT_MAD,		/* InfiniBand Access Layer */
9134 	IB_QPT_QP0_ALIAS,	/* InfiniBand Access Layer */
9135 	IB_QPT_QP1_ALIAS	/* InfiniBand Access Layer */
9136 } ib_qp_type_t;
9137 /*
9138 * VALUES
9139 *	IB_QPT_RELIABLE_CONN
9140 *		Reliable, connected queue pair.
9141 *
9142 *	IB_QPT_UNRELIABLE_CONN
9143 *		Unreliable, connected queue pair.
9144 *
9145 *	IB_QPT_RELIABLE_DGRM
9146 *		Reliable, datagram queue pair.
9147 *
9148 *	IB_QPT_UNRELIABLE_DGRM
9149 *		Unreliable, datagram queue pair.
9150 *
9151 *	IB_QPT_QP0
9152 *		Queue pair 0.
9153 *
9154 *	IB_QPT_QP1
9155 *		Queue pair 1.
9156 *
9157 *	IB_QPT_RAW_DGRM
9158 *		Raw datagram queue pair.
9159 *
9160 *	IB_QPT_RAW_IPV6
9161 *		Raw IP version 6 queue pair.
9162 *
9163 *	IB_QPT_RAW_ETHER
9164 *		Raw Ethernet queue pair.
9165 *
9166 *	IB_QPT_MAD
9167 *		Unreliable, datagram queue pair that will send and receive management
9168 *		datagrams with assistance from the access layer.
9169 *
9170 *	IB_QPT_QP0_ALIAS
9171 *		Alias to queue pair 0.  Aliased QPs can only be created on an aliased
9172 *		protection domain.
9173 *
9174 *	IB_QPT_QP1_ALIAS
9175 *		Alias to queue pair 1.  Aliased QPs can only be created on an aliased
9176 *		protection domain.
9177 *****/
9178 
9179 /****d* Access Layer/ib_access_t
9180 * NAME
9181 *	ib_access_t
9182 *
9183 * DESCRIPTION
9184 *	Indicates the type of access is permitted on resources such as QPs,
9185 *	memory regions and memory windows.
9186 *
9187 * SYNOPSIS
9188 */
9189 typedef uint32_t ib_access_t;
9190 #define IB_AC_RDMA_READ				0x00000001
9191 #define IB_AC_RDMA_WRITE			0x00000002
9192 #define IB_AC_ATOMIC				0x00000004
9193 #define IB_AC_LOCAL_WRITE			0x00000008
9194 #define IB_AC_MW_BIND				0x00000010
9195 /*
9196 * NOTES
9197 *	Users may combine access rights using a bit-wise or operation to specify
9198 *	additional access.  For example: IB_AC_RDMA_READ | IB_AC_RDMA_WRITE grants
9199 *	RDMA read and write access.
9200 *****/
9201 
9202 /****d* Access Layer/ib_qp_state_t
9203 * NAME
9204 *	ib_qp_state_t
9205 *
9206 * DESCRIPTION
9207 *	Indicates or sets the state of a queue pair.  The current state of a queue
9208 *	pair is returned through the ib_qp_query call and set via the
9209 *	ib_qp_modify call.
9210 *
9211 * SYNOPSIS
9212 */
9213 typedef uint32_t ib_qp_state_t;
9214 #define IB_QPS_RESET				0x00000001
9215 #define IB_QPS_INIT				0x00000002
9216 #define IB_QPS_RTR				0x00000004
9217 #define IB_QPS_RTS				0x00000008
9218 #define IB_QPS_SQD				0x00000010
9219 #define IB_QPS_SQD_DRAINING			0x00000030
9220 #define IB_QPS_SQD_DRAINED			0x00000050
9221 #define IB_QPS_SQERR				0x00000080
9222 #define IB_QPS_ERROR				0x00000100
9223 #define IB_QPS_TIME_WAIT			0xDEAD0000	/* InfiniBand Access Layer */
9224 /*****/
9225 
9226 /****d* Access Layer/ib_apm_state_t
9227 * NAME
9228 *	ib_apm_state_t
9229 *
9230 * DESCRIPTION
9231 *	The current automatic path migration state of a queue pair
9232 *
9233 * SYNOPSIS
9234 */
9235 typedef enum _ib_apm_state {
9236 	IB_APM_MIGRATED = 1,
9237 	IB_APM_REARM,
9238 	IB_APM_ARMED
9239 } ib_apm_state_t;
9240 /*****/
9241 
9242 /****s* Access Layer/ib_qp_create_t
9243 * NAME
9244 *	ib_qp_create_t
9245 *
9246 * DESCRIPTION
9247 *	Attributes used to initialize a queue pair at creation time.
9248 *
9249 * SYNOPSIS
9250 */
9251 typedef struct _ib_qp_create {
9252 	ib_qp_type_t qp_type;
9253 
9254 	ib_rdd_handle_t h_rdd;
9255 
9256 	uint32_t sq_depth;
9257 	uint32_t rq_depth;
9258 	uint32_t sq_sge;
9259 	uint32_t rq_sge;
9260 
9261 	ib_cq_handle_t h_sq_cq;
9262 	ib_cq_handle_t h_rq_cq;
9263 
9264 	boolean_t sq_signaled;
9265 
9266 } ib_qp_create_t;
9267 /*
9268 * FIELDS
9269 *	type
9270 *		Specifies the type of queue pair to create.
9271 *
9272 *	h_rdd
9273 *		A handle to a reliable datagram domain to associate with the queue
9274 *		pair.  This field is ignored if the queue pair is not a reliable
9275 *		datagram type queue pair.
9276 *
9277 *	sq_depth
9278 *		Indicates the requested maximum number of work requests that may be
9279 *		outstanding on the queue pair's send queue.  This value must be less
9280 *		than or equal to the maximum reported by the channel adapter associated
9281 *		with the queue pair.
9282 *
9283 *	rq_depth
9284 *		Indicates the requested maximum number of work requests that may be
9285 *		outstanding on the queue pair's receive queue.  This value must be less
9286 *		than or equal to the maximum reported by the channel adapter associated
9287 *		with the queue pair.
9288 *
9289 *	sq_sge
9290 *		Indicates the maximum number scatter-gather elements that may be
9291 *		given in a send work request.  This value must be less
9292 *		than or equal to the maximum reported by the channel adapter associated
9293 *		with the queue pair.
9294 *
9295 *	rq_sge
9296 *		Indicates the maximum number scatter-gather elements that may be
9297 *		given in a receive work request.  This value must be less
9298 *		than or equal to the maximum reported by the channel adapter associated
9299 *		with the queue pair.
9300 *
9301 *	h_sq_cq
9302 *		A handle to the completion queue that will be used to report send work
9303 *		request completions.  This handle must be NULL if the type is
9304 *		IB_QPT_MAD, IB_QPT_QP0_ALIAS, or IB_QPT_QP1_ALIAS.
9305 *
9306 *	h_rq_cq
9307 *		A handle to the completion queue that will be used to report receive
9308 *		work request completions.  This handle must be NULL if the type is
9309 *		IB_QPT_MAD, IB_QPT_QP0_ALIAS, or IB_QPT_QP1_ALIAS.
9310 *
9311 *	sq_signaled
9312 *		A flag that is used to indicate whether the queue pair will signal
9313 *		an event upon completion of a send work request.  If set to
9314 *		TRUE, send work requests will always generate a completion
9315 *		event.  If set to FALSE, a completion event will only be
9316 *		generated if the send_opt field of the send work request has the
9317 *		IB_SEND_OPT_SIGNALED flag set.
9318 *
9319 * SEE ALSO
9320 *	ib_qp_type_t, ib_qp_attr_t
9321 *****/
9322 
9323 /****s* Access Layer/ib_qp_attr_t
9324 * NAME
9325 *	ib_qp_attr_t
9326 *
9327 * DESCRIPTION
9328 *	Queue pair attributes returned through ib_query_qp.
9329 *
9330 * SYNOPSIS
9331 */
9332 typedef struct _ib_qp_attr {
9333 	ib_pd_handle_t h_pd;
9334 	ib_qp_type_t qp_type;
9335 	ib_access_t access_ctrl;
9336 	uint16_t pkey_index;
9337 
9338 	uint32_t sq_depth;
9339 	uint32_t rq_depth;
9340 	uint32_t sq_sge;
9341 	uint32_t rq_sge;
9342 	uint8_t init_depth;
9343 	uint8_t resp_res;
9344 
9345 	ib_cq_handle_t h_sq_cq;
9346 	ib_cq_handle_t h_rq_cq;
9347 	ib_rdd_handle_t h_rdd;
9348 
9349 	boolean_t sq_signaled;
9350 
9351 	ib_qp_state_t state;
9352 	ib_net32_t num;
9353 	ib_net32_t dest_num;
9354 	ib_net32_t qkey;
9355 
9356 	ib_net32_t sq_psn;
9357 	ib_net32_t rq_psn;
9358 
9359 	uint8_t primary_port;
9360 	uint8_t alternate_port;
9361 	ib_av_attr_t primary_av;
9362 	ib_av_attr_t alternate_av;
9363 	ib_apm_state_t apm_state;
9364 
9365 } ib_qp_attr_t;
9366 /*
9367 * FIELDS
9368 *	h_pd
9369 *		This is a handle to a protection domain associated with the queue
9370 *		pair, or NULL if the queue pair is type IB_QPT_RELIABLE_DGRM.
9371 *
9372 * NOTES
9373 *	Other fields are defined by the Infiniband specification.
9374 *
9375 * SEE ALSO
9376 *	ib_qp_type_t, ib_access_t, ib_qp_state_t, ib_av_attr_t, ib_apm_state_t
9377 *****/
9378 
9379 /****d* Access Layer/ib_qp_opts_t
9380 * NAME
9381 *	ib_qp_opts_t
9382 *
9383 * DESCRIPTION
9384 *	Optional fields supplied in the modify QP operation.
9385 *
9386 * SYNOPSIS
9387 */
9388 typedef uint32_t ib_qp_opts_t;
9389 #define IB_MOD_QP_ALTERNATE_AV			0x00000001
9390 #define IB_MOD_QP_PKEY				0x00000002
9391 #define IB_MOD_QP_APM_STATE			0x00000004
9392 #define IB_MOD_QP_PRIMARY_AV			0x00000008
9393 #define IB_MOD_QP_RNR_NAK_TIMEOUT		0x00000010
9394 #define IB_MOD_QP_RESP_RES			0x00000020
9395 #define IB_MOD_QP_INIT_DEPTH			0x00000040
9396 #define IB_MOD_QP_PRIMARY_PORT			0x00000080
9397 #define IB_MOD_QP_ACCESS_CTRL			0x00000100
9398 #define IB_MOD_QP_QKEY				0x00000200
9399 #define IB_MOD_QP_SQ_DEPTH			0x00000400
9400 #define IB_MOD_QP_RQ_DEPTH			0x00000800
9401 #define IB_MOD_QP_CURRENT_STATE			0x00001000
9402 #define IB_MOD_QP_RETRY_CNT			0x00002000
9403 #define IB_MOD_QP_LOCAL_ACK_TIMEOUT		0x00004000
9404 #define IB_MOD_QP_RNR_RETRY_CNT			0x00008000
9405 /*
9406 * SEE ALSO
9407 *	ib_qp_mod_t
9408 *****/
9409 
9410 /****s* Access Layer/ib_qp_mod_t
9411 * NAME
9412 *	ib_qp_mod_t
9413 *
9414 * DESCRIPTION
9415 *	Information needed to change the state of a queue pair through the
9416 *	ib_modify_qp call.
9417 *
9418 * SYNOPSIS
9419 */
9420 typedef struct _ib_qp_mod {
9421 	ib_qp_state_t req_state;
9422 
9423 	union _qp_state {
9424 		struct _qp_reset {
9425 			/*
9426 			 * Time, in milliseconds, that the QP needs to spend in
9427 			 * the time wait state before being reused.
9428 			 */
9429 			uint32_t timewait;
9430 
9431 		} reset;
9432 
9433 		struct _qp_init {
9434 			ib_qp_opts_t opts;
9435 			uint8_t primary_port;
9436 			ib_net32_t qkey;
9437 			uint16_t pkey_index;
9438 			ib_access_t access_ctrl;
9439 
9440 		} init;
9441 
9442 		struct _qp_rtr {
9443 			ib_net32_t rq_psn;
9444 			ib_net32_t dest_qp;
9445 			ib_av_attr_t primary_av;
9446 			uint8_t resp_res;
9447 
9448 			ib_qp_opts_t opts;
9449 			ib_av_attr_t alternate_av;
9450 			ib_net32_t qkey;
9451 			uint16_t pkey_index;
9452 			ib_access_t access_ctrl;
9453 			uint32_t sq_depth;
9454 			uint32_t rq_depth;
9455 			uint8_t rnr_nak_timeout;
9456 
9457 		} rtr;
9458 
9459 		struct _qp_rts {
9460 			ib_net32_t sq_psn;
9461 			uint8_t retry_cnt;
9462 			uint8_t rnr_retry_cnt;
9463 			uint8_t rnr_nak_timeout;
9464 			uint8_t local_ack_timeout;
9465 			uint8_t init_depth;
9466 
9467 			ib_qp_opts_t opts;
9468 			ib_qp_state_t current_state;
9469 			ib_net32_t qkey;
9470 			ib_access_t access_ctrl;
9471 			uint8_t resp_res;
9472 
9473 			ib_av_attr_t primary_av;
9474 			ib_av_attr_t alternate_av;
9475 
9476 			uint32_t sq_depth;
9477 			uint32_t rq_depth;
9478 
9479 			ib_apm_state_t apm_state;
9480 			uint8_t primary_port;
9481 			uint16_t pkey_index;
9482 
9483 		} rts;
9484 
9485 		struct _qp_sqd {
9486 			boolean_t sqd_event;
9487 
9488 		} sqd;
9489 
9490 	} state;
9491 
9492 } ib_qp_mod_t;
9493 /*
9494 * SEE ALSO
9495 *	ib_qp_state_t, ib_access_t, ib_av_attr_t, ib_apm_state_t
9496 *****/
9497 
9498 /****s* Access Layer/ib_eec_attr_t
9499 * NAME
9500 *	ib_eec_attr_t
9501 *
9502 * DESCRIPTION
9503 *	Information about an end-to-end context.
9504 *
9505 * SYNOPSIS
9506 */
9507 typedef struct _ib_eec_attr {
9508 	ib_qp_state_t state;
9509 	ib_rdd_handle_t h_rdd;
9510 	ib_net32_t local_eecn;
9511 
9512 	ib_net32_t sq_psn;
9513 	ib_net32_t rq_psn;
9514 	uint8_t primary_port;
9515 	uint16_t pkey_index;
9516 	uint32_t resp_res;
9517 	ib_net32_t remote_eecn;
9518 	uint32_t init_depth;
9519 	uint32_t dest_num;	// ??? What is this?
9520 	ib_av_attr_t primary_av;
9521 	ib_av_attr_t alternate_av;
9522 	ib_apm_state_t apm_state;
9523 
9524 } ib_eec_attr_t;
9525 /*
9526 * SEE ALSO
9527 *	ib_qp_state_t, ib_av_attr_t, ib_apm_state_t
9528 *****/
9529 
9530 /****d* Access Layer/ib_eec_opts_t
9531 * NAME
9532 *	ib_eec_opts_t
9533 *
9534 * DESCRIPTION
9535 *	Optional fields supplied in the modify EEC operation.
9536 *
9537 * SYNOPSIS
9538 */
9539 typedef uint32_t ib_eec_opts_t;
9540 #define IB_MOD_EEC_ALTERNATE_AV			0x00000001
9541 #define IB_MOD_EEC_PKEY				0x00000002
9542 #define IB_MOD_EEC_APM_STATE			0x00000004
9543 #define IB_MOD_EEC_PRIMARY_AV			0x00000008
9544 #define IB_MOD_EEC_RNR				0x00000010
9545 #define IB_MOD_EEC_RESP_RES			0x00000020
9546 #define IB_MOD_EEC_OUTSTANDING			0x00000040
9547 #define IB_MOD_EEC_PRIMARY_PORT			0x00000080
9548 /*
9549 * NOTES
9550 *
9551 *
9552 *****/
9553 
9554 /****s* Access Layer/ib_eec_mod_t
9555 * NAME
9556 *	ib_eec_mod_t
9557 *
9558 * DESCRIPTION
9559 *	Information needed to change the state of an end-to-end context through
9560 *	the ib_modify_eec function.
9561 *
9562 * SYNOPSIS
9563 */
9564 typedef struct _ib_eec_mod {
9565 	ib_qp_state_t req_state;
9566 
9567 	union _eec_state {
9568 		struct _eec_init {
9569 			uint8_t primary_port;
9570 			uint16_t pkey_index;
9571 
9572 		} init;
9573 
9574 		struct _eec_rtr {
9575 			ib_net32_t rq_psn;
9576 			ib_net32_t remote_eecn;
9577 			ib_av_attr_t primary_av;
9578 			uint8_t resp_res;
9579 
9580 			ib_eec_opts_t opts;
9581 			ib_av_attr_t alternate_av;
9582 			uint16_t pkey_index;
9583 
9584 		} rtr;
9585 
9586 		struct _eec_rts {
9587 			ib_net32_t sq_psn;
9588 			uint8_t retry_cnt;
9589 			uint8_t rnr_retry_cnt;
9590 			uint8_t local_ack_timeout;
9591 			uint8_t init_depth;
9592 
9593 			ib_eec_opts_t opts;
9594 			ib_av_attr_t alternate_av;
9595 			ib_apm_state_t apm_state;
9596 
9597 			ib_av_attr_t primary_av;
9598 			uint16_t pkey_index;
9599 			uint8_t primary_port;
9600 
9601 		} rts;
9602 
9603 		struct _eec_sqd {
9604 			boolean_t sqd_event;
9605 
9606 		} sqd;
9607 
9608 	} state;
9609 
9610 } ib_eec_mod_t;
9611 /*
9612 * SEE ALSO
9613 *	ib_qp_state_t, ib_av_attr_t, ib_apm_state_t
9614 *****/
9615 
9616 /****d* Access Layer/ib_wr_type_t
9617 * NAME
9618 *	ib_wr_type_t
9619 *
9620 * DESCRIPTION
9621 *	Identifies the type of work request posted to a queue pair.
9622 *
9623 * SYNOPSIS
9624 */
9625 typedef enum _ib_wr_type_t {
9626 	WR_SEND = 1,
9627 	WR_RDMA_WRITE,
9628 	WR_RDMA_READ,
9629 	WR_COMPARE_SWAP,
9630 	WR_FETCH_ADD
9631 } ib_wr_type_t;
9632 /*****/
9633 
9634 /****s* Access Layer/ib_local_ds_t
9635 * NAME
9636 *	ib_local_ds_t
9637 *
9638 * DESCRIPTION
9639 *	Local data segment information referenced by send and receive work
9640 *	requests.  This is used to specify local data buffers used as part of a
9641 *	work request.
9642 *
9643 * SYNOPSIS
9644 */
9645 typedef struct _ib_local_ds {
9646 	void *vaddr;
9647 	uint32_t length;
9648 	uint32_t lkey;
9649 
9650 } ib_local_ds_t;
9651 /*****/
9652 
9653 /****d* Access Layer/ib_send_opt_t
9654 * NAME
9655 *	ib_send_opt_t
9656 *
9657 * DESCRIPTION
9658 *	Optional flags used when posting send work requests.  These flags
9659 *	indicate specific processing for the send operation.
9660 *
9661 * SYNOPSIS
9662 */
9663 typedef uint32_t ib_send_opt_t;
9664 #define IB_SEND_OPT_IMMEDIATE		0x00000001
9665 #define IB_SEND_OPT_FENCE		0x00000002
9666 #define IB_SEND_OPT_SIGNALED		0x00000004
9667 #define IB_SEND_OPT_SOLICITED		0x00000008
9668 #define IB_SEND_OPT_INLINE		0x00000010
9669 #define IB_SEND_OPT_LOCAL		0x00000020
9670 #define IB_SEND_OPT_VEND_MASK		0xFFFF0000
9671 /*
9672 * VALUES
9673 *	The following flags determine the behavior of a work request when
9674 *	posted to the send side.
9675 *
9676 *	IB_SEND_OPT_IMMEDIATE
9677 *		Send immediate data with the given request.
9678 *
9679 *	IB_SEND_OPT_FENCE
9680 *		The operation is fenced.  Complete all pending send operations
9681 *		before processing this request.
9682 *
9683 *	IB_SEND_OPT_SIGNALED
9684 *		If the queue pair is configured for signaled completion, then
9685 *		generate a completion queue entry when this request completes.
9686 *
9687 *	IB_SEND_OPT_SOLICITED
9688 *		Set the solicited bit on the last packet of this request.
9689 *
9690 *	IB_SEND_OPT_INLINE
9691 *		Indicates that the requested send data should be copied into a VPD
9692 *		owned data buffer.  This flag permits the user to issue send operations
9693 *		without first needing to register the buffer(s) associated with the
9694 *		send operation.  Verb providers that support this operation may place
9695 *		vendor specific restrictions on the size of send operation that may
9696 *		be performed as inline.
9697 *
9698 *
9699 *  IB_SEND_OPT_LOCAL
9700 *     Indicates that a sent MAD request should be given to the local VPD for
9701 *     processing.  MADs sent using this option are not placed on the wire.
9702 *     This send option is only valid for MAD send operations.
9703 *
9704 *
9705 *	IB_SEND_OPT_VEND_MASK
9706 *		This mask indicates bits reserved in the send options that may be used
9707 *		by the verbs provider to indicate vendor specific options.  Bits set
9708 *		in this area of the send options are ignored by the Access Layer, but
9709 *		may have specific meaning to the underlying VPD.
9710 *
9711 *****/
9712 
9713 /****s* Access Layer/ib_send_wr_t
9714 * NAME
9715 *	ib_send_wr_t
9716 *
9717 * DESCRIPTION
9718 *	Information used to submit a work request to the send queue of a queue
9719 *	pair.
9720 *
9721 * SYNOPSIS
9722 */
9723 typedef struct _ib_send_wr {
9724 	struct _ib_send_wr *p_next;
9725 	uint64_t wr_id;
9726 	ib_wr_type_t wr_type;
9727 	ib_send_opt_t send_opt;
9728 	uint32_t num_ds;
9729 	ib_local_ds_t *ds_array;
9730 	ib_net32_t immediate_data;
9731 
9732 	union _send_dgrm {
9733 		struct _send_ud {
9734 			ib_net32_t remote_qp;
9735 			ib_net32_t remote_qkey;
9736 			ib_av_handle_t h_av;
9737 
9738 		} ud;
9739 
9740 		struct _send_rd {
9741 			ib_net32_t remote_qp;
9742 			ib_net32_t remote_qkey;
9743 			ib_net32_t eecn;
9744 
9745 		} rd;
9746 
9747 		struct _send_raw_ether {
9748 			ib_net16_t dest_lid;
9749 			uint8_t path_bits;
9750 			uint8_t sl;
9751 			uint8_t max_static_rate;
9752 			ib_net16_t ether_type;
9753 
9754 		} raw_ether;
9755 
9756 		struct _send_raw_ipv6 {
9757 			ib_net16_t dest_lid;
9758 			uint8_t path_bits;
9759 			uint8_t sl;
9760 			uint8_t max_static_rate;
9761 
9762 		} raw_ipv6;
9763 
9764 	} dgrm;
9765 
9766 	struct _send_remote_ops {
9767 		uint64_t vaddr;
9768 		uint32_t rkey;
9769 
9770 		ib_net64_t atomic1;
9771 		ib_net64_t atomic2;
9772 
9773 	} remote_ops;
9774 
9775 } ib_send_wr_t;
9776 /*
9777 * FIELDS
9778 *	p_next
9779 *		A pointer used to chain work requests together.  This permits multiple
9780 *		work requests to be posted to a queue pair through a single function
9781 *		call.  This value is set to NULL to mark the end of the chain.
9782 *
9783 *	wr_id
9784 *		A 64-bit work request identifier that is returned to the consumer
9785 *		as part of the work completion.
9786 *
9787 *	wr_type
9788 *		The type of work request being submitted to the send queue.
9789 *
9790 *	send_opt
9791 *		Optional send control parameters.
9792 *
9793 *	num_ds
9794 *		Number of local data segments specified by this work request.
9795 *
9796 *	ds_array
9797 *		A reference to an array of local data segments used by the send
9798 *		operation.
9799 *
9800 *	immediate_data
9801 *		32-bit field sent as part of a message send or RDMA write operation.
9802 *		This field is only valid if the send_opt flag IB_SEND_OPT_IMMEDIATE
9803 *		has been set.
9804 *
9805 *	dgrm.ud.remote_qp
9806 *		Identifies the destination queue pair of an unreliable datagram send
9807 *		operation.
9808 *
9809 *	dgrm.ud.remote_qkey
9810 *		The qkey for the destination queue pair.
9811 *
9812 *	dgrm.ud.h_av
9813 *		An address vector that specifies the path information used to route
9814 *		the outbound datagram to the destination queue pair.
9815 *
9816 *	dgrm.rd.remote_qp
9817 *		Identifies the destination queue pair of a reliable datagram send
9818 *		operation.
9819 *
9820 *	dgrm.rd.remote_qkey
9821 *		The qkey for the destination queue pair.
9822 *
9823 *	dgrm.rd.eecn
9824 *		The local end-to-end context number to use with the reliable datagram
9825 *		send operation.
9826 *
9827 *	dgrm.raw_ether.dest_lid
9828 *		The destination LID that will receive this raw ether send.
9829 *
9830 *	dgrm.raw_ether.path_bits
9831 *		path bits...
9832 *
9833 *	dgrm.raw_ether.sl
9834 *		service level...
9835 *
9836 *	dgrm.raw_ether.max_static_rate
9837 *		static rate...
9838 *
9839 *	dgrm.raw_ether.ether_type
9840 *		ether type...
9841 *
9842 *	dgrm.raw_ipv6.dest_lid
9843 *		The destination LID that will receive this raw ether send.
9844 *
9845 *	dgrm.raw_ipv6.path_bits
9846 *		path bits...
9847 *
9848 *	dgrm.raw_ipv6.sl
9849 *		service level...
9850 *
9851 *	dgrm.raw_ipv6.max_static_rate
9852 *		static rate...
9853 *
9854 *	remote_ops.vaddr
9855 *		The registered virtual memory address of the remote memory to access
9856 *		with an RDMA or atomic operation.
9857 *
9858 *	remote_ops.rkey
9859 *		The rkey associated with the specified remote vaddr. This data must
9860 *		be presented exactly as obtained from the remote node. No swapping
9861 *		of data must be performed.
9862 *
9863 *	atomic1
9864 *		The first operand for an atomic operation.
9865 *
9866 *	atomic2
9867 *		The second operand for an atomic operation.
9868 *
9869 * NOTES
9870 *	The format of data sent over the fabric is user-defined and is considered
9871 *	opaque to the access layer.  The sole exception to this are MADs posted
9872 *	to a MAD QP service.  MADs are expected to match the format defined by
9873 *	the Infiniband specification and must be in network-byte order when posted
9874 *	to the MAD QP service.
9875 *
9876 * SEE ALSO
9877 *	ib_wr_type_t, ib_local_ds_t, ib_send_opt_t
9878 *****/
9879 
9880 /****s* Access Layer/ib_recv_wr_t
9881 * NAME
9882 *	ib_recv_wr_t
9883 *
9884 * DESCRIPTION
9885 *	Information used to submit a work request to the receive queue of a queue
9886 *	pair.
9887 *
9888 * SYNOPSIS
9889 */
9890 typedef struct _ib_recv_wr {
9891 	struct _ib_recv_wr *p_next;
9892 	uint64_t wr_id;
9893 	uint32_t num_ds;
9894 	ib_local_ds_t *ds_array;
9895 } ib_recv_wr_t;
9896 /*
9897 * FIELDS
9898 *	p_next
9899 *		A pointer used to chain work requests together.  This permits multiple
9900 *		work requests to be posted to a queue pair through a single function
9901 *		call.  This value is set to NULL to mark the end of the chain.
9902 *
9903 *	wr_id
9904 *		A 64-bit work request identifier that is returned to the consumer
9905 *		as part of the work completion.
9906 *
9907 *	num_ds
9908 *		Number of local data segments specified by this work request.
9909 *
9910 *	ds_array
9911 *		A reference to an array of local data segments used by the send
9912 *		operation.
9913 *
9914 * SEE ALSO
9915 *	ib_local_ds_t
9916 *****/
9917 
9918 /****s* Access Layer/ib_bind_wr_t
9919 * NAME
9920 *	ib_bind_wr_t
9921 *
9922 * DESCRIPTION
9923 *	Information used to submit a memory window bind work request to the send
9924 *	queue of a queue pair.
9925 *
9926 * SYNOPSIS
9927 */
9928 typedef struct _ib_bind_wr {
9929 	uint64_t wr_id;
9930 	ib_send_opt_t send_opt;
9931 
9932 	ib_mr_handle_t h_mr;
9933 	ib_access_t access_ctrl;
9934 	uint32_t current_rkey;
9935 
9936 	ib_local_ds_t local_ds;
9937 
9938 } ib_bind_wr_t;
9939 /*
9940 * FIELDS
9941 *	wr_id
9942 *		A 64-bit work request identifier that is returned to the consumer
9943 *		as part of the work completion.
9944 *
9945 *	send_opt
9946 *		Optional send control parameters.
9947 *
9948 *	h_mr
9949 *		Handle to the memory region to which this window is being bound.
9950 *
9951 *	access_ctrl
9952 *		Access rights for this memory window.
9953 *
9954 *	current_rkey
9955 *		The current rkey assigned to this window for remote access.
9956 *
9957 *	local_ds
9958 *		A reference to a local data segment used by the bind operation.
9959 *
9960 * SEE ALSO
9961 *	ib_send_opt_t, ib_access_t, ib_local_ds_t
9962 *****/
9963 
9964 /****d* Access Layer/ib_wc_status_t
9965 * NAME
9966 *	ib_wc_status_t
9967 *
9968 * DESCRIPTION
9969 *	Indicates the status of a completed work request.  These VALUES are
9970 *	returned to the user when retrieving completions.  Note that success is
9971 *	identified as IB_WCS_SUCCESS, which is always zero.
9972 *
9973 * SYNOPSIS
9974 */
9975 typedef enum _ib_wc_status_t {
9976 	IB_WCS_SUCCESS,
9977 	IB_WCS_LOCAL_LEN_ERR,
9978 	IB_WCS_LOCAL_OP_ERR,
9979 	IB_WCS_LOCAL_EEC_OP_ERR,
9980 	IB_WCS_LOCAL_PROTECTION_ERR,
9981 	IB_WCS_WR_FLUSHED_ERR,
9982 	IB_WCS_MEM_WINDOW_BIND_ERR,
9983 	IB_WCS_REM_ACCESS_ERR,
9984 	IB_WCS_REM_OP_ERR,
9985 	IB_WCS_RNR_RETRY_ERR,
9986 	IB_WCS_TIMEOUT_RETRY_ERR,
9987 	IB_WCS_REM_INVALID_REQ_ERR,
9988 	IB_WCS_REM_INVALID_RD_REQ_ERR,
9989 	IB_WCS_INVALID_EECN,
9990 	IB_WCS_INVALID_EEC_STATE,
9991 	IB_WCS_UNMATCHED_RESPONSE,	/* InfiniBand Access Layer */
9992 	IB_WCS_CANCELED,	/* InfiniBand Access Layer */
9993 	IB_WCS_UNKNOWN		/* Must be last. */
9994 } ib_wc_status_t;
9995 /*
9996 * VALUES
9997 *	IB_WCS_SUCCESS
9998 *		Work request completed successfully.
9999 *
10000 *	IB_WCS_MAD
10001 *		The completed work request was associated with a managmenet datagram
10002 *		that requires post processing.  The MAD will be returned to the user
10003 *		through a callback once all post processing has completed.
10004 *
10005 *	IB_WCS_LOCAL_LEN_ERR
10006 *		Generated for a work request posted to the send queue when the
10007 *		total of the data segment lengths exceeds the message length of the
10008 *		channel.  Generated for a work request posted to the receive queue when
10009 *		the total of the data segment lengths is too small for a
10010 *		valid incoming message.
10011 *
10012 *	IB_WCS_LOCAL_OP_ERR
10013 *		An internal QP consistency error was generated while processing this
10014 *		work request.  This may indicate that the QP was in an incorrect state
10015 *		for the requested operation.
10016 *
10017 *	IB_WCS_LOCAL_EEC_OP_ERR
10018 *		An internal EEC consistency error was generated while processing
10019 *		this work request.  This may indicate that the EEC was in an incorrect
10020 *		state for the requested operation.
10021 *
10022 *	IB_WCS_LOCAL_PROTECTION_ERR
10023 *		The data segments of the locally posted work request did not refer to
10024 *		a valid memory region.  The memory may not have been properly
10025 *		registered for the requested operation.
10026 *
10027 *	IB_WCS_WR_FLUSHED_ERR
10028 *		The work request was flushed from the QP before being completed.
10029 *
10030 *	IB_WCS_MEM_WINDOW_BIND_ERR
10031 *		A memory window bind operation failed due to insufficient access
10032 *		rights.
10033 *
10034 *	IB_WCS_REM_ACCESS_ERR,
10035 *		A protection error was detected at the remote node for a RDMA or atomic
10036 *		operation.
10037 *
10038 *	IB_WCS_REM_OP_ERR,
10039 *		The operation could not be successfully completed at the remote node.
10040 *		This may indicate that the remote QP was in an invalid state or
10041 *		contained an invalid work request.
10042 *
10043 *	IB_WCS_RNR_RETRY_ERR,
10044 *		The RNR retry count was exceeded while trying to send this message.
10045 *
10046 *	IB_WCS_TIMEOUT_RETRY_ERR
10047 *		The local transport timeout counter expired while trying to send this
10048 *		message.
10049 *
10050 *	IB_WCS_REM_INVALID_REQ_ERR,
10051 *		The remote node detected an invalid message on the channel.  This error
10052 *		is usually a result of one of the following:
10053 *			- The operation was not supported on receive queue.
10054 *			- There was insufficient buffers to receive a new RDMA request.
10055 *			- There was insufficient buffers to receive a new atomic operation.
10056 *			- An RDMA request was larger than 2^31 bytes.
10057 *
10058 *	IB_WCS_REM_INVALID_RD_REQ_ERR,
10059 *		Responder detected an invalid RD message.  This may be the result of an
10060 *		invalid qkey or an RDD mismatch.
10061 *
10062 *	IB_WCS_INVALID_EECN
10063 *		An invalid EE context number was detected.
10064 *
10065 *	IB_WCS_INVALID_EEC_STATE
10066 *		The EEC was in an invalid state for the specified request.
10067 *
10068 *	IB_WCS_UNMATCHED_RESPONSE
10069 *		A response MAD was received for which there was no matching send.  The
10070 *		send operation may have been canceled by the user or may have timed
10071 *		out.
10072 *
10073 *	IB_WCS_CANCELED
10074 *		The completed work request was canceled by the user.
10075 *****/
10076 
10077 OSM_EXPORT const char *ib_wc_status_str[];
10078 
10079 /****f* IBA Base: Types/ib_get_wc_status_str
10080 * NAME
10081 *	ib_get_wc_status_str
10082 *
10083 * DESCRIPTION
10084 *	Returns a string for the specified work completion status.
10085 *
10086 * SYNOPSIS
10087 */
10088 static inline const char *OSM_API
ib_get_wc_status_str(IN ib_wc_status_t wc_status)10089 ib_get_wc_status_str(IN ib_wc_status_t wc_status)
10090 {
10091 	if (wc_status > IB_WCS_UNKNOWN)
10092 		wc_status = IB_WCS_UNKNOWN;
10093 	return (ib_wc_status_str[wc_status]);
10094 }
10095 
10096 /*
10097 * PARAMETERS
10098 *	wc_status
10099 *		[in] work completion status value
10100 *
10101 * RETURN VALUES
10102 *	Pointer to the work completion status description string.
10103 *
10104 * NOTES
10105 *
10106 * SEE ALSO
10107 *********/
10108 
10109 /****d* Access Layer/ib_wc_type_t
10110 * NAME
10111 *	ib_wc_type_t
10112 *
10113 * DESCRIPTION
10114 *	Indicates the type of work completion.
10115 *
10116 * SYNOPSIS
10117 */
10118 typedef enum _ib_wc_type_t {
10119 	IB_WC_SEND,
10120 	IB_WC_RDMA_WRITE,
10121 	IB_WC_RECV,
10122 	IB_WC_RDMA_READ,
10123 	IB_WC_MW_BIND,
10124 	IB_WC_FETCH_ADD,
10125 	IB_WC_COMPARE_SWAP,
10126 	IB_WC_RECV_RDMA_WRITE
10127 } ib_wc_type_t;
10128 /*****/
10129 
10130 /****d* Access Layer/ib_recv_opt_t
10131 * NAME
10132 *	ib_recv_opt_t
10133 *
10134 * DESCRIPTION
10135 *	Indicates optional fields valid in a receive work completion.
10136 *
10137 * SYNOPSIS
10138 */
10139 typedef uint32_t ib_recv_opt_t;
10140 #define	IB_RECV_OPT_IMMEDIATE		0x00000001
10141 #define IB_RECV_OPT_FORWARD		0x00000002
10142 #define IB_RECV_OPT_GRH_VALID		0x00000004
10143 #define IB_RECV_OPT_VEND_MASK		0xFFFF0000
10144 /*
10145 * VALUES
10146 *	IB_RECV_OPT_IMMEDIATE
10147 *		Indicates that immediate data is valid for this work completion.
10148 *
10149 *	IB_RECV_OPT_FORWARD
10150 *		Indicates that the received trap should be forwarded to the SM.
10151 *
10152 *	IB_RECV_OPT_GRH_VALID
10153 *		Indicates presence of the global route header. When set, the
10154 *		first 40 bytes received are the GRH.
10155 *
10156 *	IB_RECV_OPT_VEND_MASK
10157 *		This mask indicates bits reserved in the receive options that may be
10158 *		used by the verbs provider to indicate vendor specific options.  Bits
10159 *		set in this area of the receive options are ignored by the Access Layer,
10160 *		but may have specific meaning to the underlying VPD.
10161 *****/
10162 
10163 /****s* Access Layer/ib_wc_t
10164 * NAME
10165 *	ib_wc_t
10166 *
10167 * DESCRIPTION
10168 *	Work completion information.
10169 *
10170 * SYNOPSIS
10171 */
10172 typedef struct _ib_wc {
10173 	struct _ib_wc *p_next;
10174 	uint64_t wr_id;
10175 	ib_wc_type_t wc_type;
10176 
10177 	uint32_t length;
10178 	ib_wc_status_t status;
10179 	uint64_t vendor_specific;
10180 
10181 	union _wc_recv {
10182 		struct _wc_conn {
10183 			ib_recv_opt_t recv_opt;
10184 			ib_net32_t immediate_data;
10185 
10186 		} conn;
10187 
10188 		struct _wc_ud {
10189 			ib_recv_opt_t recv_opt;
10190 			ib_net32_t immediate_data;
10191 			ib_net32_t remote_qp;
10192 			uint16_t pkey_index;
10193 			ib_net16_t remote_lid;
10194 			uint8_t remote_sl;
10195 			uint8_t path_bits;
10196 
10197 		} ud;
10198 
10199 		struct _wc_rd {
10200 			ib_net32_t remote_eecn;
10201 			ib_net32_t remote_qp;
10202 			ib_net16_t remote_lid;
10203 			uint8_t remote_sl;
10204 			uint32_t free_cnt;
10205 
10206 		} rd;
10207 
10208 		struct _wc_raw_ipv6 {
10209 			ib_net16_t remote_lid;
10210 			uint8_t remote_sl;
10211 			uint8_t path_bits;
10212 
10213 		} raw_ipv6;
10214 
10215 		struct _wc_raw_ether {
10216 			ib_net16_t remote_lid;
10217 			uint8_t remote_sl;
10218 			uint8_t path_bits;
10219 			ib_net16_t ether_type;
10220 
10221 		} raw_ether;
10222 
10223 	} recv;
10224 
10225 } ib_wc_t;
10226 /*
10227 * FIELDS
10228 *	p_next
10229 *		A pointer used to chain work completions.  This permits multiple
10230 *		work completions to be retrieved from a completion queue through a
10231 *		single function call.  This value is set to NULL to mark the end of
10232 *		the chain.
10233 *
10234 *	wr_id
10235 *		The 64-bit work request identifier that was specified when posting the
10236 *		work request.
10237 *
10238 *	wc_type
10239 *		Indicates the type of work completion.
10240 *
10241 *
10242 *	length
10243 *		The total length of the data sent or received with the work request.
10244 *
10245 *	status
10246 *		The result of the work request.
10247 *
10248 *	vendor_specific
10249 *		HCA vendor specific information returned as part of the completion.
10250 *
10251 *	recv.conn.recv_opt
10252 *		Indicates optional fields valid as part of a work request that
10253 *		completed on a connected (reliable or unreliable) queue pair.
10254 *
10255 *	recv.conn.immediate_data
10256 *		32-bit field received as part of an inbound message on a connected
10257 *		queue pair.  This field is only valid if the recv_opt flag
10258 *		IB_RECV_OPT_IMMEDIATE has been set.
10259 *
10260 *	recv.ud.recv_opt
10261 *		Indicates optional fields valid as part of a work request that
10262 *		completed on an unreliable datagram queue pair.
10263 *
10264 *	recv.ud.immediate_data
10265 *		32-bit field received as part of an inbound message on a unreliable
10266 *		datagram queue pair.  This field is only valid if the recv_opt flag
10267 *		IB_RECV_OPT_IMMEDIATE has been set.
10268 *
10269 *	recv.ud.remote_qp
10270 *		Identifies the source queue pair of a received datagram.
10271 *
10272 *	recv.ud.pkey_index
10273 *		The pkey index for the source queue pair. This is valid only for
10274 *		GSI type QP's.
10275 *
10276 *	recv.ud.remote_lid
10277 *		The source LID of the received datagram.
10278 *
10279 *	recv.ud.remote_sl
10280 *		The service level used by the source of the received datagram.
10281 *
10282 *	recv.ud.path_bits
10283 *		path bits...
10284 *
10285 *	recv.rd.remote_eecn
10286 *		The remote end-to-end context number that sent the received message.
10287 *
10288 *	recv.rd.remote_qp
10289 *		Identifies the source queue pair of a received message.
10290 *
10291 *	recv.rd.remote_lid
10292 *		The source LID of the received message.
10293 *
10294 *	recv.rd.remote_sl
10295 *		The service level used by the source of the received message.
10296 *
10297 *	recv.rd.free_cnt
10298 *		The number of available entries in the completion queue.  Reliable
10299 *		datagrams may complete out of order, so this field may be used to
10300 *		determine the number of additional completions that may occur.
10301 *
10302 *	recv.raw_ipv6.remote_lid
10303 *		The source LID of the received message.
10304 *
10305 *	recv.raw_ipv6.remote_sl
10306 *		The service level used by the source of the received message.
10307 *
10308 *	recv.raw_ipv6.path_bits
10309 *		path bits...
10310 *
10311 *	recv.raw_ether.remote_lid
10312 *		The source LID of the received message.
10313 *
10314 *	recv.raw_ether.remote_sl
10315 *		The service level used by the source of the received message.
10316 *
10317 *	recv.raw_ether.path_bits
10318 *		path bits...
10319 *
10320 *	recv.raw_ether.ether_type
10321 *		ether type...
10322 * NOTES
10323 *	When the work request completes with error, the only values that the
10324 *	consumer can depend on are the wr_id field, and the status of the
10325 *	operation.
10326 *
10327 *	If the consumer is using the same CQ for completions from more than
10328 *	one type of QP (i.e Reliable Connected, Datagram etc), then the consumer
10329 *	must have additional information to decide what fields of the union are
10330 *	valid.
10331 * SEE ALSO
10332 *	ib_wc_type_t, ib_qp_type_t, ib_wc_status_t, ib_recv_opt_t
10333 *****/
10334 
10335 /****s* Access Layer/ib_mr_create_t
10336 * NAME
10337 *	ib_mr_create_t
10338 *
10339 * DESCRIPTION
10340 *	Information required to create a registered memory region.
10341 *
10342 * SYNOPSIS
10343 */
10344 typedef struct _ib_mr_create {
10345 	void *vaddr;
10346 	uint64_t length;
10347 	ib_access_t access_ctrl;
10348 } ib_mr_create_t;
10349 /*
10350 * FIELDS
10351 *	vaddr
10352 *		Starting virtual address of the region being registered.
10353 *
10354 *	length
10355 *		Length of the buffer to register.
10356 *
10357 *	access_ctrl
10358 *		Access rights of the registered region.
10359 *
10360 * SEE ALSO
10361 *	ib_access_t
10362 *****/
10363 
10364 /****s* Access Layer/ib_phys_create_t
10365 * NAME
10366 *	ib_phys_create_t
10367 *
10368 * DESCRIPTION
10369 *	Information required to create a physical memory region.
10370 *
10371 * SYNOPSIS
10372 */
10373 typedef struct _ib_phys_create {
10374 	uint64_t length;
10375 	uint32_t num_bufs;
10376 	uint64_t *buf_array;
10377 	uint32_t buf_offset;
10378 	uint32_t page_size;
10379 	ib_access_t access_ctrl;
10380 } ib_phys_create_t;
10381 /*
10382 *	length
10383 *		The length of the memory region in bytes.
10384 *
10385 *	num_bufs
10386 *		Number of buffers listed in the specified buffer array.
10387 *
10388 *	buf_array
10389 *		An array of physical buffers to be registered as a single memory
10390 *		region.
10391 *
10392 *	buf_offset
10393 *		The offset into the first physical page of the specified memory
10394 *		region to start the virtual address.
10395 *
10396 *	page_size
10397 *		The physical page size of the memory being registered.
10398 *
10399 *	access_ctrl
10400 *		Access rights of the registered region.
10401 *
10402 * SEE ALSO
10403 *	ib_access_t
10404 *****/
10405 
10406 /****s* Access Layer/ib_mr_attr_t
10407 * NAME
10408 *	ib_mr_attr_t
10409 *
10410 * DESCRIPTION
10411 *	Attributes of a registered memory region.
10412 *
10413 * SYNOPSIS
10414 */
10415 typedef struct _ib_mr_attr {
10416 	ib_pd_handle_t h_pd;
10417 	void *local_lb;
10418 	void *local_ub;
10419 	void *remote_lb;
10420 	void *remote_ub;
10421 	ib_access_t access_ctrl;
10422 	uint32_t lkey;
10423 	uint32_t rkey;
10424 } ib_mr_attr_t;
10425 /*
10426 * DESCRIPTION
10427 *	h_pd
10428 *		Handle to the protection domain for this memory region.
10429 *
10430 *	local_lb
10431 *		The virtual address of the lower bound of protection for local
10432 *		memory access.
10433 *
10434 *	local_ub
10435 *		The virtual address of the upper bound of protection for local
10436 *		memory access.
10437 *
10438 *	remote_lb
10439 *		The virtual address of the lower bound of protection for remote
10440 *		memory access.
10441 *
10442 *	remote_ub
10443 *		The virtual address of the upper bound of protection for remote
10444 *		memory access.
10445 *
10446 *	access_ctrl
10447 *		Access rights for the specified memory region.
10448 *
10449 *	lkey
10450 *		The lkey associated with this memory region.
10451 *
10452 *	rkey
10453 *		The rkey associated with this memory region.
10454 *
10455 * NOTES
10456 *	The remote_lb, remote_ub, and rkey are only valid if remote memory access
10457 *	is enabled for this memory region.
10458 *
10459 * SEE ALSO
10460 *	ib_access_t
10461 *****/
10462 
10463 /****d* Access Layer/ib_ca_mod_t
10464 * NAME
10465 *	ib_ca_mod_t -- Modify port attributes and error counters
10466 *
10467 * DESCRIPTION
10468 *	Specifies modifications to the port attributes of a channel adapter.
10469 *
10470 * SYNOPSIS
10471 */
10472 typedef uint32_t ib_ca_mod_t;
10473 #define IB_CA_MOD_IS_CM_SUPPORTED		0x00000001
10474 #define IB_CA_MOD_IS_SNMP_SUPPORTED		0x00000002
10475 #define	IB_CA_MOD_IS_DEV_MGMT_SUPPORTED		0x00000004
10476 #define	IB_CA_MOD_IS_VEND_SUPPORTED		0x00000008
10477 #define	IB_CA_MOD_IS_SM				0x00000010
10478 #define IB_CA_MOD_IS_SM_DISABLED		0x00000020
10479 #define IB_CA_MOD_QKEY_CTR			0x00000040
10480 #define IB_CA_MOD_PKEY_CTR			0x00000080
10481 #define IB_CA_MOD_IS_NOTICE_SUPPORTED		0x00000100
10482 #define IB_CA_MOD_IS_TRAP_SUPPORTED		0x00000200
10483 #define IB_CA_MOD_IS_APM_SUPPORTED		0x00000400
10484 #define IB_CA_MOD_IS_SLMAP_SUPPORTED		0x00000800
10485 #define IB_CA_MOD_IS_PKEY_NVRAM_SUPPORTED	0x00001000
10486 #define IB_CA_MOD_IS_MKEY_NVRAM_SUPPORTED	0x00002000
10487 #define IB_CA_MOD_IS_SYSGUID_SUPPORTED		0x00004000
10488 #define IB_CA_MOD_IS_DR_NOTICE_SUPPORTED	0x00008000
10489 #define IB_CA_MOD_IS_BOOT_MGMT_SUPPORTED	0x00010000
10490 #define IB_CA_MOD_IS_CAPM_NOTICE_SUPPORTED	0x00020000
10491 #define IB_CA_MOD_IS_REINIT_SUPORTED		0x00040000
10492 #define IB_CA_MOD_IS_LEDINFO_SUPPORTED		0x00080000
10493 #define IB_CA_MOD_SHUTDOWN_PORT			0x00100000
10494 #define IB_CA_MOD_INIT_TYPE_VALUE		0x00200000
10495 #define IB_CA_MOD_SYSTEM_IMAGE_GUID		0x00400000
10496 /*
10497 * VALUES
10498 *	IB_CA_MOD_IS_CM_SUPPORTED
10499 *		Indicates if there is a communication manager accessible through
10500 *		the port.
10501 *
10502 *	IB_CA_MOD_IS_SNMP_SUPPORTED
10503 *		Indicates if there is an SNMP agent accessible through the port.
10504 *
10505 *	IB_CA_MOD_IS_DEV_MGMT_SUPPORTED
10506 *		Indicates if there is a device management agent accessible
10507 *		through the port.
10508 *
10509 *	IB_CA_MOD_IS_VEND_SUPPORTED
10510 *		Indicates if there is a vendor supported agent accessible
10511 *		through the port.
10512 *
10513 *	IB_CA_MOD_IS_SM
10514 *		Indicates if there is a subnet manager accessible through
10515 *		the port.
10516 *
10517 *	IB_CA_MOD_IS_SM_DISABLED
10518 *		Indicates if the port has been disabled for configuration by the
10519 *		subnet manager.
10520 *
10521 *	IB_CA_MOD_QKEY_CTR
10522 *		Used to reset the qkey violation counter associated with the
10523 *		port.
10524 *
10525 *	IB_CA_MOD_PKEY_CTR
10526 *		Used to reset the pkey violation counter associated with the
10527 *		port.
10528 *
10529 *	IB_CA_MOD_IS_NOTICE_SUPPORTED
10530 *		Indicates that this CA supports ability to generate Notices for
10531 *		Port State changes. (only applicable to switches)
10532 *
10533 *	IB_CA_MOD_IS_TRAP_SUPPORTED
10534 *		Indicates that this management port supports ability to generate
10535 *		trap messages. (only applicable to switches)
10536 *
10537 *	IB_CA_MOD_IS_APM_SUPPORTED
10538 *		Indicates that this port is capable of performing Automatic
10539 *		Path Migration.
10540 *
10541 *	IB_CA_MOD_IS_SLMAP_SUPPORTED
10542 *		Indicates this port supports SLMAP capability.
10543 *
10544 *	IB_CA_MOD_IS_PKEY_NVRAM_SUPPORTED
10545 *		Indicates that PKEY is supported in NVRAM
10546 *
10547 *	IB_CA_MOD_IS_MKEY_NVRAM_SUPPORTED
10548 *		Indicates that MKEY is supported in NVRAM
10549 *
10550 *	IB_CA_MOD_IS_SYSGUID_SUPPORTED
10551 *		Indicates System Image GUID support.
10552 *
10553 *	IB_CA_MOD_IS_DR_NOTICE_SUPPORTED
10554 *		Indicate support for generating Direct Routed Notices
10555 *
10556 *	IB_CA_MOD_IS_BOOT_MGMT_SUPPORTED
10557 *		Indicates support for Boot Management
10558 *
10559 *	IB_CA_MOD_IS_CAPM_NOTICE_SUPPORTED
10560 *		Indicates capability to generate notices for changes to CAPMASK
10561 *
10562 *	IB_CA_MOD_IS_REINIT_SUPORTED
10563 *		Indicates type of node init supported. Refer to Chapter 14 for
10564 *		Initialization actions.
10565 *
10566 *	IB_CA_MOD_IS_LEDINFO_SUPPORTED
10567 *		Indicates support for LED info.
10568 *
10569 *	IB_CA_MOD_SHUTDOWN_PORT
10570 *		Used to modify the port active indicator.
10571 *
10572 *	IB_CA_MOD_INIT_TYPE_VALUE
10573 *		Used to modify the init_type value for the port.
10574 *
10575 *	IB_CA_MOD_SYSTEM_IMAGE_GUID
10576 *		Used to modify the system image GUID for the port.
10577 *****/
10578 
10579 /****d* Access Layer/ib_mr_mod_t
10580 * NAME
10581 *	ib_mr_mod_t
10582 *
10583 * DESCRIPTION
10584 *	Mask used to specify which attributes of a registered memory region are
10585 *	being modified.
10586 *
10587 * SYNOPSIS
10588 */
10589 typedef uint32_t ib_mr_mod_t;
10590 #define IB_MR_MOD_ADDR					0x00000001
10591 #define IB_MR_MOD_PD					0x00000002
10592 #define IB_MR_MOD_ACCESS				0x00000004
10593 /*
10594 * PARAMETERS
10595 *	IB_MEM_MOD_ADDR
10596 *		The address of the memory region is being modified.
10597 *
10598 *	IB_MEM_MOD_PD
10599 *		The protection domain associated with the memory region is being
10600 *		modified.
10601 *
10602 *	IB_MEM_MOD_ACCESS
10603 *		The access rights the memory region are being modified.
10604 *****/
10605 
10606 /****d* IBA Base: Constants/IB_SMINFO_ATTR_MOD_HANDOVER
10607 * NAME
10608 *	IB_SMINFO_ATTR_MOD_HANDOVER
10609 *
10610 * DESCRIPTION
10611 *	Encoded attribute modifier value used on SubnSet(SMInfo) SMPs.
10612 *
10613 * SOURCE
10614 */
10615 #define IB_SMINFO_ATTR_MOD_HANDOVER		(CL_HTON32(0x000001))
10616 /**********/
10617 
10618 /****d* IBA Base: Constants/IB_SMINFO_ATTR_MOD_ACKNOWLEDGE
10619 * NAME
10620 *	IB_SMINFO_ATTR_MOD_ACKNOWLEDGE
10621 *
10622 * DESCRIPTION
10623 *	Encoded attribute modifier value used on SubnSet(SMInfo) SMPs.
10624 *
10625 * SOURCE
10626 */
10627 #define IB_SMINFO_ATTR_MOD_ACKNOWLEDGE		(CL_HTON32(0x000002))
10628 /**********/
10629 
10630 /****d* IBA Base: Constants/IB_SMINFO_ATTR_MOD_DISABLE
10631 * NAME
10632 *	IB_SMINFO_ATTR_MOD_DISABLE
10633 *
10634 * DESCRIPTION
10635 *	Encoded attribute modifier value used on SubnSet(SMInfo) SMPs.
10636 *
10637 * SOURCE
10638 */
10639 #define IB_SMINFO_ATTR_MOD_DISABLE			(CL_HTON32(0x000003))
10640 /**********/
10641 
10642 /****d* IBA Base: Constants/IB_SMINFO_ATTR_MOD_STANDBY
10643 * NAME
10644 *	IB_SMINFO_ATTR_MOD_STANDBY
10645 *
10646 * DESCRIPTION
10647 *	Encoded attribute modifier value used on SubnSet(SMInfo) SMPs.
10648 *
10649 * SOURCE
10650 */
10651 #define IB_SMINFO_ATTR_MOD_STANDBY			(CL_HTON32(0x000004))
10652 /**********/
10653 
10654 /****d* IBA Base: Constants/IB_SMINFO_ATTR_MOD_DISCOVER
10655 * NAME
10656 *	IB_SMINFO_ATTR_MOD_DISCOVER
10657 *
10658 * DESCRIPTION
10659 *	Encoded attribute modifier value used on SubnSet(SMInfo) SMPs.
10660 *
10661 * SOURCE
10662 */
10663 #define IB_SMINFO_ATTR_MOD_DISCOVER			(CL_HTON32(0x000005))
10664 /**********/
10665 
10666 /****s* Access Layer/ib_ci_op_t
10667 * NAME
10668 *	ib_ci_op_t
10669 *
10670 * DESCRIPTION
10671 *	A structure used for vendor specific CA interface communication.
10672 *
10673 * SYNOPSIS
10674 */
10675 typedef struct _ib_ci_op {
10676 	IN uint32_t command;
10677 	IN OUT void *p_buf OPTIONAL;
10678 	IN uint32_t buf_size;
10679 	IN OUT uint32_t num_bytes_ret;
10680 	IN OUT int32_t status;
10681 
10682 } ib_ci_op_t;
10683 /*
10684 * FIELDS
10685 *	command
10686 *		A command code that is understood by the verbs provider.
10687 *
10688 *	p_buf
10689 *		A reference to a buffer containing vendor specific data.  The verbs
10690 *		provider must not access pointers in the p_buf between user-mode and
10691 *		kernel-mode.  Any pointers embedded in the p_buf are invalidated by
10692 *		the user-mode/kernel-mode transition.
10693 *
10694 *	buf_size
10695 *		The size of the buffer in bytes.
10696 *
10697 *	num_bytes_ret
10698 *		The size in bytes of the vendor specific data returned in the buffer.
10699 *		This field is set by the verbs provider.  The verbs provider should
10700 *		verify that the buffer size is sufficient to hold the data being
10701 *		returned.
10702 *
10703 *	status
10704 *		The completion status from the verbs provider.  This field should be
10705 *		initialize to indicate an error to allow detection and cleanup in
10706 *		case a communication error occurs between user-mode and kernel-mode.
10707 *
10708 * NOTES
10709 *	This structure is provided to allow the exchange of vendor specific
10710 *	data between the originator and the verbs provider.  Users of this
10711 *	structure are expected to know the format of data in the p_buf based
10712 *	on the structure command field or the usage context.
10713 *****/
10714 
10715 END_C_DECLS
10716 #endif				/* ndef WIN32 */
10717 #if defined( __WIN__ )
10718 #include <iba/ib_types_extended.h>
10719 #endif
10720 #endif				/* __IB_TYPES_H__ */
10721