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