^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 */