Path: blob/master/drivers/infiniband/core/cm_msgs.h
37212 views
/*1* Copyright (c) 2004 Intel Corporation. All rights reserved.2* Copyright (c) 2004 Topspin Corporation. All rights reserved.3* Copyright (c) 2004 Voltaire Corporation. All rights reserved.4*5* This software is available to you under a choice of one of two6* licenses. You may choose to be licensed under the terms of the GNU7* General Public License (GPL) Version 2, available from the file8* COPYING the madirectory of this source tree, or the9* OpenIB.org BSD license below:10*11* Redistribution and use source and binary forms, with or12* withmodification, are permitted provided that the following13* conditions are met:14*15* - Redistributions of source code must retathe above16* copyright notice, this list of conditions and the following17* disclaimer.18*19* - Redistributions binary form must reproduce the above20* copyright notice, this list of conditions and the following21* disclaimer the documentation and/or other materials22* provided with the distribution.23*24* THE SOFTWARE IS PROVIDED "AS IS", WITHWARRANTY OF ANY KIND,25* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF26* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND27* NONINFRINGEMENT. NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS28* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER AN29* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OF OR IN30* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS THE31* SOFTWARE.32*/33#if !defined(CM_MSGS_H)34#define CM_MSGS_H3536#include <rdma/ib_mad.h>37#include <rdma/ib_cm.h>3839/*40* Parameters to routines below should be in network-byte order, and values41* are returned in network-byte order.42*/4344#define IB_CM_CLASS_VERSION 2 /* IB specification 1.2 */4546#define CM_REQ_ATTR_ID cpu_to_be16(0x0010)47#define CM_MRA_ATTR_ID cpu_to_be16(0x0011)48#define CM_REJ_ATTR_ID cpu_to_be16(0x0012)49#define CM_REP_ATTR_ID cpu_to_be16(0x0013)50#define CM_RTU_ATTR_ID cpu_to_be16(0x0014)51#define CM_DREQ_ATTR_ID cpu_to_be16(0x0015)52#define CM_DREP_ATTR_ID cpu_to_be16(0x0016)53#define CM_SIDR_REQ_ATTR_ID cpu_to_be16(0x0017)54#define CM_SIDR_REP_ATTR_ID cpu_to_be16(0x0018)55#define CM_LAP_ATTR_ID cpu_to_be16(0x0019)56#define CM_APR_ATTR_ID cpu_to_be16(0x001A)5758enum cm_msg_sequence {59CM_MSG_SEQUENCE_REQ,60CM_MSG_SEQUENCE_LAP,61CM_MSG_SEQUENCE_DREQ,62CM_MSG_SEQUENCE_SIDR63};6465struct cm_req_msg {66struct ib_mad_hdr hdr;6768__be32 local_comm_id;69__be32 rsvd4;70__be64 service_id;71__be64 local_ca_guid;72__be32 rsvd24;73__be32 local_qkey;74/* local QPN:24, responder resources:8 */75__be32 offset32;76/* local EECN:24, initiator depth:8 */77__be32 offset36;78/*79* remote EECN:24, remote CM response timeout:5,80* transport service type:2, end-to-end flow control:181*/82__be32 offset40;83/* starting PSN:24, local CM response timeout:5, retry count:3 */84__be32 offset44;85__be16 pkey;86/* path MTU:4, RDC exists:1, RNR retry count:3. */87u8 offset50;88/* max CM Retries:4, SRQ:1, rsvd:3 */89u8 offset51;9091__be16 primary_local_lid;92__be16 primary_remote_lid;93union ib_gid primary_local_gid;94union ib_gid primary_remote_gid;95/* flow label:20, rsvd:6, packet rate:6 */96__be32 primary_offset88;97u8 primary_traffic_class;98u8 primary_hop_limit;99/* SL:4, subnet local:1, rsvd:3 */100u8 primary_offset94;101/* local ACK timeout:5, rsvd:3 */102u8 primary_offset95;103104__be16 alt_local_lid;105__be16 alt_remote_lid;106union ib_gid alt_local_gid;107union ib_gid alt_remote_gid;108/* flow label:20, rsvd:6, packet rate:6 */109__be32 alt_offset132;110u8 alt_traffic_class;111u8 alt_hop_limit;112/* SL:4, subnet local:1, rsvd:3 */113u8 alt_offset138;114/* local ACK timeout:5, rsvd:3 */115u8 alt_offset139;116117u8 private_data[IB_CM_REQ_PRIVATE_DATA_SIZE];118119} __attribute__ ((packed));120121static inline __be32 cm_req_get_local_qpn(struct cm_req_msg *req_msg)122{123return cpu_to_be32(be32_to_cpu(req_msg->offset32) >> 8);124}125126static inline void cm_req_set_local_qpn(struct cm_req_msg *req_msg, __be32 qpn)127{128req_msg->offset32 = cpu_to_be32((be32_to_cpu(qpn) << 8) |129(be32_to_cpu(req_msg->offset32) &1300x000000FF));131}132133static inline u8 cm_req_get_resp_res(struct cm_req_msg *req_msg)134{135return (u8) be32_to_cpu(req_msg->offset32);136}137138static inline void cm_req_set_resp_res(struct cm_req_msg *req_msg, u8 resp_res)139{140req_msg->offset32 = cpu_to_be32(resp_res |141(be32_to_cpu(req_msg->offset32) &1420xFFFFFF00));143}144145static inline u8 cm_req_get_init_depth(struct cm_req_msg *req_msg)146{147return (u8) be32_to_cpu(req_msg->offset36);148}149150static inline void cm_req_set_init_depth(struct cm_req_msg *req_msg,151u8 init_depth)152{153req_msg->offset36 = cpu_to_be32(init_depth |154(be32_to_cpu(req_msg->offset36) &1550xFFFFFF00));156}157158static inline u8 cm_req_get_remote_resp_timeout(struct cm_req_msg *req_msg)159{160return (u8) ((be32_to_cpu(req_msg->offset40) & 0xF8) >> 3);161}162163static inline void cm_req_set_remote_resp_timeout(struct cm_req_msg *req_msg,164u8 resp_timeout)165{166req_msg->offset40 = cpu_to_be32((resp_timeout << 3) |167(be32_to_cpu(req_msg->offset40) &1680xFFFFFF07));169}170171static inline enum ib_qp_type cm_req_get_qp_type(struct cm_req_msg *req_msg)172{173u8 transport_type = (u8) (be32_to_cpu(req_msg->offset40) & 0x06) >> 1;174switch(transport_type) {175case 0: return IB_QPT_RC;176case 1: return IB_QPT_UC;177default: return 0;178}179}180181static inline void cm_req_set_qp_type(struct cm_req_msg *req_msg,182enum ib_qp_type qp_type)183{184switch(qp_type) {185case IB_QPT_UC:186req_msg->offset40 = cpu_to_be32((be32_to_cpu(187req_msg->offset40) &1880xFFFFFFF9) | 0x2);189break;190default:191req_msg->offset40 = cpu_to_be32(be32_to_cpu(192req_msg->offset40) &1930xFFFFFFF9);194}195}196197static inline u8 cm_req_get_flow_ctrl(struct cm_req_msg *req_msg)198{199return be32_to_cpu(req_msg->offset40) & 0x1;200}201202static inline void cm_req_set_flow_ctrl(struct cm_req_msg *req_msg,203u8 flow_ctrl)204{205req_msg->offset40 = cpu_to_be32((flow_ctrl & 0x1) |206(be32_to_cpu(req_msg->offset40) &2070xFFFFFFFE));208}209210static inline __be32 cm_req_get_starting_psn(struct cm_req_msg *req_msg)211{212return cpu_to_be32(be32_to_cpu(req_msg->offset44) >> 8);213}214215static inline void cm_req_set_starting_psn(struct cm_req_msg *req_msg,216__be32 starting_psn)217{218req_msg->offset44 = cpu_to_be32((be32_to_cpu(starting_psn) << 8) |219(be32_to_cpu(req_msg->offset44) & 0x000000FF));220}221222static inline u8 cm_req_get_local_resp_timeout(struct cm_req_msg *req_msg)223{224return (u8) ((be32_to_cpu(req_msg->offset44) & 0xF8) >> 3);225}226227static inline void cm_req_set_local_resp_timeout(struct cm_req_msg *req_msg,228u8 resp_timeout)229{230req_msg->offset44 = cpu_to_be32((resp_timeout << 3) |231(be32_to_cpu(req_msg->offset44) & 0xFFFFFF07));232}233234static inline u8 cm_req_get_retry_count(struct cm_req_msg *req_msg)235{236return (u8) (be32_to_cpu(req_msg->offset44) & 0x7);237}238239static inline void cm_req_set_retry_count(struct cm_req_msg *req_msg,240u8 retry_count)241{242req_msg->offset44 = cpu_to_be32((retry_count & 0x7) |243(be32_to_cpu(req_msg->offset44) & 0xFFFFFFF8));244}245246static inline u8 cm_req_get_path_mtu(struct cm_req_msg *req_msg)247{248return req_msg->offset50 >> 4;249}250251static inline void cm_req_set_path_mtu(struct cm_req_msg *req_msg, u8 path_mtu)252{253req_msg->offset50 = (u8) ((req_msg->offset50 & 0xF) | (path_mtu << 4));254}255256static inline u8 cm_req_get_rnr_retry_count(struct cm_req_msg *req_msg)257{258return req_msg->offset50 & 0x7;259}260261static inline void cm_req_set_rnr_retry_count(struct cm_req_msg *req_msg,262u8 rnr_retry_count)263{264req_msg->offset50 = (u8) ((req_msg->offset50 & 0xF8) |265(rnr_retry_count & 0x7));266}267268static inline u8 cm_req_get_max_cm_retries(struct cm_req_msg *req_msg)269{270return req_msg->offset51 >> 4;271}272273static inline void cm_req_set_max_cm_retries(struct cm_req_msg *req_msg,274u8 retries)275{276req_msg->offset51 = (u8) ((req_msg->offset51 & 0xF) | (retries << 4));277}278279static inline u8 cm_req_get_srq(struct cm_req_msg *req_msg)280{281return (req_msg->offset51 & 0x8) >> 3;282}283284static inline void cm_req_set_srq(struct cm_req_msg *req_msg, u8 srq)285{286req_msg->offset51 = (u8) ((req_msg->offset51 & 0xF7) |287((srq & 0x1) << 3));288}289290static inline __be32 cm_req_get_primary_flow_label(struct cm_req_msg *req_msg)291{292return cpu_to_be32(be32_to_cpu(req_msg->primary_offset88) >> 12);293}294295static inline void cm_req_set_primary_flow_label(struct cm_req_msg *req_msg,296__be32 flow_label)297{298req_msg->primary_offset88 = cpu_to_be32(299(be32_to_cpu(req_msg->primary_offset88) &3000x00000FFF) |301(be32_to_cpu(flow_label) << 12));302}303304static inline u8 cm_req_get_primary_packet_rate(struct cm_req_msg *req_msg)305{306return (u8) (be32_to_cpu(req_msg->primary_offset88) & 0x3F);307}308309static inline void cm_req_set_primary_packet_rate(struct cm_req_msg *req_msg,310u8 rate)311{312req_msg->primary_offset88 = cpu_to_be32(313(be32_to_cpu(req_msg->primary_offset88) &3140xFFFFFFC0) | (rate & 0x3F));315}316317static inline u8 cm_req_get_primary_sl(struct cm_req_msg *req_msg)318{319return (u8) (req_msg->primary_offset94 >> 4);320}321322static inline void cm_req_set_primary_sl(struct cm_req_msg *req_msg, u8 sl)323{324req_msg->primary_offset94 = (u8) ((req_msg->primary_offset94 & 0x0F) |325(sl << 4));326}327328static inline u8 cm_req_get_primary_subnet_local(struct cm_req_msg *req_msg)329{330return (u8) ((req_msg->primary_offset94 & 0x08) >> 3);331}332333static inline void cm_req_set_primary_subnet_local(struct cm_req_msg *req_msg,334u8 subnet_local)335{336req_msg->primary_offset94 = (u8) ((req_msg->primary_offset94 & 0xF7) |337((subnet_local & 0x1) << 3));338}339340static inline u8 cm_req_get_primary_local_ack_timeout(struct cm_req_msg *req_msg)341{342return (u8) (req_msg->primary_offset95 >> 3);343}344345static inline void cm_req_set_primary_local_ack_timeout(struct cm_req_msg *req_msg,346u8 local_ack_timeout)347{348req_msg->primary_offset95 = (u8) ((req_msg->primary_offset95 & 0x07) |349(local_ack_timeout << 3));350}351352static inline __be32 cm_req_get_alt_flow_label(struct cm_req_msg *req_msg)353{354return cpu_to_be32(be32_to_cpu(req_msg->alt_offset132) >> 12);355}356357static inline void cm_req_set_alt_flow_label(struct cm_req_msg *req_msg,358__be32 flow_label)359{360req_msg->alt_offset132 = cpu_to_be32(361(be32_to_cpu(req_msg->alt_offset132) &3620x00000FFF) |363(be32_to_cpu(flow_label) << 12));364}365366static inline u8 cm_req_get_alt_packet_rate(struct cm_req_msg *req_msg)367{368return (u8) (be32_to_cpu(req_msg->alt_offset132) & 0x3F);369}370371static inline void cm_req_set_alt_packet_rate(struct cm_req_msg *req_msg,372u8 rate)373{374req_msg->alt_offset132 = cpu_to_be32(375(be32_to_cpu(req_msg->alt_offset132) &3760xFFFFFFC0) | (rate & 0x3F));377}378379static inline u8 cm_req_get_alt_sl(struct cm_req_msg *req_msg)380{381return (u8) (req_msg->alt_offset138 >> 4);382}383384static inline void cm_req_set_alt_sl(struct cm_req_msg *req_msg, u8 sl)385{386req_msg->alt_offset138 = (u8) ((req_msg->alt_offset138 & 0x0F) |387(sl << 4));388}389390static inline u8 cm_req_get_alt_subnet_local(struct cm_req_msg *req_msg)391{392return (u8) ((req_msg->alt_offset138 & 0x08) >> 3);393}394395static inline void cm_req_set_alt_subnet_local(struct cm_req_msg *req_msg,396u8 subnet_local)397{398req_msg->alt_offset138 = (u8) ((req_msg->alt_offset138 & 0xF7) |399((subnet_local & 0x1) << 3));400}401402static inline u8 cm_req_get_alt_local_ack_timeout(struct cm_req_msg *req_msg)403{404return (u8) (req_msg->alt_offset139 >> 3);405}406407static inline void cm_req_set_alt_local_ack_timeout(struct cm_req_msg *req_msg,408u8 local_ack_timeout)409{410req_msg->alt_offset139 = (u8) ((req_msg->alt_offset139 & 0x07) |411(local_ack_timeout << 3));412}413414/* Message REJected or MRAed */415enum cm_msg_response {416CM_MSG_RESPONSE_REQ = 0x0,417CM_MSG_RESPONSE_REP = 0x1,418CM_MSG_RESPONSE_OTHER = 0x2419};420421struct cm_mra_msg {422struct ib_mad_hdr hdr;423424__be32 local_comm_id;425__be32 remote_comm_id;426/* message MRAed:2, rsvd:6 */427u8 offset8;428/* service timeout:5, rsvd:3 */429u8 offset9;430431u8 private_data[IB_CM_MRA_PRIVATE_DATA_SIZE];432433} __attribute__ ((packed));434435static inline u8 cm_mra_get_msg_mraed(struct cm_mra_msg *mra_msg)436{437return (u8) (mra_msg->offset8 >> 6);438}439440static inline void cm_mra_set_msg_mraed(struct cm_mra_msg *mra_msg, u8 msg)441{442mra_msg->offset8 = (u8) ((mra_msg->offset8 & 0x3F) | (msg << 6));443}444445static inline u8 cm_mra_get_service_timeout(struct cm_mra_msg *mra_msg)446{447return (u8) (mra_msg->offset9 >> 3);448}449450static inline void cm_mra_set_service_timeout(struct cm_mra_msg *mra_msg,451u8 service_timeout)452{453mra_msg->offset9 = (u8) ((mra_msg->offset9 & 0x07) |454(service_timeout << 3));455}456457struct cm_rej_msg {458struct ib_mad_hdr hdr;459460__be32 local_comm_id;461__be32 remote_comm_id;462/* message REJected:2, rsvd:6 */463u8 offset8;464/* reject info length:7, rsvd:1. */465u8 offset9;466__be16 reason;467u8 ari[IB_CM_REJ_ARI_LENGTH];468469u8 private_data[IB_CM_REJ_PRIVATE_DATA_SIZE];470471} __attribute__ ((packed));472473static inline u8 cm_rej_get_msg_rejected(struct cm_rej_msg *rej_msg)474{475return (u8) (rej_msg->offset8 >> 6);476}477478static inline void cm_rej_set_msg_rejected(struct cm_rej_msg *rej_msg, u8 msg)479{480rej_msg->offset8 = (u8) ((rej_msg->offset8 & 0x3F) | (msg << 6));481}482483static inline u8 cm_rej_get_reject_info_len(struct cm_rej_msg *rej_msg)484{485return (u8) (rej_msg->offset9 >> 1);486}487488static inline void cm_rej_set_reject_info_len(struct cm_rej_msg *rej_msg,489u8 len)490{491rej_msg->offset9 = (u8) ((rej_msg->offset9 & 0x1) | (len << 1));492}493494struct cm_rep_msg {495struct ib_mad_hdr hdr;496497__be32 local_comm_id;498__be32 remote_comm_id;499__be32 local_qkey;500/* local QPN:24, rsvd:8 */501__be32 offset12;502/* local EECN:24, rsvd:8 */503__be32 offset16;504/* starting PSN:24 rsvd:8 */505__be32 offset20;506u8 resp_resources;507u8 initiator_depth;508/* target ACK delay:5, failover accepted:2, end-to-end flow control:1 */509u8 offset26;510/* RNR retry count:3, SRQ:1, rsvd:5 */511u8 offset27;512__be64 local_ca_guid;513514u8 private_data[IB_CM_REP_PRIVATE_DATA_SIZE];515516} __attribute__ ((packed));517518static inline __be32 cm_rep_get_local_qpn(struct cm_rep_msg *rep_msg)519{520return cpu_to_be32(be32_to_cpu(rep_msg->offset12) >> 8);521}522523static inline void cm_rep_set_local_qpn(struct cm_rep_msg *rep_msg, __be32 qpn)524{525rep_msg->offset12 = cpu_to_be32((be32_to_cpu(qpn) << 8) |526(be32_to_cpu(rep_msg->offset12) & 0x000000FF));527}528529static inline __be32 cm_rep_get_starting_psn(struct cm_rep_msg *rep_msg)530{531return cpu_to_be32(be32_to_cpu(rep_msg->offset20) >> 8);532}533534static inline void cm_rep_set_starting_psn(struct cm_rep_msg *rep_msg,535__be32 starting_psn)536{537rep_msg->offset20 = cpu_to_be32((be32_to_cpu(starting_psn) << 8) |538(be32_to_cpu(rep_msg->offset20) & 0x000000FF));539}540541static inline u8 cm_rep_get_target_ack_delay(struct cm_rep_msg *rep_msg)542{543return (u8) (rep_msg->offset26 >> 3);544}545546static inline void cm_rep_set_target_ack_delay(struct cm_rep_msg *rep_msg,547u8 target_ack_delay)548{549rep_msg->offset26 = (u8) ((rep_msg->offset26 & 0x07) |550(target_ack_delay << 3));551}552553static inline u8 cm_rep_get_failover(struct cm_rep_msg *rep_msg)554{555return (u8) ((rep_msg->offset26 & 0x06) >> 1);556}557558static inline void cm_rep_set_failover(struct cm_rep_msg *rep_msg, u8 failover)559{560rep_msg->offset26 = (u8) ((rep_msg->offset26 & 0xF9) |561((failover & 0x3) << 1));562}563564static inline u8 cm_rep_get_flow_ctrl(struct cm_rep_msg *rep_msg)565{566return (u8) (rep_msg->offset26 & 0x01);567}568569static inline void cm_rep_set_flow_ctrl(struct cm_rep_msg *rep_msg,570u8 flow_ctrl)571{572rep_msg->offset26 = (u8) ((rep_msg->offset26 & 0xFE) |573(flow_ctrl & 0x1));574}575576static inline u8 cm_rep_get_rnr_retry_count(struct cm_rep_msg *rep_msg)577{578return (u8) (rep_msg->offset27 >> 5);579}580581static inline void cm_rep_set_rnr_retry_count(struct cm_rep_msg *rep_msg,582u8 rnr_retry_count)583{584rep_msg->offset27 = (u8) ((rep_msg->offset27 & 0x1F) |585(rnr_retry_count << 5));586}587588static inline u8 cm_rep_get_srq(struct cm_rep_msg *rep_msg)589{590return (u8) ((rep_msg->offset27 >> 4) & 0x1);591}592593static inline void cm_rep_set_srq(struct cm_rep_msg *rep_msg, u8 srq)594{595rep_msg->offset27 = (u8) ((rep_msg->offset27 & 0xEF) |596((srq & 0x1) << 4));597}598599struct cm_rtu_msg {600struct ib_mad_hdr hdr;601602__be32 local_comm_id;603__be32 remote_comm_id;604605u8 private_data[IB_CM_RTU_PRIVATE_DATA_SIZE];606607} __attribute__ ((packed));608609struct cm_dreq_msg {610struct ib_mad_hdr hdr;611612__be32 local_comm_id;613__be32 remote_comm_id;614/* remote QPN/EECN:24, rsvd:8 */615__be32 offset8;616617u8 private_data[IB_CM_DREQ_PRIVATE_DATA_SIZE];618619} __attribute__ ((packed));620621static inline __be32 cm_dreq_get_remote_qpn(struct cm_dreq_msg *dreq_msg)622{623return cpu_to_be32(be32_to_cpu(dreq_msg->offset8) >> 8);624}625626static inline void cm_dreq_set_remote_qpn(struct cm_dreq_msg *dreq_msg, __be32 qpn)627{628dreq_msg->offset8 = cpu_to_be32((be32_to_cpu(qpn) << 8) |629(be32_to_cpu(dreq_msg->offset8) & 0x000000FF));630}631632struct cm_drep_msg {633struct ib_mad_hdr hdr;634635__be32 local_comm_id;636__be32 remote_comm_id;637638u8 private_data[IB_CM_DREP_PRIVATE_DATA_SIZE];639640} __attribute__ ((packed));641642struct cm_lap_msg {643struct ib_mad_hdr hdr;644645__be32 local_comm_id;646__be32 remote_comm_id;647648__be32 rsvd8;649/* remote QPN/EECN:24, remote CM response timeout:5, rsvd:3 */650__be32 offset12;651__be32 rsvd16;652653__be16 alt_local_lid;654__be16 alt_remote_lid;655union ib_gid alt_local_gid;656union ib_gid alt_remote_gid;657/* flow label:20, rsvd:4, traffic class:8 */658__be32 offset56;659u8 alt_hop_limit;660/* rsvd:2, packet rate:6 */661u8 offset61;662/* SL:4, subnet local:1, rsvd:3 */663u8 offset62;664/* local ACK timeout:5, rsvd:3 */665u8 offset63;666667u8 private_data[IB_CM_LAP_PRIVATE_DATA_SIZE];668} __attribute__ ((packed));669670static inline __be32 cm_lap_get_remote_qpn(struct cm_lap_msg *lap_msg)671{672return cpu_to_be32(be32_to_cpu(lap_msg->offset12) >> 8);673}674675static inline void cm_lap_set_remote_qpn(struct cm_lap_msg *lap_msg, __be32 qpn)676{677lap_msg->offset12 = cpu_to_be32((be32_to_cpu(qpn) << 8) |678(be32_to_cpu(lap_msg->offset12) &6790x000000FF));680}681682static inline u8 cm_lap_get_remote_resp_timeout(struct cm_lap_msg *lap_msg)683{684return (u8) ((be32_to_cpu(lap_msg->offset12) & 0xF8) >> 3);685}686687static inline void cm_lap_set_remote_resp_timeout(struct cm_lap_msg *lap_msg,688u8 resp_timeout)689{690lap_msg->offset12 = cpu_to_be32((resp_timeout << 3) |691(be32_to_cpu(lap_msg->offset12) &6920xFFFFFF07));693}694695static inline __be32 cm_lap_get_flow_label(struct cm_lap_msg *lap_msg)696{697return cpu_to_be32(be32_to_cpu(lap_msg->offset56) >> 12);698}699700static inline void cm_lap_set_flow_label(struct cm_lap_msg *lap_msg,701__be32 flow_label)702{703lap_msg->offset56 = cpu_to_be32(704(be32_to_cpu(lap_msg->offset56) & 0x00000FFF) |705(be32_to_cpu(flow_label) << 12));706}707708static inline u8 cm_lap_get_traffic_class(struct cm_lap_msg *lap_msg)709{710return (u8) be32_to_cpu(lap_msg->offset56);711}712713static inline void cm_lap_set_traffic_class(struct cm_lap_msg *lap_msg,714u8 traffic_class)715{716lap_msg->offset56 = cpu_to_be32(traffic_class |717(be32_to_cpu(lap_msg->offset56) &7180xFFFFFF00));719}720721static inline u8 cm_lap_get_packet_rate(struct cm_lap_msg *lap_msg)722{723return lap_msg->offset61 & 0x3F;724}725726static inline void cm_lap_set_packet_rate(struct cm_lap_msg *lap_msg,727u8 packet_rate)728{729lap_msg->offset61 = (packet_rate & 0x3F) | (lap_msg->offset61 & 0xC0);730}731732static inline u8 cm_lap_get_sl(struct cm_lap_msg *lap_msg)733{734return lap_msg->offset62 >> 4;735}736737static inline void cm_lap_set_sl(struct cm_lap_msg *lap_msg, u8 sl)738{739lap_msg->offset62 = (sl << 4) | (lap_msg->offset62 & 0x0F);740}741742static inline u8 cm_lap_get_subnet_local(struct cm_lap_msg *lap_msg)743{744return (lap_msg->offset62 >> 3) & 0x1;745}746747static inline void cm_lap_set_subnet_local(struct cm_lap_msg *lap_msg,748u8 subnet_local)749{750lap_msg->offset62 = ((subnet_local & 0x1) << 3) |751(lap_msg->offset61 & 0xF7);752}753static inline u8 cm_lap_get_local_ack_timeout(struct cm_lap_msg *lap_msg)754{755return lap_msg->offset63 >> 3;756}757758static inline void cm_lap_set_local_ack_timeout(struct cm_lap_msg *lap_msg,759u8 local_ack_timeout)760{761lap_msg->offset63 = (local_ack_timeout << 3) |762(lap_msg->offset63 & 0x07);763}764765struct cm_apr_msg {766struct ib_mad_hdr hdr;767768__be32 local_comm_id;769__be32 remote_comm_id;770771u8 info_length;772u8 ap_status;773u8 info[IB_CM_APR_INFO_LENGTH];774775u8 private_data[IB_CM_APR_PRIVATE_DATA_SIZE];776} __attribute__ ((packed));777778struct cm_sidr_req_msg {779struct ib_mad_hdr hdr;780781__be32 request_id;782__be16 pkey;783__be16 rsvd;784__be64 service_id;785786u8 private_data[IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE];787} __attribute__ ((packed));788789struct cm_sidr_rep_msg {790struct ib_mad_hdr hdr;791792__be32 request_id;793u8 status;794u8 info_length;795__be16 rsvd;796/* QPN:24, rsvd:8 */797__be32 offset8;798__be64 service_id;799__be32 qkey;800u8 info[IB_CM_SIDR_REP_INFO_LENGTH];801802u8 private_data[IB_CM_SIDR_REP_PRIVATE_DATA_SIZE];803} __attribute__ ((packed));804805static inline __be32 cm_sidr_rep_get_qpn(struct cm_sidr_rep_msg *sidr_rep_msg)806{807return cpu_to_be32(be32_to_cpu(sidr_rep_msg->offset8) >> 8);808}809810static inline void cm_sidr_rep_set_qpn(struct cm_sidr_rep_msg *sidr_rep_msg,811__be32 qpn)812{813sidr_rep_msg->offset8 = cpu_to_be32((be32_to_cpu(qpn) << 8) |814(be32_to_cpu(sidr_rep_msg->offset8) &8150x000000FF));816}817818#endif /* CM_MSGS_H */819820821