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