124f52149SLeon Romanovsky /* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2a977049dSHal Rosenstock /*
3ef700446SSean Hefty  * Copyright (c) 2004, 2011 Intel Corporation.  All rights reserved.
4a977049dSHal Rosenstock  * Copyright (c) 2004 Topspin Corporation.  All rights reserved.
5a977049dSHal Rosenstock  * Copyright (c) 2004 Voltaire Corporation.  All rights reserved.
624f52149SLeon Romanovsky  * Copyright (c) 2019, Mellanox Technologies inc.  All rights reserved.
7a977049dSHal Rosenstock  */
8a9160511SLeon Romanovsky #ifndef CM_MSGS_H
9a977049dSHal Rosenstock #define CM_MSGS_H
10a977049dSHal Rosenstock 
11a4d61e84SRoland Dreier #include <rdma/ib_mad.h>
125d861be8SSean Hefty #include <rdma/ib_cm.h>
13a977049dSHal Rosenstock 
14a977049dSHal Rosenstock /*
15a977049dSHal Rosenstock  * Parameters to routines below should be in network-byte order, and values
16a977049dSHal Rosenstock  * are returned in network-byte order.
17a977049dSHal Rosenstock  */
18a977049dSHal Rosenstock 
19a977049dSHal Rosenstock #define IB_CM_CLASS_VERSION	2 /* IB specification 1.2 */
20a977049dSHal Rosenstock 
21a977049dSHal Rosenstock struct cm_req_msg {
22a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
23a977049dSHal Rosenstock 
2497f52eb4SSean Hefty 	__be32 local_comm_id;
2597f52eb4SSean Hefty 	__be32 rsvd4;
2697f52eb4SSean Hefty 	__be64 service_id;
2797f52eb4SSean Hefty 	__be64 local_ca_guid;
2897f52eb4SSean Hefty 	__be32 rsvd24;
2997f52eb4SSean Hefty 	__be32 local_qkey;
30a977049dSHal Rosenstock 	/* local QPN:24, responder resources:8 */
3197f52eb4SSean Hefty 	__be32 offset32;
32a977049dSHal Rosenstock 	/* local EECN:24, initiator depth:8 */
3397f52eb4SSean Hefty 	__be32 offset36;
34a977049dSHal Rosenstock 	/*
35a977049dSHal Rosenstock 	 * remote EECN:24, remote CM response timeout:5,
36a977049dSHal Rosenstock 	 * transport service type:2, end-to-end flow control:1
37a977049dSHal Rosenstock 	 */
3897f52eb4SSean Hefty 	__be32 offset40;
39a977049dSHal Rosenstock 	/* starting PSN:24, local CM response timeout:5, retry count:3 */
4097f52eb4SSean Hefty 	__be32 offset44;
4197f52eb4SSean Hefty 	__be16 pkey;
42a977049dSHal Rosenstock 	/* path MTU:4, RDC exists:1, RNR retry count:3. */
43a977049dSHal Rosenstock 	u8 offset50;
44d26a360bSSean Hefty 	/* max CM Retries:4, SRQ:1, extended transport type:3 */
45a977049dSHal Rosenstock 	u8 offset51;
46a977049dSHal Rosenstock 
4797f52eb4SSean Hefty 	__be16 primary_local_lid;
4897f52eb4SSean Hefty 	__be16 primary_remote_lid;
49a977049dSHal Rosenstock 	union ib_gid primary_local_gid;
50a977049dSHal Rosenstock 	union ib_gid primary_remote_gid;
51a977049dSHal Rosenstock 	/* flow label:20, rsvd:6, packet rate:6 */
5297f52eb4SSean Hefty 	__be32 primary_offset88;
53a977049dSHal Rosenstock 	u8 primary_traffic_class;
54a977049dSHal Rosenstock 	u8 primary_hop_limit;
55a977049dSHal Rosenstock 	/* SL:4, subnet local:1, rsvd:3 */
56a977049dSHal Rosenstock 	u8 primary_offset94;
57a977049dSHal Rosenstock 	/* local ACK timeout:5, rsvd:3 */
58a977049dSHal Rosenstock 	u8 primary_offset95;
59a977049dSHal Rosenstock 
6097f52eb4SSean Hefty 	__be16 alt_local_lid;
6197f52eb4SSean Hefty 	__be16 alt_remote_lid;
62a977049dSHal Rosenstock 	union ib_gid alt_local_gid;
63a977049dSHal Rosenstock 	union ib_gid alt_remote_gid;
64a977049dSHal Rosenstock 	/* flow label:20, rsvd:6, packet rate:6 */
6597f52eb4SSean Hefty 	__be32 alt_offset132;
66a977049dSHal Rosenstock 	u8 alt_traffic_class;
67a977049dSHal Rosenstock 	u8 alt_hop_limit;
68a977049dSHal Rosenstock 	/* SL:4, subnet local:1, rsvd:3 */
69a977049dSHal Rosenstock 	u8 alt_offset138;
70a977049dSHal Rosenstock 	/* local ACK timeout:5, rsvd:3 */
71a977049dSHal Rosenstock 	u8 alt_offset139;
72a977049dSHal Rosenstock 
730d0f738fSDavid Ahern 	u32 private_data[IB_CM_REQ_PRIVATE_DATA_SIZE / sizeof(u32)];
74a977049dSHal Rosenstock 
7519b1a294SErez Alfasi } __packed;
76a977049dSHal Rosenstock 
7797f52eb4SSean Hefty static inline __be32 cm_req_get_local_qpn(struct cm_req_msg *req_msg)
78a977049dSHal Rosenstock {
79a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(req_msg->offset32) >> 8);
80a977049dSHal Rosenstock }
81a977049dSHal Rosenstock 
8297f52eb4SSean Hefty static inline void cm_req_set_local_qpn(struct cm_req_msg *req_msg, __be32 qpn)
83a977049dSHal Rosenstock {
84a977049dSHal Rosenstock 	req_msg->offset32 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
85a977049dSHal Rosenstock 					 (be32_to_cpu(req_msg->offset32) &
86a977049dSHal Rosenstock 					  0x000000FF));
87a977049dSHal Rosenstock }
88a977049dSHal Rosenstock 
89a977049dSHal Rosenstock static inline u8 cm_req_get_resp_res(struct cm_req_msg *req_msg)
90a977049dSHal Rosenstock {
91a977049dSHal Rosenstock 	return (u8) be32_to_cpu(req_msg->offset32);
92a977049dSHal Rosenstock }
93a977049dSHal Rosenstock 
94a977049dSHal Rosenstock static inline void cm_req_set_resp_res(struct cm_req_msg *req_msg, u8 resp_res)
95a977049dSHal Rosenstock {
96a977049dSHal Rosenstock 	req_msg->offset32 = cpu_to_be32(resp_res |
97a977049dSHal Rosenstock 					(be32_to_cpu(req_msg->offset32) &
98a977049dSHal Rosenstock 					 0xFFFFFF00));
99a977049dSHal Rosenstock }
100a977049dSHal Rosenstock 
101a977049dSHal Rosenstock static inline u8 cm_req_get_init_depth(struct cm_req_msg *req_msg)
102a977049dSHal Rosenstock {
103a977049dSHal Rosenstock 	return (u8) be32_to_cpu(req_msg->offset36);
104a977049dSHal Rosenstock }
105a977049dSHal Rosenstock 
106a977049dSHal Rosenstock static inline void cm_req_set_init_depth(struct cm_req_msg *req_msg,
107a977049dSHal Rosenstock 					 u8 init_depth)
108a977049dSHal Rosenstock {
109a977049dSHal Rosenstock 	req_msg->offset36 = cpu_to_be32(init_depth |
110a977049dSHal Rosenstock 					(be32_to_cpu(req_msg->offset36) &
111a977049dSHal Rosenstock 					 0xFFFFFF00));
112a977049dSHal Rosenstock }
113a977049dSHal Rosenstock 
114a977049dSHal Rosenstock static inline u8 cm_req_get_remote_resp_timeout(struct cm_req_msg *req_msg)
115a977049dSHal Rosenstock {
116a977049dSHal Rosenstock 	return (u8) ((be32_to_cpu(req_msg->offset40) & 0xF8) >> 3);
117a977049dSHal Rosenstock }
118a977049dSHal Rosenstock 
119a977049dSHal Rosenstock static inline void cm_req_set_remote_resp_timeout(struct cm_req_msg *req_msg,
120a977049dSHal Rosenstock 						  u8 resp_timeout)
121a977049dSHal Rosenstock {
122a977049dSHal Rosenstock 	req_msg->offset40 = cpu_to_be32((resp_timeout << 3) |
123a977049dSHal Rosenstock 					 (be32_to_cpu(req_msg->offset40) &
124a977049dSHal Rosenstock 					  0xFFFFFF07));
125a977049dSHal Rosenstock }
126a977049dSHal Rosenstock 
127a977049dSHal Rosenstock static inline enum ib_qp_type cm_req_get_qp_type(struct cm_req_msg *req_msg)
128a977049dSHal Rosenstock {
129a977049dSHal Rosenstock 	u8 transport_type = (u8) (be32_to_cpu(req_msg->offset40) & 0x06) >> 1;
130a977049dSHal Rosenstock 	switch(transport_type) {
131a977049dSHal Rosenstock 	case 0: return IB_QPT_RC;
132a977049dSHal Rosenstock 	case 1: return IB_QPT_UC;
133d26a360bSSean Hefty 	case 3:
134d26a360bSSean Hefty 		switch (req_msg->offset51 & 0x7) {
135d26a360bSSean Hefty 		case 1: return IB_QPT_XRC_TGT;
136d26a360bSSean Hefty 		default: return 0;
137d26a360bSSean Hefty 		}
138a977049dSHal Rosenstock 	default: return 0;
139a977049dSHal Rosenstock 	}
140a977049dSHal Rosenstock }
141a977049dSHal Rosenstock 
142a977049dSHal Rosenstock static inline void cm_req_set_qp_type(struct cm_req_msg *req_msg,
143a977049dSHal Rosenstock 				      enum ib_qp_type qp_type)
144a977049dSHal Rosenstock {
145a977049dSHal Rosenstock 	switch(qp_type) {
146a977049dSHal Rosenstock 	case IB_QPT_UC:
147a977049dSHal Rosenstock 		req_msg->offset40 = cpu_to_be32((be32_to_cpu(
148a977049dSHal Rosenstock 						  req_msg->offset40) &
149a977049dSHal Rosenstock 						   0xFFFFFFF9) | 0x2);
1503910f44dSRoland Dreier 		break;
151d26a360bSSean Hefty 	case IB_QPT_XRC_INI:
152d26a360bSSean Hefty 		req_msg->offset40 = cpu_to_be32((be32_to_cpu(
153d26a360bSSean Hefty 						 req_msg->offset40) &
154d26a360bSSean Hefty 						   0xFFFFFFF9) | 0x6);
155d26a360bSSean Hefty 		req_msg->offset51 = (req_msg->offset51 & 0xF8) | 1;
156d26a360bSSean Hefty 		break;
157a977049dSHal Rosenstock 	default:
158a977049dSHal Rosenstock 		req_msg->offset40 = cpu_to_be32(be32_to_cpu(
159a977049dSHal Rosenstock 						 req_msg->offset40) &
160a977049dSHal Rosenstock 						  0xFFFFFFF9);
161a977049dSHal Rosenstock 	}
162a977049dSHal Rosenstock }
163a977049dSHal Rosenstock 
164a977049dSHal Rosenstock static inline u8 cm_req_get_flow_ctrl(struct cm_req_msg *req_msg)
165a977049dSHal Rosenstock {
166a977049dSHal Rosenstock 	return be32_to_cpu(req_msg->offset40) & 0x1;
167a977049dSHal Rosenstock }
168a977049dSHal Rosenstock 
169a977049dSHal Rosenstock static inline void cm_req_set_flow_ctrl(struct cm_req_msg *req_msg,
170a977049dSHal Rosenstock 					u8 flow_ctrl)
171a977049dSHal Rosenstock {
172a977049dSHal Rosenstock 	req_msg->offset40 = cpu_to_be32((flow_ctrl & 0x1) |
173a977049dSHal Rosenstock 					 (be32_to_cpu(req_msg->offset40) &
174a977049dSHal Rosenstock 					  0xFFFFFFFE));
175a977049dSHal Rosenstock }
176a977049dSHal Rosenstock 
17797f52eb4SSean Hefty static inline __be32 cm_req_get_starting_psn(struct cm_req_msg *req_msg)
178a977049dSHal Rosenstock {
179a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(req_msg->offset44) >> 8);
180a977049dSHal Rosenstock }
181a977049dSHal Rosenstock 
182a977049dSHal Rosenstock static inline void cm_req_set_starting_psn(struct cm_req_msg *req_msg,
18397f52eb4SSean Hefty 					   __be32 starting_psn)
184a977049dSHal Rosenstock {
185a977049dSHal Rosenstock 	req_msg->offset44 = cpu_to_be32((be32_to_cpu(starting_psn) << 8) |
186a977049dSHal Rosenstock 			    (be32_to_cpu(req_msg->offset44) & 0x000000FF));
187a977049dSHal Rosenstock }
188a977049dSHal Rosenstock 
189a977049dSHal Rosenstock static inline u8 cm_req_get_local_resp_timeout(struct cm_req_msg *req_msg)
190a977049dSHal Rosenstock {
191a977049dSHal Rosenstock 	return (u8) ((be32_to_cpu(req_msg->offset44) & 0xF8) >> 3);
192a977049dSHal Rosenstock }
193a977049dSHal Rosenstock 
194a977049dSHal Rosenstock static inline void cm_req_set_local_resp_timeout(struct cm_req_msg *req_msg,
195a977049dSHal Rosenstock 						 u8 resp_timeout)
196a977049dSHal Rosenstock {
197a977049dSHal Rosenstock 	req_msg->offset44 = cpu_to_be32((resp_timeout << 3) |
198a977049dSHal Rosenstock 			    (be32_to_cpu(req_msg->offset44) & 0xFFFFFF07));
199a977049dSHal Rosenstock }
200a977049dSHal Rosenstock 
201a977049dSHal Rosenstock static inline u8 cm_req_get_retry_count(struct cm_req_msg *req_msg)
202a977049dSHal Rosenstock {
203a977049dSHal Rosenstock 	return (u8) (be32_to_cpu(req_msg->offset44) & 0x7);
204a977049dSHal Rosenstock }
205a977049dSHal Rosenstock 
206a977049dSHal Rosenstock static inline void cm_req_set_retry_count(struct cm_req_msg *req_msg,
207a977049dSHal Rosenstock 					  u8 retry_count)
208a977049dSHal Rosenstock {
209a977049dSHal Rosenstock 	req_msg->offset44 = cpu_to_be32((retry_count & 0x7) |
210a977049dSHal Rosenstock 			    (be32_to_cpu(req_msg->offset44) & 0xFFFFFFF8));
211a977049dSHal Rosenstock }
212a977049dSHal Rosenstock 
213a977049dSHal Rosenstock static inline u8 cm_req_get_path_mtu(struct cm_req_msg *req_msg)
214a977049dSHal Rosenstock {
215a977049dSHal Rosenstock 	return req_msg->offset50 >> 4;
216a977049dSHal Rosenstock }
217a977049dSHal Rosenstock 
218a977049dSHal Rosenstock static inline void cm_req_set_path_mtu(struct cm_req_msg *req_msg, u8 path_mtu)
219a977049dSHal Rosenstock {
220a977049dSHal Rosenstock 	req_msg->offset50 = (u8) ((req_msg->offset50 & 0xF) | (path_mtu << 4));
221a977049dSHal Rosenstock }
222a977049dSHal Rosenstock 
223a977049dSHal Rosenstock static inline u8 cm_req_get_rnr_retry_count(struct cm_req_msg *req_msg)
224a977049dSHal Rosenstock {
225a977049dSHal Rosenstock 	return req_msg->offset50 & 0x7;
226a977049dSHal Rosenstock }
227a977049dSHal Rosenstock 
228a977049dSHal Rosenstock static inline void cm_req_set_rnr_retry_count(struct cm_req_msg *req_msg,
229a977049dSHal Rosenstock 					      u8 rnr_retry_count)
230a977049dSHal Rosenstock {
231a977049dSHal Rosenstock 	req_msg->offset50 = (u8) ((req_msg->offset50 & 0xF8) |
232a977049dSHal Rosenstock 				  (rnr_retry_count & 0x7));
233a977049dSHal Rosenstock }
234a977049dSHal Rosenstock 
235a977049dSHal Rosenstock static inline u8 cm_req_get_max_cm_retries(struct cm_req_msg *req_msg)
236a977049dSHal Rosenstock {
237a977049dSHal Rosenstock 	return req_msg->offset51 >> 4;
238a977049dSHal Rosenstock }
239a977049dSHal Rosenstock 
240a977049dSHal Rosenstock static inline void cm_req_set_max_cm_retries(struct cm_req_msg *req_msg,
241a977049dSHal Rosenstock 					     u8 retries)
242a977049dSHal Rosenstock {
243a977049dSHal Rosenstock 	req_msg->offset51 = (u8) ((req_msg->offset51 & 0xF) | (retries << 4));
244a977049dSHal Rosenstock }
245a977049dSHal Rosenstock 
246a977049dSHal Rosenstock static inline u8 cm_req_get_srq(struct cm_req_msg *req_msg)
247a977049dSHal Rosenstock {
248a977049dSHal Rosenstock 	return (req_msg->offset51 & 0x8) >> 3;
249a977049dSHal Rosenstock }
250a977049dSHal Rosenstock 
251a977049dSHal Rosenstock static inline void cm_req_set_srq(struct cm_req_msg *req_msg, u8 srq)
252a977049dSHal Rosenstock {
253a977049dSHal Rosenstock 	req_msg->offset51 = (u8) ((req_msg->offset51 & 0xF7) |
254a977049dSHal Rosenstock 				  ((srq & 0x1) << 3));
255a977049dSHal Rosenstock }
256a977049dSHal Rosenstock 
25797f52eb4SSean Hefty static inline __be32 cm_req_get_primary_flow_label(struct cm_req_msg *req_msg)
258a977049dSHal Rosenstock {
25997f52eb4SSean Hefty 	return cpu_to_be32(be32_to_cpu(req_msg->primary_offset88) >> 12);
260a977049dSHal Rosenstock }
261a977049dSHal Rosenstock 
262a977049dSHal Rosenstock static inline void cm_req_set_primary_flow_label(struct cm_req_msg *req_msg,
26397f52eb4SSean Hefty 						 __be32 flow_label)
264a977049dSHal Rosenstock {
265a977049dSHal Rosenstock 	req_msg->primary_offset88 = cpu_to_be32(
266a977049dSHal Rosenstock 				    (be32_to_cpu(req_msg->primary_offset88) &
267a977049dSHal Rosenstock 				     0x00000FFF) |
268a977049dSHal Rosenstock 				     (be32_to_cpu(flow_label) << 12));
269a977049dSHal Rosenstock }
270a977049dSHal Rosenstock 
271a977049dSHal Rosenstock static inline u8 cm_req_get_primary_packet_rate(struct cm_req_msg *req_msg)
272a977049dSHal Rosenstock {
273a977049dSHal Rosenstock 	return (u8) (be32_to_cpu(req_msg->primary_offset88) & 0x3F);
274a977049dSHal Rosenstock }
275a977049dSHal Rosenstock 
276a977049dSHal Rosenstock static inline void cm_req_set_primary_packet_rate(struct cm_req_msg *req_msg,
277a977049dSHal Rosenstock 						  u8 rate)
278a977049dSHal Rosenstock {
279a977049dSHal Rosenstock 	req_msg->primary_offset88 = cpu_to_be32(
280a977049dSHal Rosenstock 				    (be32_to_cpu(req_msg->primary_offset88) &
281a977049dSHal Rosenstock 				     0xFFFFFFC0) | (rate & 0x3F));
282a977049dSHal Rosenstock }
283a977049dSHal Rosenstock 
284a977049dSHal Rosenstock static inline u8 cm_req_get_primary_sl(struct cm_req_msg *req_msg)
285a977049dSHal Rosenstock {
286a977049dSHal Rosenstock 	return (u8) (req_msg->primary_offset94 >> 4);
287a977049dSHal Rosenstock }
288a977049dSHal Rosenstock 
289a977049dSHal Rosenstock static inline void cm_req_set_primary_sl(struct cm_req_msg *req_msg, u8 sl)
290a977049dSHal Rosenstock {
291a977049dSHal Rosenstock 	req_msg->primary_offset94 = (u8) ((req_msg->primary_offset94 & 0x0F) |
292a977049dSHal Rosenstock 					  (sl << 4));
293a977049dSHal Rosenstock }
294a977049dSHal Rosenstock 
295a977049dSHal Rosenstock static inline u8 cm_req_get_primary_subnet_local(struct cm_req_msg *req_msg)
296a977049dSHal Rosenstock {
297a977049dSHal Rosenstock 	return (u8) ((req_msg->primary_offset94 & 0x08) >> 3);
298a977049dSHal Rosenstock }
299a977049dSHal Rosenstock 
300a977049dSHal Rosenstock static inline void cm_req_set_primary_subnet_local(struct cm_req_msg *req_msg,
301a977049dSHal Rosenstock 						   u8 subnet_local)
302a977049dSHal Rosenstock {
303a977049dSHal Rosenstock 	req_msg->primary_offset94 = (u8) ((req_msg->primary_offset94 & 0xF7) |
304a977049dSHal Rosenstock 					  ((subnet_local & 0x1) << 3));
305a977049dSHal Rosenstock }
306a977049dSHal Rosenstock 
307a977049dSHal Rosenstock static inline u8 cm_req_get_primary_local_ack_timeout(struct cm_req_msg *req_msg)
308a977049dSHal Rosenstock {
309a977049dSHal Rosenstock 	return (u8) (req_msg->primary_offset95 >> 3);
310a977049dSHal Rosenstock }
311a977049dSHal Rosenstock 
312a977049dSHal Rosenstock static inline void cm_req_set_primary_local_ack_timeout(struct cm_req_msg *req_msg,
313a977049dSHal Rosenstock 							u8 local_ack_timeout)
314a977049dSHal Rosenstock {
315a977049dSHal Rosenstock 	req_msg->primary_offset95 = (u8) ((req_msg->primary_offset95 & 0x07) |
316a977049dSHal Rosenstock 					  (local_ack_timeout << 3));
317a977049dSHal Rosenstock }
318a977049dSHal Rosenstock 
31997f52eb4SSean Hefty static inline __be32 cm_req_get_alt_flow_label(struct cm_req_msg *req_msg)
320a977049dSHal Rosenstock {
32197f52eb4SSean Hefty 	return cpu_to_be32(be32_to_cpu(req_msg->alt_offset132) >> 12);
322a977049dSHal Rosenstock }
323a977049dSHal Rosenstock 
324a977049dSHal Rosenstock static inline void cm_req_set_alt_flow_label(struct cm_req_msg *req_msg,
32597f52eb4SSean Hefty 					     __be32 flow_label)
326a977049dSHal Rosenstock {
327a977049dSHal Rosenstock 	req_msg->alt_offset132 = cpu_to_be32(
328a977049dSHal Rosenstock 				 (be32_to_cpu(req_msg->alt_offset132) &
329a977049dSHal Rosenstock 				  0x00000FFF) |
330a977049dSHal Rosenstock 				  (be32_to_cpu(flow_label) << 12));
331a977049dSHal Rosenstock }
332a977049dSHal Rosenstock 
333a977049dSHal Rosenstock static inline u8 cm_req_get_alt_packet_rate(struct cm_req_msg *req_msg)
334a977049dSHal Rosenstock {
335a977049dSHal Rosenstock 	return (u8) (be32_to_cpu(req_msg->alt_offset132) & 0x3F);
336a977049dSHal Rosenstock }
337a977049dSHal Rosenstock 
338a977049dSHal Rosenstock static inline void cm_req_set_alt_packet_rate(struct cm_req_msg *req_msg,
339a977049dSHal Rosenstock 					      u8 rate)
340a977049dSHal Rosenstock {
341a977049dSHal Rosenstock 	req_msg->alt_offset132 = cpu_to_be32(
342a977049dSHal Rosenstock 				 (be32_to_cpu(req_msg->alt_offset132) &
343a977049dSHal Rosenstock 				  0xFFFFFFC0) | (rate & 0x3F));
344a977049dSHal Rosenstock }
345a977049dSHal Rosenstock 
346a977049dSHal Rosenstock static inline u8 cm_req_get_alt_sl(struct cm_req_msg *req_msg)
347a977049dSHal Rosenstock {
348a977049dSHal Rosenstock 	return (u8) (req_msg->alt_offset138 >> 4);
349a977049dSHal Rosenstock }
350a977049dSHal Rosenstock 
351a977049dSHal Rosenstock static inline void cm_req_set_alt_sl(struct cm_req_msg *req_msg, u8 sl)
352a977049dSHal Rosenstock {
353a977049dSHal Rosenstock 	req_msg->alt_offset138 = (u8) ((req_msg->alt_offset138 & 0x0F) |
354a977049dSHal Rosenstock 				       (sl << 4));
355a977049dSHal Rosenstock }
356a977049dSHal Rosenstock 
357a977049dSHal Rosenstock static inline u8 cm_req_get_alt_subnet_local(struct cm_req_msg *req_msg)
358a977049dSHal Rosenstock {
359a977049dSHal Rosenstock 	return (u8) ((req_msg->alt_offset138 & 0x08) >> 3);
360a977049dSHal Rosenstock }
361a977049dSHal Rosenstock 
362a977049dSHal Rosenstock static inline void cm_req_set_alt_subnet_local(struct cm_req_msg *req_msg,
363a977049dSHal Rosenstock 					       u8 subnet_local)
364a977049dSHal Rosenstock {
365a977049dSHal Rosenstock 	req_msg->alt_offset138 = (u8) ((req_msg->alt_offset138 & 0xF7) |
366a977049dSHal Rosenstock 				       ((subnet_local & 0x1) << 3));
367a977049dSHal Rosenstock }
368a977049dSHal Rosenstock 
369a977049dSHal Rosenstock static inline u8 cm_req_get_alt_local_ack_timeout(struct cm_req_msg *req_msg)
370a977049dSHal Rosenstock {
371a977049dSHal Rosenstock 	return (u8) (req_msg->alt_offset139 >> 3);
372a977049dSHal Rosenstock }
373a977049dSHal Rosenstock 
374a977049dSHal Rosenstock static inline void cm_req_set_alt_local_ack_timeout(struct cm_req_msg *req_msg,
375a977049dSHal Rosenstock 						    u8 local_ack_timeout)
376a977049dSHal Rosenstock {
377a977049dSHal Rosenstock 	req_msg->alt_offset139 = (u8) ((req_msg->alt_offset139 & 0x07) |
378a977049dSHal Rosenstock 				       (local_ack_timeout << 3));
379a977049dSHal Rosenstock }
380a977049dSHal Rosenstock 
381a977049dSHal Rosenstock /* Message REJected or MRAed */
382a977049dSHal Rosenstock enum cm_msg_response {
383a977049dSHal Rosenstock 	CM_MSG_RESPONSE_REQ = 0x0,
384a977049dSHal Rosenstock 	CM_MSG_RESPONSE_REP = 0x1,
385a977049dSHal Rosenstock 	CM_MSG_RESPONSE_OTHER = 0x2
386a977049dSHal Rosenstock };
387a977049dSHal Rosenstock 
388a977049dSHal Rosenstock  struct cm_mra_msg {
389a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
390a977049dSHal Rosenstock 
39197f52eb4SSean Hefty 	__be32 local_comm_id;
39297f52eb4SSean Hefty 	__be32 remote_comm_id;
393a977049dSHal Rosenstock 	/* message MRAed:2, rsvd:6 */
394a977049dSHal Rosenstock 	u8 offset8;
395a977049dSHal Rosenstock 	/* service timeout:5, rsvd:3 */
396a977049dSHal Rosenstock 	u8 offset9;
397a977049dSHal Rosenstock 
398a977049dSHal Rosenstock 	u8 private_data[IB_CM_MRA_PRIVATE_DATA_SIZE];
399a977049dSHal Rosenstock 
40019b1a294SErez Alfasi } __packed;
401a977049dSHal Rosenstock 
402a977049dSHal Rosenstock static inline u8 cm_mra_get_msg_mraed(struct cm_mra_msg *mra_msg)
403a977049dSHal Rosenstock {
404a977049dSHal Rosenstock 	return (u8) (mra_msg->offset8 >> 6);
405a977049dSHal Rosenstock }
406a977049dSHal Rosenstock 
407a977049dSHal Rosenstock static inline void cm_mra_set_msg_mraed(struct cm_mra_msg *mra_msg, u8 msg)
408a977049dSHal Rosenstock {
409a977049dSHal Rosenstock 	mra_msg->offset8 = (u8) ((mra_msg->offset8 & 0x3F) | (msg << 6));
410a977049dSHal Rosenstock }
411a977049dSHal Rosenstock 
412a977049dSHal Rosenstock static inline u8 cm_mra_get_service_timeout(struct cm_mra_msg *mra_msg)
413a977049dSHal Rosenstock {
414a977049dSHal Rosenstock 	return (u8) (mra_msg->offset9 >> 3);
415a977049dSHal Rosenstock }
416a977049dSHal Rosenstock 
417a977049dSHal Rosenstock static inline void cm_mra_set_service_timeout(struct cm_mra_msg *mra_msg,
418a977049dSHal Rosenstock 					      u8 service_timeout)
419a977049dSHal Rosenstock {
420a977049dSHal Rosenstock 	mra_msg->offset9 = (u8) ((mra_msg->offset9 & 0x07) |
421a977049dSHal Rosenstock 				 (service_timeout << 3));
422a977049dSHal Rosenstock }
423a977049dSHal Rosenstock 
424a977049dSHal Rosenstock struct cm_rej_msg {
425a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
426a977049dSHal Rosenstock 
42797f52eb4SSean Hefty 	__be32 local_comm_id;
42897f52eb4SSean Hefty 	__be32 remote_comm_id;
429a977049dSHal Rosenstock 	/* message REJected:2, rsvd:6 */
430a977049dSHal Rosenstock 	u8 offset8;
431a977049dSHal Rosenstock 	/* reject info length:7, rsvd:1. */
432a977049dSHal Rosenstock 	u8 offset9;
43397f52eb4SSean Hefty 	__be16 reason;
434a977049dSHal Rosenstock 	u8 ari[IB_CM_REJ_ARI_LENGTH];
435a977049dSHal Rosenstock 
436a977049dSHal Rosenstock 	u8 private_data[IB_CM_REJ_PRIVATE_DATA_SIZE];
437a977049dSHal Rosenstock 
43819b1a294SErez Alfasi } __packed;
439a977049dSHal Rosenstock 
440a977049dSHal Rosenstock static inline u8 cm_rej_get_msg_rejected(struct cm_rej_msg *rej_msg)
441a977049dSHal Rosenstock {
442a977049dSHal Rosenstock 	return (u8) (rej_msg->offset8 >> 6);
443a977049dSHal Rosenstock }
444a977049dSHal Rosenstock 
445a977049dSHal Rosenstock static inline void cm_rej_set_msg_rejected(struct cm_rej_msg *rej_msg, u8 msg)
446a977049dSHal Rosenstock {
447a977049dSHal Rosenstock 	rej_msg->offset8 = (u8) ((rej_msg->offset8 & 0x3F) | (msg << 6));
448a977049dSHal Rosenstock }
449a977049dSHal Rosenstock 
450a977049dSHal Rosenstock static inline u8 cm_rej_get_reject_info_len(struct cm_rej_msg *rej_msg)
451a977049dSHal Rosenstock {
452a977049dSHal Rosenstock 	return (u8) (rej_msg->offset9 >> 1);
453a977049dSHal Rosenstock }
454a977049dSHal Rosenstock 
455a977049dSHal Rosenstock static inline void cm_rej_set_reject_info_len(struct cm_rej_msg *rej_msg,
456a977049dSHal Rosenstock 					      u8 len)
457a977049dSHal Rosenstock {
458a977049dSHal Rosenstock 	rej_msg->offset9 = (u8) ((rej_msg->offset9 & 0x1) | (len << 1));
459a977049dSHal Rosenstock }
460a977049dSHal Rosenstock 
461a977049dSHal Rosenstock struct cm_rep_msg {
462a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
463a977049dSHal Rosenstock 
46497f52eb4SSean Hefty 	__be32 local_comm_id;
46597f52eb4SSean Hefty 	__be32 remote_comm_id;
46697f52eb4SSean Hefty 	__be32 local_qkey;
467a977049dSHal Rosenstock 	/* local QPN:24, rsvd:8 */
46897f52eb4SSean Hefty 	__be32 offset12;
469a977049dSHal Rosenstock 	/* local EECN:24, rsvd:8 */
47097f52eb4SSean Hefty 	__be32 offset16;
471a977049dSHal Rosenstock 	/* starting PSN:24 rsvd:8 */
47297f52eb4SSean Hefty 	__be32 offset20;
473a977049dSHal Rosenstock 	u8 resp_resources;
474a977049dSHal Rosenstock 	u8 initiator_depth;
475a977049dSHal Rosenstock 	/* target ACK delay:5, failover accepted:2, end-to-end flow control:1 */
476a977049dSHal Rosenstock 	u8 offset26;
477a977049dSHal Rosenstock 	/* RNR retry count:3, SRQ:1, rsvd:5 */
478a977049dSHal Rosenstock 	u8 offset27;
47997f52eb4SSean Hefty 	__be64 local_ca_guid;
480a977049dSHal Rosenstock 
481a977049dSHal Rosenstock 	u8 private_data[IB_CM_REP_PRIVATE_DATA_SIZE];
482a977049dSHal Rosenstock 
48319b1a294SErez Alfasi } __packed;
484a977049dSHal Rosenstock 
48597f52eb4SSean Hefty static inline __be32 cm_rep_get_local_qpn(struct cm_rep_msg *rep_msg)
486a977049dSHal Rosenstock {
487a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(rep_msg->offset12) >> 8);
488a977049dSHal Rosenstock }
489a977049dSHal Rosenstock 
49097f52eb4SSean Hefty static inline void cm_rep_set_local_qpn(struct cm_rep_msg *rep_msg, __be32 qpn)
491a977049dSHal Rosenstock {
492a977049dSHal Rosenstock 	rep_msg->offset12 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
493a977049dSHal Rosenstock 			    (be32_to_cpu(rep_msg->offset12) & 0x000000FF));
494a977049dSHal Rosenstock }
495a977049dSHal Rosenstock 
496ef700446SSean Hefty static inline __be32 cm_rep_get_local_eecn(struct cm_rep_msg *rep_msg)
497ef700446SSean Hefty {
498ef700446SSean Hefty 	return cpu_to_be32(be32_to_cpu(rep_msg->offset16) >> 8);
499ef700446SSean Hefty }
500ef700446SSean Hefty 
501ef700446SSean Hefty static inline void cm_rep_set_local_eecn(struct cm_rep_msg *rep_msg, __be32 eecn)
502ef700446SSean Hefty {
503ef700446SSean Hefty 	rep_msg->offset16 = cpu_to_be32((be32_to_cpu(eecn) << 8) |
504ef700446SSean Hefty 			    (be32_to_cpu(rep_msg->offset16) & 0x000000FF));
505ef700446SSean Hefty }
506ef700446SSean Hefty 
507ef700446SSean Hefty static inline __be32 cm_rep_get_qpn(struct cm_rep_msg *rep_msg, enum ib_qp_type qp_type)
508ef700446SSean Hefty {
509ef700446SSean Hefty 	return (qp_type == IB_QPT_XRC_INI) ?
510ef700446SSean Hefty 		cm_rep_get_local_eecn(rep_msg) : cm_rep_get_local_qpn(rep_msg);
511ef700446SSean Hefty }
512ef700446SSean Hefty 
51397f52eb4SSean Hefty static inline __be32 cm_rep_get_starting_psn(struct cm_rep_msg *rep_msg)
514a977049dSHal Rosenstock {
515a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(rep_msg->offset20) >> 8);
516a977049dSHal Rosenstock }
517a977049dSHal Rosenstock 
518a977049dSHal Rosenstock static inline void cm_rep_set_starting_psn(struct cm_rep_msg *rep_msg,
51997f52eb4SSean Hefty 					   __be32 starting_psn)
520a977049dSHal Rosenstock {
521a977049dSHal Rosenstock 	rep_msg->offset20 = cpu_to_be32((be32_to_cpu(starting_psn) << 8) |
522a977049dSHal Rosenstock 			    (be32_to_cpu(rep_msg->offset20) & 0x000000FF));
523a977049dSHal Rosenstock }
524a977049dSHal Rosenstock 
525a977049dSHal Rosenstock static inline u8 cm_rep_get_target_ack_delay(struct cm_rep_msg *rep_msg)
526a977049dSHal Rosenstock {
527a977049dSHal Rosenstock 	return (u8) (rep_msg->offset26 >> 3);
528a977049dSHal Rosenstock }
529a977049dSHal Rosenstock 
530a977049dSHal Rosenstock static inline void cm_rep_set_target_ack_delay(struct cm_rep_msg *rep_msg,
531a977049dSHal Rosenstock 					       u8 target_ack_delay)
532a977049dSHal Rosenstock {
533a977049dSHal Rosenstock 	rep_msg->offset26 = (u8) ((rep_msg->offset26 & 0x07) |
534a977049dSHal Rosenstock 				  (target_ack_delay << 3));
535a977049dSHal Rosenstock }
536a977049dSHal Rosenstock 
537a977049dSHal Rosenstock static inline u8 cm_rep_get_failover(struct cm_rep_msg *rep_msg)
538a977049dSHal Rosenstock {
539a977049dSHal Rosenstock 	return (u8) ((rep_msg->offset26 & 0x06) >> 1);
540a977049dSHal Rosenstock }
541a977049dSHal Rosenstock 
542a977049dSHal Rosenstock static inline void cm_rep_set_failover(struct cm_rep_msg *rep_msg, u8 failover)
543a977049dSHal Rosenstock {
544a977049dSHal Rosenstock 	rep_msg->offset26 = (u8) ((rep_msg->offset26 & 0xF9) |
545a977049dSHal Rosenstock 				  ((failover & 0x3) << 1));
546a977049dSHal Rosenstock }
547a977049dSHal Rosenstock 
548a977049dSHal Rosenstock static inline u8 cm_rep_get_flow_ctrl(struct cm_rep_msg *rep_msg)
549a977049dSHal Rosenstock {
550a977049dSHal Rosenstock 	return (u8) (rep_msg->offset26 & 0x01);
551a977049dSHal Rosenstock }
552a977049dSHal Rosenstock 
553a977049dSHal Rosenstock static inline void cm_rep_set_flow_ctrl(struct cm_rep_msg *rep_msg,
554a977049dSHal Rosenstock 					    u8 flow_ctrl)
555a977049dSHal Rosenstock {
556a977049dSHal Rosenstock 	rep_msg->offset26 = (u8) ((rep_msg->offset26 & 0xFE) |
557a977049dSHal Rosenstock 				  (flow_ctrl & 0x1));
558a977049dSHal Rosenstock }
559a977049dSHal Rosenstock 
560a977049dSHal Rosenstock static inline u8 cm_rep_get_rnr_retry_count(struct cm_rep_msg *rep_msg)
561a977049dSHal Rosenstock {
562a977049dSHal Rosenstock 	return (u8) (rep_msg->offset27 >> 5);
563a977049dSHal Rosenstock }
564a977049dSHal Rosenstock 
565a977049dSHal Rosenstock static inline void cm_rep_set_rnr_retry_count(struct cm_rep_msg *rep_msg,
566a977049dSHal Rosenstock 					      u8 rnr_retry_count)
567a977049dSHal Rosenstock {
568a977049dSHal Rosenstock 	rep_msg->offset27 = (u8) ((rep_msg->offset27 & 0x1F) |
569a977049dSHal Rosenstock 				  (rnr_retry_count << 5));
570a977049dSHal Rosenstock }
571a977049dSHal Rosenstock 
572a977049dSHal Rosenstock static inline u8 cm_rep_get_srq(struct cm_rep_msg *rep_msg)
573a977049dSHal Rosenstock {
574a977049dSHal Rosenstock 	return (u8) ((rep_msg->offset27 >> 4) & 0x1);
575a977049dSHal Rosenstock }
576a977049dSHal Rosenstock 
577a977049dSHal Rosenstock static inline void cm_rep_set_srq(struct cm_rep_msg *rep_msg, u8 srq)
578a977049dSHal Rosenstock {
579a977049dSHal Rosenstock 	rep_msg->offset27 = (u8) ((rep_msg->offset27 & 0xEF) |
580a977049dSHal Rosenstock 				  ((srq & 0x1) << 4));
581a977049dSHal Rosenstock }
582a977049dSHal Rosenstock 
583a977049dSHal Rosenstock struct cm_rtu_msg {
584a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
585a977049dSHal Rosenstock 
58697f52eb4SSean Hefty 	__be32 local_comm_id;
58797f52eb4SSean Hefty 	__be32 remote_comm_id;
588a977049dSHal Rosenstock 
589a977049dSHal Rosenstock 	u8 private_data[IB_CM_RTU_PRIVATE_DATA_SIZE];
590a977049dSHal Rosenstock 
59119b1a294SErez Alfasi } __packed;
592a977049dSHal Rosenstock 
593a977049dSHal Rosenstock struct cm_dreq_msg {
594a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
595a977049dSHal Rosenstock 
59697f52eb4SSean Hefty 	__be32 local_comm_id;
59797f52eb4SSean Hefty 	__be32 remote_comm_id;
598a977049dSHal Rosenstock 	/* remote QPN/EECN:24, rsvd:8 */
59997f52eb4SSean Hefty 	__be32 offset8;
600a977049dSHal Rosenstock 
601a977049dSHal Rosenstock 	u8 private_data[IB_CM_DREQ_PRIVATE_DATA_SIZE];
602a977049dSHal Rosenstock 
60319b1a294SErez Alfasi } __packed;
604a977049dSHal Rosenstock 
60597f52eb4SSean Hefty static inline __be32 cm_dreq_get_remote_qpn(struct cm_dreq_msg *dreq_msg)
606a977049dSHal Rosenstock {
607a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(dreq_msg->offset8) >> 8);
608a977049dSHal Rosenstock }
609a977049dSHal Rosenstock 
61097f52eb4SSean Hefty static inline void cm_dreq_set_remote_qpn(struct cm_dreq_msg *dreq_msg, __be32 qpn)
611a977049dSHal Rosenstock {
612a977049dSHal Rosenstock 	dreq_msg->offset8 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
613a977049dSHal Rosenstock 			    (be32_to_cpu(dreq_msg->offset8) & 0x000000FF));
614a977049dSHal Rosenstock }
615a977049dSHal Rosenstock 
616a977049dSHal Rosenstock struct cm_drep_msg {
617a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
618a977049dSHal Rosenstock 
61997f52eb4SSean Hefty 	__be32 local_comm_id;
62097f52eb4SSean Hefty 	__be32 remote_comm_id;
621a977049dSHal Rosenstock 
622a977049dSHal Rosenstock 	u8 private_data[IB_CM_DREP_PRIVATE_DATA_SIZE];
623a977049dSHal Rosenstock 
62419b1a294SErez Alfasi } __packed;
625a977049dSHal Rosenstock 
626a977049dSHal Rosenstock struct cm_lap_msg {
627a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
628a977049dSHal Rosenstock 
62997f52eb4SSean Hefty 	__be32 local_comm_id;
63097f52eb4SSean Hefty 	__be32 remote_comm_id;
631a977049dSHal Rosenstock 
63297f52eb4SSean Hefty 	__be32 rsvd8;
633a977049dSHal Rosenstock 	/* remote QPN/EECN:24, remote CM response timeout:5, rsvd:3 */
63497f52eb4SSean Hefty 	__be32 offset12;
63597f52eb4SSean Hefty 	__be32 rsvd16;
636a977049dSHal Rosenstock 
63797f52eb4SSean Hefty 	__be16 alt_local_lid;
63897f52eb4SSean Hefty 	__be16 alt_remote_lid;
639a977049dSHal Rosenstock 	union ib_gid alt_local_gid;
640a977049dSHal Rosenstock 	union ib_gid alt_remote_gid;
641a977049dSHal Rosenstock 	/* flow label:20, rsvd:4, traffic class:8 */
64297f52eb4SSean Hefty 	__be32 offset56;
643a977049dSHal Rosenstock 	u8 alt_hop_limit;
644a977049dSHal Rosenstock 	/* rsvd:2, packet rate:6 */
64597f52eb4SSean Hefty 	u8 offset61;
646a977049dSHal Rosenstock 	/* SL:4, subnet local:1, rsvd:3 */
64797f52eb4SSean Hefty 	u8 offset62;
648a977049dSHal Rosenstock 	/* local ACK timeout:5, rsvd:3 */
64997f52eb4SSean Hefty 	u8 offset63;
650a977049dSHal Rosenstock 
651a977049dSHal Rosenstock 	u8 private_data[IB_CM_LAP_PRIVATE_DATA_SIZE];
65219b1a294SErez Alfasi } __packed;
653a977049dSHal Rosenstock 
65497f52eb4SSean Hefty static inline __be32 cm_lap_get_remote_qpn(struct cm_lap_msg *lap_msg)
655a977049dSHal Rosenstock {
656a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(lap_msg->offset12) >> 8);
657a977049dSHal Rosenstock }
658a977049dSHal Rosenstock 
65997f52eb4SSean Hefty static inline void cm_lap_set_remote_qpn(struct cm_lap_msg *lap_msg, __be32 qpn)
660a977049dSHal Rosenstock {
661a977049dSHal Rosenstock 	lap_msg->offset12 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
662a977049dSHal Rosenstock 					 (be32_to_cpu(lap_msg->offset12) &
663a977049dSHal Rosenstock 					  0x000000FF));
664a977049dSHal Rosenstock }
665a977049dSHal Rosenstock 
666a977049dSHal Rosenstock static inline u8 cm_lap_get_remote_resp_timeout(struct cm_lap_msg *lap_msg)
667a977049dSHal Rosenstock {
668a977049dSHal Rosenstock 	return (u8) ((be32_to_cpu(lap_msg->offset12) & 0xF8) >> 3);
669a977049dSHal Rosenstock }
670a977049dSHal Rosenstock 
671a977049dSHal Rosenstock static inline void cm_lap_set_remote_resp_timeout(struct cm_lap_msg *lap_msg,
672a977049dSHal Rosenstock 						  u8 resp_timeout)
673a977049dSHal Rosenstock {
674a977049dSHal Rosenstock 	lap_msg->offset12 = cpu_to_be32((resp_timeout << 3) |
675a977049dSHal Rosenstock 					 (be32_to_cpu(lap_msg->offset12) &
676a977049dSHal Rosenstock 					  0xFFFFFF07));
677a977049dSHal Rosenstock }
678a977049dSHal Rosenstock 
67997f52eb4SSean Hefty static inline __be32 cm_lap_get_flow_label(struct cm_lap_msg *lap_msg)
680a977049dSHal Rosenstock {
68197f52eb4SSean Hefty 	return cpu_to_be32(be32_to_cpu(lap_msg->offset56) >> 12);
682a977049dSHal Rosenstock }
683a977049dSHal Rosenstock 
684a977049dSHal Rosenstock static inline void cm_lap_set_flow_label(struct cm_lap_msg *lap_msg,
68597f52eb4SSean Hefty 					 __be32 flow_label)
686a977049dSHal Rosenstock {
68797f52eb4SSean Hefty 	lap_msg->offset56 = cpu_to_be32(
68897f52eb4SSean Hefty 				 (be32_to_cpu(lap_msg->offset56) & 0x00000FFF) |
68997f52eb4SSean Hefty 				 (be32_to_cpu(flow_label) << 12));
690a977049dSHal Rosenstock }
691a977049dSHal Rosenstock 
692a977049dSHal Rosenstock static inline u8 cm_lap_get_traffic_class(struct cm_lap_msg *lap_msg)
693a977049dSHal Rosenstock {
694a977049dSHal Rosenstock 	return (u8) be32_to_cpu(lap_msg->offset56);
695a977049dSHal Rosenstock }
696a977049dSHal Rosenstock 
697a977049dSHal Rosenstock static inline void cm_lap_set_traffic_class(struct cm_lap_msg *lap_msg,
698a977049dSHal Rosenstock 					    u8 traffic_class)
699a977049dSHal Rosenstock {
700a977049dSHal Rosenstock 	lap_msg->offset56 = cpu_to_be32(traffic_class |
701a977049dSHal Rosenstock 					 (be32_to_cpu(lap_msg->offset56) &
702a977049dSHal Rosenstock 					  0xFFFFFF00));
703a977049dSHal Rosenstock }
704a977049dSHal Rosenstock 
705a977049dSHal Rosenstock static inline u8 cm_lap_get_packet_rate(struct cm_lap_msg *lap_msg)
706a977049dSHal Rosenstock {
707a977049dSHal Rosenstock 	return lap_msg->offset61 & 0x3F;
708a977049dSHal Rosenstock }
709a977049dSHal Rosenstock 
710a977049dSHal Rosenstock static inline void cm_lap_set_packet_rate(struct cm_lap_msg *lap_msg,
711a977049dSHal Rosenstock 					  u8 packet_rate)
712a977049dSHal Rosenstock {
713a977049dSHal Rosenstock 	lap_msg->offset61 = (packet_rate & 0x3F) | (lap_msg->offset61 & 0xC0);
714a977049dSHal Rosenstock }
715a977049dSHal Rosenstock 
716a977049dSHal Rosenstock static inline u8 cm_lap_get_sl(struct cm_lap_msg *lap_msg)
717a977049dSHal Rosenstock {
718a977049dSHal Rosenstock 	return lap_msg->offset62 >> 4;
719a977049dSHal Rosenstock }
720a977049dSHal Rosenstock 
721a977049dSHal Rosenstock static inline void cm_lap_set_sl(struct cm_lap_msg *lap_msg, u8 sl)
722a977049dSHal Rosenstock {
723a977049dSHal Rosenstock 	lap_msg->offset62 = (sl << 4) | (lap_msg->offset62 & 0x0F);
724a977049dSHal Rosenstock }
725a977049dSHal Rosenstock 
726a977049dSHal Rosenstock static inline u8 cm_lap_get_subnet_local(struct cm_lap_msg *lap_msg)
727a977049dSHal Rosenstock {
728a977049dSHal Rosenstock 	return (lap_msg->offset62 >> 3) & 0x1;
729a977049dSHal Rosenstock }
730a977049dSHal Rosenstock 
731a977049dSHal Rosenstock static inline void cm_lap_set_subnet_local(struct cm_lap_msg *lap_msg,
732a977049dSHal Rosenstock 					   u8 subnet_local)
733a977049dSHal Rosenstock {
734a977049dSHal Rosenstock 	lap_msg->offset62 = ((subnet_local & 0x1) << 3) |
735a977049dSHal Rosenstock 			     (lap_msg->offset61 & 0xF7);
736a977049dSHal Rosenstock }
737a977049dSHal Rosenstock static inline u8 cm_lap_get_local_ack_timeout(struct cm_lap_msg *lap_msg)
738a977049dSHal Rosenstock {
739a977049dSHal Rosenstock 	return lap_msg->offset63 >> 3;
740a977049dSHal Rosenstock }
741a977049dSHal Rosenstock 
742a977049dSHal Rosenstock static inline void cm_lap_set_local_ack_timeout(struct cm_lap_msg *lap_msg,
743a977049dSHal Rosenstock 						u8 local_ack_timeout)
744a977049dSHal Rosenstock {
745a977049dSHal Rosenstock 	lap_msg->offset63 = (local_ack_timeout << 3) |
746a977049dSHal Rosenstock 			    (lap_msg->offset63 & 0x07);
747a977049dSHal Rosenstock }
748a977049dSHal Rosenstock 
749a977049dSHal Rosenstock struct cm_apr_msg {
750a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
751a977049dSHal Rosenstock 
75297f52eb4SSean Hefty 	__be32 local_comm_id;
75397f52eb4SSean Hefty 	__be32 remote_comm_id;
754a977049dSHal Rosenstock 
755a977049dSHal Rosenstock 	u8 info_length;
756a977049dSHal Rosenstock 	u8 ap_status;
7576f233d30SEli Cohen 	__be16 rsvd;
758a977049dSHal Rosenstock 	u8 info[IB_CM_APR_INFO_LENGTH];
759a977049dSHal Rosenstock 
760a977049dSHal Rosenstock 	u8 private_data[IB_CM_APR_PRIVATE_DATA_SIZE];
76119b1a294SErez Alfasi } __packed;
762a977049dSHal Rosenstock 
763a977049dSHal Rosenstock struct cm_sidr_req_msg {
764a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
765a977049dSHal Rosenstock 
76697f52eb4SSean Hefty 	__be32 request_id;
76797f52eb4SSean Hefty 	__be16 pkey;
76897f52eb4SSean Hefty 	__be16 rsvd;
76997f52eb4SSean Hefty 	__be64 service_id;
770a977049dSHal Rosenstock 
7710d0f738fSDavid Ahern 	u32 private_data[IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE / sizeof(u32)];
77219b1a294SErez Alfasi } __packed;
773a977049dSHal Rosenstock 
774a977049dSHal Rosenstock struct cm_sidr_rep_msg {
775a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
776a977049dSHal Rosenstock 
77797f52eb4SSean Hefty 	__be32 request_id;
778a977049dSHal Rosenstock 	u8 status;
779a977049dSHal Rosenstock 	u8 info_length;
78097f52eb4SSean Hefty 	__be16 rsvd;
781a977049dSHal Rosenstock 	/* QPN:24, rsvd:8 */
78297f52eb4SSean Hefty 	__be32 offset8;
78397f52eb4SSean Hefty 	__be64 service_id;
78497f52eb4SSean Hefty 	__be32 qkey;
785a977049dSHal Rosenstock 	u8 info[IB_CM_SIDR_REP_INFO_LENGTH];
786a977049dSHal Rosenstock 
787a977049dSHal Rosenstock 	u8 private_data[IB_CM_SIDR_REP_PRIVATE_DATA_SIZE];
78819b1a294SErez Alfasi } __packed;
789a977049dSHal Rosenstock 
79097f52eb4SSean Hefty static inline __be32 cm_sidr_rep_get_qpn(struct cm_sidr_rep_msg *sidr_rep_msg)
791a977049dSHal Rosenstock {
792a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(sidr_rep_msg->offset8) >> 8);
793a977049dSHal Rosenstock }
794a977049dSHal Rosenstock 
795a977049dSHal Rosenstock static inline void cm_sidr_rep_set_qpn(struct cm_sidr_rep_msg *sidr_rep_msg,
79697f52eb4SSean Hefty 				       __be32 qpn)
797a977049dSHal Rosenstock {
798a977049dSHal Rosenstock 	sidr_rep_msg->offset8 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
799a977049dSHal Rosenstock 					(be32_to_cpu(sidr_rep_msg->offset8) &
800a977049dSHal Rosenstock 					 0x000000FF));
801a977049dSHal Rosenstock }
802a977049dSHal Rosenstock 
803a977049dSHal Rosenstock #endif /* CM_MSGS_H */
804