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
51BEGIN_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*/
566static inline boolean_t OSM_API
567ib_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*/
598static inline boolean_t OSM_API
599ib_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*/
629static inline boolean_t OSM_API
630ib_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*/
660static 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*/
1777typedef 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*/
1789typedef 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*/
1801typedef 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*/
1812typedef 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
1832static 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*/
1849static 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
1870static 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*/
1889static inline const char *OSM_API
1890ib_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
1912static 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*/
1931static 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*/
1961static inline uint8_t OSM_API
1962ib_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*/
2016static 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*/
2043static 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*/
2074static 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>
2104typedef 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*/
2144static 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*/
2158static 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*/
2172static inline void OSM_API
2173ib_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*/
2188static inline void OSM_API
2189ib_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*/
2221static inline ib_net64_t OSM_API
2222ib_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*/
2251static inline boolean_t OSM_API
2252ib_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*/
2283static inline boolean_t OSM_API
2284ib_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*/
2315static inline ib_net64_t OSM_API
2316ib_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>
2346typedef 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*/
2681static inline void OSM_API
2682ib_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*/
2794static inline uint8_t OSM_API
2795ib_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*/
2823static inline void OSM_API
2824ib_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*/
2857static inline uint8_t OSM_API
2858ib_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*/
2886static inline void OSM_API
2887ib_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*/
2921static inline uint16_t OSM_API
2922ib_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*/
2950static inline uint8_t OSM_API
2951ib_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*/
2985static inline uint8_t OSM_API
2986ib_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*/
3018static inline uint8_t OSM_API
3019ib_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*/
3057static inline uint8_t OSM_API
3058ib_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*/
3090static inline uint8_t OSM_API
3091ib_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*/
3119static inline uint8_t OSM_API
3120ib_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*/
3152static inline uint32_t OSM_API
3153ib_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*/
3181static inline uint8_t OSM_API
3182ib_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>
3260typedef 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*/
3348static inline void OSM_API
3349ib_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*/
3383static inline uint8_t OSM_API
3384ib_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*/
3413static inline void OSM_API
3414ib_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*/
3448static inline uint32_t OSM_API
3449ib_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>
3478typedef 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*/
3512static inline uint8_t OSM_API
3513ib_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*/
3540static inline uint8_t OSM_API
3541ib_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>
3569typedef 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>
3627typedef 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*/
3654static inline void OSM_API
3655ib_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*/
3716static inline void OSM_API
3717ib_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*/
3760static inline boolean_t OSM_API
3761ib_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*/
3815static inline boolean_t OSM_API
3816ib_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
3840static inline void OSM_API
3841ib_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
3848static inline uint8_t OSM_API
3849ib_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>
3892typedef 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*/
3982static inline ib_net16_t OSM_API
3983ib_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*/
4011static inline boolean_t OSM_API
4012ib_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*/
4040static 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*/
4072static inline void OSM_API
4073ib_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*/
4156static inline void *OSM_API
4157ib_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>
4186typedef 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>
4215typedef 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
4248static 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
4253static 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*/
4267static inline void *OSM_API
4268ib_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*/
4304static inline uint8_t OSM_API
4305ib_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*/
4335static inline ib_net32_t OSM_API
4336ib_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>
4359typedef 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>
4369typedef 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>
4389typedef 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*/
4489static inline uint8_t OSM_API
4490ib_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*/
4517static inline void OSM_API
4518ib_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*/
4549static inline uint8_t OSM_API
4550ib_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*/
4577static inline uint8_t OSM_API
4578ib_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*/
4605static inline uint8_t OSM_API
4606ib_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*/
4633static inline void OSM_API
4634ib_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*/
4665static inline void OSM_API
4666ib_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*/
4694static inline uint8_t OSM_API
4695ib_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*/
4725static inline void OSM_API
4726ib_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*/
4760static inline uint8_t OSM_API
4761ib_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*/
4791static inline void OSM_API
4792ib_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*/
4826static inline uint8_t OSM_API
4827ib_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*/
4854static inline void OSM_API
4855ib_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*/
4887static inline uint8_t OSM_API
4888ib_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*/
4939static inline uint8_t OSM_API
4940ib_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*/
5044static inline uint8_t OSM_API
5045ib_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*/
5111static inline uint8_t OSM_API
5112ib_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*/
5139static inline uint8_t OSM_API
5140ib_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*/
5167static inline void OSM_API
5168ib_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*/
5201static inline uint8_t OSM_API
5202ib_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*/
5229static inline void OSM_API
5230ib_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*/
5261static inline void OSM_API
5262ib_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*/
5295static inline void OSM_API
5296ib_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*/
5330static inline uint8_t OSM_API
5331ib_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*/
5358static inline uint8_t OSM_API
5359ib_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*/
5387static inline void OSM_API
5388ib_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*/
5421static inline uint8_t OSM_API
5422ib_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*/
5450static inline void OSM_API
5451ib_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*/
5484static inline uint8_t OSM_API
5485ib_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*/
5512static inline uint8_t OSM_API
5513ib_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*/
5540static inline void OSM_API
5541ib_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*/
5572static inline uint8_t OSM_API
5573ib_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*/
5600static inline void OSM_API
5601ib_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*/
5633static inline uint8_t OSM_API
5634ib_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*/
5662static inline void OSM_API
5663ib_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*/
5693static inline uint8_t OSM_API
5694ib_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*/
5721static inline uint8_t OSM_API
5722ib_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*/
5749static inline void OSM_API
5750ib_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
5778typedef uint8_t ib_svc_name_t[64];
5779
5780#include <complib/cl_packon.h>
5781typedef 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>
5798typedef 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>
5809typedef 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>
5820typedef 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>
5839typedef 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>
5858typedef 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>
5877typedef 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>
5895typedef 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*/
5915static inline boolean_t OSM_API
5916ib_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*/
5943static inline void OSM_API
5944ib_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*/
5973static inline boolean_t OSM_API
5974ib_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>
6004typedef 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>
6012typedef 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>
6024typedef 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*/
6090static inline uint8_t OSM_API
6091ib_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*/
6119static inline void	OSM_API
6120ib_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*/
6154static inline uint8_t OSM_API
6155ib_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*/
6183static inline void	OSM_API
6184ib_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*/
6218static inline uint16_t	OSM_API
6219ib_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*/
6247static inline uint8_t OSM_API
6248ib_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*/
6282static inline uint8_t OSM_API
6283ib_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*/
6315static inline uint8_t OSM_API
6316ib_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*/
6348static inline uint8_t OSM_API
6349ib_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*/
6382static inline uint8_t OSM_API
6383ib_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*/
6411static inline uint8_t OSM_API
6412ib_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*/
6445static inline ib_net64_t OSM_API
6446ib_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>
6483typedef 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>
6500typedef 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>
6524typedef 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>
6540typedef 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*/
6560static inline void OSM_API
6561ib_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*/
6608static inline uint8_t OSM_API
6609ib_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>
6650typedef 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>
6669typedef 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>
6685typedef 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>
6699typedef 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*/
6718static inline void OSM_API
6719ib_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*/
6770static inline ib_net32_t OSM_API
6771ib_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>
6816typedef 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*/
6884static inline void OSM_API
6885ib_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*/
6935static inline ib_net32_t OSM_API
6936ib_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*/
6976static inline void OSM_API
6977ib_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*/
7020static inline uint8_t OSM_API
7021ib_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*/
7058static inline void OSM_API
7059ib_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>
7101typedef 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*/
7232static inline boolean_t OSM_API
7233ib_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*/
7259static inline uint8_t OSM_API
7260ib_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*/
7286static inline ib_net32_t OSM_API
7287ib_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*/
7317static inline void OSM_API
7318ib_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*/
7352static inline void OSM_API
7353ib_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*/
7386static inline ib_net32_t OSM_API
7387ib_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*/
7417static inline void OSM_API
7418ib_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*/
7450static inline void OSM_API
7451ib_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>
7476typedef 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*/
7515static inline void OSM_API
7516ib_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*/
7556static inline void OSM_API
7557ib_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*/
7585static inline ib_net32_t OSM_API
7586ib_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*/
7618static inline ib_net32_t OSM_API
7619ib_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>
7652typedef 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>
7671typedef 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>
7706typedef 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>
7743typedef 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>
7769typedef 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>
7826typedef 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>
7871typedef 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>
7906typedef 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*/
7952static inline uint8_t OSM_API
7953ib_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*/
7981static inline uint8_t OSM_API
7982ib_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*/
8010static inline uint8_t OSM_API
8011ioc_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>
8049typedef 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
8156static inline uint32_t OSM_API
8157ib_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
8162static inline void OSM_API
8163ib_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>
8179typedef 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>
8209typedef 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
8224static inline void OSM_API
8225ib_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>
8245typedef 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 */
8259typedef struct _ib_ca *__ptr64 ib_ca_handle_t;
8260typedef struct _ib_pd *__ptr64 ib_pd_handle_t;
8261typedef struct _ib_rdd *__ptr64 ib_rdd_handle_t;
8262typedef struct _ib_mr *__ptr64 ib_mr_handle_t;
8263typedef struct _ib_mw *__ptr64 ib_mw_handle_t;
8264typedef struct _ib_qp *__ptr64 ib_qp_handle_t;
8265typedef struct _ib_eec *__ptr64 ib_eec_handle_t;
8266typedef struct _ib_cq *__ptr64 ib_cq_handle_t;
8267typedef struct _ib_av *__ptr64 ib_av_handle_t;
8268typedef 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*/
8290typedef 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
8345OSM_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*/
8356static 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*/
8388typedef 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
8529OSM_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*/
8540static inline const char *OSM_API
8541ib_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*/
8578typedef 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*/
8630typedef 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*/
8658typedef 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*/
8697typedef 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*/
8713typedef 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*/
8736typedef 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*/
8796typedef 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*/
9060ib_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*/
9090typedef 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*/
9124typedef 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*/
9189typedef 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*/
9213typedef 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*/
9235typedef 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*/
9251typedef 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*/
9332typedef 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*/
9388typedef 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*/
9420typedef 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*/
9507typedef 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*/
9539typedef 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*/
9564typedef 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*/
9625typedef 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*/
9645typedef 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*/
9663typedef 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*/
9723typedef 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*/
9890typedef 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*/
9928typedef 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*/
9975typedef 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
10077OSM_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*/
10088static inline const char *OSM_API
10089ib_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*/
10118typedef 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*/
10139typedef 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*/
10172typedef 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*/
10344typedef 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*/
10373typedef 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*/
10415typedef 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*/
10472typedef 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*/
10589typedef 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*/
10675typedef 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
10715END_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