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 Topspin Communications.  All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (c) 2005 Voltaire, Inc.  All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (c) 2006 Intel Corporation.  All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #ifndef IB_SA_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #define IB_SA_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #include <linux/completion.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #include <linux/atomic.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <linux/netdevice.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <rdma/ib_verbs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <rdma/ib_mad.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <rdma/ib_addr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #include <rdma/opa_addr.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 	IB_SA_CLASS_VERSION		= 2,	/* IB spec version 1.1/1.2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	IB_SA_METHOD_GET_TABLE		= 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	IB_SA_METHOD_GET_TABLE_RESP	= 0x92,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	IB_SA_METHOD_DELETE		= 0x15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	IB_SA_METHOD_DELETE_RESP	= 0x95,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	IB_SA_METHOD_GET_MULTI		= 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	IB_SA_METHOD_GET_MULTI_RESP	= 0x94,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	IB_SA_METHOD_GET_TRACE_TBL	= 0x13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #define OPA_SA_CLASS_VERSION	0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	IB_SA_ATTR_CLASS_PORTINFO    = 0x01,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	IB_SA_ATTR_NOTICE	     = 0x02,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	IB_SA_ATTR_INFORM_INFO	     = 0x03,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	IB_SA_ATTR_NODE_REC	     = 0x11,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	IB_SA_ATTR_PORT_INFO_REC     = 0x12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	IB_SA_ATTR_SL2VL_REC	     = 0x13,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	IB_SA_ATTR_SWITCH_REC	     = 0x14,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	IB_SA_ATTR_LINEAR_FDB_REC    = 0x15,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	IB_SA_ATTR_RANDOM_FDB_REC    = 0x16,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	IB_SA_ATTR_MCAST_FDB_REC     = 0x17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	IB_SA_ATTR_SM_INFO_REC	     = 0x18,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	IB_SA_ATTR_LINK_REC	     = 0x20,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	IB_SA_ATTR_GUID_INFO_REC     = 0x30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	IB_SA_ATTR_SERVICE_REC	     = 0x31,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	IB_SA_ATTR_PARTITION_REC     = 0x33,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	IB_SA_ATTR_PATH_REC	     = 0x35,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	IB_SA_ATTR_VL_ARB_REC	     = 0x36,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	IB_SA_ATTR_MC_MEMBER_REC     = 0x38,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	IB_SA_ATTR_TRACE_REC	     = 0x39,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	IB_SA_ATTR_MULTI_PATH_REC    = 0x3a,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	IB_SA_ATTR_SERVICE_ASSOC_REC = 0x3b,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	IB_SA_ATTR_INFORM_INFO_REC   = 0xf3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) enum ib_sa_selector {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	IB_SA_GT   = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	IB_SA_LT   = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	IB_SA_EQ   = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	 * The meaning of "best" depends on the attribute: for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	 * example, for MTU best will return the largest available
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	 * MTU, while for packet life time, best will return the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	 * smallest available life time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	IB_SA_BEST = 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)  * There are 4 types of join states:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)  * FullMember, NonMember, SendOnlyNonMember, SendOnlyFullMember.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)  * The order corresponds to JoinState bits in MCMemberRecord.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) enum ib_sa_mc_join_states {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	FULLMEMBER_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	NONMEMBER_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	SENDONLY_NONMEBER_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	SENDONLY_FULLMEMBER_JOIN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	NUM_JOIN_MEMBERSHIP_TYPES,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) #define IB_SA_CAP_MASK2_SENDONLY_FULL_MEM_SUPPORT	BIT(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89)  * Structures for SA records are named "struct ib_sa_xxx_rec."  No
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90)  * attempt is made to pack structures to match the physical layout of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91)  * SA records in SA MADs; all packing and unpacking is handled by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92)  * SA query code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94)  * For a record with structure ib_sa_xxx_rec, the naming convention
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95)  * for the component mask value for field yyy is IB_SA_XXX_REC_YYY (we
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96)  * never use different abbreviations or otherwise change the spelling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97)  * of xxx/yyy between ib_sa_xxx_rec.yyy and IB_SA_XXX_REC_YYY).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99)  * Reserved rows are indicated with comments to help maintainability.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define IB_SA_PATH_REC_SERVICE_ID		       (IB_SA_COMP_MASK( 0) |\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 							IB_SA_COMP_MASK( 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define IB_SA_PATH_REC_DGID				IB_SA_COMP_MASK( 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define IB_SA_PATH_REC_SGID				IB_SA_COMP_MASK( 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define IB_SA_PATH_REC_DLID				IB_SA_COMP_MASK( 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #define IB_SA_PATH_REC_SLID				IB_SA_COMP_MASK( 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define IB_SA_PATH_REC_RAW_TRAFFIC			IB_SA_COMP_MASK( 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* reserved:								 7 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define IB_SA_PATH_REC_FLOW_LABEL       		IB_SA_COMP_MASK( 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define IB_SA_PATH_REC_HOP_LIMIT			IB_SA_COMP_MASK( 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define IB_SA_PATH_REC_TRAFFIC_CLASS			IB_SA_COMP_MASK(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define IB_SA_PATH_REC_REVERSIBLE			IB_SA_COMP_MASK(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define IB_SA_PATH_REC_NUMB_PATH			IB_SA_COMP_MASK(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define IB_SA_PATH_REC_PKEY				IB_SA_COMP_MASK(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define IB_SA_PATH_REC_QOS_CLASS			IB_SA_COMP_MASK(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define IB_SA_PATH_REC_SL				IB_SA_COMP_MASK(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define IB_SA_PATH_REC_MTU_SELECTOR			IB_SA_COMP_MASK(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define IB_SA_PATH_REC_MTU				IB_SA_COMP_MASK(17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #define IB_SA_PATH_REC_RATE_SELECTOR			IB_SA_COMP_MASK(18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define IB_SA_PATH_REC_RATE				IB_SA_COMP_MASK(19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) #define IB_SA_PATH_REC_PACKET_LIFE_TIME_SELECTOR	IB_SA_COMP_MASK(20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define IB_SA_PATH_REC_PACKET_LIFE_TIME			IB_SA_COMP_MASK(21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define IB_SA_PATH_REC_PREFERENCE			IB_SA_COMP_MASK(22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) enum sa_path_rec_type {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	SA_PATH_REC_TYPE_IB,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	SA_PATH_REC_TYPE_ROCE_V1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	SA_PATH_REC_TYPE_ROCE_V2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	SA_PATH_REC_TYPE_OPA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) struct sa_path_rec_ib {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	__be16       dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	__be16       slid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	u8           raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)  * struct sa_path_rec_roce - RoCE specific portion of the path record entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)  * @route_resolved:	When set, it indicates that this route is already
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)  *			resolved for this path record entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)  * @dmac:		Destination mac address for the given DGID entry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)  *			of the path record entry.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) struct sa_path_rec_roce {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	bool	route_resolved;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	u8	dmac[ETH_ALEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) struct sa_path_rec_opa {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	__be32       dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	__be32       slid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	u8           raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	u8	     l2_8B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	u8	     l2_10B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	u8	     l2_9B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	u8	     l2_16B;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	u8	     qos_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	u8	     qos_priority;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) struct sa_path_rec {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	union ib_gid dgid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	union ib_gid sgid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	__be64       service_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	/* reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	__be32       flow_label;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	u8           hop_limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	u8           traffic_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	u8           reversible;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	u8           numb_path;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	__be16       pkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	__be16       qos_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	u8           sl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	u8           mtu_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	u8           mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	u8           rate_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	u8           rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	u8           packet_life_time_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	u8           packet_life_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	u8           preference;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	union {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		struct sa_path_rec_ib ib;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		struct sa_path_rec_roce roce;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		struct sa_path_rec_opa opa;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	enum sa_path_rec_type rec_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) static inline enum ib_gid_type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 		sa_conv_pathrec_to_gid_type(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	switch (rec->rec_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	case SA_PATH_REC_TYPE_ROCE_V1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		return IB_GID_TYPE_ROCE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	case SA_PATH_REC_TYPE_ROCE_V2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 		return IB_GID_TYPE_ROCE_UDP_ENCAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 		return IB_GID_TYPE_IB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) static inline enum sa_path_rec_type
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 		sa_conv_gid_to_pathrec_type(enum ib_gid_type type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	case IB_GID_TYPE_ROCE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 		return SA_PATH_REC_TYPE_ROCE_V1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	case IB_GID_TYPE_ROCE_UDP_ENCAP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 		return SA_PATH_REC_TYPE_ROCE_V2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 		return SA_PATH_REC_TYPE_IB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) static inline void path_conv_opa_to_ib(struct sa_path_rec *ib,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 				       struct sa_path_rec *opa)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	if ((be32_to_cpu(opa->opa.dlid) >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	     be16_to_cpu(IB_MULTICAST_LID_BASE)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 	    (be32_to_cpu(opa->opa.slid) >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	     be16_to_cpu(IB_MULTICAST_LID_BASE))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		/* Create OPA GID and zero out the LID */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 		ib->dgid.global.interface_id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 				= OPA_MAKE_ID(be32_to_cpu(opa->opa.dlid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 		ib->dgid.global.subnet_prefix
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 				= opa->dgid.global.subnet_prefix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 		ib->sgid.global.interface_id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 				= OPA_MAKE_ID(be32_to_cpu(opa->opa.slid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 		ib->dgid.global.subnet_prefix
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 				= opa->dgid.global.subnet_prefix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 		ib->ib.dlid	= 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 		ib->ib.slid	= 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 		ib->ib.dlid	= htons(ntohl(opa->opa.dlid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 		ib->ib.slid	= htons(ntohl(opa->opa.slid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	ib->service_id		= opa->service_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 	ib->ib.raw_traffic	= opa->opa.raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) static inline void path_conv_ib_to_opa(struct sa_path_rec *opa,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 				       struct sa_path_rec *ib)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 	__be32 slid, dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	if ((ib_is_opa_gid(&ib->sgid)) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	    (ib_is_opa_gid(&ib->dgid))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 		slid = htonl(opa_get_lid_from_gid(&ib->sgid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 		dlid = htonl(opa_get_lid_from_gid(&ib->dgid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 		slid = htonl(ntohs(ib->ib.slid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 		dlid = htonl(ntohs(ib->ib.dlid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	opa->opa.slid		= slid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	opa->opa.dlid		= dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	opa->service_id		= ib->service_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	opa->opa.raw_traffic	= ib->ib.raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) /* Convert from OPA to IB path record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) static inline void sa_convert_path_opa_to_ib(struct sa_path_rec *dest,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 					     struct sa_path_rec *src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	if (src->rec_type != SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	*dest = *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	dest->rec_type = SA_PATH_REC_TYPE_IB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	path_conv_opa_to_ib(dest, src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) /* Convert from IB to OPA path record */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) static inline void sa_convert_path_ib_to_opa(struct sa_path_rec *dest,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 					     struct sa_path_rec *src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	if (src->rec_type != SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	/* Do a structure copy and overwrite the relevant fields */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	*dest = *src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	dest->rec_type = SA_PATH_REC_TYPE_OPA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	path_conv_ib_to_opa(dest, src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #define IB_SA_MCMEMBER_REC_MGID				IB_SA_COMP_MASK( 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) #define IB_SA_MCMEMBER_REC_PORT_GID			IB_SA_COMP_MASK( 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) #define IB_SA_MCMEMBER_REC_QKEY				IB_SA_COMP_MASK( 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) #define IB_SA_MCMEMBER_REC_MLID				IB_SA_COMP_MASK( 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) #define IB_SA_MCMEMBER_REC_MTU_SELECTOR			IB_SA_COMP_MASK( 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #define IB_SA_MCMEMBER_REC_MTU				IB_SA_COMP_MASK( 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) #define IB_SA_MCMEMBER_REC_TRAFFIC_CLASS		IB_SA_COMP_MASK( 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) #define IB_SA_MCMEMBER_REC_PKEY				IB_SA_COMP_MASK( 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) #define IB_SA_MCMEMBER_REC_RATE_SELECTOR		IB_SA_COMP_MASK( 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) #define IB_SA_MCMEMBER_REC_RATE				IB_SA_COMP_MASK( 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME_SELECTOR	IB_SA_COMP_MASK(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) #define IB_SA_MCMEMBER_REC_PACKET_LIFE_TIME		IB_SA_COMP_MASK(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #define IB_SA_MCMEMBER_REC_SL				IB_SA_COMP_MASK(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #define IB_SA_MCMEMBER_REC_FLOW_LABEL			IB_SA_COMP_MASK(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #define IB_SA_MCMEMBER_REC_HOP_LIMIT			IB_SA_COMP_MASK(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #define IB_SA_MCMEMBER_REC_SCOPE			IB_SA_COMP_MASK(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) #define IB_SA_MCMEMBER_REC_JOIN_STATE			IB_SA_COMP_MASK(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) #define IB_SA_MCMEMBER_REC_PROXY_JOIN			IB_SA_COMP_MASK(17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) struct ib_sa_mcmember_rec {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	union ib_gid mgid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	union ib_gid port_gid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	__be32       qkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 	__be16       mlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	u8           mtu_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	u8           mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	u8           traffic_class;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	__be16       pkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	u8 	     rate_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 	u8 	     rate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 	u8 	     packet_life_time_selector;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	u8 	     packet_life_time;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 	u8           sl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	__be32       flow_label;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	u8           hop_limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	u8           scope;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	u8           join_state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	u8           proxy_join;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) /* Service Record Component Mask Sec 15.2.5.14 Ver 1.1	*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) #define IB_SA_SERVICE_REC_SERVICE_ID			IB_SA_COMP_MASK( 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) #define IB_SA_SERVICE_REC_SERVICE_GID			IB_SA_COMP_MASK( 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) #define IB_SA_SERVICE_REC_SERVICE_PKEY			IB_SA_COMP_MASK( 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /* reserved:								 3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) #define IB_SA_SERVICE_REC_SERVICE_LEASE			IB_SA_COMP_MASK( 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) #define IB_SA_SERVICE_REC_SERVICE_KEY			IB_SA_COMP_MASK( 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #define IB_SA_SERVICE_REC_SERVICE_NAME			IB_SA_COMP_MASK( 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) #define IB_SA_SERVICE_REC_SERVICE_DATA8_0		IB_SA_COMP_MASK( 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) #define IB_SA_SERVICE_REC_SERVICE_DATA8_1		IB_SA_COMP_MASK( 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) #define IB_SA_SERVICE_REC_SERVICE_DATA8_2		IB_SA_COMP_MASK( 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) #define IB_SA_SERVICE_REC_SERVICE_DATA8_3		IB_SA_COMP_MASK(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #define IB_SA_SERVICE_REC_SERVICE_DATA8_4		IB_SA_COMP_MASK(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #define IB_SA_SERVICE_REC_SERVICE_DATA8_5		IB_SA_COMP_MASK(12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) #define IB_SA_SERVICE_REC_SERVICE_DATA8_6		IB_SA_COMP_MASK(13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) #define IB_SA_SERVICE_REC_SERVICE_DATA8_7		IB_SA_COMP_MASK(14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) #define IB_SA_SERVICE_REC_SERVICE_DATA8_8		IB_SA_COMP_MASK(15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) #define IB_SA_SERVICE_REC_SERVICE_DATA8_9		IB_SA_COMP_MASK(16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) #define IB_SA_SERVICE_REC_SERVICE_DATA8_10		IB_SA_COMP_MASK(17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) #define IB_SA_SERVICE_REC_SERVICE_DATA8_11		IB_SA_COMP_MASK(18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) #define IB_SA_SERVICE_REC_SERVICE_DATA8_12		IB_SA_COMP_MASK(19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) #define IB_SA_SERVICE_REC_SERVICE_DATA8_13		IB_SA_COMP_MASK(20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) #define IB_SA_SERVICE_REC_SERVICE_DATA8_14		IB_SA_COMP_MASK(21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #define IB_SA_SERVICE_REC_SERVICE_DATA8_15		IB_SA_COMP_MASK(22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #define IB_SA_SERVICE_REC_SERVICE_DATA16_0		IB_SA_COMP_MASK(23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #define IB_SA_SERVICE_REC_SERVICE_DATA16_1		IB_SA_COMP_MASK(24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) #define IB_SA_SERVICE_REC_SERVICE_DATA16_2		IB_SA_COMP_MASK(25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) #define IB_SA_SERVICE_REC_SERVICE_DATA16_3		IB_SA_COMP_MASK(26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) #define IB_SA_SERVICE_REC_SERVICE_DATA16_4		IB_SA_COMP_MASK(27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) #define IB_SA_SERVICE_REC_SERVICE_DATA16_5		IB_SA_COMP_MASK(28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) #define IB_SA_SERVICE_REC_SERVICE_DATA16_6		IB_SA_COMP_MASK(29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #define IB_SA_SERVICE_REC_SERVICE_DATA16_7		IB_SA_COMP_MASK(30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) #define IB_SA_SERVICE_REC_SERVICE_DATA32_0		IB_SA_COMP_MASK(31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) #define IB_SA_SERVICE_REC_SERVICE_DATA32_1		IB_SA_COMP_MASK(32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #define IB_SA_SERVICE_REC_SERVICE_DATA32_2		IB_SA_COMP_MASK(33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #define IB_SA_SERVICE_REC_SERVICE_DATA32_3		IB_SA_COMP_MASK(34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) #define IB_SA_SERVICE_REC_SERVICE_DATA64_0		IB_SA_COMP_MASK(35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) #define IB_SA_SERVICE_REC_SERVICE_DATA64_1		IB_SA_COMP_MASK(36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) #define IB_DEFAULT_SERVICE_LEASE 	0xFFFFFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) struct ib_sa_service_rec {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 	u64		id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 	union ib_gid	gid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	__be16 		pkey;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 	/* reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 	u32		lease;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 	u8		key[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 	u8		name[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 	u8		data8[16];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 	u16		data16[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 	u32		data32[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	u64		data64[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) #define IB_SA_GUIDINFO_REC_LID		IB_SA_COMP_MASK(0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) #define IB_SA_GUIDINFO_REC_BLOCK_NUM	IB_SA_COMP_MASK(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) #define IB_SA_GUIDINFO_REC_RES1		IB_SA_COMP_MASK(2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) #define IB_SA_GUIDINFO_REC_RES2		IB_SA_COMP_MASK(3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) #define IB_SA_GUIDINFO_REC_GID0		IB_SA_COMP_MASK(4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) #define IB_SA_GUIDINFO_REC_GID1		IB_SA_COMP_MASK(5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) #define IB_SA_GUIDINFO_REC_GID2		IB_SA_COMP_MASK(6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) #define IB_SA_GUIDINFO_REC_GID3		IB_SA_COMP_MASK(7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) #define IB_SA_GUIDINFO_REC_GID4		IB_SA_COMP_MASK(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) #define IB_SA_GUIDINFO_REC_GID5		IB_SA_COMP_MASK(9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) #define IB_SA_GUIDINFO_REC_GID6		IB_SA_COMP_MASK(10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) #define IB_SA_GUIDINFO_REC_GID7		IB_SA_COMP_MASK(11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) struct ib_sa_guidinfo_rec {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 	__be16	lid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 	u8	block_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	/* reserved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	u8	res1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 	__be32	res2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 	u8	guid_info_list[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) struct ib_sa_client {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 	atomic_t users;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 	struct completion comp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411)  * ib_sa_register_client - Register an SA client.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) void ib_sa_register_client(struct ib_sa_client *client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416)  * ib_sa_unregister_client - Deregister an SA client.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)  * @client: Client object to deregister.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) void ib_sa_unregister_client(struct ib_sa_client *client);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) struct ib_sa_query;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) void ib_sa_cancel_query(int id, struct ib_sa_query *query);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) int ib_sa_path_rec_get(struct ib_sa_client *client, struct ib_device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 		       u8 port_num, struct sa_path_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 		       ib_sa_comp_mask comp_mask, unsigned long timeout_ms,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 		       gfp_t gfp_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 		       void (*callback)(int status, struct sa_path_rec *resp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 					void *context),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 		       void *context, struct ib_sa_query **query);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) int ib_sa_service_rec_query(struct ib_sa_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 			    struct ib_device *device, u8 port_num, u8 method,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 			    struct ib_sa_service_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 			    ib_sa_comp_mask comp_mask, unsigned long timeout_ms,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 			    gfp_t gfp_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 			    void (*callback)(int status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 					     struct ib_sa_service_rec *resp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 					     void *context),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 			    void *context, struct ib_sa_query **sa_query);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) struct ib_sa_multicast {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	struct ib_sa_mcmember_rec rec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	ib_sa_comp_mask		comp_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 	int			(*callback)(int status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 					    struct ib_sa_multicast *multicast);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 	void			*context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)  * ib_sa_join_multicast - Initiates a join request to the specified multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453)  *   group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)  * @client: SA client
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)  * @device: Device associated with the multicast group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456)  * @port_num: Port on the specified device to associate with the multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)  *   group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)  * @rec: SA multicast member record specifying group attributes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)  * @comp_mask: Component mask indicating which group attributes of %rec are
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)  *   valid.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)  * @gfp_mask: GFP mask for memory allocations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)  * @callback: User callback invoked once the join operation completes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)  * @context: User specified context stored with the ib_sa_multicast structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)  * This call initiates a multicast join request with the SA for the specified
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)  * multicast group.  If the join operation is started successfully, it returns
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)  * an ib_sa_multicast structure that is used to track the multicast operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)  * Users must free this structure by calling ib_free_multicast, even if the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)  * join operation later fails.  (The callback status is non-zero.)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)  * If the join operation fails; status will be non-zero, with the following
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)  * failures possible:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)  * -ETIMEDOUT: The request timed out.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474)  * -EIO: An error occurred sending the query.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)  * -EINVAL: The MCMemberRecord values differed from the existing group's.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)  * -ENETRESET: Indicates that an fatal error has occurred on the multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477)  *   group, and the user must rejoin the group to continue using it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) struct ib_sa_multicast *ib_sa_join_multicast(struct ib_sa_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 					     struct ib_device *device, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 					     struct ib_sa_mcmember_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 					     ib_sa_comp_mask comp_mask, gfp_t gfp_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 					     int (*callback)(int status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 							     struct ib_sa_multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 								    *multicast),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 					     void *context);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489)  * ib_free_multicast - Frees the multicast tracking structure, and releases
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490)  *    any reference on the multicast group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491)  * @multicast: Multicast tracking structure allocated by ib_join_multicast.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493)  * This call blocks until the multicast identifier is destroyed.  It may
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)  * not be called from within the multicast callback; however, returning a non-
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495)  * zero value from the callback will result in destroying the multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)  * tracking structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) void ib_sa_free_multicast(struct ib_sa_multicast *multicast);
^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)  * ib_get_mcmember_rec - Looks up a multicast member record by its MGID and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502)  *   returns it if found.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)  * @device: Device associated with the multicast group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504)  * @port_num: Port on the specified device to associate with the multicast
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505)  *   group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)  * @mgid: MGID of multicast group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)  * @rec: Location to copy SA multicast member record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) int ib_sa_get_mcmember_rec(struct ib_device *device, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 			   union ib_gid *mgid, struct ib_sa_mcmember_rec *rec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513)  * ib_init_ah_from_mcmember - Initialize address handle attributes based on
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)  * an SA multicast member record.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) int ib_init_ah_from_mcmember(struct ib_device *device, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) 			     struct ib_sa_mcmember_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) 			     struct net_device *ndev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 			     enum ib_gid_type gid_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 			     struct rdma_ah_attr *ah_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) int ib_init_ah_attr_from_path(struct ib_device *device, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 			      struct sa_path_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 			      struct rdma_ah_attr *ah_attr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 			      const struct ib_gid_attr *sgid_attr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)  * ib_sa_pack_path - Conert a path record from struct ib_sa_path_rec
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)  * to IB MAD wire format.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) void ib_sa_pack_path(struct sa_path_rec *rec, void *attribute);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534)  * ib_sa_unpack_path - Convert a path record from MAD format to struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535)  * ib_sa_path_rec.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) void ib_sa_unpack_path(void *attribute, struct sa_path_rec *rec);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) /* Support GuidInfoRecord */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) int ib_sa_guid_info_rec_query(struct ib_sa_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 			      struct ib_device *device, u8 port_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 			      struct ib_sa_guidinfo_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 			      ib_sa_comp_mask comp_mask, u8 method,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 			      unsigned long timeout_ms, gfp_t gfp_mask,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 			      void (*callback)(int status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 					       struct ib_sa_guidinfo_rec *resp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 					       void *context),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 			      void *context, struct ib_sa_query **sa_query);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) bool ib_sa_sendonly_fullmem_support(struct ib_sa_client *client,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 				    struct ib_device *device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 				    u8 port_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) static inline bool sa_path_is_roce(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 	return ((rec->rec_type == SA_PATH_REC_TYPE_ROCE_V1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 		(rec->rec_type == SA_PATH_REC_TYPE_ROCE_V2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) static inline bool sa_path_is_opa(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 	return (rec->rec_type == SA_PATH_REC_TYPE_OPA);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) static inline void sa_path_set_slid(struct sa_path_rec *rec, u32 slid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 	if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 		rec->ib.slid = cpu_to_be16(slid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 	else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 		rec->opa.slid = cpu_to_be32(slid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) static inline void sa_path_set_dlid(struct sa_path_rec *rec, u32 dlid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) 	if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) 		rec->ib.dlid = cpu_to_be16(dlid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) 	else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) 		rec->opa.dlid = cpu_to_be32(dlid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) static inline void sa_path_set_raw_traffic(struct sa_path_rec *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) 					   u8 raw_traffic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) 	if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) 		rec->ib.raw_traffic = raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) 	else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) 		rec->opa.raw_traffic = raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) static inline __be32 sa_path_get_slid(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) 	if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) 		return htonl(ntohs(rec->ib.slid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) 	else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 		return rec->opa.slid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) static inline __be32 sa_path_get_dlid(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) 	if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) 		return htonl(ntohs(rec->ib.dlid));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) 	else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) 		return rec->opa.dlid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) static inline u8 sa_path_get_raw_traffic(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) 	if (rec->rec_type == SA_PATH_REC_TYPE_IB)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) 		return rec->ib.raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) 	else if (rec->rec_type == SA_PATH_REC_TYPE_OPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) 		return rec->opa.raw_traffic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) static inline void sa_path_set_dmac(struct sa_path_rec *rec, u8 *dmac)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) 	if (sa_path_is_roce(rec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) 		memcpy(rec->roce.dmac, dmac, ETH_ALEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) static inline void sa_path_set_dmac_zero(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) 	if (sa_path_is_roce(rec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) 		eth_zero_addr(rec->roce.dmac);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) static inline u8 *sa_path_get_dmac(struct sa_path_rec *rec)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) 	if (sa_path_is_roce(rec))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) 		return rec->roce.dmac;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) #endif /* IB_SA_H */