xref: /openbmc/linux/drivers/infiniband/sw/siw/iwarp.h (revision 8be98d2f2a0a262f8bf8a0bc1fdf522b3c7aab17)
1*0e935ae6SBernard Metzler /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */
2*0e935ae6SBernard Metzler 
3*0e935ae6SBernard Metzler /* Authors: Bernard Metzler <bmt@zurich.ibm.com> */
4*0e935ae6SBernard Metzler /* Copyright (c) 2008-2019, IBM Corporation */
5*0e935ae6SBernard Metzler 
6*0e935ae6SBernard Metzler #ifndef _IWARP_H
7*0e935ae6SBernard Metzler #define _IWARP_H
8*0e935ae6SBernard Metzler 
9*0e935ae6SBernard Metzler #include <rdma/rdma_user_cm.h> /* RDMA_MAX_PRIVATE_DATA */
10*0e935ae6SBernard Metzler #include <linux/types.h>
11*0e935ae6SBernard Metzler #include <asm/byteorder.h>
12*0e935ae6SBernard Metzler 
13*0e935ae6SBernard Metzler #define RDMAP_VERSION 1
14*0e935ae6SBernard Metzler #define DDP_VERSION 1
15*0e935ae6SBernard Metzler #define MPA_REVISION_1 1
16*0e935ae6SBernard Metzler #define MPA_REVISION_2 2
17*0e935ae6SBernard Metzler #define MPA_MAX_PRIVDATA RDMA_MAX_PRIVATE_DATA
18*0e935ae6SBernard Metzler #define MPA_KEY_REQ "MPA ID Req Frame"
19*0e935ae6SBernard Metzler #define MPA_KEY_REP "MPA ID Rep Frame"
20*0e935ae6SBernard Metzler #define MPA_IRD_ORD_MASK 0x3fff
21*0e935ae6SBernard Metzler 
22*0e935ae6SBernard Metzler struct mpa_rr_params {
23*0e935ae6SBernard Metzler 	__be16 bits;
24*0e935ae6SBernard Metzler 	__be16 pd_len;
25*0e935ae6SBernard Metzler };
26*0e935ae6SBernard Metzler 
27*0e935ae6SBernard Metzler /*
28*0e935ae6SBernard Metzler  * MPA request/response header bits & fields
29*0e935ae6SBernard Metzler  */
30*0e935ae6SBernard Metzler enum {
31*0e935ae6SBernard Metzler 	MPA_RR_FLAG_MARKERS = cpu_to_be16(0x8000),
32*0e935ae6SBernard Metzler 	MPA_RR_FLAG_CRC = cpu_to_be16(0x4000),
33*0e935ae6SBernard Metzler 	MPA_RR_FLAG_REJECT = cpu_to_be16(0x2000),
34*0e935ae6SBernard Metzler 	MPA_RR_FLAG_ENHANCED = cpu_to_be16(0x1000),
35*0e935ae6SBernard Metzler 	MPA_RR_FLAG_GSO_EXP = cpu_to_be16(0x0800),
36*0e935ae6SBernard Metzler 	MPA_RR_MASK_REVISION = cpu_to_be16(0x00ff)
37*0e935ae6SBernard Metzler };
38*0e935ae6SBernard Metzler 
39*0e935ae6SBernard Metzler /*
40*0e935ae6SBernard Metzler  * MPA request/reply header
41*0e935ae6SBernard Metzler  */
42*0e935ae6SBernard Metzler struct mpa_rr {
43*0e935ae6SBernard Metzler 	__u8 key[16];
44*0e935ae6SBernard Metzler 	struct mpa_rr_params params;
45*0e935ae6SBernard Metzler };
46*0e935ae6SBernard Metzler 
__mpa_rr_set_revision(__be16 * bits,u8 rev)47*0e935ae6SBernard Metzler static inline void __mpa_rr_set_revision(__be16 *bits, u8 rev)
48*0e935ae6SBernard Metzler {
49*0e935ae6SBernard Metzler 	*bits = (*bits & ~MPA_RR_MASK_REVISION) |
50*0e935ae6SBernard Metzler 		(cpu_to_be16(rev) & MPA_RR_MASK_REVISION);
51*0e935ae6SBernard Metzler }
52*0e935ae6SBernard Metzler 
__mpa_rr_revision(__be16 mpa_rr_bits)53*0e935ae6SBernard Metzler static inline u8 __mpa_rr_revision(__be16 mpa_rr_bits)
54*0e935ae6SBernard Metzler {
55*0e935ae6SBernard Metzler 	__be16 rev = mpa_rr_bits & MPA_RR_MASK_REVISION;
56*0e935ae6SBernard Metzler 
57*0e935ae6SBernard Metzler 	return be16_to_cpu(rev);
58*0e935ae6SBernard Metzler }
59*0e935ae6SBernard Metzler 
60*0e935ae6SBernard Metzler enum mpa_v2_ctrl {
61*0e935ae6SBernard Metzler 	MPA_V2_PEER_TO_PEER = cpu_to_be16(0x8000),
62*0e935ae6SBernard Metzler 	MPA_V2_ZERO_LENGTH_RTR = cpu_to_be16(0x4000),
63*0e935ae6SBernard Metzler 	MPA_V2_RDMA_WRITE_RTR = cpu_to_be16(0x8000),
64*0e935ae6SBernard Metzler 	MPA_V2_RDMA_READ_RTR = cpu_to_be16(0x4000),
65*0e935ae6SBernard Metzler 	MPA_V2_RDMA_NO_RTR = cpu_to_be16(0x0000),
66*0e935ae6SBernard Metzler 	MPA_V2_MASK_IRD_ORD = cpu_to_be16(0x3fff)
67*0e935ae6SBernard Metzler };
68*0e935ae6SBernard Metzler 
69*0e935ae6SBernard Metzler struct mpa_v2_data {
70*0e935ae6SBernard Metzler 	__be16 ird;
71*0e935ae6SBernard Metzler 	__be16 ord;
72*0e935ae6SBernard Metzler };
73*0e935ae6SBernard Metzler 
74*0e935ae6SBernard Metzler struct mpa_marker {
75*0e935ae6SBernard Metzler 	__be16 rsvd;
76*0e935ae6SBernard Metzler 	__be16 fpdu_hmd; /* FPDU header-marker distance (= MPA's FPDUPTR) */
77*0e935ae6SBernard Metzler };
78*0e935ae6SBernard Metzler 
79*0e935ae6SBernard Metzler /*
80*0e935ae6SBernard Metzler  * maximum MPA trailer
81*0e935ae6SBernard Metzler  */
82*0e935ae6SBernard Metzler struct mpa_trailer {
83*0e935ae6SBernard Metzler 	__u8 pad[4];
84*0e935ae6SBernard Metzler 	__be32 crc;
85*0e935ae6SBernard Metzler };
86*0e935ae6SBernard Metzler 
87*0e935ae6SBernard Metzler #define MPA_HDR_SIZE 2
88*0e935ae6SBernard Metzler #define MPA_CRC_SIZE 4
89*0e935ae6SBernard Metzler 
90*0e935ae6SBernard Metzler /*
91*0e935ae6SBernard Metzler  * Common portion of iWARP headers (MPA, DDP, RDMAP)
92*0e935ae6SBernard Metzler  * for any FPDU
93*0e935ae6SBernard Metzler  */
94*0e935ae6SBernard Metzler struct iwarp_ctrl {
95*0e935ae6SBernard Metzler 	__be16 mpa_len;
96*0e935ae6SBernard Metzler 	__be16 ddp_rdmap_ctrl;
97*0e935ae6SBernard Metzler };
98*0e935ae6SBernard Metzler 
99*0e935ae6SBernard Metzler /*
100*0e935ae6SBernard Metzler  * DDP/RDMAP Hdr bits & fields
101*0e935ae6SBernard Metzler  */
102*0e935ae6SBernard Metzler enum {
103*0e935ae6SBernard Metzler 	DDP_FLAG_TAGGED = cpu_to_be16(0x8000),
104*0e935ae6SBernard Metzler 	DDP_FLAG_LAST = cpu_to_be16(0x4000),
105*0e935ae6SBernard Metzler 	DDP_MASK_RESERVED = cpu_to_be16(0x3C00),
106*0e935ae6SBernard Metzler 	DDP_MASK_VERSION = cpu_to_be16(0x0300),
107*0e935ae6SBernard Metzler 	RDMAP_MASK_VERSION = cpu_to_be16(0x00C0),
108*0e935ae6SBernard Metzler 	RDMAP_MASK_RESERVED = cpu_to_be16(0x0030),
109*0e935ae6SBernard Metzler 	RDMAP_MASK_OPCODE = cpu_to_be16(0x000f)
110*0e935ae6SBernard Metzler };
111*0e935ae6SBernard Metzler 
__ddp_get_version(struct iwarp_ctrl * ctrl)112*0e935ae6SBernard Metzler static inline u8 __ddp_get_version(struct iwarp_ctrl *ctrl)
113*0e935ae6SBernard Metzler {
114*0e935ae6SBernard Metzler 	return be16_to_cpu(ctrl->ddp_rdmap_ctrl & DDP_MASK_VERSION) >> 8;
115*0e935ae6SBernard Metzler }
116*0e935ae6SBernard Metzler 
__rdmap_get_version(struct iwarp_ctrl * ctrl)117*0e935ae6SBernard Metzler static inline u8 __rdmap_get_version(struct iwarp_ctrl *ctrl)
118*0e935ae6SBernard Metzler {
119*0e935ae6SBernard Metzler 	__be16 ver = ctrl->ddp_rdmap_ctrl & RDMAP_MASK_VERSION;
120*0e935ae6SBernard Metzler 
121*0e935ae6SBernard Metzler 	return be16_to_cpu(ver) >> 6;
122*0e935ae6SBernard Metzler }
123*0e935ae6SBernard Metzler 
__rdmap_get_opcode(struct iwarp_ctrl * ctrl)124*0e935ae6SBernard Metzler static inline u8 __rdmap_get_opcode(struct iwarp_ctrl *ctrl)
125*0e935ae6SBernard Metzler {
126*0e935ae6SBernard Metzler 	return be16_to_cpu(ctrl->ddp_rdmap_ctrl & RDMAP_MASK_OPCODE);
127*0e935ae6SBernard Metzler }
128*0e935ae6SBernard Metzler 
__rdmap_set_opcode(struct iwarp_ctrl * ctrl,u8 opcode)129*0e935ae6SBernard Metzler static inline void __rdmap_set_opcode(struct iwarp_ctrl *ctrl, u8 opcode)
130*0e935ae6SBernard Metzler {
131*0e935ae6SBernard Metzler 	ctrl->ddp_rdmap_ctrl = (ctrl->ddp_rdmap_ctrl & ~RDMAP_MASK_OPCODE) |
132*0e935ae6SBernard Metzler 			       (cpu_to_be16(opcode) & RDMAP_MASK_OPCODE);
133*0e935ae6SBernard Metzler }
134*0e935ae6SBernard Metzler 
135*0e935ae6SBernard Metzler struct iwarp_rdma_write {
136*0e935ae6SBernard Metzler 	struct iwarp_ctrl ctrl;
137*0e935ae6SBernard Metzler 	__be32 sink_stag;
138*0e935ae6SBernard Metzler 	__be64 sink_to;
139*0e935ae6SBernard Metzler };
140*0e935ae6SBernard Metzler 
141*0e935ae6SBernard Metzler struct iwarp_rdma_rreq {
142*0e935ae6SBernard Metzler 	struct iwarp_ctrl ctrl;
143*0e935ae6SBernard Metzler 	__be32 rsvd;
144*0e935ae6SBernard Metzler 	__be32 ddp_qn;
145*0e935ae6SBernard Metzler 	__be32 ddp_msn;
146*0e935ae6SBernard Metzler 	__be32 ddp_mo;
147*0e935ae6SBernard Metzler 	__be32 sink_stag;
148*0e935ae6SBernard Metzler 	__be64 sink_to;
149*0e935ae6SBernard Metzler 	__be32 read_size;
150*0e935ae6SBernard Metzler 	__be32 source_stag;
151*0e935ae6SBernard Metzler 	__be64 source_to;
152*0e935ae6SBernard Metzler };
153*0e935ae6SBernard Metzler 
154*0e935ae6SBernard Metzler struct iwarp_rdma_rresp {
155*0e935ae6SBernard Metzler 	struct iwarp_ctrl ctrl;
156*0e935ae6SBernard Metzler 	__be32 sink_stag;
157*0e935ae6SBernard Metzler 	__be64 sink_to;
158*0e935ae6SBernard Metzler };
159*0e935ae6SBernard Metzler 
160*0e935ae6SBernard Metzler struct iwarp_send {
161*0e935ae6SBernard Metzler 	struct iwarp_ctrl ctrl;
162*0e935ae6SBernard Metzler 	__be32 rsvd;
163*0e935ae6SBernard Metzler 	__be32 ddp_qn;
164*0e935ae6SBernard Metzler 	__be32 ddp_msn;
165*0e935ae6SBernard Metzler 	__be32 ddp_mo;
166*0e935ae6SBernard Metzler };
167*0e935ae6SBernard Metzler 
168*0e935ae6SBernard Metzler struct iwarp_send_inv {
169*0e935ae6SBernard Metzler 	struct iwarp_ctrl ctrl;
170*0e935ae6SBernard Metzler 	__be32 inval_stag;
171*0e935ae6SBernard Metzler 	__be32 ddp_qn;
172*0e935ae6SBernard Metzler 	__be32 ddp_msn;
173*0e935ae6SBernard Metzler 	__be32 ddp_mo;
174*0e935ae6SBernard Metzler };
175*0e935ae6SBernard Metzler 
176*0e935ae6SBernard Metzler struct iwarp_terminate {
177*0e935ae6SBernard Metzler 	struct iwarp_ctrl ctrl;
178*0e935ae6SBernard Metzler 	__be32 rsvd;
179*0e935ae6SBernard Metzler 	__be32 ddp_qn;
180*0e935ae6SBernard Metzler 	__be32 ddp_msn;
181*0e935ae6SBernard Metzler 	__be32 ddp_mo;
182*0e935ae6SBernard Metzler #if defined(__LITTLE_ENDIAN_BITFIELD)
183*0e935ae6SBernard Metzler 	__be32 layer : 4;
184*0e935ae6SBernard Metzler 	__be32 etype : 4;
185*0e935ae6SBernard Metzler 	__be32 ecode : 8;
186*0e935ae6SBernard Metzler 	__be32 flag_m : 1;
187*0e935ae6SBernard Metzler 	__be32 flag_d : 1;
188*0e935ae6SBernard Metzler 	__be32 flag_r : 1;
189*0e935ae6SBernard Metzler 	__be32 reserved : 13;
190*0e935ae6SBernard Metzler #elif defined(__BIG_ENDIAN_BITFIELD)
191*0e935ae6SBernard Metzler 	__be32 reserved : 13;
192*0e935ae6SBernard Metzler 	__be32 flag_r : 1;
193*0e935ae6SBernard Metzler 	__be32 flag_d : 1;
194*0e935ae6SBernard Metzler 	__be32 flag_m : 1;
195*0e935ae6SBernard Metzler 	__be32 ecode : 8;
196*0e935ae6SBernard Metzler 	__be32 etype : 4;
197*0e935ae6SBernard Metzler 	__be32 layer : 4;
198*0e935ae6SBernard Metzler #else
199*0e935ae6SBernard Metzler #error "undefined byte order"
200*0e935ae6SBernard Metzler #endif
201*0e935ae6SBernard Metzler };
202*0e935ae6SBernard Metzler 
203*0e935ae6SBernard Metzler /*
204*0e935ae6SBernard Metzler  * Terminate Hdr bits & fields
205*0e935ae6SBernard Metzler  */
206*0e935ae6SBernard Metzler enum {
207*0e935ae6SBernard Metzler 	TERM_MASK_LAYER = cpu_to_be32(0xf0000000),
208*0e935ae6SBernard Metzler 	TERM_MASK_ETYPE = cpu_to_be32(0x0f000000),
209*0e935ae6SBernard Metzler 	TERM_MASK_ECODE = cpu_to_be32(0x00ff0000),
210*0e935ae6SBernard Metzler 	TERM_FLAG_M = cpu_to_be32(0x00008000),
211*0e935ae6SBernard Metzler 	TERM_FLAG_D = cpu_to_be32(0x00004000),
212*0e935ae6SBernard Metzler 	TERM_FLAG_R = cpu_to_be32(0x00002000),
213*0e935ae6SBernard Metzler 	TERM_MASK_RESVD = cpu_to_be32(0x00001fff)
214*0e935ae6SBernard Metzler };
215*0e935ae6SBernard Metzler 
__rdmap_term_layer(struct iwarp_terminate * term)216*0e935ae6SBernard Metzler static inline u8 __rdmap_term_layer(struct iwarp_terminate *term)
217*0e935ae6SBernard Metzler {
218*0e935ae6SBernard Metzler 	return term->layer;
219*0e935ae6SBernard Metzler }
220*0e935ae6SBernard Metzler 
__rdmap_term_set_layer(struct iwarp_terminate * term,u8 layer)221*0e935ae6SBernard Metzler static inline void __rdmap_term_set_layer(struct iwarp_terminate *term,
222*0e935ae6SBernard Metzler 					  u8 layer)
223*0e935ae6SBernard Metzler {
224*0e935ae6SBernard Metzler 	term->layer = layer & 0xf;
225*0e935ae6SBernard Metzler }
226*0e935ae6SBernard Metzler 
__rdmap_term_etype(struct iwarp_terminate * term)227*0e935ae6SBernard Metzler static inline u8 __rdmap_term_etype(struct iwarp_terminate *term)
228*0e935ae6SBernard Metzler {
229*0e935ae6SBernard Metzler 	return term->etype;
230*0e935ae6SBernard Metzler }
231*0e935ae6SBernard Metzler 
__rdmap_term_set_etype(struct iwarp_terminate * term,u8 etype)232*0e935ae6SBernard Metzler static inline void __rdmap_term_set_etype(struct iwarp_terminate *term,
233*0e935ae6SBernard Metzler 					  u8 etype)
234*0e935ae6SBernard Metzler {
235*0e935ae6SBernard Metzler 	term->etype = etype & 0xf;
236*0e935ae6SBernard Metzler }
237*0e935ae6SBernard Metzler 
__rdmap_term_ecode(struct iwarp_terminate * term)238*0e935ae6SBernard Metzler static inline u8 __rdmap_term_ecode(struct iwarp_terminate *term)
239*0e935ae6SBernard Metzler {
240*0e935ae6SBernard Metzler 	return term->ecode;
241*0e935ae6SBernard Metzler }
242*0e935ae6SBernard Metzler 
__rdmap_term_set_ecode(struct iwarp_terminate * term,u8 ecode)243*0e935ae6SBernard Metzler static inline void __rdmap_term_set_ecode(struct iwarp_terminate *term,
244*0e935ae6SBernard Metzler 					  u8 ecode)
245*0e935ae6SBernard Metzler {
246*0e935ae6SBernard Metzler 	term->ecode = ecode;
247*0e935ae6SBernard Metzler }
248*0e935ae6SBernard Metzler 
249*0e935ae6SBernard Metzler /*
250*0e935ae6SBernard Metzler  * Common portion of iWARP headers (MPA, DDP, RDMAP)
251*0e935ae6SBernard Metzler  * for an FPDU carrying an untagged DDP segment
252*0e935ae6SBernard Metzler  */
253*0e935ae6SBernard Metzler struct iwarp_ctrl_untagged {
254*0e935ae6SBernard Metzler 	struct iwarp_ctrl ctrl;
255*0e935ae6SBernard Metzler 	__be32 rsvd;
256*0e935ae6SBernard Metzler 	__be32 ddp_qn;
257*0e935ae6SBernard Metzler 	__be32 ddp_msn;
258*0e935ae6SBernard Metzler 	__be32 ddp_mo;
259*0e935ae6SBernard Metzler };
260*0e935ae6SBernard Metzler 
261*0e935ae6SBernard Metzler /*
262*0e935ae6SBernard Metzler  * Common portion of iWARP headers (MPA, DDP, RDMAP)
263*0e935ae6SBernard Metzler  * for an FPDU carrying a tagged DDP segment
264*0e935ae6SBernard Metzler  */
265*0e935ae6SBernard Metzler struct iwarp_ctrl_tagged {
266*0e935ae6SBernard Metzler 	struct iwarp_ctrl ctrl;
267*0e935ae6SBernard Metzler 	__be32 ddp_stag;
268*0e935ae6SBernard Metzler 	__be64 ddp_to;
269*0e935ae6SBernard Metzler };
270*0e935ae6SBernard Metzler 
271*0e935ae6SBernard Metzler union iwarp_hdr {
272*0e935ae6SBernard Metzler 	struct iwarp_ctrl ctrl;
273*0e935ae6SBernard Metzler 	struct iwarp_ctrl_untagged c_untagged;
274*0e935ae6SBernard Metzler 	struct iwarp_ctrl_tagged c_tagged;
275*0e935ae6SBernard Metzler 	struct iwarp_rdma_write rwrite;
276*0e935ae6SBernard Metzler 	struct iwarp_rdma_rreq rreq;
277*0e935ae6SBernard Metzler 	struct iwarp_rdma_rresp rresp;
278*0e935ae6SBernard Metzler 	struct iwarp_terminate terminate;
279*0e935ae6SBernard Metzler 	struct iwarp_send send;
280*0e935ae6SBernard Metzler 	struct iwarp_send_inv send_inv;
281*0e935ae6SBernard Metzler };
282*0e935ae6SBernard Metzler 
283*0e935ae6SBernard Metzler enum term_elayer {
284*0e935ae6SBernard Metzler 	TERM_ERROR_LAYER_RDMAP = 0x00,
285*0e935ae6SBernard Metzler 	TERM_ERROR_LAYER_DDP = 0x01,
286*0e935ae6SBernard Metzler 	TERM_ERROR_LAYER_LLP = 0x02 /* eg., MPA */
287*0e935ae6SBernard Metzler };
288*0e935ae6SBernard Metzler 
289*0e935ae6SBernard Metzler enum ddp_etype {
290*0e935ae6SBernard Metzler 	DDP_ETYPE_CATASTROPHIC = 0x0,
291*0e935ae6SBernard Metzler 	DDP_ETYPE_TAGGED_BUF = 0x1,
292*0e935ae6SBernard Metzler 	DDP_ETYPE_UNTAGGED_BUF = 0x2,
293*0e935ae6SBernard Metzler 	DDP_ETYPE_RSVD = 0x3
294*0e935ae6SBernard Metzler };
295*0e935ae6SBernard Metzler 
296*0e935ae6SBernard Metzler enum ddp_ecode {
297*0e935ae6SBernard Metzler 	/* unspecified, set to zero */
298*0e935ae6SBernard Metzler 	DDP_ECODE_CATASTROPHIC = 0x00,
299*0e935ae6SBernard Metzler 	/* Tagged Buffer Errors */
300*0e935ae6SBernard Metzler 	DDP_ECODE_T_INVALID_STAG = 0x00,
301*0e935ae6SBernard Metzler 	DDP_ECODE_T_BASE_BOUNDS = 0x01,
302*0e935ae6SBernard Metzler 	DDP_ECODE_T_STAG_NOT_ASSOC = 0x02,
303*0e935ae6SBernard Metzler 	DDP_ECODE_T_TO_WRAP = 0x03,
304*0e935ae6SBernard Metzler 	DDP_ECODE_T_VERSION = 0x04,
305*0e935ae6SBernard Metzler 	/* Untagged Buffer Errors */
306*0e935ae6SBernard Metzler 	DDP_ECODE_UT_INVALID_QN = 0x01,
307*0e935ae6SBernard Metzler 	DDP_ECODE_UT_INVALID_MSN_NOBUF = 0x02,
308*0e935ae6SBernard Metzler 	DDP_ECODE_UT_INVALID_MSN_RANGE = 0x03,
309*0e935ae6SBernard Metzler 	DDP_ECODE_UT_INVALID_MO = 0x04,
310*0e935ae6SBernard Metzler 	DDP_ECODE_UT_MSG_TOOLONG = 0x05,
311*0e935ae6SBernard Metzler 	DDP_ECODE_UT_VERSION = 0x06
312*0e935ae6SBernard Metzler };
313*0e935ae6SBernard Metzler 
314*0e935ae6SBernard Metzler enum rdmap_untagged_qn {
315*0e935ae6SBernard Metzler 	RDMAP_UNTAGGED_QN_SEND = 0,
316*0e935ae6SBernard Metzler 	RDMAP_UNTAGGED_QN_RDMA_READ = 1,
317*0e935ae6SBernard Metzler 	RDMAP_UNTAGGED_QN_TERMINATE = 2,
318*0e935ae6SBernard Metzler 	RDMAP_UNTAGGED_QN_COUNT = 3
319*0e935ae6SBernard Metzler };
320*0e935ae6SBernard Metzler 
321*0e935ae6SBernard Metzler enum rdmap_etype {
322*0e935ae6SBernard Metzler 	RDMAP_ETYPE_CATASTROPHIC = 0x0,
323*0e935ae6SBernard Metzler 	RDMAP_ETYPE_REMOTE_PROTECTION = 0x1,
324*0e935ae6SBernard Metzler 	RDMAP_ETYPE_REMOTE_OPERATION = 0x2
325*0e935ae6SBernard Metzler };
326*0e935ae6SBernard Metzler 
327*0e935ae6SBernard Metzler enum rdmap_ecode {
328*0e935ae6SBernard Metzler 	RDMAP_ECODE_INVALID_STAG = 0x00,
329*0e935ae6SBernard Metzler 	RDMAP_ECODE_BASE_BOUNDS = 0x01,
330*0e935ae6SBernard Metzler 	RDMAP_ECODE_ACCESS_RIGHTS = 0x02,
331*0e935ae6SBernard Metzler 	RDMAP_ECODE_STAG_NOT_ASSOC = 0x03,
332*0e935ae6SBernard Metzler 	RDMAP_ECODE_TO_WRAP = 0x04,
333*0e935ae6SBernard Metzler 	RDMAP_ECODE_VERSION = 0x05,
334*0e935ae6SBernard Metzler 	RDMAP_ECODE_OPCODE = 0x06,
335*0e935ae6SBernard Metzler 	RDMAP_ECODE_CATASTROPHIC_STREAM = 0x07,
336*0e935ae6SBernard Metzler 	RDMAP_ECODE_CATASTROPHIC_GLOBAL = 0x08,
337*0e935ae6SBernard Metzler 	RDMAP_ECODE_CANNOT_INVALIDATE = 0x09,
338*0e935ae6SBernard Metzler 	RDMAP_ECODE_UNSPECIFIED = 0xff
339*0e935ae6SBernard Metzler };
340*0e935ae6SBernard Metzler 
341*0e935ae6SBernard Metzler enum llp_ecode {
342*0e935ae6SBernard Metzler 	LLP_ECODE_TCP_STREAM_LOST = 0x01, /* How to transfer this ?? */
343*0e935ae6SBernard Metzler 	LLP_ECODE_RECEIVED_CRC = 0x02,
344*0e935ae6SBernard Metzler 	LLP_ECODE_FPDU_START = 0x03,
345*0e935ae6SBernard Metzler 	LLP_ECODE_INVALID_REQ_RESP = 0x04,
346*0e935ae6SBernard Metzler 
347*0e935ae6SBernard Metzler 	/* Errors for Enhanced Connection Establishment only */
348*0e935ae6SBernard Metzler 	LLP_ECODE_LOCAL_CATASTROPHIC = 0x05,
349*0e935ae6SBernard Metzler 	LLP_ECODE_INSUFFICIENT_IRD = 0x06,
350*0e935ae6SBernard Metzler 	LLP_ECODE_NO_MATCHING_RTR = 0x07
351*0e935ae6SBernard Metzler };
352*0e935ae6SBernard Metzler 
353*0e935ae6SBernard Metzler enum llp_etype { LLP_ETYPE_MPA = 0x00 };
354*0e935ae6SBernard Metzler 
355*0e935ae6SBernard Metzler enum rdma_opcode {
356*0e935ae6SBernard Metzler 	RDMAP_RDMA_WRITE = 0x0,
357*0e935ae6SBernard Metzler 	RDMAP_RDMA_READ_REQ = 0x1,
358*0e935ae6SBernard Metzler 	RDMAP_RDMA_READ_RESP = 0x2,
359*0e935ae6SBernard Metzler 	RDMAP_SEND = 0x3,
360*0e935ae6SBernard Metzler 	RDMAP_SEND_INVAL = 0x4,
361*0e935ae6SBernard Metzler 	RDMAP_SEND_SE = 0x5,
362*0e935ae6SBernard Metzler 	RDMAP_SEND_SE_INVAL = 0x6,
363*0e935ae6SBernard Metzler 	RDMAP_TERMINATE = 0x7,
364*0e935ae6SBernard Metzler 	RDMAP_NOT_SUPPORTED = RDMAP_TERMINATE + 1
365*0e935ae6SBernard Metzler };
366*0e935ae6SBernard Metzler 
367*0e935ae6SBernard Metzler #endif
368