Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

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