162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved. 462306a36Sopenharmony_ci * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#ifndef RXE_HDR_H 862306a36Sopenharmony_ci#define RXE_HDR_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci/* extracted information about a packet carried in an sk_buff struct fits in 1162306a36Sopenharmony_ci * the skbuff cb array. Must be at most 48 bytes. stored in control block of 1262306a36Sopenharmony_ci * sk_buff for received packets. 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_cistruct rxe_pkt_info { 1562306a36Sopenharmony_ci struct rxe_dev *rxe; /* device that owns packet */ 1662306a36Sopenharmony_ci struct rxe_qp *qp; /* qp that owns packet */ 1762306a36Sopenharmony_ci struct rxe_send_wqe *wqe; /* send wqe */ 1862306a36Sopenharmony_ci u8 *hdr; /* points to bth */ 1962306a36Sopenharmony_ci u32 mask; /* useful info about pkt */ 2062306a36Sopenharmony_ci u32 psn; /* bth psn of packet */ 2162306a36Sopenharmony_ci u16 pkey_index; /* partition of pkt */ 2262306a36Sopenharmony_ci u16 paylen; /* length of bth - icrc */ 2362306a36Sopenharmony_ci u8 port_num; /* port pkt received on */ 2462306a36Sopenharmony_ci u8 opcode; /* bth opcode of packet */ 2562306a36Sopenharmony_ci}; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* Macros should be used only for received skb */ 2862306a36Sopenharmony_cistatic inline struct rxe_pkt_info *SKB_TO_PKT(struct sk_buff *skb) 2962306a36Sopenharmony_ci{ 3062306a36Sopenharmony_ci BUILD_BUG_ON(sizeof(struct rxe_pkt_info) > sizeof(skb->cb)); 3162306a36Sopenharmony_ci return (void *)skb->cb; 3262306a36Sopenharmony_ci} 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistatic inline struct sk_buff *PKT_TO_SKB(struct rxe_pkt_info *pkt) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci return container_of((void *)pkt, struct sk_buff, cb); 3762306a36Sopenharmony_ci} 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* 4062306a36Sopenharmony_ci * IBA header types and methods 4162306a36Sopenharmony_ci * 4262306a36Sopenharmony_ci * Some of these are for reference and completeness only since 4362306a36Sopenharmony_ci * rxe does not currently support RD transport 4462306a36Sopenharmony_ci * most of this could be moved into IB core. ib_pack.h has 4562306a36Sopenharmony_ci * part of this but is incomplete 4662306a36Sopenharmony_ci * 4762306a36Sopenharmony_ci * Header specific routines to insert/extract values to/from headers 4862306a36Sopenharmony_ci * the routines that are named __hhh_(set_)fff() take a pointer to a 4962306a36Sopenharmony_ci * hhh header and get(set) the fff field. The routines named 5062306a36Sopenharmony_ci * hhh_(set_)fff take a packet info struct and find the 5162306a36Sopenharmony_ci * header and field based on the opcode in the packet. 5262306a36Sopenharmony_ci * Conversion to/from network byte order from cpu order is also done. 5362306a36Sopenharmony_ci */ 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci#define RXE_ICRC_SIZE (4) 5662306a36Sopenharmony_ci#define RXE_MAX_HDR_LENGTH (80) 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/****************************************************************************** 5962306a36Sopenharmony_ci * Base Transport Header 6062306a36Sopenharmony_ci ******************************************************************************/ 6162306a36Sopenharmony_cistruct rxe_bth { 6262306a36Sopenharmony_ci u8 opcode; 6362306a36Sopenharmony_ci u8 flags; 6462306a36Sopenharmony_ci __be16 pkey; 6562306a36Sopenharmony_ci __be32 qpn; 6662306a36Sopenharmony_ci __be32 apsn; 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#define BTH_TVER (0) 7062306a36Sopenharmony_ci#define BTH_DEF_PKEY (0xffff) 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define BTH_SE_MASK (0x80) 7362306a36Sopenharmony_ci#define BTH_MIG_MASK (0x40) 7462306a36Sopenharmony_ci#define BTH_PAD_MASK (0x30) 7562306a36Sopenharmony_ci#define BTH_TVER_MASK (0x0f) 7662306a36Sopenharmony_ci#define BTH_FECN_MASK (0x80000000) 7762306a36Sopenharmony_ci#define BTH_BECN_MASK (0x40000000) 7862306a36Sopenharmony_ci#define BTH_RESV6A_MASK (0x3f000000) 7962306a36Sopenharmony_ci#define BTH_QPN_MASK (0x00ffffff) 8062306a36Sopenharmony_ci#define BTH_ACK_MASK (0x80000000) 8162306a36Sopenharmony_ci#define BTH_RESV7_MASK (0x7f000000) 8262306a36Sopenharmony_ci#define BTH_PSN_MASK (0x00ffffff) 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cistatic inline u8 __bth_opcode(void *arg) 8562306a36Sopenharmony_ci{ 8662306a36Sopenharmony_ci struct rxe_bth *bth = arg; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci return bth->opcode; 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistatic inline void __bth_set_opcode(void *arg, u8 opcode) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci struct rxe_bth *bth = arg; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci bth->opcode = opcode; 9662306a36Sopenharmony_ci} 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_cistatic inline u8 __bth_se(void *arg) 9962306a36Sopenharmony_ci{ 10062306a36Sopenharmony_ci struct rxe_bth *bth = arg; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci return 0 != (BTH_SE_MASK & bth->flags); 10362306a36Sopenharmony_ci} 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cistatic inline void __bth_set_se(void *arg, int se) 10662306a36Sopenharmony_ci{ 10762306a36Sopenharmony_ci struct rxe_bth *bth = arg; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci if (se) 11062306a36Sopenharmony_ci bth->flags |= BTH_SE_MASK; 11162306a36Sopenharmony_ci else 11262306a36Sopenharmony_ci bth->flags &= ~BTH_SE_MASK; 11362306a36Sopenharmony_ci} 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_cistatic inline u8 __bth_mig(void *arg) 11662306a36Sopenharmony_ci{ 11762306a36Sopenharmony_ci struct rxe_bth *bth = arg; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci return 0 != (BTH_MIG_MASK & bth->flags); 12062306a36Sopenharmony_ci} 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cistatic inline void __bth_set_mig(void *arg, u8 mig) 12362306a36Sopenharmony_ci{ 12462306a36Sopenharmony_ci struct rxe_bth *bth = arg; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci if (mig) 12762306a36Sopenharmony_ci bth->flags |= BTH_MIG_MASK; 12862306a36Sopenharmony_ci else 12962306a36Sopenharmony_ci bth->flags &= ~BTH_MIG_MASK; 13062306a36Sopenharmony_ci} 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistatic inline u8 __bth_pad(void *arg) 13362306a36Sopenharmony_ci{ 13462306a36Sopenharmony_ci struct rxe_bth *bth = arg; 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci return (BTH_PAD_MASK & bth->flags) >> 4; 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistatic inline void __bth_set_pad(void *arg, u8 pad) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci struct rxe_bth *bth = arg; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci bth->flags = (BTH_PAD_MASK & (pad << 4)) | 14462306a36Sopenharmony_ci (~BTH_PAD_MASK & bth->flags); 14562306a36Sopenharmony_ci} 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_cistatic inline u8 __bth_tver(void *arg) 14862306a36Sopenharmony_ci{ 14962306a36Sopenharmony_ci struct rxe_bth *bth = arg; 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci return BTH_TVER_MASK & bth->flags; 15262306a36Sopenharmony_ci} 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistatic inline void __bth_set_tver(void *arg, u8 tver) 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci struct rxe_bth *bth = arg; 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci bth->flags = (BTH_TVER_MASK & tver) | 15962306a36Sopenharmony_ci (~BTH_TVER_MASK & bth->flags); 16062306a36Sopenharmony_ci} 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_cistatic inline u16 __bth_pkey(void *arg) 16362306a36Sopenharmony_ci{ 16462306a36Sopenharmony_ci struct rxe_bth *bth = arg; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci return be16_to_cpu(bth->pkey); 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic inline void __bth_set_pkey(void *arg, u16 pkey) 17062306a36Sopenharmony_ci{ 17162306a36Sopenharmony_ci struct rxe_bth *bth = arg; 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci bth->pkey = cpu_to_be16(pkey); 17462306a36Sopenharmony_ci} 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistatic inline u32 __bth_qpn(void *arg) 17762306a36Sopenharmony_ci{ 17862306a36Sopenharmony_ci struct rxe_bth *bth = arg; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci return BTH_QPN_MASK & be32_to_cpu(bth->qpn); 18162306a36Sopenharmony_ci} 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_cistatic inline void __bth_set_qpn(void *arg, u32 qpn) 18462306a36Sopenharmony_ci{ 18562306a36Sopenharmony_ci struct rxe_bth *bth = arg; 18662306a36Sopenharmony_ci u32 resvqpn = be32_to_cpu(bth->qpn); 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci bth->qpn = cpu_to_be32((BTH_QPN_MASK & qpn) | 18962306a36Sopenharmony_ci (~BTH_QPN_MASK & resvqpn)); 19062306a36Sopenharmony_ci} 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_cistatic inline int __bth_fecn(void *arg) 19362306a36Sopenharmony_ci{ 19462306a36Sopenharmony_ci struct rxe_bth *bth = arg; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci return 0 != (cpu_to_be32(BTH_FECN_MASK) & bth->qpn); 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistatic inline void __bth_set_fecn(void *arg, int fecn) 20062306a36Sopenharmony_ci{ 20162306a36Sopenharmony_ci struct rxe_bth *bth = arg; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci if (fecn) 20462306a36Sopenharmony_ci bth->qpn |= cpu_to_be32(BTH_FECN_MASK); 20562306a36Sopenharmony_ci else 20662306a36Sopenharmony_ci bth->qpn &= ~cpu_to_be32(BTH_FECN_MASK); 20762306a36Sopenharmony_ci} 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_cistatic inline int __bth_becn(void *arg) 21062306a36Sopenharmony_ci{ 21162306a36Sopenharmony_ci struct rxe_bth *bth = arg; 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci return 0 != (cpu_to_be32(BTH_BECN_MASK) & bth->qpn); 21462306a36Sopenharmony_ci} 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistatic inline void __bth_set_becn(void *arg, int becn) 21762306a36Sopenharmony_ci{ 21862306a36Sopenharmony_ci struct rxe_bth *bth = arg; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci if (becn) 22162306a36Sopenharmony_ci bth->qpn |= cpu_to_be32(BTH_BECN_MASK); 22262306a36Sopenharmony_ci else 22362306a36Sopenharmony_ci bth->qpn &= ~cpu_to_be32(BTH_BECN_MASK); 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_cistatic inline u8 __bth_resv6a(void *arg) 22762306a36Sopenharmony_ci{ 22862306a36Sopenharmony_ci struct rxe_bth *bth = arg; 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_ci return (BTH_RESV6A_MASK & be32_to_cpu(bth->qpn)) >> 24; 23162306a36Sopenharmony_ci} 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistatic inline void __bth_set_resv6a(void *arg) 23462306a36Sopenharmony_ci{ 23562306a36Sopenharmony_ci struct rxe_bth *bth = arg; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci bth->qpn = cpu_to_be32(~BTH_RESV6A_MASK); 23862306a36Sopenharmony_ci} 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_cistatic inline int __bth_ack(void *arg) 24162306a36Sopenharmony_ci{ 24262306a36Sopenharmony_ci struct rxe_bth *bth = arg; 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci return 0 != (cpu_to_be32(BTH_ACK_MASK) & bth->apsn); 24562306a36Sopenharmony_ci} 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_cistatic inline void __bth_set_ack(void *arg, int ack) 24862306a36Sopenharmony_ci{ 24962306a36Sopenharmony_ci struct rxe_bth *bth = arg; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci if (ack) 25262306a36Sopenharmony_ci bth->apsn |= cpu_to_be32(BTH_ACK_MASK); 25362306a36Sopenharmony_ci else 25462306a36Sopenharmony_ci bth->apsn &= ~cpu_to_be32(BTH_ACK_MASK); 25562306a36Sopenharmony_ci} 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_cistatic inline void __bth_set_resv7(void *arg) 25862306a36Sopenharmony_ci{ 25962306a36Sopenharmony_ci struct rxe_bth *bth = arg; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci bth->apsn &= ~cpu_to_be32(BTH_RESV7_MASK); 26262306a36Sopenharmony_ci} 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_cistatic inline u32 __bth_psn(void *arg) 26562306a36Sopenharmony_ci{ 26662306a36Sopenharmony_ci struct rxe_bth *bth = arg; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci return BTH_PSN_MASK & be32_to_cpu(bth->apsn); 26962306a36Sopenharmony_ci} 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_cistatic inline void __bth_set_psn(void *arg, u32 psn) 27262306a36Sopenharmony_ci{ 27362306a36Sopenharmony_ci struct rxe_bth *bth = arg; 27462306a36Sopenharmony_ci u32 apsn = be32_to_cpu(bth->apsn); 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci bth->apsn = cpu_to_be32((BTH_PSN_MASK & psn) | 27762306a36Sopenharmony_ci (~BTH_PSN_MASK & apsn)); 27862306a36Sopenharmony_ci} 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_cistatic inline u8 bth_opcode(struct rxe_pkt_info *pkt) 28162306a36Sopenharmony_ci{ 28262306a36Sopenharmony_ci return __bth_opcode(pkt->hdr); 28362306a36Sopenharmony_ci} 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_cistatic inline void bth_set_opcode(struct rxe_pkt_info *pkt, u8 opcode) 28662306a36Sopenharmony_ci{ 28762306a36Sopenharmony_ci __bth_set_opcode(pkt->hdr, opcode); 28862306a36Sopenharmony_ci} 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_cistatic inline u8 bth_se(struct rxe_pkt_info *pkt) 29162306a36Sopenharmony_ci{ 29262306a36Sopenharmony_ci return __bth_se(pkt->hdr); 29362306a36Sopenharmony_ci} 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_cistatic inline void bth_set_se(struct rxe_pkt_info *pkt, int se) 29662306a36Sopenharmony_ci{ 29762306a36Sopenharmony_ci __bth_set_se(pkt->hdr, se); 29862306a36Sopenharmony_ci} 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_cistatic inline u8 bth_mig(struct rxe_pkt_info *pkt) 30162306a36Sopenharmony_ci{ 30262306a36Sopenharmony_ci return __bth_mig(pkt->hdr); 30362306a36Sopenharmony_ci} 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_cistatic inline void bth_set_mig(struct rxe_pkt_info *pkt, u8 mig) 30662306a36Sopenharmony_ci{ 30762306a36Sopenharmony_ci __bth_set_mig(pkt->hdr, mig); 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistatic inline u8 bth_pad(struct rxe_pkt_info *pkt) 31162306a36Sopenharmony_ci{ 31262306a36Sopenharmony_ci return __bth_pad(pkt->hdr); 31362306a36Sopenharmony_ci} 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_cistatic inline void bth_set_pad(struct rxe_pkt_info *pkt, u8 pad) 31662306a36Sopenharmony_ci{ 31762306a36Sopenharmony_ci __bth_set_pad(pkt->hdr, pad); 31862306a36Sopenharmony_ci} 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_cistatic inline u8 bth_tver(struct rxe_pkt_info *pkt) 32162306a36Sopenharmony_ci{ 32262306a36Sopenharmony_ci return __bth_tver(pkt->hdr); 32362306a36Sopenharmony_ci} 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_cistatic inline void bth_set_tver(struct rxe_pkt_info *pkt, u8 tver) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci __bth_set_tver(pkt->hdr, tver); 32862306a36Sopenharmony_ci} 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_cistatic inline u16 bth_pkey(struct rxe_pkt_info *pkt) 33162306a36Sopenharmony_ci{ 33262306a36Sopenharmony_ci return __bth_pkey(pkt->hdr); 33362306a36Sopenharmony_ci} 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_cistatic inline void bth_set_pkey(struct rxe_pkt_info *pkt, u16 pkey) 33662306a36Sopenharmony_ci{ 33762306a36Sopenharmony_ci __bth_set_pkey(pkt->hdr, pkey); 33862306a36Sopenharmony_ci} 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_cistatic inline u32 bth_qpn(struct rxe_pkt_info *pkt) 34162306a36Sopenharmony_ci{ 34262306a36Sopenharmony_ci return __bth_qpn(pkt->hdr); 34362306a36Sopenharmony_ci} 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_cistatic inline void bth_set_qpn(struct rxe_pkt_info *pkt, u32 qpn) 34662306a36Sopenharmony_ci{ 34762306a36Sopenharmony_ci __bth_set_qpn(pkt->hdr, qpn); 34862306a36Sopenharmony_ci} 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_cistatic inline int bth_fecn(struct rxe_pkt_info *pkt) 35162306a36Sopenharmony_ci{ 35262306a36Sopenharmony_ci return __bth_fecn(pkt->hdr); 35362306a36Sopenharmony_ci} 35462306a36Sopenharmony_ci 35562306a36Sopenharmony_cistatic inline void bth_set_fecn(struct rxe_pkt_info *pkt, int fecn) 35662306a36Sopenharmony_ci{ 35762306a36Sopenharmony_ci __bth_set_fecn(pkt->hdr, fecn); 35862306a36Sopenharmony_ci} 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_cistatic inline int bth_becn(struct rxe_pkt_info *pkt) 36162306a36Sopenharmony_ci{ 36262306a36Sopenharmony_ci return __bth_becn(pkt->hdr); 36362306a36Sopenharmony_ci} 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistatic inline void bth_set_becn(struct rxe_pkt_info *pkt, int becn) 36662306a36Sopenharmony_ci{ 36762306a36Sopenharmony_ci __bth_set_becn(pkt->hdr, becn); 36862306a36Sopenharmony_ci} 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_cistatic inline u8 bth_resv6a(struct rxe_pkt_info *pkt) 37162306a36Sopenharmony_ci{ 37262306a36Sopenharmony_ci return __bth_resv6a(pkt->hdr); 37362306a36Sopenharmony_ci} 37462306a36Sopenharmony_ci 37562306a36Sopenharmony_cistatic inline void bth_set_resv6a(struct rxe_pkt_info *pkt) 37662306a36Sopenharmony_ci{ 37762306a36Sopenharmony_ci __bth_set_resv6a(pkt->hdr); 37862306a36Sopenharmony_ci} 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_cistatic inline int bth_ack(struct rxe_pkt_info *pkt) 38162306a36Sopenharmony_ci{ 38262306a36Sopenharmony_ci return __bth_ack(pkt->hdr); 38362306a36Sopenharmony_ci} 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_cistatic inline void bth_set_ack(struct rxe_pkt_info *pkt, int ack) 38662306a36Sopenharmony_ci{ 38762306a36Sopenharmony_ci __bth_set_ack(pkt->hdr, ack); 38862306a36Sopenharmony_ci} 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_cistatic inline void bth_set_resv7(struct rxe_pkt_info *pkt) 39162306a36Sopenharmony_ci{ 39262306a36Sopenharmony_ci __bth_set_resv7(pkt->hdr); 39362306a36Sopenharmony_ci} 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistatic inline u32 bth_psn(struct rxe_pkt_info *pkt) 39662306a36Sopenharmony_ci{ 39762306a36Sopenharmony_ci return __bth_psn(pkt->hdr); 39862306a36Sopenharmony_ci} 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_cistatic inline void bth_set_psn(struct rxe_pkt_info *pkt, u32 psn) 40162306a36Sopenharmony_ci{ 40262306a36Sopenharmony_ci __bth_set_psn(pkt->hdr, psn); 40362306a36Sopenharmony_ci} 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_cistatic inline void bth_init(struct rxe_pkt_info *pkt, u8 opcode, int se, 40662306a36Sopenharmony_ci int mig, int pad, u16 pkey, u32 qpn, int ack_req, 40762306a36Sopenharmony_ci u32 psn) 40862306a36Sopenharmony_ci{ 40962306a36Sopenharmony_ci struct rxe_bth *bth = (struct rxe_bth *)(pkt->hdr); 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci bth->opcode = opcode; 41262306a36Sopenharmony_ci bth->flags = (pad << 4) & BTH_PAD_MASK; 41362306a36Sopenharmony_ci if (se) 41462306a36Sopenharmony_ci bth->flags |= BTH_SE_MASK; 41562306a36Sopenharmony_ci if (mig) 41662306a36Sopenharmony_ci bth->flags |= BTH_MIG_MASK; 41762306a36Sopenharmony_ci bth->pkey = cpu_to_be16(pkey); 41862306a36Sopenharmony_ci bth->qpn = cpu_to_be32(qpn & BTH_QPN_MASK); 41962306a36Sopenharmony_ci psn &= BTH_PSN_MASK; 42062306a36Sopenharmony_ci if (ack_req) 42162306a36Sopenharmony_ci psn |= BTH_ACK_MASK; 42262306a36Sopenharmony_ci bth->apsn = cpu_to_be32(psn); 42362306a36Sopenharmony_ci} 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci/****************************************************************************** 42662306a36Sopenharmony_ci * Reliable Datagram Extended Transport Header 42762306a36Sopenharmony_ci ******************************************************************************/ 42862306a36Sopenharmony_cistruct rxe_rdeth { 42962306a36Sopenharmony_ci __be32 een; 43062306a36Sopenharmony_ci}; 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci#define RDETH_EEN_MASK (0x00ffffff) 43362306a36Sopenharmony_ci 43462306a36Sopenharmony_cistatic inline u8 __rdeth_een(void *arg) 43562306a36Sopenharmony_ci{ 43662306a36Sopenharmony_ci struct rxe_rdeth *rdeth = arg; 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci return RDETH_EEN_MASK & be32_to_cpu(rdeth->een); 43962306a36Sopenharmony_ci} 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_cistatic inline void __rdeth_set_een(void *arg, u32 een) 44262306a36Sopenharmony_ci{ 44362306a36Sopenharmony_ci struct rxe_rdeth *rdeth = arg; 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci rdeth->een = cpu_to_be32(RDETH_EEN_MASK & een); 44662306a36Sopenharmony_ci} 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_cistatic inline u8 rdeth_een(struct rxe_pkt_info *pkt) 44962306a36Sopenharmony_ci{ 45062306a36Sopenharmony_ci return __rdeth_een(pkt->hdr + 45162306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_RDETH]); 45262306a36Sopenharmony_ci} 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_cistatic inline void rdeth_set_een(struct rxe_pkt_info *pkt, u32 een) 45562306a36Sopenharmony_ci{ 45662306a36Sopenharmony_ci __rdeth_set_een(pkt->hdr + 45762306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_RDETH], een); 45862306a36Sopenharmony_ci} 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci/****************************************************************************** 46162306a36Sopenharmony_ci * Datagram Extended Transport Header 46262306a36Sopenharmony_ci ******************************************************************************/ 46362306a36Sopenharmony_cistruct rxe_deth { 46462306a36Sopenharmony_ci __be32 qkey; 46562306a36Sopenharmony_ci __be32 sqp; 46662306a36Sopenharmony_ci}; 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci#define GSI_QKEY (0x80010000) 46962306a36Sopenharmony_ci#define DETH_SQP_MASK (0x00ffffff) 47062306a36Sopenharmony_ci 47162306a36Sopenharmony_cistatic inline u32 __deth_qkey(void *arg) 47262306a36Sopenharmony_ci{ 47362306a36Sopenharmony_ci struct rxe_deth *deth = arg; 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci return be32_to_cpu(deth->qkey); 47662306a36Sopenharmony_ci} 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_cistatic inline void __deth_set_qkey(void *arg, u32 qkey) 47962306a36Sopenharmony_ci{ 48062306a36Sopenharmony_ci struct rxe_deth *deth = arg; 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci deth->qkey = cpu_to_be32(qkey); 48362306a36Sopenharmony_ci} 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_cistatic inline u32 __deth_sqp(void *arg) 48662306a36Sopenharmony_ci{ 48762306a36Sopenharmony_ci struct rxe_deth *deth = arg; 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci return DETH_SQP_MASK & be32_to_cpu(deth->sqp); 49062306a36Sopenharmony_ci} 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_cistatic inline void __deth_set_sqp(void *arg, u32 sqp) 49362306a36Sopenharmony_ci{ 49462306a36Sopenharmony_ci struct rxe_deth *deth = arg; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci deth->sqp = cpu_to_be32(DETH_SQP_MASK & sqp); 49762306a36Sopenharmony_ci} 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_cistatic inline u32 deth_qkey(struct rxe_pkt_info *pkt) 50062306a36Sopenharmony_ci{ 50162306a36Sopenharmony_ci return __deth_qkey(pkt->hdr + 50262306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_DETH]); 50362306a36Sopenharmony_ci} 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_cistatic inline void deth_set_qkey(struct rxe_pkt_info *pkt, u32 qkey) 50662306a36Sopenharmony_ci{ 50762306a36Sopenharmony_ci __deth_set_qkey(pkt->hdr + 50862306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_DETH], qkey); 50962306a36Sopenharmony_ci} 51062306a36Sopenharmony_ci 51162306a36Sopenharmony_cistatic inline u32 deth_sqp(struct rxe_pkt_info *pkt) 51262306a36Sopenharmony_ci{ 51362306a36Sopenharmony_ci return __deth_sqp(pkt->hdr + 51462306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_DETH]); 51562306a36Sopenharmony_ci} 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_cistatic inline void deth_set_sqp(struct rxe_pkt_info *pkt, u32 sqp) 51862306a36Sopenharmony_ci{ 51962306a36Sopenharmony_ci __deth_set_sqp(pkt->hdr + 52062306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_DETH], sqp); 52162306a36Sopenharmony_ci} 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci/****************************************************************************** 52462306a36Sopenharmony_ci * RDMA Extended Transport Header 52562306a36Sopenharmony_ci ******************************************************************************/ 52662306a36Sopenharmony_cistruct rxe_reth { 52762306a36Sopenharmony_ci __be64 va; 52862306a36Sopenharmony_ci __be32 rkey; 52962306a36Sopenharmony_ci __be32 len; 53062306a36Sopenharmony_ci}; 53162306a36Sopenharmony_ci 53262306a36Sopenharmony_cistatic inline u64 __reth_va(void *arg) 53362306a36Sopenharmony_ci{ 53462306a36Sopenharmony_ci struct rxe_reth *reth = arg; 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ci return be64_to_cpu(reth->va); 53762306a36Sopenharmony_ci} 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_cistatic inline void __reth_set_va(void *arg, u64 va) 54062306a36Sopenharmony_ci{ 54162306a36Sopenharmony_ci struct rxe_reth *reth = arg; 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci reth->va = cpu_to_be64(va); 54462306a36Sopenharmony_ci} 54562306a36Sopenharmony_ci 54662306a36Sopenharmony_cistatic inline u32 __reth_rkey(void *arg) 54762306a36Sopenharmony_ci{ 54862306a36Sopenharmony_ci struct rxe_reth *reth = arg; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci return be32_to_cpu(reth->rkey); 55162306a36Sopenharmony_ci} 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_cistatic inline void __reth_set_rkey(void *arg, u32 rkey) 55462306a36Sopenharmony_ci{ 55562306a36Sopenharmony_ci struct rxe_reth *reth = arg; 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci reth->rkey = cpu_to_be32(rkey); 55862306a36Sopenharmony_ci} 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_cistatic inline u32 __reth_len(void *arg) 56162306a36Sopenharmony_ci{ 56262306a36Sopenharmony_ci struct rxe_reth *reth = arg; 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci return be32_to_cpu(reth->len); 56562306a36Sopenharmony_ci} 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_cistatic inline void __reth_set_len(void *arg, u32 len) 56862306a36Sopenharmony_ci{ 56962306a36Sopenharmony_ci struct rxe_reth *reth = arg; 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci reth->len = cpu_to_be32(len); 57262306a36Sopenharmony_ci} 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_cistatic inline u64 reth_va(struct rxe_pkt_info *pkt) 57562306a36Sopenharmony_ci{ 57662306a36Sopenharmony_ci return __reth_va(pkt->hdr + 57762306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_RETH]); 57862306a36Sopenharmony_ci} 57962306a36Sopenharmony_ci 58062306a36Sopenharmony_cistatic inline void reth_set_va(struct rxe_pkt_info *pkt, u64 va) 58162306a36Sopenharmony_ci{ 58262306a36Sopenharmony_ci __reth_set_va(pkt->hdr + 58362306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_RETH], va); 58462306a36Sopenharmony_ci} 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_cistatic inline u32 reth_rkey(struct rxe_pkt_info *pkt) 58762306a36Sopenharmony_ci{ 58862306a36Sopenharmony_ci return __reth_rkey(pkt->hdr + 58962306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_RETH]); 59062306a36Sopenharmony_ci} 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_cistatic inline void reth_set_rkey(struct rxe_pkt_info *pkt, u32 rkey) 59362306a36Sopenharmony_ci{ 59462306a36Sopenharmony_ci __reth_set_rkey(pkt->hdr + 59562306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_RETH], rkey); 59662306a36Sopenharmony_ci} 59762306a36Sopenharmony_ci 59862306a36Sopenharmony_cistatic inline u32 reth_len(struct rxe_pkt_info *pkt) 59962306a36Sopenharmony_ci{ 60062306a36Sopenharmony_ci return __reth_len(pkt->hdr + 60162306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_RETH]); 60262306a36Sopenharmony_ci} 60362306a36Sopenharmony_ci 60462306a36Sopenharmony_cistatic inline void reth_set_len(struct rxe_pkt_info *pkt, u32 len) 60562306a36Sopenharmony_ci{ 60662306a36Sopenharmony_ci __reth_set_len(pkt->hdr + 60762306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_RETH], len); 60862306a36Sopenharmony_ci} 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_ci/****************************************************************************** 61162306a36Sopenharmony_ci * FLUSH Extended Transport Header 61262306a36Sopenharmony_ci ******************************************************************************/ 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_cistruct rxe_feth { 61562306a36Sopenharmony_ci __be32 bits; 61662306a36Sopenharmony_ci}; 61762306a36Sopenharmony_ci 61862306a36Sopenharmony_ci#define FETH_PLT_MASK (0x0000000f) /* bits 3-0 */ 61962306a36Sopenharmony_ci#define FETH_SEL_MASK (0x00000030) /* bits 5-4 */ 62062306a36Sopenharmony_ci#define FETH_SEL_SHIFT (4U) 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_cistatic inline u32 __feth_plt(void *arg) 62362306a36Sopenharmony_ci{ 62462306a36Sopenharmony_ci struct rxe_feth *feth = arg; 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_ci return be32_to_cpu(feth->bits) & FETH_PLT_MASK; 62762306a36Sopenharmony_ci} 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_cistatic inline u32 __feth_sel(void *arg) 63062306a36Sopenharmony_ci{ 63162306a36Sopenharmony_ci struct rxe_feth *feth = arg; 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci return (be32_to_cpu(feth->bits) & FETH_SEL_MASK) >> FETH_SEL_SHIFT; 63462306a36Sopenharmony_ci} 63562306a36Sopenharmony_ci 63662306a36Sopenharmony_cistatic inline u32 feth_plt(struct rxe_pkt_info *pkt) 63762306a36Sopenharmony_ci{ 63862306a36Sopenharmony_ci return __feth_plt(pkt->hdr + rxe_opcode[pkt->opcode].offset[RXE_FETH]); 63962306a36Sopenharmony_ci} 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_cistatic inline u32 feth_sel(struct rxe_pkt_info *pkt) 64262306a36Sopenharmony_ci{ 64362306a36Sopenharmony_ci return __feth_sel(pkt->hdr + rxe_opcode[pkt->opcode].offset[RXE_FETH]); 64462306a36Sopenharmony_ci} 64562306a36Sopenharmony_ci 64662306a36Sopenharmony_cistatic inline void feth_init(struct rxe_pkt_info *pkt, u8 type, u8 level) 64762306a36Sopenharmony_ci{ 64862306a36Sopenharmony_ci struct rxe_feth *feth = (struct rxe_feth *) 64962306a36Sopenharmony_ci (pkt->hdr + rxe_opcode[pkt->opcode].offset[RXE_FETH]); 65062306a36Sopenharmony_ci u32 bits = ((level << FETH_SEL_SHIFT) & FETH_SEL_MASK) | 65162306a36Sopenharmony_ci (type & FETH_PLT_MASK); 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci feth->bits = cpu_to_be32(bits); 65462306a36Sopenharmony_ci} 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci/****************************************************************************** 65762306a36Sopenharmony_ci * Atomic Extended Transport Header 65862306a36Sopenharmony_ci ******************************************************************************/ 65962306a36Sopenharmony_cistruct rxe_atmeth { 66062306a36Sopenharmony_ci __be64 va; 66162306a36Sopenharmony_ci __be32 rkey; 66262306a36Sopenharmony_ci __be64 swap_add; 66362306a36Sopenharmony_ci __be64 comp; 66462306a36Sopenharmony_ci} __packed; 66562306a36Sopenharmony_ci 66662306a36Sopenharmony_cistatic inline u64 __atmeth_va(void *arg) 66762306a36Sopenharmony_ci{ 66862306a36Sopenharmony_ci struct rxe_atmeth *atmeth = arg; 66962306a36Sopenharmony_ci 67062306a36Sopenharmony_ci return be64_to_cpu(atmeth->va); 67162306a36Sopenharmony_ci} 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_cistatic inline void __atmeth_set_va(void *arg, u64 va) 67462306a36Sopenharmony_ci{ 67562306a36Sopenharmony_ci struct rxe_atmeth *atmeth = arg; 67662306a36Sopenharmony_ci 67762306a36Sopenharmony_ci atmeth->va = cpu_to_be64(va); 67862306a36Sopenharmony_ci} 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_cistatic inline u32 __atmeth_rkey(void *arg) 68162306a36Sopenharmony_ci{ 68262306a36Sopenharmony_ci struct rxe_atmeth *atmeth = arg; 68362306a36Sopenharmony_ci 68462306a36Sopenharmony_ci return be32_to_cpu(atmeth->rkey); 68562306a36Sopenharmony_ci} 68662306a36Sopenharmony_ci 68762306a36Sopenharmony_cistatic inline void __atmeth_set_rkey(void *arg, u32 rkey) 68862306a36Sopenharmony_ci{ 68962306a36Sopenharmony_ci struct rxe_atmeth *atmeth = arg; 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_ci atmeth->rkey = cpu_to_be32(rkey); 69262306a36Sopenharmony_ci} 69362306a36Sopenharmony_ci 69462306a36Sopenharmony_cistatic inline u64 __atmeth_swap_add(void *arg) 69562306a36Sopenharmony_ci{ 69662306a36Sopenharmony_ci struct rxe_atmeth *atmeth = arg; 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_ci return be64_to_cpu(atmeth->swap_add); 69962306a36Sopenharmony_ci} 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_cistatic inline void __atmeth_set_swap_add(void *arg, u64 swap_add) 70262306a36Sopenharmony_ci{ 70362306a36Sopenharmony_ci struct rxe_atmeth *atmeth = arg; 70462306a36Sopenharmony_ci 70562306a36Sopenharmony_ci atmeth->swap_add = cpu_to_be64(swap_add); 70662306a36Sopenharmony_ci} 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_cistatic inline u64 __atmeth_comp(void *arg) 70962306a36Sopenharmony_ci{ 71062306a36Sopenharmony_ci struct rxe_atmeth *atmeth = arg; 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_ci return be64_to_cpu(atmeth->comp); 71362306a36Sopenharmony_ci} 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_cistatic inline void __atmeth_set_comp(void *arg, u64 comp) 71662306a36Sopenharmony_ci{ 71762306a36Sopenharmony_ci struct rxe_atmeth *atmeth = arg; 71862306a36Sopenharmony_ci 71962306a36Sopenharmony_ci atmeth->comp = cpu_to_be64(comp); 72062306a36Sopenharmony_ci} 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_cistatic inline u64 atmeth_va(struct rxe_pkt_info *pkt) 72362306a36Sopenharmony_ci{ 72462306a36Sopenharmony_ci return __atmeth_va(pkt->hdr + 72562306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_ATMETH]); 72662306a36Sopenharmony_ci} 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_cistatic inline void atmeth_set_va(struct rxe_pkt_info *pkt, u64 va) 72962306a36Sopenharmony_ci{ 73062306a36Sopenharmony_ci __atmeth_set_va(pkt->hdr + 73162306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_ATMETH], va); 73262306a36Sopenharmony_ci} 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_cistatic inline u32 atmeth_rkey(struct rxe_pkt_info *pkt) 73562306a36Sopenharmony_ci{ 73662306a36Sopenharmony_ci return __atmeth_rkey(pkt->hdr + 73762306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_ATMETH]); 73862306a36Sopenharmony_ci} 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_cistatic inline void atmeth_set_rkey(struct rxe_pkt_info *pkt, u32 rkey) 74162306a36Sopenharmony_ci{ 74262306a36Sopenharmony_ci __atmeth_set_rkey(pkt->hdr + 74362306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_ATMETH], rkey); 74462306a36Sopenharmony_ci} 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_cistatic inline u64 atmeth_swap_add(struct rxe_pkt_info *pkt) 74762306a36Sopenharmony_ci{ 74862306a36Sopenharmony_ci return __atmeth_swap_add(pkt->hdr + 74962306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_ATMETH]); 75062306a36Sopenharmony_ci} 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_cistatic inline void atmeth_set_swap_add(struct rxe_pkt_info *pkt, u64 swap_add) 75362306a36Sopenharmony_ci{ 75462306a36Sopenharmony_ci __atmeth_set_swap_add(pkt->hdr + 75562306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_ATMETH], swap_add); 75662306a36Sopenharmony_ci} 75762306a36Sopenharmony_ci 75862306a36Sopenharmony_cistatic inline u64 atmeth_comp(struct rxe_pkt_info *pkt) 75962306a36Sopenharmony_ci{ 76062306a36Sopenharmony_ci return __atmeth_comp(pkt->hdr + 76162306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_ATMETH]); 76262306a36Sopenharmony_ci} 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_cistatic inline void atmeth_set_comp(struct rxe_pkt_info *pkt, u64 comp) 76562306a36Sopenharmony_ci{ 76662306a36Sopenharmony_ci __atmeth_set_comp(pkt->hdr + 76762306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_ATMETH], comp); 76862306a36Sopenharmony_ci} 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci/****************************************************************************** 77162306a36Sopenharmony_ci * Ack Extended Transport Header 77262306a36Sopenharmony_ci ******************************************************************************/ 77362306a36Sopenharmony_cistruct rxe_aeth { 77462306a36Sopenharmony_ci __be32 smsn; 77562306a36Sopenharmony_ci}; 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_ci#define AETH_SYN_MASK (0xff000000) 77862306a36Sopenharmony_ci#define AETH_MSN_MASK (0x00ffffff) 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_cienum aeth_syndrome { 78162306a36Sopenharmony_ci AETH_TYPE_MASK = 0xe0, 78262306a36Sopenharmony_ci AETH_ACK = 0x00, 78362306a36Sopenharmony_ci AETH_RNR_NAK = 0x20, 78462306a36Sopenharmony_ci AETH_RSVD = 0x40, 78562306a36Sopenharmony_ci AETH_NAK = 0x60, 78662306a36Sopenharmony_ci AETH_ACK_UNLIMITED = 0x1f, 78762306a36Sopenharmony_ci AETH_NAK_PSN_SEQ_ERROR = 0x60, 78862306a36Sopenharmony_ci AETH_NAK_INVALID_REQ = 0x61, 78962306a36Sopenharmony_ci AETH_NAK_REM_ACC_ERR = 0x62, 79062306a36Sopenharmony_ci AETH_NAK_REM_OP_ERR = 0x63, 79162306a36Sopenharmony_ci}; 79262306a36Sopenharmony_ci 79362306a36Sopenharmony_cistatic inline u8 __aeth_syn(void *arg) 79462306a36Sopenharmony_ci{ 79562306a36Sopenharmony_ci struct rxe_aeth *aeth = arg; 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_ci return (AETH_SYN_MASK & be32_to_cpu(aeth->smsn)) >> 24; 79862306a36Sopenharmony_ci} 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_cistatic inline void __aeth_set_syn(void *arg, u8 syn) 80162306a36Sopenharmony_ci{ 80262306a36Sopenharmony_ci struct rxe_aeth *aeth = arg; 80362306a36Sopenharmony_ci u32 smsn = be32_to_cpu(aeth->smsn); 80462306a36Sopenharmony_ci 80562306a36Sopenharmony_ci aeth->smsn = cpu_to_be32((AETH_SYN_MASK & (syn << 24)) | 80662306a36Sopenharmony_ci (~AETH_SYN_MASK & smsn)); 80762306a36Sopenharmony_ci} 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_cistatic inline u32 __aeth_msn(void *arg) 81062306a36Sopenharmony_ci{ 81162306a36Sopenharmony_ci struct rxe_aeth *aeth = arg; 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ci return AETH_MSN_MASK & be32_to_cpu(aeth->smsn); 81462306a36Sopenharmony_ci} 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_cistatic inline void __aeth_set_msn(void *arg, u32 msn) 81762306a36Sopenharmony_ci{ 81862306a36Sopenharmony_ci struct rxe_aeth *aeth = arg; 81962306a36Sopenharmony_ci u32 smsn = be32_to_cpu(aeth->smsn); 82062306a36Sopenharmony_ci 82162306a36Sopenharmony_ci aeth->smsn = cpu_to_be32((AETH_MSN_MASK & msn) | 82262306a36Sopenharmony_ci (~AETH_MSN_MASK & smsn)); 82362306a36Sopenharmony_ci} 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_cistatic inline u8 aeth_syn(struct rxe_pkt_info *pkt) 82662306a36Sopenharmony_ci{ 82762306a36Sopenharmony_ci return __aeth_syn(pkt->hdr + 82862306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_AETH]); 82962306a36Sopenharmony_ci} 83062306a36Sopenharmony_ci 83162306a36Sopenharmony_cistatic inline void aeth_set_syn(struct rxe_pkt_info *pkt, u8 syn) 83262306a36Sopenharmony_ci{ 83362306a36Sopenharmony_ci __aeth_set_syn(pkt->hdr + 83462306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_AETH], syn); 83562306a36Sopenharmony_ci} 83662306a36Sopenharmony_ci 83762306a36Sopenharmony_cistatic inline u32 aeth_msn(struct rxe_pkt_info *pkt) 83862306a36Sopenharmony_ci{ 83962306a36Sopenharmony_ci return __aeth_msn(pkt->hdr + 84062306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_AETH]); 84162306a36Sopenharmony_ci} 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_cistatic inline void aeth_set_msn(struct rxe_pkt_info *pkt, u32 msn) 84462306a36Sopenharmony_ci{ 84562306a36Sopenharmony_ci __aeth_set_msn(pkt->hdr + 84662306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_AETH], msn); 84762306a36Sopenharmony_ci} 84862306a36Sopenharmony_ci 84962306a36Sopenharmony_ci/****************************************************************************** 85062306a36Sopenharmony_ci * Atomic Ack Extended Transport Header 85162306a36Sopenharmony_ci ******************************************************************************/ 85262306a36Sopenharmony_cistruct rxe_atmack { 85362306a36Sopenharmony_ci __be64 orig; 85462306a36Sopenharmony_ci}; 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_cistatic inline u64 __atmack_orig(void *arg) 85762306a36Sopenharmony_ci{ 85862306a36Sopenharmony_ci struct rxe_atmack *atmack = arg; 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci return be64_to_cpu(atmack->orig); 86162306a36Sopenharmony_ci} 86262306a36Sopenharmony_ci 86362306a36Sopenharmony_cistatic inline void __atmack_set_orig(void *arg, u64 orig) 86462306a36Sopenharmony_ci{ 86562306a36Sopenharmony_ci struct rxe_atmack *atmack = arg; 86662306a36Sopenharmony_ci 86762306a36Sopenharmony_ci atmack->orig = cpu_to_be64(orig); 86862306a36Sopenharmony_ci} 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_cistatic inline u64 atmack_orig(struct rxe_pkt_info *pkt) 87162306a36Sopenharmony_ci{ 87262306a36Sopenharmony_ci return __atmack_orig(pkt->hdr + 87362306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_ATMACK]); 87462306a36Sopenharmony_ci} 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_cistatic inline void atmack_set_orig(struct rxe_pkt_info *pkt, u64 orig) 87762306a36Sopenharmony_ci{ 87862306a36Sopenharmony_ci __atmack_set_orig(pkt->hdr + 87962306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_ATMACK], orig); 88062306a36Sopenharmony_ci} 88162306a36Sopenharmony_ci 88262306a36Sopenharmony_ci/****************************************************************************** 88362306a36Sopenharmony_ci * Immediate Extended Transport Header 88462306a36Sopenharmony_ci ******************************************************************************/ 88562306a36Sopenharmony_cistruct rxe_immdt { 88662306a36Sopenharmony_ci __be32 imm; 88762306a36Sopenharmony_ci}; 88862306a36Sopenharmony_ci 88962306a36Sopenharmony_cistatic inline __be32 __immdt_imm(void *arg) 89062306a36Sopenharmony_ci{ 89162306a36Sopenharmony_ci struct rxe_immdt *immdt = arg; 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_ci return immdt->imm; 89462306a36Sopenharmony_ci} 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_cistatic inline void __immdt_set_imm(void *arg, __be32 imm) 89762306a36Sopenharmony_ci{ 89862306a36Sopenharmony_ci struct rxe_immdt *immdt = arg; 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci immdt->imm = imm; 90162306a36Sopenharmony_ci} 90262306a36Sopenharmony_ci 90362306a36Sopenharmony_cistatic inline __be32 immdt_imm(struct rxe_pkt_info *pkt) 90462306a36Sopenharmony_ci{ 90562306a36Sopenharmony_ci return __immdt_imm(pkt->hdr + 90662306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_IMMDT]); 90762306a36Sopenharmony_ci} 90862306a36Sopenharmony_ci 90962306a36Sopenharmony_cistatic inline void immdt_set_imm(struct rxe_pkt_info *pkt, __be32 imm) 91062306a36Sopenharmony_ci{ 91162306a36Sopenharmony_ci __immdt_set_imm(pkt->hdr + 91262306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_IMMDT], imm); 91362306a36Sopenharmony_ci} 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_ci/****************************************************************************** 91662306a36Sopenharmony_ci * Invalidate Extended Transport Header 91762306a36Sopenharmony_ci ******************************************************************************/ 91862306a36Sopenharmony_cistruct rxe_ieth { 91962306a36Sopenharmony_ci __be32 rkey; 92062306a36Sopenharmony_ci}; 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_cistatic inline u32 __ieth_rkey(void *arg) 92362306a36Sopenharmony_ci{ 92462306a36Sopenharmony_ci struct rxe_ieth *ieth = arg; 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_ci return be32_to_cpu(ieth->rkey); 92762306a36Sopenharmony_ci} 92862306a36Sopenharmony_ci 92962306a36Sopenharmony_cistatic inline void __ieth_set_rkey(void *arg, u32 rkey) 93062306a36Sopenharmony_ci{ 93162306a36Sopenharmony_ci struct rxe_ieth *ieth = arg; 93262306a36Sopenharmony_ci 93362306a36Sopenharmony_ci ieth->rkey = cpu_to_be32(rkey); 93462306a36Sopenharmony_ci} 93562306a36Sopenharmony_ci 93662306a36Sopenharmony_cistatic inline u32 ieth_rkey(struct rxe_pkt_info *pkt) 93762306a36Sopenharmony_ci{ 93862306a36Sopenharmony_ci return __ieth_rkey(pkt->hdr + 93962306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_IETH]); 94062306a36Sopenharmony_ci} 94162306a36Sopenharmony_ci 94262306a36Sopenharmony_cistatic inline void ieth_set_rkey(struct rxe_pkt_info *pkt, u32 rkey) 94362306a36Sopenharmony_ci{ 94462306a36Sopenharmony_ci __ieth_set_rkey(pkt->hdr + 94562306a36Sopenharmony_ci rxe_opcode[pkt->opcode].offset[RXE_IETH], rkey); 94662306a36Sopenharmony_ci} 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_cienum rxe_hdr_length { 94962306a36Sopenharmony_ci RXE_BTH_BYTES = sizeof(struct rxe_bth), 95062306a36Sopenharmony_ci RXE_DETH_BYTES = sizeof(struct rxe_deth), 95162306a36Sopenharmony_ci RXE_IMMDT_BYTES = sizeof(struct rxe_immdt), 95262306a36Sopenharmony_ci RXE_RETH_BYTES = sizeof(struct rxe_reth), 95362306a36Sopenharmony_ci RXE_AETH_BYTES = sizeof(struct rxe_aeth), 95462306a36Sopenharmony_ci RXE_ATMACK_BYTES = sizeof(struct rxe_atmack), 95562306a36Sopenharmony_ci RXE_ATMETH_BYTES = sizeof(struct rxe_atmeth), 95662306a36Sopenharmony_ci RXE_IETH_BYTES = sizeof(struct rxe_ieth), 95762306a36Sopenharmony_ci RXE_RDETH_BYTES = sizeof(struct rxe_rdeth), 95862306a36Sopenharmony_ci RXE_FETH_BYTES = sizeof(struct rxe_feth), 95962306a36Sopenharmony_ci}; 96062306a36Sopenharmony_ci 96162306a36Sopenharmony_cistatic inline size_t header_size(struct rxe_pkt_info *pkt) 96262306a36Sopenharmony_ci{ 96362306a36Sopenharmony_ci return rxe_opcode[pkt->opcode].length; 96462306a36Sopenharmony_ci} 96562306a36Sopenharmony_ci 96662306a36Sopenharmony_cistatic inline void *payload_addr(struct rxe_pkt_info *pkt) 96762306a36Sopenharmony_ci{ 96862306a36Sopenharmony_ci return pkt->hdr + rxe_opcode[pkt->opcode].offset[RXE_PAYLOAD]; 96962306a36Sopenharmony_ci} 97062306a36Sopenharmony_ci 97162306a36Sopenharmony_cistatic inline size_t payload_size(struct rxe_pkt_info *pkt) 97262306a36Sopenharmony_ci{ 97362306a36Sopenharmony_ci return pkt->paylen - rxe_opcode[pkt->opcode].offset[RXE_PAYLOAD] 97462306a36Sopenharmony_ci - bth_pad(pkt) - RXE_ICRC_SIZE; 97562306a36Sopenharmony_ci} 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_ci#endif /* RXE_HDR_H */ 978