109938b21SHans Petter Selasky /*-
209938b21SHans Petter Selasky  * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
309938b21SHans Petter Selasky  *
4b5c1e0cbSHans Petter Selasky  * Copyright (c) 2004, 2011 Intel Corporation.  All rights reserved.
5aa0a1e58SJeff Roberson  * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
6aa0a1e58SJeff Roberson  * Copyright (c) 2004 Voltaire Corporation.  All rights reserved.
7aa0a1e58SJeff Roberson  *
8aa0a1e58SJeff Roberson  * This software is available to you under a choice of one of two
9aa0a1e58SJeff Roberson  * licenses.  You may choose to be licensed under the terms of the GNU
10aa0a1e58SJeff Roberson  * General Public License (GPL) Version 2, available from the file
11aa0a1e58SJeff Roberson  * COPYING the madirectory of this source tree, or the
12aa0a1e58SJeff Roberson  * OpenIB.org BSD license below:
13aa0a1e58SJeff Roberson  *
14aa0a1e58SJeff Roberson  *     Redistribution and use source and binary forms, with or
15aa0a1e58SJeff Roberson  *     withmodification, are permitted provided that the following
16aa0a1e58SJeff Roberson  *     conditions are met:
17aa0a1e58SJeff Roberson  *
18aa0a1e58SJeff Roberson  *      - Redistributions of source code must retathe above
19aa0a1e58SJeff Roberson  *        copyright notice, this list of conditions and the following
20aa0a1e58SJeff Roberson  *        disclaimer.
21aa0a1e58SJeff Roberson  *
22aa0a1e58SJeff Roberson  *      - Redistributions binary form must reproduce the above
23aa0a1e58SJeff Roberson  *        copyright notice, this list of conditions and the following
24aa0a1e58SJeff Roberson  *        disclaimer the documentation and/or other materials
25aa0a1e58SJeff Roberson  *        provided with the distribution.
26aa0a1e58SJeff Roberson  *
27aa0a1e58SJeff Roberson  * THE SOFTWARE IS PROVIDED "AS IS", WITHWARRANTY OF ANY KIND,
28aa0a1e58SJeff Roberson  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29aa0a1e58SJeff Roberson  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30aa0a1e58SJeff Roberson  * NONINFRINGEMENT. NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
31aa0a1e58SJeff Roberson  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER AN
32aa0a1e58SJeff Roberson  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OF OR IN
33aa0a1e58SJeff Roberson  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS THE
34aa0a1e58SJeff Roberson  * SOFTWARE.
35aa0a1e58SJeff Roberson  */
3609938b21SHans Petter Selasky 
37aa0a1e58SJeff Roberson #if !defined(CM_MSGS_H)
38aa0a1e58SJeff Roberson #define CM_MSGS_H
39aa0a1e58SJeff Roberson 
40aa0a1e58SJeff Roberson #include <rdma/ib_mad.h>
41aa0a1e58SJeff Roberson #include <rdma/ib_cm.h>
42aa0a1e58SJeff Roberson 
43aa0a1e58SJeff Roberson /*
44aa0a1e58SJeff Roberson  * Parameters to routines below should be in network-byte order, and values
45aa0a1e58SJeff Roberson  * are returned in network-byte order.
46aa0a1e58SJeff Roberson  */
47aa0a1e58SJeff Roberson 
48aa0a1e58SJeff Roberson #define IB_CM_CLASS_VERSION	2 /* IB specification 1.2 */
49aa0a1e58SJeff Roberson 
50aa0a1e58SJeff Roberson struct cm_req_msg {
51aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
52aa0a1e58SJeff Roberson 
53aa0a1e58SJeff Roberson 	__be32 local_comm_id;
54aa0a1e58SJeff Roberson 	__be32 rsvd4;
55aa0a1e58SJeff Roberson 	__be64 service_id;
56aa0a1e58SJeff Roberson 	__be64 local_ca_guid;
57aa0a1e58SJeff Roberson 	__be32 rsvd24;
58aa0a1e58SJeff Roberson 	__be32 local_qkey;
59aa0a1e58SJeff Roberson 	/* local QPN:24, responder resources:8 */
60aa0a1e58SJeff Roberson 	__be32 offset32;
61aa0a1e58SJeff Roberson 	/* local EECN:24, initiator depth:8 */
62aa0a1e58SJeff Roberson 	__be32 offset36;
63aa0a1e58SJeff Roberson 	/*
64aa0a1e58SJeff Roberson 	 * remote EECN:24, remote CM response timeout:5,
65aa0a1e58SJeff Roberson 	 * transport service type:2, end-to-end flow control:1
66aa0a1e58SJeff Roberson 	 */
67aa0a1e58SJeff Roberson 	__be32 offset40;
68aa0a1e58SJeff Roberson 	/* starting PSN:24, local CM response timeout:5, retry count:3 */
69aa0a1e58SJeff Roberson 	__be32 offset44;
70aa0a1e58SJeff Roberson 	__be16 pkey;
71aa0a1e58SJeff Roberson 	/* path MTU:4, RDC exists:1, RNR retry count:3. */
72aa0a1e58SJeff Roberson 	u8 offset50;
73b5c1e0cbSHans Petter Selasky 	/* max CM Retries:4, SRQ:1, extended transport type:3 */
74aa0a1e58SJeff Roberson 	u8 offset51;
75aa0a1e58SJeff Roberson 
76aa0a1e58SJeff Roberson 	__be16 primary_local_lid;
77aa0a1e58SJeff Roberson 	__be16 primary_remote_lid;
78aa0a1e58SJeff Roberson 	union ib_gid primary_local_gid;
79aa0a1e58SJeff Roberson 	union ib_gid primary_remote_gid;
80aa0a1e58SJeff Roberson 	/* flow label:20, rsvd:6, packet rate:6 */
81aa0a1e58SJeff Roberson 	__be32 primary_offset88;
82aa0a1e58SJeff Roberson 	u8 primary_traffic_class;
83aa0a1e58SJeff Roberson 	u8 primary_hop_limit;
84aa0a1e58SJeff Roberson 	/* SL:4, subnet local:1, rsvd:3 */
85aa0a1e58SJeff Roberson 	u8 primary_offset94;
86aa0a1e58SJeff Roberson 	/* local ACK timeout:5, rsvd:3 */
87aa0a1e58SJeff Roberson 	u8 primary_offset95;
88aa0a1e58SJeff Roberson 
89aa0a1e58SJeff Roberson 	__be16 alt_local_lid;
90aa0a1e58SJeff Roberson 	__be16 alt_remote_lid;
91aa0a1e58SJeff Roberson 	union ib_gid alt_local_gid;
92aa0a1e58SJeff Roberson 	union ib_gid alt_remote_gid;
93aa0a1e58SJeff Roberson 	/* flow label:20, rsvd:6, packet rate:6 */
94aa0a1e58SJeff Roberson 	__be32 alt_offset132;
95aa0a1e58SJeff Roberson 	u8 alt_traffic_class;
96aa0a1e58SJeff Roberson 	u8 alt_hop_limit;
97aa0a1e58SJeff Roberson 	/* SL:4, subnet local:1, rsvd:3 */
98aa0a1e58SJeff Roberson 	u8 alt_offset138;
99aa0a1e58SJeff Roberson 	/* local ACK timeout:5, rsvd:3 */
100aa0a1e58SJeff Roberson 	u8 alt_offset139;
101aa0a1e58SJeff Roberson 
102478d3005SHans Petter Selasky 	u32 private_data[IB_CM_REQ_PRIVATE_DATA_SIZE / sizeof(u32)];
103aa0a1e58SJeff Roberson 
104aa0a1e58SJeff Roberson } __attribute__ ((packed));
105aa0a1e58SJeff Roberson 
cm_req_get_local_qpn(struct cm_req_msg * req_msg)106aa0a1e58SJeff Roberson static inline __be32 cm_req_get_local_qpn(struct cm_req_msg *req_msg)
107aa0a1e58SJeff Roberson {
108aa0a1e58SJeff Roberson 	return cpu_to_be32(be32_to_cpu(req_msg->offset32) >> 8);
109aa0a1e58SJeff Roberson }
110aa0a1e58SJeff Roberson 
cm_req_set_local_qpn(struct cm_req_msg * req_msg,__be32 qpn)111aa0a1e58SJeff Roberson static inline void cm_req_set_local_qpn(struct cm_req_msg *req_msg, __be32 qpn)
112aa0a1e58SJeff Roberson {
113aa0a1e58SJeff Roberson 	req_msg->offset32 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
114aa0a1e58SJeff Roberson 					 (be32_to_cpu(req_msg->offset32) &
115aa0a1e58SJeff Roberson 					  0x000000FF));
116aa0a1e58SJeff Roberson }
117aa0a1e58SJeff Roberson 
cm_req_get_resp_res(struct cm_req_msg * req_msg)118aa0a1e58SJeff Roberson static inline u8 cm_req_get_resp_res(struct cm_req_msg *req_msg)
119aa0a1e58SJeff Roberson {
120aa0a1e58SJeff Roberson 	return (u8) be32_to_cpu(req_msg->offset32);
121aa0a1e58SJeff Roberson }
122aa0a1e58SJeff Roberson 
cm_req_set_resp_res(struct cm_req_msg * req_msg,u8 resp_res)123aa0a1e58SJeff Roberson static inline void cm_req_set_resp_res(struct cm_req_msg *req_msg, u8 resp_res)
124aa0a1e58SJeff Roberson {
125aa0a1e58SJeff Roberson 	req_msg->offset32 = cpu_to_be32(resp_res |
126aa0a1e58SJeff Roberson 					(be32_to_cpu(req_msg->offset32) &
127aa0a1e58SJeff Roberson 					 0xFFFFFF00));
128aa0a1e58SJeff Roberson }
129aa0a1e58SJeff Roberson 
cm_req_get_init_depth(struct cm_req_msg * req_msg)130aa0a1e58SJeff Roberson static inline u8 cm_req_get_init_depth(struct cm_req_msg *req_msg)
131aa0a1e58SJeff Roberson {
132aa0a1e58SJeff Roberson 	return (u8) be32_to_cpu(req_msg->offset36);
133aa0a1e58SJeff Roberson }
134aa0a1e58SJeff Roberson 
cm_req_set_init_depth(struct cm_req_msg * req_msg,u8 init_depth)135aa0a1e58SJeff Roberson static inline void cm_req_set_init_depth(struct cm_req_msg *req_msg,
136aa0a1e58SJeff Roberson 					 u8 init_depth)
137aa0a1e58SJeff Roberson {
138aa0a1e58SJeff Roberson 	req_msg->offset36 = cpu_to_be32(init_depth |
139aa0a1e58SJeff Roberson 					(be32_to_cpu(req_msg->offset36) &
140aa0a1e58SJeff Roberson 					 0xFFFFFF00));
141aa0a1e58SJeff Roberson }
142aa0a1e58SJeff Roberson 
cm_req_get_remote_resp_timeout(struct cm_req_msg * req_msg)143aa0a1e58SJeff Roberson static inline u8 cm_req_get_remote_resp_timeout(struct cm_req_msg *req_msg)
144aa0a1e58SJeff Roberson {
145aa0a1e58SJeff Roberson 	return (u8) ((be32_to_cpu(req_msg->offset40) & 0xF8) >> 3);
146aa0a1e58SJeff Roberson }
147aa0a1e58SJeff Roberson 
cm_req_set_remote_resp_timeout(struct cm_req_msg * req_msg,u8 resp_timeout)148aa0a1e58SJeff Roberson static inline void cm_req_set_remote_resp_timeout(struct cm_req_msg *req_msg,
149aa0a1e58SJeff Roberson 						  u8 resp_timeout)
150aa0a1e58SJeff Roberson {
151aa0a1e58SJeff Roberson 	req_msg->offset40 = cpu_to_be32((resp_timeout << 3) |
152aa0a1e58SJeff Roberson 					 (be32_to_cpu(req_msg->offset40) &
153aa0a1e58SJeff Roberson 					  0xFFFFFF07));
154aa0a1e58SJeff Roberson }
155aa0a1e58SJeff Roberson 
cm_req_get_qp_type(struct cm_req_msg * req_msg)156aa0a1e58SJeff Roberson static inline enum ib_qp_type cm_req_get_qp_type(struct cm_req_msg *req_msg)
157aa0a1e58SJeff Roberson {
158aa0a1e58SJeff Roberson 	u8 transport_type = (u8) (be32_to_cpu(req_msg->offset40) & 0x06) >> 1;
159aa0a1e58SJeff Roberson 	switch(transport_type) {
160aa0a1e58SJeff Roberson 	case 0: return IB_QPT_RC;
161aa0a1e58SJeff Roberson 	case 1: return IB_QPT_UC;
162b5c1e0cbSHans Petter Selasky 	case 3:
163b5c1e0cbSHans Petter Selasky 		switch (req_msg->offset51 & 0x7) {
164b5c1e0cbSHans Petter Selasky 		case 1: return IB_QPT_XRC_TGT;
165b5c1e0cbSHans Petter Selasky 		default: return 0;
166b5c1e0cbSHans Petter Selasky 		}
167aa0a1e58SJeff Roberson 	default: return 0;
168aa0a1e58SJeff Roberson 	}
169aa0a1e58SJeff Roberson }
170aa0a1e58SJeff Roberson 
cm_req_set_qp_type(struct cm_req_msg * req_msg,enum ib_qp_type qp_type)171aa0a1e58SJeff Roberson static inline void cm_req_set_qp_type(struct cm_req_msg *req_msg,
172aa0a1e58SJeff Roberson 				      enum ib_qp_type qp_type)
173aa0a1e58SJeff Roberson {
174aa0a1e58SJeff Roberson 	switch(qp_type) {
175aa0a1e58SJeff Roberson 	case IB_QPT_UC:
176aa0a1e58SJeff Roberson 		req_msg->offset40 = cpu_to_be32((be32_to_cpu(
177aa0a1e58SJeff Roberson 						  req_msg->offset40) &
178aa0a1e58SJeff Roberson 						   0xFFFFFFF9) | 0x2);
179aa0a1e58SJeff Roberson 		break;
180b5c1e0cbSHans Petter Selasky 	case IB_QPT_XRC_INI:
181b5c1e0cbSHans Petter Selasky 		req_msg->offset40 = cpu_to_be32((be32_to_cpu(
182b5c1e0cbSHans Petter Selasky 						 req_msg->offset40) &
183b5c1e0cbSHans Petter Selasky 						   0xFFFFFFF9) | 0x6);
184b5c1e0cbSHans Petter Selasky 		req_msg->offset51 = (req_msg->offset51 & 0xF8) | 1;
185b5c1e0cbSHans Petter Selasky 		break;
186aa0a1e58SJeff Roberson 	default:
187aa0a1e58SJeff Roberson 		req_msg->offset40 = cpu_to_be32(be32_to_cpu(
188aa0a1e58SJeff Roberson 						 req_msg->offset40) &
189aa0a1e58SJeff Roberson 						  0xFFFFFFF9);
190aa0a1e58SJeff Roberson 	}
191aa0a1e58SJeff Roberson }
192aa0a1e58SJeff Roberson 
cm_req_get_flow_ctrl(struct cm_req_msg * req_msg)193aa0a1e58SJeff Roberson static inline u8 cm_req_get_flow_ctrl(struct cm_req_msg *req_msg)
194aa0a1e58SJeff Roberson {
195aa0a1e58SJeff Roberson 	return be32_to_cpu(req_msg->offset40) & 0x1;
196aa0a1e58SJeff Roberson }
197aa0a1e58SJeff Roberson 
cm_req_set_flow_ctrl(struct cm_req_msg * req_msg,u8 flow_ctrl)198aa0a1e58SJeff Roberson static inline void cm_req_set_flow_ctrl(struct cm_req_msg *req_msg,
199aa0a1e58SJeff Roberson 					u8 flow_ctrl)
200aa0a1e58SJeff Roberson {
201aa0a1e58SJeff Roberson 	req_msg->offset40 = cpu_to_be32((flow_ctrl & 0x1) |
202aa0a1e58SJeff Roberson 					 (be32_to_cpu(req_msg->offset40) &
203aa0a1e58SJeff Roberson 					  0xFFFFFFFE));
204aa0a1e58SJeff Roberson }
205aa0a1e58SJeff Roberson 
cm_req_get_starting_psn(struct cm_req_msg * req_msg)206aa0a1e58SJeff Roberson static inline __be32 cm_req_get_starting_psn(struct cm_req_msg *req_msg)
207aa0a1e58SJeff Roberson {
208aa0a1e58SJeff Roberson 	return cpu_to_be32(be32_to_cpu(req_msg->offset44) >> 8);
209aa0a1e58SJeff Roberson }
210aa0a1e58SJeff Roberson 
cm_req_set_starting_psn(struct cm_req_msg * req_msg,__be32 starting_psn)211aa0a1e58SJeff Roberson static inline void cm_req_set_starting_psn(struct cm_req_msg *req_msg,
212aa0a1e58SJeff Roberson 					   __be32 starting_psn)
213aa0a1e58SJeff Roberson {
214aa0a1e58SJeff Roberson 	req_msg->offset44 = cpu_to_be32((be32_to_cpu(starting_psn) << 8) |
215aa0a1e58SJeff Roberson 			    (be32_to_cpu(req_msg->offset44) & 0x000000FF));
216aa0a1e58SJeff Roberson }
217aa0a1e58SJeff Roberson 
cm_req_get_local_resp_timeout(struct cm_req_msg * req_msg)218aa0a1e58SJeff Roberson static inline u8 cm_req_get_local_resp_timeout(struct cm_req_msg *req_msg)
219aa0a1e58SJeff Roberson {
220aa0a1e58SJeff Roberson 	return (u8) ((be32_to_cpu(req_msg->offset44) & 0xF8) >> 3);
221aa0a1e58SJeff Roberson }
222aa0a1e58SJeff Roberson 
cm_req_set_local_resp_timeout(struct cm_req_msg * req_msg,u8 resp_timeout)223aa0a1e58SJeff Roberson static inline void cm_req_set_local_resp_timeout(struct cm_req_msg *req_msg,
224aa0a1e58SJeff Roberson 						 u8 resp_timeout)
225aa0a1e58SJeff Roberson {
226aa0a1e58SJeff Roberson 	req_msg->offset44 = cpu_to_be32((resp_timeout << 3) |
227aa0a1e58SJeff Roberson 			    (be32_to_cpu(req_msg->offset44) & 0xFFFFFF07));
228aa0a1e58SJeff Roberson }
229aa0a1e58SJeff Roberson 
cm_req_get_retry_count(struct cm_req_msg * req_msg)230aa0a1e58SJeff Roberson static inline u8 cm_req_get_retry_count(struct cm_req_msg *req_msg)
231aa0a1e58SJeff Roberson {
232aa0a1e58SJeff Roberson 	return (u8) (be32_to_cpu(req_msg->offset44) & 0x7);
233aa0a1e58SJeff Roberson }
234aa0a1e58SJeff Roberson 
cm_req_set_retry_count(struct cm_req_msg * req_msg,u8 retry_count)235aa0a1e58SJeff Roberson static inline void cm_req_set_retry_count(struct cm_req_msg *req_msg,
236aa0a1e58SJeff Roberson 					  u8 retry_count)
237aa0a1e58SJeff Roberson {
238aa0a1e58SJeff Roberson 	req_msg->offset44 = cpu_to_be32((retry_count & 0x7) |
239aa0a1e58SJeff Roberson 			    (be32_to_cpu(req_msg->offset44) & 0xFFFFFFF8));
240aa0a1e58SJeff Roberson }
241aa0a1e58SJeff Roberson 
cm_req_get_path_mtu(struct cm_req_msg * req_msg)242aa0a1e58SJeff Roberson static inline u8 cm_req_get_path_mtu(struct cm_req_msg *req_msg)
243aa0a1e58SJeff Roberson {
244aa0a1e58SJeff Roberson 	return req_msg->offset50 >> 4;
245aa0a1e58SJeff Roberson }
246aa0a1e58SJeff Roberson 
cm_req_set_path_mtu(struct cm_req_msg * req_msg,u8 path_mtu)247aa0a1e58SJeff Roberson static inline void cm_req_set_path_mtu(struct cm_req_msg *req_msg, u8 path_mtu)
248aa0a1e58SJeff Roberson {
249aa0a1e58SJeff Roberson 	req_msg->offset50 = (u8) ((req_msg->offset50 & 0xF) | (path_mtu << 4));
250aa0a1e58SJeff Roberson }
251aa0a1e58SJeff Roberson 
cm_req_get_rnr_retry_count(struct cm_req_msg * req_msg)252aa0a1e58SJeff Roberson static inline u8 cm_req_get_rnr_retry_count(struct cm_req_msg *req_msg)
253aa0a1e58SJeff Roberson {
254aa0a1e58SJeff Roberson 	return req_msg->offset50 & 0x7;
255aa0a1e58SJeff Roberson }
256aa0a1e58SJeff Roberson 
cm_req_set_rnr_retry_count(struct cm_req_msg * req_msg,u8 rnr_retry_count)257aa0a1e58SJeff Roberson static inline void cm_req_set_rnr_retry_count(struct cm_req_msg *req_msg,
258aa0a1e58SJeff Roberson 					      u8 rnr_retry_count)
259aa0a1e58SJeff Roberson {
260aa0a1e58SJeff Roberson 	req_msg->offset50 = (u8) ((req_msg->offset50 & 0xF8) |
261aa0a1e58SJeff Roberson 				  (rnr_retry_count & 0x7));
262aa0a1e58SJeff Roberson }
263aa0a1e58SJeff Roberson 
cm_req_get_max_cm_retries(struct cm_req_msg * req_msg)264aa0a1e58SJeff Roberson static inline u8 cm_req_get_max_cm_retries(struct cm_req_msg *req_msg)
265aa0a1e58SJeff Roberson {
266aa0a1e58SJeff Roberson 	return req_msg->offset51 >> 4;
267aa0a1e58SJeff Roberson }
268aa0a1e58SJeff Roberson 
cm_req_set_max_cm_retries(struct cm_req_msg * req_msg,u8 retries)269aa0a1e58SJeff Roberson static inline void cm_req_set_max_cm_retries(struct cm_req_msg *req_msg,
270aa0a1e58SJeff Roberson 					     u8 retries)
271aa0a1e58SJeff Roberson {
272aa0a1e58SJeff Roberson 	req_msg->offset51 = (u8) ((req_msg->offset51 & 0xF) | (retries << 4));
273aa0a1e58SJeff Roberson }
274aa0a1e58SJeff Roberson 
cm_req_get_srq(struct cm_req_msg * req_msg)275aa0a1e58SJeff Roberson static inline u8 cm_req_get_srq(struct cm_req_msg *req_msg)
276aa0a1e58SJeff Roberson {
277aa0a1e58SJeff Roberson 	return (req_msg->offset51 & 0x8) >> 3;
278aa0a1e58SJeff Roberson }
279aa0a1e58SJeff Roberson 
cm_req_set_srq(struct cm_req_msg * req_msg,u8 srq)280aa0a1e58SJeff Roberson static inline void cm_req_set_srq(struct cm_req_msg *req_msg, u8 srq)
281aa0a1e58SJeff Roberson {
282aa0a1e58SJeff Roberson 	req_msg->offset51 = (u8) ((req_msg->offset51 & 0xF7) |
283aa0a1e58SJeff Roberson 				  ((srq & 0x1) << 3));
284aa0a1e58SJeff Roberson }
285aa0a1e58SJeff Roberson 
cm_req_get_primary_flow_label(struct cm_req_msg * req_msg)286aa0a1e58SJeff Roberson static inline __be32 cm_req_get_primary_flow_label(struct cm_req_msg *req_msg)
287aa0a1e58SJeff Roberson {
288aa0a1e58SJeff Roberson 	return cpu_to_be32(be32_to_cpu(req_msg->primary_offset88) >> 12);
289aa0a1e58SJeff Roberson }
290aa0a1e58SJeff Roberson 
cm_req_set_primary_flow_label(struct cm_req_msg * req_msg,__be32 flow_label)291aa0a1e58SJeff Roberson static inline void cm_req_set_primary_flow_label(struct cm_req_msg *req_msg,
292aa0a1e58SJeff Roberson 						 __be32 flow_label)
293aa0a1e58SJeff Roberson {
294aa0a1e58SJeff Roberson 	req_msg->primary_offset88 = cpu_to_be32(
295aa0a1e58SJeff Roberson 				    (be32_to_cpu(req_msg->primary_offset88) &
296aa0a1e58SJeff Roberson 				     0x00000FFF) |
297aa0a1e58SJeff Roberson 				     (be32_to_cpu(flow_label) << 12));
298aa0a1e58SJeff Roberson }
299aa0a1e58SJeff Roberson 
cm_req_get_primary_packet_rate(struct cm_req_msg * req_msg)300aa0a1e58SJeff Roberson static inline u8 cm_req_get_primary_packet_rate(struct cm_req_msg *req_msg)
301aa0a1e58SJeff Roberson {
302aa0a1e58SJeff Roberson 	return (u8) (be32_to_cpu(req_msg->primary_offset88) & 0x3F);
303aa0a1e58SJeff Roberson }
304aa0a1e58SJeff Roberson 
cm_req_set_primary_packet_rate(struct cm_req_msg * req_msg,u8 rate)305aa0a1e58SJeff Roberson static inline void cm_req_set_primary_packet_rate(struct cm_req_msg *req_msg,
306aa0a1e58SJeff Roberson 						  u8 rate)
307aa0a1e58SJeff Roberson {
308aa0a1e58SJeff Roberson 	req_msg->primary_offset88 = cpu_to_be32(
309aa0a1e58SJeff Roberson 				    (be32_to_cpu(req_msg->primary_offset88) &
310aa0a1e58SJeff Roberson 				     0xFFFFFFC0) | (rate & 0x3F));
311aa0a1e58SJeff Roberson }
312aa0a1e58SJeff Roberson 
cm_req_get_primary_sl(struct cm_req_msg * req_msg)313aa0a1e58SJeff Roberson static inline u8 cm_req_get_primary_sl(struct cm_req_msg *req_msg)
314aa0a1e58SJeff Roberson {
315aa0a1e58SJeff Roberson 	return (u8) (req_msg->primary_offset94 >> 4);
316aa0a1e58SJeff Roberson }
317aa0a1e58SJeff Roberson 
cm_req_set_primary_sl(struct cm_req_msg * req_msg,u8 sl)318aa0a1e58SJeff Roberson static inline void cm_req_set_primary_sl(struct cm_req_msg *req_msg, u8 sl)
319aa0a1e58SJeff Roberson {
320aa0a1e58SJeff Roberson 	req_msg->primary_offset94 = (u8) ((req_msg->primary_offset94 & 0x0F) |
321aa0a1e58SJeff Roberson 					  (sl << 4));
322aa0a1e58SJeff Roberson }
323aa0a1e58SJeff Roberson 
cm_req_get_primary_subnet_local(struct cm_req_msg * req_msg)324aa0a1e58SJeff Roberson static inline u8 cm_req_get_primary_subnet_local(struct cm_req_msg *req_msg)
325aa0a1e58SJeff Roberson {
326aa0a1e58SJeff Roberson 	return (u8) ((req_msg->primary_offset94 & 0x08) >> 3);
327aa0a1e58SJeff Roberson }
328aa0a1e58SJeff Roberson 
cm_req_set_primary_subnet_local(struct cm_req_msg * req_msg,u8 subnet_local)329aa0a1e58SJeff Roberson static inline void cm_req_set_primary_subnet_local(struct cm_req_msg *req_msg,
330aa0a1e58SJeff Roberson 						   u8 subnet_local)
331aa0a1e58SJeff Roberson {
332aa0a1e58SJeff Roberson 	req_msg->primary_offset94 = (u8) ((req_msg->primary_offset94 & 0xF7) |
333aa0a1e58SJeff Roberson 					  ((subnet_local & 0x1) << 3));
334aa0a1e58SJeff Roberson }
335aa0a1e58SJeff Roberson 
cm_req_get_primary_local_ack_timeout(struct cm_req_msg * req_msg)336aa0a1e58SJeff Roberson static inline u8 cm_req_get_primary_local_ack_timeout(struct cm_req_msg *req_msg)
337aa0a1e58SJeff Roberson {
338aa0a1e58SJeff Roberson 	return (u8) (req_msg->primary_offset95 >> 3);
339aa0a1e58SJeff Roberson }
340aa0a1e58SJeff Roberson 
cm_req_set_primary_local_ack_timeout(struct cm_req_msg * req_msg,u8 local_ack_timeout)341aa0a1e58SJeff Roberson static inline void cm_req_set_primary_local_ack_timeout(struct cm_req_msg *req_msg,
342aa0a1e58SJeff Roberson 							u8 local_ack_timeout)
343aa0a1e58SJeff Roberson {
344aa0a1e58SJeff Roberson 	req_msg->primary_offset95 = (u8) ((req_msg->primary_offset95 & 0x07) |
345aa0a1e58SJeff Roberson 					  (local_ack_timeout << 3));
346aa0a1e58SJeff Roberson }
347aa0a1e58SJeff Roberson 
cm_req_get_alt_flow_label(struct cm_req_msg * req_msg)348aa0a1e58SJeff Roberson static inline __be32 cm_req_get_alt_flow_label(struct cm_req_msg *req_msg)
349aa0a1e58SJeff Roberson {
350aa0a1e58SJeff Roberson 	return cpu_to_be32(be32_to_cpu(req_msg->alt_offset132) >> 12);
351aa0a1e58SJeff Roberson }
352aa0a1e58SJeff Roberson 
cm_req_set_alt_flow_label(struct cm_req_msg * req_msg,__be32 flow_label)353aa0a1e58SJeff Roberson static inline void cm_req_set_alt_flow_label(struct cm_req_msg *req_msg,
354aa0a1e58SJeff Roberson 					     __be32 flow_label)
355aa0a1e58SJeff Roberson {
356aa0a1e58SJeff Roberson 	req_msg->alt_offset132 = cpu_to_be32(
357aa0a1e58SJeff Roberson 				 (be32_to_cpu(req_msg->alt_offset132) &
358aa0a1e58SJeff Roberson 				  0x00000FFF) |
359aa0a1e58SJeff Roberson 				  (be32_to_cpu(flow_label) << 12));
360aa0a1e58SJeff Roberson }
361aa0a1e58SJeff Roberson 
cm_req_get_alt_packet_rate(struct cm_req_msg * req_msg)362aa0a1e58SJeff Roberson static inline u8 cm_req_get_alt_packet_rate(struct cm_req_msg *req_msg)
363aa0a1e58SJeff Roberson {
364aa0a1e58SJeff Roberson 	return (u8) (be32_to_cpu(req_msg->alt_offset132) & 0x3F);
365aa0a1e58SJeff Roberson }
366aa0a1e58SJeff Roberson 
cm_req_set_alt_packet_rate(struct cm_req_msg * req_msg,u8 rate)367aa0a1e58SJeff Roberson static inline void cm_req_set_alt_packet_rate(struct cm_req_msg *req_msg,
368aa0a1e58SJeff Roberson 					      u8 rate)
369aa0a1e58SJeff Roberson {
370aa0a1e58SJeff Roberson 	req_msg->alt_offset132 = cpu_to_be32(
371aa0a1e58SJeff Roberson 				 (be32_to_cpu(req_msg->alt_offset132) &
372aa0a1e58SJeff Roberson 				  0xFFFFFFC0) | (rate & 0x3F));
373aa0a1e58SJeff Roberson }
374aa0a1e58SJeff Roberson 
cm_req_get_alt_sl(struct cm_req_msg * req_msg)375aa0a1e58SJeff Roberson static inline u8 cm_req_get_alt_sl(struct cm_req_msg *req_msg)
376aa0a1e58SJeff Roberson {
377aa0a1e58SJeff Roberson 	return (u8) (req_msg->alt_offset138 >> 4);
378aa0a1e58SJeff Roberson }
379aa0a1e58SJeff Roberson 
cm_req_set_alt_sl(struct cm_req_msg * req_msg,u8 sl)380aa0a1e58SJeff Roberson static inline void cm_req_set_alt_sl(struct cm_req_msg *req_msg, u8 sl)
381aa0a1e58SJeff Roberson {
382aa0a1e58SJeff Roberson 	req_msg->alt_offset138 = (u8) ((req_msg->alt_offset138 & 0x0F) |
383aa0a1e58SJeff Roberson 				       (sl << 4));
384aa0a1e58SJeff Roberson }
385aa0a1e58SJeff Roberson 
cm_req_get_alt_subnet_local(struct cm_req_msg * req_msg)386aa0a1e58SJeff Roberson static inline u8 cm_req_get_alt_subnet_local(struct cm_req_msg *req_msg)
387aa0a1e58SJeff Roberson {
388aa0a1e58SJeff Roberson 	return (u8) ((req_msg->alt_offset138 & 0x08) >> 3);
389aa0a1e58SJeff Roberson }
390aa0a1e58SJeff Roberson 
cm_req_set_alt_subnet_local(struct cm_req_msg * req_msg,u8 subnet_local)391aa0a1e58SJeff Roberson static inline void cm_req_set_alt_subnet_local(struct cm_req_msg *req_msg,
392aa0a1e58SJeff Roberson 					       u8 subnet_local)
393aa0a1e58SJeff Roberson {
394aa0a1e58SJeff Roberson 	req_msg->alt_offset138 = (u8) ((req_msg->alt_offset138 & 0xF7) |
395aa0a1e58SJeff Roberson 				       ((subnet_local & 0x1) << 3));
396aa0a1e58SJeff Roberson }
397aa0a1e58SJeff Roberson 
cm_req_get_alt_local_ack_timeout(struct cm_req_msg * req_msg)398aa0a1e58SJeff Roberson static inline u8 cm_req_get_alt_local_ack_timeout(struct cm_req_msg *req_msg)
399aa0a1e58SJeff Roberson {
400aa0a1e58SJeff Roberson 	return (u8) (req_msg->alt_offset139 >> 3);
401aa0a1e58SJeff Roberson }
402aa0a1e58SJeff Roberson 
cm_req_set_alt_local_ack_timeout(struct cm_req_msg * req_msg,u8 local_ack_timeout)403aa0a1e58SJeff Roberson static inline void cm_req_set_alt_local_ack_timeout(struct cm_req_msg *req_msg,
404aa0a1e58SJeff Roberson 						    u8 local_ack_timeout)
405aa0a1e58SJeff Roberson {
406aa0a1e58SJeff Roberson 	req_msg->alt_offset139 = (u8) ((req_msg->alt_offset139 & 0x07) |
407aa0a1e58SJeff Roberson 				       (local_ack_timeout << 3));
408aa0a1e58SJeff Roberson }
409aa0a1e58SJeff Roberson 
410aa0a1e58SJeff Roberson /* Message REJected or MRAed */
411aa0a1e58SJeff Roberson enum cm_msg_response {
412aa0a1e58SJeff Roberson 	CM_MSG_RESPONSE_REQ = 0x0,
413aa0a1e58SJeff Roberson 	CM_MSG_RESPONSE_REP = 0x1,
414aa0a1e58SJeff Roberson 	CM_MSG_RESPONSE_OTHER = 0x2
415aa0a1e58SJeff Roberson };
416aa0a1e58SJeff Roberson 
417aa0a1e58SJeff Roberson  struct cm_mra_msg {
418aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
419aa0a1e58SJeff Roberson 
420aa0a1e58SJeff Roberson 	__be32 local_comm_id;
421aa0a1e58SJeff Roberson 	__be32 remote_comm_id;
422aa0a1e58SJeff Roberson 	/* message MRAed:2, rsvd:6 */
423aa0a1e58SJeff Roberson 	u8 offset8;
424aa0a1e58SJeff Roberson 	/* service timeout:5, rsvd:3 */
425aa0a1e58SJeff Roberson 	u8 offset9;
426aa0a1e58SJeff Roberson 
427aa0a1e58SJeff Roberson 	u8 private_data[IB_CM_MRA_PRIVATE_DATA_SIZE];
428aa0a1e58SJeff Roberson 
429aa0a1e58SJeff Roberson } __attribute__ ((packed));
430aa0a1e58SJeff Roberson 
cm_mra_get_msg_mraed(struct cm_mra_msg * mra_msg)431aa0a1e58SJeff Roberson static inline u8 cm_mra_get_msg_mraed(struct cm_mra_msg *mra_msg)
432aa0a1e58SJeff Roberson {
433aa0a1e58SJeff Roberson 	return (u8) (mra_msg->offset8 >> 6);
434aa0a1e58SJeff Roberson }
435aa0a1e58SJeff Roberson 
cm_mra_set_msg_mraed(struct cm_mra_msg * mra_msg,u8 msg)436aa0a1e58SJeff Roberson static inline void cm_mra_set_msg_mraed(struct cm_mra_msg *mra_msg, u8 msg)
437aa0a1e58SJeff Roberson {
438aa0a1e58SJeff Roberson 	mra_msg->offset8 = (u8) ((mra_msg->offset8 & 0x3F) | (msg << 6));
439aa0a1e58SJeff Roberson }
440aa0a1e58SJeff Roberson 
cm_mra_get_service_timeout(struct cm_mra_msg * mra_msg)441aa0a1e58SJeff Roberson static inline u8 cm_mra_get_service_timeout(struct cm_mra_msg *mra_msg)
442aa0a1e58SJeff Roberson {
443aa0a1e58SJeff Roberson 	return (u8) (mra_msg->offset9 >> 3);
444aa0a1e58SJeff Roberson }
445aa0a1e58SJeff Roberson 
cm_mra_set_service_timeout(struct cm_mra_msg * mra_msg,u8 service_timeout)446aa0a1e58SJeff Roberson static inline void cm_mra_set_service_timeout(struct cm_mra_msg *mra_msg,
447aa0a1e58SJeff Roberson 					      u8 service_timeout)
448aa0a1e58SJeff Roberson {
449aa0a1e58SJeff Roberson 	mra_msg->offset9 = (u8) ((mra_msg->offset9 & 0x07) |
450aa0a1e58SJeff Roberson 				 (service_timeout << 3));
451aa0a1e58SJeff Roberson }
452aa0a1e58SJeff Roberson 
453aa0a1e58SJeff Roberson struct cm_rej_msg {
454aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
455aa0a1e58SJeff Roberson 
456aa0a1e58SJeff Roberson 	__be32 local_comm_id;
457aa0a1e58SJeff Roberson 	__be32 remote_comm_id;
458aa0a1e58SJeff Roberson 	/* message REJected:2, rsvd:6 */
459aa0a1e58SJeff Roberson 	u8 offset8;
460aa0a1e58SJeff Roberson 	/* reject info length:7, rsvd:1. */
461aa0a1e58SJeff Roberson 	u8 offset9;
462aa0a1e58SJeff Roberson 	__be16 reason;
463aa0a1e58SJeff Roberson 	u8 ari[IB_CM_REJ_ARI_LENGTH];
464aa0a1e58SJeff Roberson 
465aa0a1e58SJeff Roberson 	u8 private_data[IB_CM_REJ_PRIVATE_DATA_SIZE];
466aa0a1e58SJeff Roberson 
467aa0a1e58SJeff Roberson } __attribute__ ((packed));
468aa0a1e58SJeff Roberson 
cm_rej_get_msg_rejected(struct cm_rej_msg * rej_msg)469aa0a1e58SJeff Roberson static inline u8 cm_rej_get_msg_rejected(struct cm_rej_msg *rej_msg)
470aa0a1e58SJeff Roberson {
471aa0a1e58SJeff Roberson 	return (u8) (rej_msg->offset8 >> 6);
472aa0a1e58SJeff Roberson }
473aa0a1e58SJeff Roberson 
cm_rej_set_msg_rejected(struct cm_rej_msg * rej_msg,u8 msg)474aa0a1e58SJeff Roberson static inline void cm_rej_set_msg_rejected(struct cm_rej_msg *rej_msg, u8 msg)
475aa0a1e58SJeff Roberson {
476aa0a1e58SJeff Roberson 	rej_msg->offset8 = (u8) ((rej_msg->offset8 & 0x3F) | (msg << 6));
477aa0a1e58SJeff Roberson }
478aa0a1e58SJeff Roberson 
cm_rej_get_reject_info_len(struct cm_rej_msg * rej_msg)479aa0a1e58SJeff Roberson static inline u8 cm_rej_get_reject_info_len(struct cm_rej_msg *rej_msg)
480aa0a1e58SJeff Roberson {
481aa0a1e58SJeff Roberson 	return (u8) (rej_msg->offset9 >> 1);
482aa0a1e58SJeff Roberson }
483aa0a1e58SJeff Roberson 
cm_rej_set_reject_info_len(struct cm_rej_msg * rej_msg,u8 len)484aa0a1e58SJeff Roberson static inline void cm_rej_set_reject_info_len(struct cm_rej_msg *rej_msg,
485aa0a1e58SJeff Roberson 					      u8 len)
486aa0a1e58SJeff Roberson {
487aa0a1e58SJeff Roberson 	rej_msg->offset9 = (u8) ((rej_msg->offset9 & 0x1) | (len << 1));
488aa0a1e58SJeff Roberson }
489aa0a1e58SJeff Roberson 
490aa0a1e58SJeff Roberson struct cm_rep_msg {
491aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
492aa0a1e58SJeff Roberson 
493aa0a1e58SJeff Roberson 	__be32 local_comm_id;
494aa0a1e58SJeff Roberson 	__be32 remote_comm_id;
495aa0a1e58SJeff Roberson 	__be32 local_qkey;
496aa0a1e58SJeff Roberson 	/* local QPN:24, rsvd:8 */
497aa0a1e58SJeff Roberson 	__be32 offset12;
498aa0a1e58SJeff Roberson 	/* local EECN:24, rsvd:8 */
499aa0a1e58SJeff Roberson 	__be32 offset16;
500aa0a1e58SJeff Roberson 	/* starting PSN:24 rsvd:8 */
501aa0a1e58SJeff Roberson 	__be32 offset20;
502aa0a1e58SJeff Roberson 	u8 resp_resources;
503aa0a1e58SJeff Roberson 	u8 initiator_depth;
504aa0a1e58SJeff Roberson 	/* target ACK delay:5, failover accepted:2, end-to-end flow control:1 */
505aa0a1e58SJeff Roberson 	u8 offset26;
506aa0a1e58SJeff Roberson 	/* RNR retry count:3, SRQ:1, rsvd:5 */
507aa0a1e58SJeff Roberson 	u8 offset27;
508aa0a1e58SJeff Roberson 	__be64 local_ca_guid;
509aa0a1e58SJeff Roberson 
510aa0a1e58SJeff Roberson 	u8 private_data[IB_CM_REP_PRIVATE_DATA_SIZE];
511aa0a1e58SJeff Roberson 
512aa0a1e58SJeff Roberson } __attribute__ ((packed));
513aa0a1e58SJeff Roberson 
cm_rep_get_local_qpn(struct cm_rep_msg * rep_msg)514aa0a1e58SJeff Roberson static inline __be32 cm_rep_get_local_qpn(struct cm_rep_msg *rep_msg)
515aa0a1e58SJeff Roberson {
516aa0a1e58SJeff Roberson 	return cpu_to_be32(be32_to_cpu(rep_msg->offset12) >> 8);
517aa0a1e58SJeff Roberson }
518aa0a1e58SJeff Roberson 
cm_rep_set_local_qpn(struct cm_rep_msg * rep_msg,__be32 qpn)519aa0a1e58SJeff Roberson static inline void cm_rep_set_local_qpn(struct cm_rep_msg *rep_msg, __be32 qpn)
520aa0a1e58SJeff Roberson {
521aa0a1e58SJeff Roberson 	rep_msg->offset12 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
522aa0a1e58SJeff Roberson 			    (be32_to_cpu(rep_msg->offset12) & 0x000000FF));
523aa0a1e58SJeff Roberson }
524aa0a1e58SJeff Roberson 
cm_rep_get_local_eecn(struct cm_rep_msg * rep_msg)525b5c1e0cbSHans Petter Selasky static inline __be32 cm_rep_get_local_eecn(struct cm_rep_msg *rep_msg)
526b5c1e0cbSHans Petter Selasky {
527b5c1e0cbSHans Petter Selasky 	return cpu_to_be32(be32_to_cpu(rep_msg->offset16) >> 8);
528b5c1e0cbSHans Petter Selasky }
529b5c1e0cbSHans Petter Selasky 
cm_rep_set_local_eecn(struct cm_rep_msg * rep_msg,__be32 eecn)530b5c1e0cbSHans Petter Selasky static inline void cm_rep_set_local_eecn(struct cm_rep_msg *rep_msg, __be32 eecn)
531b5c1e0cbSHans Petter Selasky {
532b5c1e0cbSHans Petter Selasky 	rep_msg->offset16 = cpu_to_be32((be32_to_cpu(eecn) << 8) |
533b5c1e0cbSHans Petter Selasky 			    (be32_to_cpu(rep_msg->offset16) & 0x000000FF));
534b5c1e0cbSHans Petter Selasky }
535b5c1e0cbSHans Petter Selasky 
cm_rep_get_qpn(struct cm_rep_msg * rep_msg,enum ib_qp_type qp_type)536b5c1e0cbSHans Petter Selasky static inline __be32 cm_rep_get_qpn(struct cm_rep_msg *rep_msg, enum ib_qp_type qp_type)
537b5c1e0cbSHans Petter Selasky {
538b5c1e0cbSHans Petter Selasky 	return (qp_type == IB_QPT_XRC_INI) ?
539b5c1e0cbSHans Petter Selasky 		cm_rep_get_local_eecn(rep_msg) : cm_rep_get_local_qpn(rep_msg);
540b5c1e0cbSHans Petter Selasky }
541b5c1e0cbSHans Petter Selasky 
cm_rep_get_starting_psn(struct cm_rep_msg * rep_msg)542aa0a1e58SJeff Roberson static inline __be32 cm_rep_get_starting_psn(struct cm_rep_msg *rep_msg)
543aa0a1e58SJeff Roberson {
544aa0a1e58SJeff Roberson 	return cpu_to_be32(be32_to_cpu(rep_msg->offset20) >> 8);
545aa0a1e58SJeff Roberson }
546aa0a1e58SJeff Roberson 
cm_rep_set_starting_psn(struct cm_rep_msg * rep_msg,__be32 starting_psn)547aa0a1e58SJeff Roberson static inline void cm_rep_set_starting_psn(struct cm_rep_msg *rep_msg,
548aa0a1e58SJeff Roberson 					   __be32 starting_psn)
549aa0a1e58SJeff Roberson {
550aa0a1e58SJeff Roberson 	rep_msg->offset20 = cpu_to_be32((be32_to_cpu(starting_psn) << 8) |
551aa0a1e58SJeff Roberson 			    (be32_to_cpu(rep_msg->offset20) & 0x000000FF));
552aa0a1e58SJeff Roberson }
553aa0a1e58SJeff Roberson 
cm_rep_get_target_ack_delay(struct cm_rep_msg * rep_msg)554aa0a1e58SJeff Roberson static inline u8 cm_rep_get_target_ack_delay(struct cm_rep_msg *rep_msg)
555aa0a1e58SJeff Roberson {
556aa0a1e58SJeff Roberson 	return (u8) (rep_msg->offset26 >> 3);
557aa0a1e58SJeff Roberson }
558aa0a1e58SJeff Roberson 
cm_rep_set_target_ack_delay(struct cm_rep_msg * rep_msg,u8 target_ack_delay)559aa0a1e58SJeff Roberson static inline void cm_rep_set_target_ack_delay(struct cm_rep_msg *rep_msg,
560aa0a1e58SJeff Roberson 					       u8 target_ack_delay)
561aa0a1e58SJeff Roberson {
562aa0a1e58SJeff Roberson 	rep_msg->offset26 = (u8) ((rep_msg->offset26 & 0x07) |
563aa0a1e58SJeff Roberson 				  (target_ack_delay << 3));
564aa0a1e58SJeff Roberson }
565aa0a1e58SJeff Roberson 
cm_rep_get_failover(struct cm_rep_msg * rep_msg)566aa0a1e58SJeff Roberson static inline u8 cm_rep_get_failover(struct cm_rep_msg *rep_msg)
567aa0a1e58SJeff Roberson {
568aa0a1e58SJeff Roberson 	return (u8) ((rep_msg->offset26 & 0x06) >> 1);
569aa0a1e58SJeff Roberson }
570aa0a1e58SJeff Roberson 
cm_rep_set_failover(struct cm_rep_msg * rep_msg,u8 failover)571aa0a1e58SJeff Roberson static inline void cm_rep_set_failover(struct cm_rep_msg *rep_msg, u8 failover)
572aa0a1e58SJeff Roberson {
573aa0a1e58SJeff Roberson 	rep_msg->offset26 = (u8) ((rep_msg->offset26 & 0xF9) |
574aa0a1e58SJeff Roberson 				  ((failover & 0x3) << 1));
575aa0a1e58SJeff Roberson }
576aa0a1e58SJeff Roberson 
cm_rep_get_flow_ctrl(struct cm_rep_msg * rep_msg)577aa0a1e58SJeff Roberson static inline u8 cm_rep_get_flow_ctrl(struct cm_rep_msg *rep_msg)
578aa0a1e58SJeff Roberson {
579aa0a1e58SJeff Roberson 	return (u8) (rep_msg->offset26 & 0x01);
580aa0a1e58SJeff Roberson }
581aa0a1e58SJeff Roberson 
cm_rep_set_flow_ctrl(struct cm_rep_msg * rep_msg,u8 flow_ctrl)582aa0a1e58SJeff Roberson static inline void cm_rep_set_flow_ctrl(struct cm_rep_msg *rep_msg,
583aa0a1e58SJeff Roberson 					    u8 flow_ctrl)
584aa0a1e58SJeff Roberson {
585aa0a1e58SJeff Roberson 	rep_msg->offset26 = (u8) ((rep_msg->offset26 & 0xFE) |
586aa0a1e58SJeff Roberson 				  (flow_ctrl & 0x1));
587aa0a1e58SJeff Roberson }
588aa0a1e58SJeff Roberson 
cm_rep_get_rnr_retry_count(struct cm_rep_msg * rep_msg)589aa0a1e58SJeff Roberson static inline u8 cm_rep_get_rnr_retry_count(struct cm_rep_msg *rep_msg)
590aa0a1e58SJeff Roberson {
591aa0a1e58SJeff Roberson 	return (u8) (rep_msg->offset27 >> 5);
592aa0a1e58SJeff Roberson }
593aa0a1e58SJeff Roberson 
cm_rep_set_rnr_retry_count(struct cm_rep_msg * rep_msg,u8 rnr_retry_count)594aa0a1e58SJeff Roberson static inline void cm_rep_set_rnr_retry_count(struct cm_rep_msg *rep_msg,
595aa0a1e58SJeff Roberson 					      u8 rnr_retry_count)
596aa0a1e58SJeff Roberson {
597aa0a1e58SJeff Roberson 	rep_msg->offset27 = (u8) ((rep_msg->offset27 & 0x1F) |
598aa0a1e58SJeff Roberson 				  (rnr_retry_count << 5));
599aa0a1e58SJeff Roberson }
600aa0a1e58SJeff Roberson 
cm_rep_get_srq(struct cm_rep_msg * rep_msg)601aa0a1e58SJeff Roberson static inline u8 cm_rep_get_srq(struct cm_rep_msg *rep_msg)
602aa0a1e58SJeff Roberson {
603aa0a1e58SJeff Roberson 	return (u8) ((rep_msg->offset27 >> 4) & 0x1);
604aa0a1e58SJeff Roberson }
605aa0a1e58SJeff Roberson 
cm_rep_set_srq(struct cm_rep_msg * rep_msg,u8 srq)606aa0a1e58SJeff Roberson static inline void cm_rep_set_srq(struct cm_rep_msg *rep_msg, u8 srq)
607aa0a1e58SJeff Roberson {
608aa0a1e58SJeff Roberson 	rep_msg->offset27 = (u8) ((rep_msg->offset27 & 0xEF) |
609aa0a1e58SJeff Roberson 				  ((srq & 0x1) << 4));
610aa0a1e58SJeff Roberson }
611aa0a1e58SJeff Roberson 
612aa0a1e58SJeff Roberson struct cm_rtu_msg {
613aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
614aa0a1e58SJeff Roberson 
615aa0a1e58SJeff Roberson 	__be32 local_comm_id;
616aa0a1e58SJeff Roberson 	__be32 remote_comm_id;
617aa0a1e58SJeff Roberson 
618aa0a1e58SJeff Roberson 	u8 private_data[IB_CM_RTU_PRIVATE_DATA_SIZE];
619aa0a1e58SJeff Roberson 
620aa0a1e58SJeff Roberson } __attribute__ ((packed));
621aa0a1e58SJeff Roberson 
622aa0a1e58SJeff Roberson struct cm_dreq_msg {
623aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
624aa0a1e58SJeff Roberson 
625aa0a1e58SJeff Roberson 	__be32 local_comm_id;
626aa0a1e58SJeff Roberson 	__be32 remote_comm_id;
627aa0a1e58SJeff Roberson 	/* remote QPN/EECN:24, rsvd:8 */
628aa0a1e58SJeff Roberson 	__be32 offset8;
629aa0a1e58SJeff Roberson 
630aa0a1e58SJeff Roberson 	u8 private_data[IB_CM_DREQ_PRIVATE_DATA_SIZE];
631aa0a1e58SJeff Roberson 
632aa0a1e58SJeff Roberson } __attribute__ ((packed));
633aa0a1e58SJeff Roberson 
cm_dreq_get_remote_qpn(struct cm_dreq_msg * dreq_msg)634aa0a1e58SJeff Roberson static inline __be32 cm_dreq_get_remote_qpn(struct cm_dreq_msg *dreq_msg)
635aa0a1e58SJeff Roberson {
636aa0a1e58SJeff Roberson 	return cpu_to_be32(be32_to_cpu(dreq_msg->offset8) >> 8);
637aa0a1e58SJeff Roberson }
638aa0a1e58SJeff Roberson 
cm_dreq_set_remote_qpn(struct cm_dreq_msg * dreq_msg,__be32 qpn)639aa0a1e58SJeff Roberson static inline void cm_dreq_set_remote_qpn(struct cm_dreq_msg *dreq_msg, __be32 qpn)
640aa0a1e58SJeff Roberson {
641aa0a1e58SJeff Roberson 	dreq_msg->offset8 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
642aa0a1e58SJeff Roberson 			    (be32_to_cpu(dreq_msg->offset8) & 0x000000FF));
643aa0a1e58SJeff Roberson }
644aa0a1e58SJeff Roberson 
645aa0a1e58SJeff Roberson struct cm_drep_msg {
646aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
647aa0a1e58SJeff Roberson 
648aa0a1e58SJeff Roberson 	__be32 local_comm_id;
649aa0a1e58SJeff Roberson 	__be32 remote_comm_id;
650aa0a1e58SJeff Roberson 
651aa0a1e58SJeff Roberson 	u8 private_data[IB_CM_DREP_PRIVATE_DATA_SIZE];
652aa0a1e58SJeff Roberson 
653aa0a1e58SJeff Roberson } __attribute__ ((packed));
654aa0a1e58SJeff Roberson 
655aa0a1e58SJeff Roberson struct cm_lap_msg {
656aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
657aa0a1e58SJeff Roberson 
658aa0a1e58SJeff Roberson 	__be32 local_comm_id;
659aa0a1e58SJeff Roberson 	__be32 remote_comm_id;
660aa0a1e58SJeff Roberson 
661aa0a1e58SJeff Roberson 	__be32 rsvd8;
662aa0a1e58SJeff Roberson 	/* remote QPN/EECN:24, remote CM response timeout:5, rsvd:3 */
663aa0a1e58SJeff Roberson 	__be32 offset12;
664aa0a1e58SJeff Roberson 	__be32 rsvd16;
665aa0a1e58SJeff Roberson 
666aa0a1e58SJeff Roberson 	__be16 alt_local_lid;
667aa0a1e58SJeff Roberson 	__be16 alt_remote_lid;
668aa0a1e58SJeff Roberson 	union ib_gid alt_local_gid;
669aa0a1e58SJeff Roberson 	union ib_gid alt_remote_gid;
670aa0a1e58SJeff Roberson 	/* flow label:20, rsvd:4, traffic class:8 */
671aa0a1e58SJeff Roberson 	__be32 offset56;
672aa0a1e58SJeff Roberson 	u8 alt_hop_limit;
673aa0a1e58SJeff Roberson 	/* rsvd:2, packet rate:6 */
674aa0a1e58SJeff Roberson 	u8 offset61;
675aa0a1e58SJeff Roberson 	/* SL:4, subnet local:1, rsvd:3 */
676aa0a1e58SJeff Roberson 	u8 offset62;
677aa0a1e58SJeff Roberson 	/* local ACK timeout:5, rsvd:3 */
678aa0a1e58SJeff Roberson 	u8 offset63;
679aa0a1e58SJeff Roberson 
680aa0a1e58SJeff Roberson 	u8 private_data[IB_CM_LAP_PRIVATE_DATA_SIZE];
681aa0a1e58SJeff Roberson } __attribute__  ((packed));
682aa0a1e58SJeff Roberson 
cm_lap_get_remote_qpn(struct cm_lap_msg * lap_msg)683aa0a1e58SJeff Roberson static inline __be32 cm_lap_get_remote_qpn(struct cm_lap_msg *lap_msg)
684aa0a1e58SJeff Roberson {
685aa0a1e58SJeff Roberson 	return cpu_to_be32(be32_to_cpu(lap_msg->offset12) >> 8);
686aa0a1e58SJeff Roberson }
687aa0a1e58SJeff Roberson 
cm_lap_set_remote_qpn(struct cm_lap_msg * lap_msg,__be32 qpn)688aa0a1e58SJeff Roberson static inline void cm_lap_set_remote_qpn(struct cm_lap_msg *lap_msg, __be32 qpn)
689aa0a1e58SJeff Roberson {
690aa0a1e58SJeff Roberson 	lap_msg->offset12 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
691aa0a1e58SJeff Roberson 					 (be32_to_cpu(lap_msg->offset12) &
692aa0a1e58SJeff Roberson 					  0x000000FF));
693aa0a1e58SJeff Roberson }
694aa0a1e58SJeff Roberson 
cm_lap_get_remote_resp_timeout(struct cm_lap_msg * lap_msg)695aa0a1e58SJeff Roberson static inline u8 cm_lap_get_remote_resp_timeout(struct cm_lap_msg *lap_msg)
696aa0a1e58SJeff Roberson {
697aa0a1e58SJeff Roberson 	return (u8) ((be32_to_cpu(lap_msg->offset12) & 0xF8) >> 3);
698aa0a1e58SJeff Roberson }
699aa0a1e58SJeff Roberson 
cm_lap_set_remote_resp_timeout(struct cm_lap_msg * lap_msg,u8 resp_timeout)700aa0a1e58SJeff Roberson static inline void cm_lap_set_remote_resp_timeout(struct cm_lap_msg *lap_msg,
701aa0a1e58SJeff Roberson 						  u8 resp_timeout)
702aa0a1e58SJeff Roberson {
703aa0a1e58SJeff Roberson 	lap_msg->offset12 = cpu_to_be32((resp_timeout << 3) |
704aa0a1e58SJeff Roberson 					 (be32_to_cpu(lap_msg->offset12) &
705aa0a1e58SJeff Roberson 					  0xFFFFFF07));
706aa0a1e58SJeff Roberson }
707aa0a1e58SJeff Roberson 
cm_lap_get_flow_label(struct cm_lap_msg * lap_msg)708aa0a1e58SJeff Roberson static inline __be32 cm_lap_get_flow_label(struct cm_lap_msg *lap_msg)
709aa0a1e58SJeff Roberson {
710aa0a1e58SJeff Roberson 	return cpu_to_be32(be32_to_cpu(lap_msg->offset56) >> 12);
711aa0a1e58SJeff Roberson }
712aa0a1e58SJeff Roberson 
cm_lap_set_flow_label(struct cm_lap_msg * lap_msg,__be32 flow_label)713aa0a1e58SJeff Roberson static inline void cm_lap_set_flow_label(struct cm_lap_msg *lap_msg,
714aa0a1e58SJeff Roberson 					 __be32 flow_label)
715aa0a1e58SJeff Roberson {
716aa0a1e58SJeff Roberson 	lap_msg->offset56 = cpu_to_be32(
717aa0a1e58SJeff Roberson 				 (be32_to_cpu(lap_msg->offset56) & 0x00000FFF) |
718aa0a1e58SJeff Roberson 				 (be32_to_cpu(flow_label) << 12));
719aa0a1e58SJeff Roberson }
720aa0a1e58SJeff Roberson 
cm_lap_get_traffic_class(struct cm_lap_msg * lap_msg)721aa0a1e58SJeff Roberson static inline u8 cm_lap_get_traffic_class(struct cm_lap_msg *lap_msg)
722aa0a1e58SJeff Roberson {
723aa0a1e58SJeff Roberson 	return (u8) be32_to_cpu(lap_msg->offset56);
724aa0a1e58SJeff Roberson }
725aa0a1e58SJeff Roberson 
cm_lap_set_traffic_class(struct cm_lap_msg * lap_msg,u8 traffic_class)726aa0a1e58SJeff Roberson static inline void cm_lap_set_traffic_class(struct cm_lap_msg *lap_msg,
727aa0a1e58SJeff Roberson 					    u8 traffic_class)
728aa0a1e58SJeff Roberson {
729aa0a1e58SJeff Roberson 	lap_msg->offset56 = cpu_to_be32(traffic_class |
730aa0a1e58SJeff Roberson 					 (be32_to_cpu(lap_msg->offset56) &
731aa0a1e58SJeff Roberson 					  0xFFFFFF00));
732aa0a1e58SJeff Roberson }
733aa0a1e58SJeff Roberson 
cm_lap_get_packet_rate(struct cm_lap_msg * lap_msg)734aa0a1e58SJeff Roberson static inline u8 cm_lap_get_packet_rate(struct cm_lap_msg *lap_msg)
735aa0a1e58SJeff Roberson {
736aa0a1e58SJeff Roberson 	return lap_msg->offset61 & 0x3F;
737aa0a1e58SJeff Roberson }
738aa0a1e58SJeff Roberson 
cm_lap_set_packet_rate(struct cm_lap_msg * lap_msg,u8 packet_rate)739aa0a1e58SJeff Roberson static inline void cm_lap_set_packet_rate(struct cm_lap_msg *lap_msg,
740aa0a1e58SJeff Roberson 					  u8 packet_rate)
741aa0a1e58SJeff Roberson {
742aa0a1e58SJeff Roberson 	lap_msg->offset61 = (packet_rate & 0x3F) | (lap_msg->offset61 & 0xC0);
743aa0a1e58SJeff Roberson }
744aa0a1e58SJeff Roberson 
cm_lap_get_sl(struct cm_lap_msg * lap_msg)745aa0a1e58SJeff Roberson static inline u8 cm_lap_get_sl(struct cm_lap_msg *lap_msg)
746aa0a1e58SJeff Roberson {
747aa0a1e58SJeff Roberson 	return lap_msg->offset62 >> 4;
748aa0a1e58SJeff Roberson }
749aa0a1e58SJeff Roberson 
cm_lap_set_sl(struct cm_lap_msg * lap_msg,u8 sl)750aa0a1e58SJeff Roberson static inline void cm_lap_set_sl(struct cm_lap_msg *lap_msg, u8 sl)
751aa0a1e58SJeff Roberson {
752aa0a1e58SJeff Roberson 	lap_msg->offset62 = (sl << 4) | (lap_msg->offset62 & 0x0F);
753aa0a1e58SJeff Roberson }
754aa0a1e58SJeff Roberson 
cm_lap_get_subnet_local(struct cm_lap_msg * lap_msg)755aa0a1e58SJeff Roberson static inline u8 cm_lap_get_subnet_local(struct cm_lap_msg *lap_msg)
756aa0a1e58SJeff Roberson {
757aa0a1e58SJeff Roberson 	return (lap_msg->offset62 >> 3) & 0x1;
758aa0a1e58SJeff Roberson }
759aa0a1e58SJeff Roberson 
cm_lap_set_subnet_local(struct cm_lap_msg * lap_msg,u8 subnet_local)760aa0a1e58SJeff Roberson static inline void cm_lap_set_subnet_local(struct cm_lap_msg *lap_msg,
761aa0a1e58SJeff Roberson 					   u8 subnet_local)
762aa0a1e58SJeff Roberson {
763aa0a1e58SJeff Roberson 	lap_msg->offset62 = ((subnet_local & 0x1) << 3) |
764aa0a1e58SJeff Roberson 			     (lap_msg->offset61 & 0xF7);
765aa0a1e58SJeff Roberson }
cm_lap_get_local_ack_timeout(struct cm_lap_msg * lap_msg)766aa0a1e58SJeff Roberson static inline u8 cm_lap_get_local_ack_timeout(struct cm_lap_msg *lap_msg)
767aa0a1e58SJeff Roberson {
768aa0a1e58SJeff Roberson 	return lap_msg->offset63 >> 3;
769aa0a1e58SJeff Roberson }
770aa0a1e58SJeff Roberson 
cm_lap_set_local_ack_timeout(struct cm_lap_msg * lap_msg,u8 local_ack_timeout)771aa0a1e58SJeff Roberson static inline void cm_lap_set_local_ack_timeout(struct cm_lap_msg *lap_msg,
772aa0a1e58SJeff Roberson 						u8 local_ack_timeout)
773aa0a1e58SJeff Roberson {
774aa0a1e58SJeff Roberson 	lap_msg->offset63 = (local_ack_timeout << 3) |
775aa0a1e58SJeff Roberson 			    (lap_msg->offset63 & 0x07);
776aa0a1e58SJeff Roberson }
777aa0a1e58SJeff Roberson 
778aa0a1e58SJeff Roberson struct cm_apr_msg {
779aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
780aa0a1e58SJeff Roberson 
781aa0a1e58SJeff Roberson 	__be32 local_comm_id;
782aa0a1e58SJeff Roberson 	__be32 remote_comm_id;
783aa0a1e58SJeff Roberson 
784aa0a1e58SJeff Roberson 	u8 info_length;
785aa0a1e58SJeff Roberson 	u8 ap_status;
786b5c1e0cbSHans Petter Selasky 	__be16 rsvd;
787aa0a1e58SJeff Roberson 	u8 info[IB_CM_APR_INFO_LENGTH];
788aa0a1e58SJeff Roberson 
789aa0a1e58SJeff Roberson 	u8 private_data[IB_CM_APR_PRIVATE_DATA_SIZE];
790aa0a1e58SJeff Roberson } __attribute__ ((packed));
791aa0a1e58SJeff Roberson 
792aa0a1e58SJeff Roberson struct cm_sidr_req_msg {
793aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
794aa0a1e58SJeff Roberson 
795aa0a1e58SJeff Roberson 	__be32 request_id;
796aa0a1e58SJeff Roberson 	__be16 pkey;
797aa0a1e58SJeff Roberson 	__be16 rsvd;
798aa0a1e58SJeff Roberson 	__be64 service_id;
799aa0a1e58SJeff Roberson 
800478d3005SHans Petter Selasky 	u32 private_data[IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE / sizeof(u32)];
801aa0a1e58SJeff Roberson } __attribute__ ((packed));
802aa0a1e58SJeff Roberson 
803aa0a1e58SJeff Roberson struct cm_sidr_rep_msg {
804aa0a1e58SJeff Roberson 	struct ib_mad_hdr hdr;
805aa0a1e58SJeff Roberson 
806aa0a1e58SJeff Roberson 	__be32 request_id;
807aa0a1e58SJeff Roberson 	u8 status;
808aa0a1e58SJeff Roberson 	u8 info_length;
809aa0a1e58SJeff Roberson 	__be16 rsvd;
810aa0a1e58SJeff Roberson 	/* QPN:24, rsvd:8 */
811aa0a1e58SJeff Roberson 	__be32 offset8;
812aa0a1e58SJeff Roberson 	__be64 service_id;
813aa0a1e58SJeff Roberson 	__be32 qkey;
814aa0a1e58SJeff Roberson 	u8 info[IB_CM_SIDR_REP_INFO_LENGTH];
815aa0a1e58SJeff Roberson 
816aa0a1e58SJeff Roberson 	u8 private_data[IB_CM_SIDR_REP_PRIVATE_DATA_SIZE];
817aa0a1e58SJeff Roberson } __attribute__ ((packed));
818aa0a1e58SJeff Roberson 
cm_sidr_rep_get_qpn(struct cm_sidr_rep_msg * sidr_rep_msg)819aa0a1e58SJeff Roberson static inline __be32 cm_sidr_rep_get_qpn(struct cm_sidr_rep_msg *sidr_rep_msg)
820aa0a1e58SJeff Roberson {
821aa0a1e58SJeff Roberson 	return cpu_to_be32(be32_to_cpu(sidr_rep_msg->offset8) >> 8);
822aa0a1e58SJeff Roberson }
823aa0a1e58SJeff Roberson 
cm_sidr_rep_set_qpn(struct cm_sidr_rep_msg * sidr_rep_msg,__be32 qpn)824aa0a1e58SJeff Roberson static inline void cm_sidr_rep_set_qpn(struct cm_sidr_rep_msg *sidr_rep_msg,
825aa0a1e58SJeff Roberson 				       __be32 qpn)
826aa0a1e58SJeff Roberson {
827aa0a1e58SJeff Roberson 	sidr_rep_msg->offset8 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
828aa0a1e58SJeff Roberson 					(be32_to_cpu(sidr_rep_msg->offset8) &
829aa0a1e58SJeff Roberson 					 0x000000FF));
830aa0a1e58SJeff Roberson }
831aa0a1e58SJeff Roberson 
832aa0a1e58SJeff Roberson #endif /* CM_MSGS_H */
833