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 
11d05d4ac4SLeon Romanovsky #include <rdma/ibta_vol1_c12.h>
12a4d61e84SRoland Dreier #include <rdma/ib_mad.h>
135d861be8SSean Hefty #include <rdma/ib_cm.h>
14a977049dSHal Rosenstock 
15a977049dSHal Rosenstock /*
16a977049dSHal Rosenstock  * Parameters to routines below should be in network-byte order, and values
17a977049dSHal Rosenstock  * are returned in network-byte order.
18a977049dSHal Rosenstock  */
19a977049dSHal Rosenstock 
20a977049dSHal Rosenstock #define IB_CM_CLASS_VERSION	2 /* IB specification 1.2 */
21a977049dSHal Rosenstock 
22a977049dSHal Rosenstock struct cm_req_msg {
23a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
24a977049dSHal Rosenstock 
2597f52eb4SSean Hefty 	__be32 local_comm_id;
2697f52eb4SSean Hefty 	__be32 rsvd4;
2797f52eb4SSean Hefty 	__be64 service_id;
2897f52eb4SSean Hefty 	__be64 local_ca_guid;
2997f52eb4SSean Hefty 	__be32 rsvd24;
3097f52eb4SSean Hefty 	__be32 local_qkey;
31a977049dSHal Rosenstock 	/* local QPN:24, responder resources:8 */
3297f52eb4SSean Hefty 	__be32 offset32;
33a977049dSHal Rosenstock 	/* local EECN:24, initiator depth:8 */
3497f52eb4SSean Hefty 	__be32 offset36;
35a977049dSHal Rosenstock 	/*
36a977049dSHal Rosenstock 	 * remote EECN:24, remote CM response timeout:5,
37a977049dSHal Rosenstock 	 * transport service type:2, end-to-end flow control:1
38a977049dSHal Rosenstock 	 */
3997f52eb4SSean Hefty 	__be32 offset40;
40a977049dSHal Rosenstock 	/* starting PSN:24, local CM response timeout:5, retry count:3 */
4197f52eb4SSean Hefty 	__be32 offset44;
4297f52eb4SSean Hefty 	__be16 pkey;
43a977049dSHal Rosenstock 	/* path MTU:4, RDC exists:1, RNR retry count:3. */
44a977049dSHal Rosenstock 	u8 offset50;
45d26a360bSSean Hefty 	/* max CM Retries:4, SRQ:1, extended transport type:3 */
46a977049dSHal Rosenstock 	u8 offset51;
47a977049dSHal Rosenstock 
4897f52eb4SSean Hefty 	__be16 primary_local_lid;
4997f52eb4SSean Hefty 	__be16 primary_remote_lid;
50a977049dSHal Rosenstock 	union ib_gid primary_local_gid;
51a977049dSHal Rosenstock 	union ib_gid primary_remote_gid;
52a977049dSHal Rosenstock 	/* flow label:20, rsvd:6, packet rate:6 */
5397f52eb4SSean Hefty 	__be32 primary_offset88;
54a977049dSHal Rosenstock 	u8 primary_traffic_class;
55a977049dSHal Rosenstock 	u8 primary_hop_limit;
56a977049dSHal Rosenstock 	/* SL:4, subnet local:1, rsvd:3 */
57a977049dSHal Rosenstock 	u8 primary_offset94;
58a977049dSHal Rosenstock 	/* local ACK timeout:5, rsvd:3 */
59a977049dSHal Rosenstock 	u8 primary_offset95;
60a977049dSHal Rosenstock 
6197f52eb4SSean Hefty 	__be16 alt_local_lid;
6297f52eb4SSean Hefty 	__be16 alt_remote_lid;
63a977049dSHal Rosenstock 	union ib_gid alt_local_gid;
64a977049dSHal Rosenstock 	union ib_gid alt_remote_gid;
65a977049dSHal Rosenstock 	/* flow label:20, rsvd:6, packet rate:6 */
6697f52eb4SSean Hefty 	__be32 alt_offset132;
67a977049dSHal Rosenstock 	u8 alt_traffic_class;
68a977049dSHal Rosenstock 	u8 alt_hop_limit;
69a977049dSHal Rosenstock 	/* SL:4, subnet local:1, rsvd:3 */
70a977049dSHal Rosenstock 	u8 alt_offset138;
71a977049dSHal Rosenstock 	/* local ACK timeout:5, rsvd:3 */
72a977049dSHal Rosenstock 	u8 alt_offset139;
73a977049dSHal Rosenstock 
740d0f738fSDavid Ahern 	u32 private_data[IB_CM_REQ_PRIVATE_DATA_SIZE / sizeof(u32)];
75a977049dSHal Rosenstock 
7619b1a294SErez Alfasi } __packed;
77a977049dSHal Rosenstock 
7897f52eb4SSean Hefty static inline __be32 cm_req_get_local_qpn(struct cm_req_msg *req_msg)
79a977049dSHal Rosenstock {
80a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(req_msg->offset32) >> 8);
81a977049dSHal Rosenstock }
82a977049dSHal Rosenstock 
8397f52eb4SSean Hefty static inline void cm_req_set_local_qpn(struct cm_req_msg *req_msg, __be32 qpn)
84a977049dSHal Rosenstock {
85a977049dSHal Rosenstock 	req_msg->offset32 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
86a977049dSHal Rosenstock 					 (be32_to_cpu(req_msg->offset32) &
87a977049dSHal Rosenstock 					  0x000000FF));
88a977049dSHal Rosenstock }
89a977049dSHal Rosenstock 
90a977049dSHal Rosenstock static inline enum ib_qp_type cm_req_get_qp_type(struct cm_req_msg *req_msg)
91a977049dSHal Rosenstock {
92b6bbee68SJason Gunthorpe 	u8 transport_type = IBA_GET(CM_REQ_TRANSPORT_SERVICE_TYPE, req_msg);
93a977049dSHal Rosenstock 	switch(transport_type) {
94a977049dSHal Rosenstock 	case 0: return IB_QPT_RC;
95a977049dSHal Rosenstock 	case 1: return IB_QPT_UC;
96d26a360bSSean Hefty 	case 3:
97b6bbee68SJason Gunthorpe 		switch (IBA_GET(CM_REQ_EXTENDED_TRANSPORT_TYPE, req_msg)) {
98d26a360bSSean Hefty 		case 1: return IB_QPT_XRC_TGT;
99d26a360bSSean Hefty 		default: return 0;
100d26a360bSSean Hefty 		}
101a977049dSHal Rosenstock 	default: return 0;
102a977049dSHal Rosenstock 	}
103a977049dSHal Rosenstock }
104a977049dSHal Rosenstock 
105a977049dSHal Rosenstock static inline void cm_req_set_qp_type(struct cm_req_msg *req_msg,
106a977049dSHal Rosenstock 				      enum ib_qp_type qp_type)
107a977049dSHal Rosenstock {
108a977049dSHal Rosenstock 	switch(qp_type) {
109a977049dSHal Rosenstock 	case IB_QPT_UC:
110b6bbee68SJason Gunthorpe 		IBA_SET(CM_REQ_TRANSPORT_SERVICE_TYPE, req_msg, 1);
1113910f44dSRoland Dreier 		break;
112d26a360bSSean Hefty 	case IB_QPT_XRC_INI:
113b6bbee68SJason Gunthorpe 		IBA_SET(CM_REQ_TRANSPORT_SERVICE_TYPE, req_msg, 3);
114b6bbee68SJason Gunthorpe 		IBA_SET(CM_REQ_EXTENDED_TRANSPORT_TYPE, req_msg, 1);
115d26a360bSSean Hefty 		break;
116a977049dSHal Rosenstock 	default:
117b6bbee68SJason Gunthorpe 		IBA_SET(CM_REQ_TRANSPORT_SERVICE_TYPE, req_msg, 0);
118a977049dSHal Rosenstock 	}
119a977049dSHal Rosenstock }
120a977049dSHal Rosenstock 
12197f52eb4SSean Hefty static inline __be32 cm_req_get_starting_psn(struct cm_req_msg *req_msg)
122a977049dSHal Rosenstock {
123a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(req_msg->offset44) >> 8);
124a977049dSHal Rosenstock }
125a977049dSHal Rosenstock 
126a977049dSHal Rosenstock static inline void cm_req_set_starting_psn(struct cm_req_msg *req_msg,
12797f52eb4SSean Hefty 					   __be32 starting_psn)
128a977049dSHal Rosenstock {
129a977049dSHal Rosenstock 	req_msg->offset44 = cpu_to_be32((be32_to_cpu(starting_psn) << 8) |
130a977049dSHal Rosenstock 			    (be32_to_cpu(req_msg->offset44) & 0x000000FF));
131a977049dSHal Rosenstock }
132a977049dSHal Rosenstock 
13397f52eb4SSean Hefty static inline __be32 cm_req_get_primary_flow_label(struct cm_req_msg *req_msg)
134a977049dSHal Rosenstock {
13597f52eb4SSean Hefty 	return cpu_to_be32(be32_to_cpu(req_msg->primary_offset88) >> 12);
136a977049dSHal Rosenstock }
137a977049dSHal Rosenstock 
138a977049dSHal Rosenstock static inline void cm_req_set_primary_flow_label(struct cm_req_msg *req_msg,
13997f52eb4SSean Hefty 						 __be32 flow_label)
140a977049dSHal Rosenstock {
141a977049dSHal Rosenstock 	req_msg->primary_offset88 = cpu_to_be32(
142a977049dSHal Rosenstock 				    (be32_to_cpu(req_msg->primary_offset88) &
143a977049dSHal Rosenstock 				     0x00000FFF) |
144a977049dSHal Rosenstock 				     (be32_to_cpu(flow_label) << 12));
145a977049dSHal Rosenstock }
146a977049dSHal Rosenstock 
14797f52eb4SSean Hefty static inline __be32 cm_req_get_alt_flow_label(struct cm_req_msg *req_msg)
148a977049dSHal Rosenstock {
14997f52eb4SSean Hefty 	return cpu_to_be32(be32_to_cpu(req_msg->alt_offset132) >> 12);
150a977049dSHal Rosenstock }
151a977049dSHal Rosenstock 
152a977049dSHal Rosenstock static inline void cm_req_set_alt_flow_label(struct cm_req_msg *req_msg,
15397f52eb4SSean Hefty 					     __be32 flow_label)
154a977049dSHal Rosenstock {
155a977049dSHal Rosenstock 	req_msg->alt_offset132 = cpu_to_be32(
156a977049dSHal Rosenstock 				 (be32_to_cpu(req_msg->alt_offset132) &
157a977049dSHal Rosenstock 				  0x00000FFF) |
158a977049dSHal Rosenstock 				  (be32_to_cpu(flow_label) << 12));
159a977049dSHal Rosenstock }
160a977049dSHal Rosenstock 
161a977049dSHal Rosenstock /* Message REJected or MRAed */
162a977049dSHal Rosenstock enum cm_msg_response {
163a977049dSHal Rosenstock 	CM_MSG_RESPONSE_REQ = 0x0,
164a977049dSHal Rosenstock 	CM_MSG_RESPONSE_REP = 0x1,
165a977049dSHal Rosenstock 	CM_MSG_RESPONSE_OTHER = 0x2
166a977049dSHal Rosenstock };
167a977049dSHal Rosenstock 
168a977049dSHal Rosenstock  struct cm_mra_msg {
169a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
170a977049dSHal Rosenstock 
17197f52eb4SSean Hefty 	__be32 local_comm_id;
17297f52eb4SSean Hefty 	__be32 remote_comm_id;
173a977049dSHal Rosenstock 	/* message MRAed:2, rsvd:6 */
174a977049dSHal Rosenstock 	u8 offset8;
175a977049dSHal Rosenstock 	/* service timeout:5, rsvd:3 */
176a977049dSHal Rosenstock 	u8 offset9;
177a977049dSHal Rosenstock 
178a977049dSHal Rosenstock 	u8 private_data[IB_CM_MRA_PRIVATE_DATA_SIZE];
179a977049dSHal Rosenstock 
18019b1a294SErez Alfasi } __packed;
181a977049dSHal Rosenstock 
182a977049dSHal Rosenstock struct cm_rej_msg {
183a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
184a977049dSHal Rosenstock 
18597f52eb4SSean Hefty 	__be32 local_comm_id;
18697f52eb4SSean Hefty 	__be32 remote_comm_id;
187a977049dSHal Rosenstock 	/* message REJected:2, rsvd:6 */
188a977049dSHal Rosenstock 	u8 offset8;
189a977049dSHal Rosenstock 	/* reject info length:7, rsvd:1. */
190a977049dSHal Rosenstock 	u8 offset9;
19197f52eb4SSean Hefty 	__be16 reason;
192a977049dSHal Rosenstock 	u8 ari[IB_CM_REJ_ARI_LENGTH];
193a977049dSHal Rosenstock 
194a977049dSHal Rosenstock 	u8 private_data[IB_CM_REJ_PRIVATE_DATA_SIZE];
195a977049dSHal Rosenstock 
19619b1a294SErez Alfasi } __packed;
197a977049dSHal Rosenstock 
198a977049dSHal Rosenstock struct cm_rep_msg {
199a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
200a977049dSHal Rosenstock 
20197f52eb4SSean Hefty 	__be32 local_comm_id;
20297f52eb4SSean Hefty 	__be32 remote_comm_id;
20397f52eb4SSean Hefty 	__be32 local_qkey;
204a977049dSHal Rosenstock 	/* local QPN:24, rsvd:8 */
20597f52eb4SSean Hefty 	__be32 offset12;
206a977049dSHal Rosenstock 	/* local EECN:24, rsvd:8 */
20797f52eb4SSean Hefty 	__be32 offset16;
208a977049dSHal Rosenstock 	/* starting PSN:24 rsvd:8 */
20997f52eb4SSean Hefty 	__be32 offset20;
210a977049dSHal Rosenstock 	u8 resp_resources;
211a977049dSHal Rosenstock 	u8 initiator_depth;
212a977049dSHal Rosenstock 	/* target ACK delay:5, failover accepted:2, end-to-end flow control:1 */
213a977049dSHal Rosenstock 	u8 offset26;
214a977049dSHal Rosenstock 	/* RNR retry count:3, SRQ:1, rsvd:5 */
215a977049dSHal Rosenstock 	u8 offset27;
21697f52eb4SSean Hefty 	__be64 local_ca_guid;
217a977049dSHal Rosenstock 
218a977049dSHal Rosenstock 	u8 private_data[IB_CM_REP_PRIVATE_DATA_SIZE];
219a977049dSHal Rosenstock 
22019b1a294SErez Alfasi } __packed;
221a977049dSHal Rosenstock 
22297f52eb4SSean Hefty static inline __be32 cm_rep_get_local_qpn(struct cm_rep_msg *rep_msg)
223a977049dSHal Rosenstock {
224a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(rep_msg->offset12) >> 8);
225a977049dSHal Rosenstock }
226a977049dSHal Rosenstock 
22797f52eb4SSean Hefty static inline void cm_rep_set_local_qpn(struct cm_rep_msg *rep_msg, __be32 qpn)
228a977049dSHal Rosenstock {
229a977049dSHal Rosenstock 	rep_msg->offset12 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
230a977049dSHal Rosenstock 			    (be32_to_cpu(rep_msg->offset12) & 0x000000FF));
231a977049dSHal Rosenstock }
232a977049dSHal Rosenstock 
233ef700446SSean Hefty static inline __be32 cm_rep_get_local_eecn(struct cm_rep_msg *rep_msg)
234ef700446SSean Hefty {
235ef700446SSean Hefty 	return cpu_to_be32(be32_to_cpu(rep_msg->offset16) >> 8);
236ef700446SSean Hefty }
237ef700446SSean Hefty 
238ef700446SSean Hefty static inline void cm_rep_set_local_eecn(struct cm_rep_msg *rep_msg, __be32 eecn)
239ef700446SSean Hefty {
240ef700446SSean Hefty 	rep_msg->offset16 = cpu_to_be32((be32_to_cpu(eecn) << 8) |
241ef700446SSean Hefty 			    (be32_to_cpu(rep_msg->offset16) & 0x000000FF));
242ef700446SSean Hefty }
243ef700446SSean Hefty 
244ef700446SSean Hefty static inline __be32 cm_rep_get_qpn(struct cm_rep_msg *rep_msg, enum ib_qp_type qp_type)
245ef700446SSean Hefty {
246ef700446SSean Hefty 	return (qp_type == IB_QPT_XRC_INI) ?
247ef700446SSean Hefty 		cm_rep_get_local_eecn(rep_msg) : cm_rep_get_local_qpn(rep_msg);
248ef700446SSean Hefty }
249ef700446SSean Hefty 
25097f52eb4SSean Hefty static inline __be32 cm_rep_get_starting_psn(struct cm_rep_msg *rep_msg)
251a977049dSHal Rosenstock {
252a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(rep_msg->offset20) >> 8);
253a977049dSHal Rosenstock }
254a977049dSHal Rosenstock 
255a977049dSHal Rosenstock static inline void cm_rep_set_starting_psn(struct cm_rep_msg *rep_msg,
25697f52eb4SSean Hefty 					   __be32 starting_psn)
257a977049dSHal Rosenstock {
258a977049dSHal Rosenstock 	rep_msg->offset20 = cpu_to_be32((be32_to_cpu(starting_psn) << 8) |
259a977049dSHal Rosenstock 			    (be32_to_cpu(rep_msg->offset20) & 0x000000FF));
260a977049dSHal Rosenstock }
261a977049dSHal Rosenstock 
262a977049dSHal Rosenstock struct cm_rtu_msg {
263a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
264a977049dSHal Rosenstock 
26597f52eb4SSean Hefty 	__be32 local_comm_id;
26697f52eb4SSean Hefty 	__be32 remote_comm_id;
267a977049dSHal Rosenstock 
268a977049dSHal Rosenstock 	u8 private_data[IB_CM_RTU_PRIVATE_DATA_SIZE];
269a977049dSHal Rosenstock 
27019b1a294SErez Alfasi } __packed;
271a977049dSHal Rosenstock 
272a977049dSHal Rosenstock struct cm_dreq_msg {
273a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
274a977049dSHal Rosenstock 
27597f52eb4SSean Hefty 	__be32 local_comm_id;
27697f52eb4SSean Hefty 	__be32 remote_comm_id;
277a977049dSHal Rosenstock 	/* remote QPN/EECN:24, rsvd:8 */
27897f52eb4SSean Hefty 	__be32 offset8;
279a977049dSHal Rosenstock 
280a977049dSHal Rosenstock 	u8 private_data[IB_CM_DREQ_PRIVATE_DATA_SIZE];
281a977049dSHal Rosenstock 
28219b1a294SErez Alfasi } __packed;
283a977049dSHal Rosenstock 
28497f52eb4SSean Hefty static inline __be32 cm_dreq_get_remote_qpn(struct cm_dreq_msg *dreq_msg)
285a977049dSHal Rosenstock {
286a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(dreq_msg->offset8) >> 8);
287a977049dSHal Rosenstock }
288a977049dSHal Rosenstock 
28997f52eb4SSean Hefty static inline void cm_dreq_set_remote_qpn(struct cm_dreq_msg *dreq_msg, __be32 qpn)
290a977049dSHal Rosenstock {
291a977049dSHal Rosenstock 	dreq_msg->offset8 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
292a977049dSHal Rosenstock 			    (be32_to_cpu(dreq_msg->offset8) & 0x000000FF));
293a977049dSHal Rosenstock }
294a977049dSHal Rosenstock 
295a977049dSHal Rosenstock struct cm_drep_msg {
296a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
297a977049dSHal Rosenstock 
29897f52eb4SSean Hefty 	__be32 local_comm_id;
29997f52eb4SSean Hefty 	__be32 remote_comm_id;
300a977049dSHal Rosenstock 
301a977049dSHal Rosenstock 	u8 private_data[IB_CM_DREP_PRIVATE_DATA_SIZE];
302a977049dSHal Rosenstock 
30319b1a294SErez Alfasi } __packed;
304a977049dSHal Rosenstock 
305a977049dSHal Rosenstock struct cm_lap_msg {
306a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
307a977049dSHal Rosenstock 
30897f52eb4SSean Hefty 	__be32 local_comm_id;
30997f52eb4SSean Hefty 	__be32 remote_comm_id;
310a977049dSHal Rosenstock 
31197f52eb4SSean Hefty 	__be32 rsvd8;
312a977049dSHal Rosenstock 	/* remote QPN/EECN:24, remote CM response timeout:5, rsvd:3 */
31397f52eb4SSean Hefty 	__be32 offset12;
31497f52eb4SSean Hefty 	__be32 rsvd16;
315a977049dSHal Rosenstock 
31697f52eb4SSean Hefty 	__be16 alt_local_lid;
31797f52eb4SSean Hefty 	__be16 alt_remote_lid;
318a977049dSHal Rosenstock 	union ib_gid alt_local_gid;
319a977049dSHal Rosenstock 	union ib_gid alt_remote_gid;
320a977049dSHal Rosenstock 	/* flow label:20, rsvd:4, traffic class:8 */
32197f52eb4SSean Hefty 	__be32 offset56;
322a977049dSHal Rosenstock 	u8 alt_hop_limit;
323a977049dSHal Rosenstock 	/* rsvd:2, packet rate:6 */
32497f52eb4SSean Hefty 	u8 offset61;
325a977049dSHal Rosenstock 	/* SL:4, subnet local:1, rsvd:3 */
32697f52eb4SSean Hefty 	u8 offset62;
327a977049dSHal Rosenstock 	/* local ACK timeout:5, rsvd:3 */
32897f52eb4SSean Hefty 	u8 offset63;
329a977049dSHal Rosenstock 
330a977049dSHal Rosenstock 	u8 private_data[IB_CM_LAP_PRIVATE_DATA_SIZE];
33119b1a294SErez Alfasi } __packed;
332a977049dSHal Rosenstock 
33397f52eb4SSean Hefty static inline __be32 cm_lap_get_flow_label(struct cm_lap_msg *lap_msg)
334a977049dSHal Rosenstock {
33597f52eb4SSean Hefty 	return cpu_to_be32(be32_to_cpu(lap_msg->offset56) >> 12);
336a977049dSHal Rosenstock }
337a977049dSHal Rosenstock 
338a977049dSHal Rosenstock struct cm_apr_msg {
339a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
340a977049dSHal Rosenstock 
34197f52eb4SSean Hefty 	__be32 local_comm_id;
34297f52eb4SSean Hefty 	__be32 remote_comm_id;
343a977049dSHal Rosenstock 
344a977049dSHal Rosenstock 	u8 info_length;
345a977049dSHal Rosenstock 	u8 ap_status;
3466f233d30SEli Cohen 	__be16 rsvd;
347a977049dSHal Rosenstock 	u8 info[IB_CM_APR_INFO_LENGTH];
348a977049dSHal Rosenstock 
349a977049dSHal Rosenstock 	u8 private_data[IB_CM_APR_PRIVATE_DATA_SIZE];
35019b1a294SErez Alfasi } __packed;
351a977049dSHal Rosenstock 
352a977049dSHal Rosenstock struct cm_sidr_req_msg {
353a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
354a977049dSHal Rosenstock 
35597f52eb4SSean Hefty 	__be32 request_id;
35697f52eb4SSean Hefty 	__be16 pkey;
35797f52eb4SSean Hefty 	__be16 rsvd;
35897f52eb4SSean Hefty 	__be64 service_id;
359a977049dSHal Rosenstock 
3600d0f738fSDavid Ahern 	u32 private_data[IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE / sizeof(u32)];
36119b1a294SErez Alfasi } __packed;
362a977049dSHal Rosenstock 
363a977049dSHal Rosenstock struct cm_sidr_rep_msg {
364a977049dSHal Rosenstock 	struct ib_mad_hdr hdr;
365a977049dSHal Rosenstock 
36697f52eb4SSean Hefty 	__be32 request_id;
367a977049dSHal Rosenstock 	u8 status;
368a977049dSHal Rosenstock 	u8 info_length;
36997f52eb4SSean Hefty 	__be16 rsvd;
370a977049dSHal Rosenstock 	/* QPN:24, rsvd:8 */
37197f52eb4SSean Hefty 	__be32 offset8;
37297f52eb4SSean Hefty 	__be64 service_id;
37397f52eb4SSean Hefty 	__be32 qkey;
374a977049dSHal Rosenstock 	u8 info[IB_CM_SIDR_REP_INFO_LENGTH];
375a977049dSHal Rosenstock 
376a977049dSHal Rosenstock 	u8 private_data[IB_CM_SIDR_REP_PRIVATE_DATA_SIZE];
37719b1a294SErez Alfasi } __packed;
378a977049dSHal Rosenstock 
37997f52eb4SSean Hefty static inline __be32 cm_sidr_rep_get_qpn(struct cm_sidr_rep_msg *sidr_rep_msg)
380a977049dSHal Rosenstock {
381a977049dSHal Rosenstock 	return cpu_to_be32(be32_to_cpu(sidr_rep_msg->offset8) >> 8);
382a977049dSHal Rosenstock }
383a977049dSHal Rosenstock 
384a977049dSHal Rosenstock static inline void cm_sidr_rep_set_qpn(struct cm_sidr_rep_msg *sidr_rep_msg,
38597f52eb4SSean Hefty 				       __be32 qpn)
386a977049dSHal Rosenstock {
387a977049dSHal Rosenstock 	sidr_rep_msg->offset8 = cpu_to_be32((be32_to_cpu(qpn) << 8) |
388a977049dSHal Rosenstock 					(be32_to_cpu(sidr_rep_msg->offset8) &
389a977049dSHal Rosenstock 					 0x000000FF));
390a977049dSHal Rosenstock }
391a977049dSHal Rosenstock 
392a977049dSHal Rosenstock #endif /* CM_MSGS_H */
393