1 // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
2 /*
3  * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved.
4  * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved.
5  */
6 
7 #include <rdma/ib_pack.h>
8 #include "rxe_opcode.h"
9 #include "rxe_hdr.h"
10 
11 /* useful information about work request opcodes and pkt opcodes in
12  * table form
13  */
14 struct rxe_wr_opcode_info rxe_wr_opcode_info[] = {
15 	[IB_WR_RDMA_WRITE]				= {
16 		.name	= "IB_WR_RDMA_WRITE",
17 		.mask	= {
18 			[IB_QPT_RC]	= WR_INLINE_MASK | WR_WRITE_MASK,
19 			[IB_QPT_UC]	= WR_INLINE_MASK | WR_WRITE_MASK,
20 		},
21 	},
22 	[IB_WR_RDMA_WRITE_WITH_IMM]			= {
23 		.name	= "IB_WR_RDMA_WRITE_WITH_IMM",
24 		.mask	= {
25 			[IB_QPT_RC]	= WR_INLINE_MASK | WR_WRITE_MASK,
26 			[IB_QPT_UC]	= WR_INLINE_MASK | WR_WRITE_MASK,
27 		},
28 	},
29 	[IB_WR_SEND]					= {
30 		.name	= "IB_WR_SEND",
31 		.mask	= {
32 			[IB_QPT_SMI]	= WR_INLINE_MASK | WR_SEND_MASK,
33 			[IB_QPT_GSI]	= WR_INLINE_MASK | WR_SEND_MASK,
34 			[IB_QPT_RC]	= WR_INLINE_MASK | WR_SEND_MASK,
35 			[IB_QPT_UC]	= WR_INLINE_MASK | WR_SEND_MASK,
36 			[IB_QPT_UD]	= WR_INLINE_MASK | WR_SEND_MASK,
37 		},
38 	},
39 	[IB_WR_SEND_WITH_IMM]				= {
40 		.name	= "IB_WR_SEND_WITH_IMM",
41 		.mask	= {
42 			[IB_QPT_SMI]	= WR_INLINE_MASK | WR_SEND_MASK,
43 			[IB_QPT_GSI]	= WR_INLINE_MASK | WR_SEND_MASK,
44 			[IB_QPT_RC]	= WR_INLINE_MASK | WR_SEND_MASK,
45 			[IB_QPT_UC]	= WR_INLINE_MASK | WR_SEND_MASK,
46 			[IB_QPT_UD]	= WR_INLINE_MASK | WR_SEND_MASK,
47 		},
48 	},
49 	[IB_WR_RDMA_READ]				= {
50 		.name	= "IB_WR_RDMA_READ",
51 		.mask	= {
52 			[IB_QPT_RC]	= WR_READ_MASK,
53 		},
54 	},
55 	[IB_WR_ATOMIC_CMP_AND_SWP]			= {
56 		.name	= "IB_WR_ATOMIC_CMP_AND_SWP",
57 		.mask	= {
58 			[IB_QPT_RC]	= WR_ATOMIC_MASK,
59 		},
60 	},
61 	[IB_WR_ATOMIC_FETCH_AND_ADD]			= {
62 		.name	= "IB_WR_ATOMIC_FETCH_AND_ADD",
63 		.mask	= {
64 			[IB_QPT_RC]	= WR_ATOMIC_MASK,
65 		},
66 	},
67 	[IB_WR_LSO]					= {
68 		.name	= "IB_WR_LSO",
69 		.mask	= {
70 			/* not supported */
71 		},
72 	},
73 	[IB_WR_SEND_WITH_INV]				= {
74 		.name	= "IB_WR_SEND_WITH_INV",
75 		.mask	= {
76 			[IB_QPT_RC]	= WR_INLINE_MASK | WR_SEND_MASK,
77 			[IB_QPT_UC]	= WR_INLINE_MASK | WR_SEND_MASK,
78 			[IB_QPT_UD]	= WR_INLINE_MASK | WR_SEND_MASK,
79 		},
80 	},
81 	[IB_WR_RDMA_READ_WITH_INV]			= {
82 		.name	= "IB_WR_RDMA_READ_WITH_INV",
83 		.mask	= {
84 			[IB_QPT_RC]	= WR_READ_MASK,
85 		},
86 	},
87 	[IB_WR_LOCAL_INV]				= {
88 		.name	= "IB_WR_LOCAL_INV",
89 		.mask	= {
90 			[IB_QPT_RC]	= WR_REG_MASK,
91 		},
92 	},
93 	[IB_WR_REG_MR]					= {
94 		.name	= "IB_WR_REG_MR",
95 		.mask	= {
96 			[IB_QPT_RC]	= WR_REG_MASK,
97 		},
98 	},
99 };
100 
101 struct rxe_opcode_info rxe_opcode[RXE_NUM_OPCODE] = {
102 	[IB_OPCODE_RC_SEND_FIRST]			= {
103 		.name	= "IB_OPCODE_RC_SEND_FIRST",
104 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_RWR_MASK
105 				| RXE_SEND_MASK | RXE_START_MASK,
106 		.length = RXE_BTH_BYTES,
107 		.offset = {
108 			[RXE_BTH]	= 0,
109 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
110 		}
111 	},
112 	[IB_OPCODE_RC_SEND_MIDDLE]		= {
113 		.name	= "IB_OPCODE_RC_SEND_MIDDLE]",
114 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_SEND_MASK
115 				| RXE_MIDDLE_MASK,
116 		.length = RXE_BTH_BYTES,
117 		.offset = {
118 			[RXE_BTH]	= 0,
119 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
120 		}
121 	},
122 	[IB_OPCODE_RC_SEND_LAST]			= {
123 		.name	= "IB_OPCODE_RC_SEND_LAST",
124 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_COMP_MASK
125 				| RXE_SEND_MASK | RXE_END_MASK,
126 		.length = RXE_BTH_BYTES,
127 		.offset = {
128 			[RXE_BTH]	= 0,
129 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
130 		}
131 	},
132 	[IB_OPCODE_RC_SEND_LAST_WITH_IMMEDIATE]		= {
133 		.name	= "IB_OPCODE_RC_SEND_LAST_WITH_IMMEDIATE",
134 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
135 				| RXE_COMP_MASK | RXE_SEND_MASK | RXE_END_MASK,
136 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
137 		.offset = {
138 			[RXE_BTH]	= 0,
139 			[RXE_IMMDT]	= RXE_BTH_BYTES,
140 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
141 						+ RXE_IMMDT_BYTES,
142 		}
143 	},
144 	[IB_OPCODE_RC_SEND_ONLY]			= {
145 		.name	= "IB_OPCODE_RC_SEND_ONLY",
146 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_COMP_MASK
147 				| RXE_RWR_MASK | RXE_SEND_MASK
148 				| RXE_START_MASK | RXE_END_MASK,
149 		.length = RXE_BTH_BYTES,
150 		.offset = {
151 			[RXE_BTH]	= 0,
152 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
153 		}
154 	},
155 	[IB_OPCODE_RC_SEND_ONLY_WITH_IMMEDIATE]		= {
156 		.name	= "IB_OPCODE_RC_SEND_ONLY_WITH_IMMEDIATE",
157 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
158 				| RXE_COMP_MASK | RXE_RWR_MASK | RXE_SEND_MASK
159 				| RXE_START_MASK | RXE_END_MASK,
160 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
161 		.offset = {
162 			[RXE_BTH]	= 0,
163 			[RXE_IMMDT]	= RXE_BTH_BYTES,
164 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
165 						+ RXE_IMMDT_BYTES,
166 		}
167 	},
168 	[IB_OPCODE_RC_RDMA_WRITE_FIRST]		= {
169 		.name	= "IB_OPCODE_RC_RDMA_WRITE_FIRST",
170 		.mask	= RXE_RETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
171 				| RXE_WRITE_MASK | RXE_START_MASK,
172 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES,
173 		.offset = {
174 			[RXE_BTH]	= 0,
175 			[RXE_RETH]	= RXE_BTH_BYTES,
176 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
177 						+ RXE_RETH_BYTES,
178 		}
179 	},
180 	[IB_OPCODE_RC_RDMA_WRITE_MIDDLE]		= {
181 		.name	= "IB_OPCODE_RC_RDMA_WRITE_MIDDLE",
182 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_WRITE_MASK
183 				| RXE_MIDDLE_MASK,
184 		.length = RXE_BTH_BYTES,
185 		.offset = {
186 			[RXE_BTH]	= 0,
187 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
188 		}
189 	},
190 	[IB_OPCODE_RC_RDMA_WRITE_LAST]			= {
191 		.name	= "IB_OPCODE_RC_RDMA_WRITE_LAST",
192 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_WRITE_MASK
193 				| RXE_END_MASK,
194 		.length = RXE_BTH_BYTES,
195 		.offset = {
196 			[RXE_BTH]	= 0,
197 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
198 		}
199 	},
200 	[IB_OPCODE_RC_RDMA_WRITE_LAST_WITH_IMMEDIATE]		= {
201 		.name	= "IB_OPCODE_RC_RDMA_WRITE_LAST_WITH_IMMEDIATE",
202 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
203 				| RXE_WRITE_MASK | RXE_COMP_MASK | RXE_RWR_MASK
204 				| RXE_END_MASK,
205 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
206 		.offset = {
207 			[RXE_BTH]	= 0,
208 			[RXE_IMMDT]	= RXE_BTH_BYTES,
209 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
210 						+ RXE_IMMDT_BYTES,
211 		}
212 	},
213 	[IB_OPCODE_RC_RDMA_WRITE_ONLY]			= {
214 		.name	= "IB_OPCODE_RC_RDMA_WRITE_ONLY",
215 		.mask	= RXE_RETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
216 				| RXE_WRITE_MASK | RXE_START_MASK
217 				| RXE_END_MASK,
218 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES,
219 		.offset = {
220 			[RXE_BTH]	= 0,
221 			[RXE_RETH]	= RXE_BTH_BYTES,
222 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
223 						+ RXE_RETH_BYTES,
224 		}
225 	},
226 	[IB_OPCODE_RC_RDMA_WRITE_ONLY_WITH_IMMEDIATE]		= {
227 		.name	= "IB_OPCODE_RC_RDMA_WRITE_ONLY_WITH_IMMEDIATE",
228 		.mask	= RXE_RETH_MASK | RXE_IMMDT_MASK | RXE_PAYLOAD_MASK
229 				| RXE_REQ_MASK | RXE_WRITE_MASK
230 				| RXE_COMP_MASK | RXE_RWR_MASK
231 				| RXE_START_MASK | RXE_END_MASK,
232 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_RETH_BYTES,
233 		.offset = {
234 			[RXE_BTH]	= 0,
235 			[RXE_RETH]	= RXE_BTH_BYTES,
236 			[RXE_IMMDT]	= RXE_BTH_BYTES
237 						+ RXE_RETH_BYTES,
238 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
239 						+ RXE_RETH_BYTES
240 						+ RXE_IMMDT_BYTES,
241 		}
242 	},
243 	[IB_OPCODE_RC_RDMA_READ_REQUEST]			= {
244 		.name	= "IB_OPCODE_RC_RDMA_READ_REQUEST",
245 		.mask	= RXE_RETH_MASK | RXE_REQ_MASK | RXE_READ_MASK
246 				| RXE_START_MASK | RXE_END_MASK,
247 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES,
248 		.offset = {
249 			[RXE_BTH]	= 0,
250 			[RXE_RETH]	= RXE_BTH_BYTES,
251 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
252 						+ RXE_RETH_BYTES,
253 		}
254 	},
255 	[IB_OPCODE_RC_RDMA_READ_RESPONSE_FIRST]		= {
256 		.name	= "IB_OPCODE_RC_RDMA_READ_RESPONSE_FIRST",
257 		.mask	= RXE_AETH_MASK | RXE_PAYLOAD_MASK | RXE_ACK_MASK
258 				| RXE_START_MASK,
259 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES,
260 		.offset = {
261 			[RXE_BTH]	= 0,
262 			[RXE_AETH]	= RXE_BTH_BYTES,
263 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
264 						+ RXE_AETH_BYTES,
265 		}
266 	},
267 	[IB_OPCODE_RC_RDMA_READ_RESPONSE_MIDDLE]		= {
268 		.name	= "IB_OPCODE_RC_RDMA_READ_RESPONSE_MIDDLE",
269 		.mask	= RXE_PAYLOAD_MASK | RXE_ACK_MASK | RXE_MIDDLE_MASK,
270 		.length = RXE_BTH_BYTES,
271 		.offset = {
272 			[RXE_BTH]	= 0,
273 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
274 		}
275 	},
276 	[IB_OPCODE_RC_RDMA_READ_RESPONSE_LAST]		= {
277 		.name	= "IB_OPCODE_RC_RDMA_READ_RESPONSE_LAST",
278 		.mask	= RXE_AETH_MASK | RXE_PAYLOAD_MASK | RXE_ACK_MASK
279 				| RXE_END_MASK,
280 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES,
281 		.offset = {
282 			[RXE_BTH]	= 0,
283 			[RXE_AETH]	= RXE_BTH_BYTES,
284 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
285 						+ RXE_AETH_BYTES,
286 		}
287 	},
288 	[IB_OPCODE_RC_RDMA_READ_RESPONSE_ONLY]		= {
289 		.name	= "IB_OPCODE_RC_RDMA_READ_RESPONSE_ONLY",
290 		.mask	= RXE_AETH_MASK | RXE_PAYLOAD_MASK | RXE_ACK_MASK
291 				| RXE_START_MASK | RXE_END_MASK,
292 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES,
293 		.offset = {
294 			[RXE_BTH]	= 0,
295 			[RXE_AETH]	= RXE_BTH_BYTES,
296 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
297 						+ RXE_AETH_BYTES,
298 		}
299 	},
300 	[IB_OPCODE_RC_ACKNOWLEDGE]			= {
301 		.name	= "IB_OPCODE_RC_ACKNOWLEDGE",
302 		.mask	= RXE_AETH_MASK | RXE_ACK_MASK | RXE_START_MASK
303 				| RXE_END_MASK,
304 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES,
305 		.offset = {
306 			[RXE_BTH]	= 0,
307 			[RXE_AETH]	= RXE_BTH_BYTES,
308 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
309 						+ RXE_AETH_BYTES,
310 		}
311 	},
312 	[IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE]			= {
313 		.name	= "IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE",
314 		.mask	= RXE_AETH_MASK | RXE_ATMACK_MASK | RXE_ACK_MASK
315 				| RXE_START_MASK | RXE_END_MASK,
316 		.length = RXE_BTH_BYTES + RXE_ATMACK_BYTES + RXE_AETH_BYTES,
317 		.offset = {
318 			[RXE_BTH]	= 0,
319 			[RXE_AETH]	= RXE_BTH_BYTES,
320 			[RXE_ATMACK]	= RXE_BTH_BYTES
321 						+ RXE_AETH_BYTES,
322 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
323 					+ RXE_ATMACK_BYTES + RXE_AETH_BYTES,
324 		}
325 	},
326 	[IB_OPCODE_RC_COMPARE_SWAP]			= {
327 		.name	= "IB_OPCODE_RC_COMPARE_SWAP",
328 		.mask	= RXE_ATMETH_MASK | RXE_REQ_MASK | RXE_ATOMIC_MASK
329 				| RXE_START_MASK | RXE_END_MASK,
330 		.length = RXE_BTH_BYTES + RXE_ATMETH_BYTES,
331 		.offset = {
332 			[RXE_BTH]	= 0,
333 			[RXE_ATMETH]	= RXE_BTH_BYTES,
334 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
335 						+ RXE_ATMETH_BYTES,
336 		}
337 	},
338 	[IB_OPCODE_RC_FETCH_ADD]			= {
339 		.name	= "IB_OPCODE_RC_FETCH_ADD",
340 		.mask	= RXE_ATMETH_MASK | RXE_REQ_MASK | RXE_ATOMIC_MASK
341 				| RXE_START_MASK | RXE_END_MASK,
342 		.length = RXE_BTH_BYTES + RXE_ATMETH_BYTES,
343 		.offset = {
344 			[RXE_BTH]	= 0,
345 			[RXE_ATMETH]	= RXE_BTH_BYTES,
346 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
347 						+ RXE_ATMETH_BYTES,
348 		}
349 	},
350 	[IB_OPCODE_RC_SEND_LAST_WITH_INVALIDATE]		= {
351 		.name	= "IB_OPCODE_RC_SEND_LAST_WITH_INVALIDATE",
352 		.mask	= RXE_IETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
353 				| RXE_COMP_MASK | RXE_SEND_MASK | RXE_END_MASK,
354 		.length = RXE_BTH_BYTES + RXE_IETH_BYTES,
355 		.offset = {
356 			[RXE_BTH]	= 0,
357 			[RXE_IETH]	= RXE_BTH_BYTES,
358 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
359 						+ RXE_IETH_BYTES,
360 		}
361 	},
362 	[IB_OPCODE_RC_SEND_ONLY_WITH_INVALIDATE]		= {
363 		.name	= "IB_OPCODE_RC_SEND_ONLY_INV",
364 		.mask	= RXE_IETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
365 				| RXE_COMP_MASK | RXE_RWR_MASK | RXE_SEND_MASK
366 				| RXE_END_MASK  | RXE_START_MASK,
367 		.length = RXE_BTH_BYTES + RXE_IETH_BYTES,
368 		.offset = {
369 			[RXE_BTH]	= 0,
370 			[RXE_IETH]	= RXE_BTH_BYTES,
371 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
372 						+ RXE_IETH_BYTES,
373 		}
374 	},
375 
376 	/* UC */
377 	[IB_OPCODE_UC_SEND_FIRST]			= {
378 		.name	= "IB_OPCODE_UC_SEND_FIRST",
379 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_RWR_MASK
380 				| RXE_SEND_MASK | RXE_START_MASK,
381 		.length = RXE_BTH_BYTES,
382 		.offset = {
383 			[RXE_BTH]	= 0,
384 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
385 		}
386 	},
387 	[IB_OPCODE_UC_SEND_MIDDLE]		= {
388 		.name	= "IB_OPCODE_UC_SEND_MIDDLE",
389 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_SEND_MASK
390 				| RXE_MIDDLE_MASK,
391 		.length = RXE_BTH_BYTES,
392 		.offset = {
393 			[RXE_BTH]	= 0,
394 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
395 		}
396 	},
397 	[IB_OPCODE_UC_SEND_LAST]			= {
398 		.name	= "IB_OPCODE_UC_SEND_LAST",
399 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_COMP_MASK
400 				| RXE_SEND_MASK | RXE_END_MASK,
401 		.length = RXE_BTH_BYTES,
402 		.offset = {
403 			[RXE_BTH]	= 0,
404 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
405 		}
406 	},
407 	[IB_OPCODE_UC_SEND_LAST_WITH_IMMEDIATE]		= {
408 		.name	= "IB_OPCODE_UC_SEND_LAST_WITH_IMMEDIATE",
409 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
410 				| RXE_COMP_MASK | RXE_SEND_MASK | RXE_END_MASK,
411 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
412 		.offset = {
413 			[RXE_BTH]	= 0,
414 			[RXE_IMMDT]	= RXE_BTH_BYTES,
415 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
416 						+ RXE_IMMDT_BYTES,
417 		}
418 	},
419 	[IB_OPCODE_UC_SEND_ONLY]			= {
420 		.name	= "IB_OPCODE_UC_SEND_ONLY",
421 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_COMP_MASK
422 				| RXE_RWR_MASK | RXE_SEND_MASK
423 				| RXE_START_MASK | RXE_END_MASK,
424 		.length = RXE_BTH_BYTES,
425 		.offset = {
426 			[RXE_BTH]	= 0,
427 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
428 		}
429 	},
430 	[IB_OPCODE_UC_SEND_ONLY_WITH_IMMEDIATE]		= {
431 		.name	= "IB_OPCODE_UC_SEND_ONLY_WITH_IMMEDIATE",
432 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
433 				| RXE_COMP_MASK | RXE_RWR_MASK | RXE_SEND_MASK
434 				| RXE_START_MASK | RXE_END_MASK,
435 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
436 		.offset = {
437 			[RXE_BTH]	= 0,
438 			[RXE_IMMDT]	= RXE_BTH_BYTES,
439 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
440 						+ RXE_IMMDT_BYTES,
441 		}
442 	},
443 	[IB_OPCODE_UC_RDMA_WRITE_FIRST]		= {
444 		.name	= "IB_OPCODE_UC_RDMA_WRITE_FIRST",
445 		.mask	= RXE_RETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
446 				| RXE_WRITE_MASK | RXE_START_MASK,
447 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES,
448 		.offset = {
449 			[RXE_BTH]	= 0,
450 			[RXE_RETH]	= RXE_BTH_BYTES,
451 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
452 						+ RXE_RETH_BYTES,
453 		}
454 	},
455 	[IB_OPCODE_UC_RDMA_WRITE_MIDDLE]		= {
456 		.name	= "IB_OPCODE_UC_RDMA_WRITE_MIDDLE",
457 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_WRITE_MASK
458 				| RXE_MIDDLE_MASK,
459 		.length = RXE_BTH_BYTES,
460 		.offset = {
461 			[RXE_BTH]	= 0,
462 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
463 		}
464 	},
465 	[IB_OPCODE_UC_RDMA_WRITE_LAST]			= {
466 		.name	= "IB_OPCODE_UC_RDMA_WRITE_LAST",
467 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_WRITE_MASK
468 				| RXE_END_MASK,
469 		.length = RXE_BTH_BYTES,
470 		.offset = {
471 			[RXE_BTH]	= 0,
472 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
473 		}
474 	},
475 	[IB_OPCODE_UC_RDMA_WRITE_LAST_WITH_IMMEDIATE]		= {
476 		.name	= "IB_OPCODE_UC_RDMA_WRITE_LAST_WITH_IMMEDIATE",
477 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
478 				| RXE_WRITE_MASK | RXE_COMP_MASK | RXE_RWR_MASK
479 				| RXE_END_MASK,
480 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
481 		.offset = {
482 			[RXE_BTH]	= 0,
483 			[RXE_IMMDT]	= RXE_BTH_BYTES,
484 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
485 						+ RXE_IMMDT_BYTES,
486 		}
487 	},
488 	[IB_OPCODE_UC_RDMA_WRITE_ONLY]			= {
489 		.name	= "IB_OPCODE_UC_RDMA_WRITE_ONLY",
490 		.mask	= RXE_RETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
491 				| RXE_WRITE_MASK | RXE_START_MASK
492 				| RXE_END_MASK,
493 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES,
494 		.offset = {
495 			[RXE_BTH]	= 0,
496 			[RXE_RETH]	= RXE_BTH_BYTES,
497 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
498 						+ RXE_RETH_BYTES,
499 		}
500 	},
501 	[IB_OPCODE_UC_RDMA_WRITE_ONLY_WITH_IMMEDIATE]		= {
502 		.name	= "IB_OPCODE_UC_RDMA_WRITE_ONLY_WITH_IMMEDIATE",
503 		.mask	= RXE_RETH_MASK | RXE_IMMDT_MASK | RXE_PAYLOAD_MASK
504 				| RXE_REQ_MASK | RXE_WRITE_MASK
505 				| RXE_COMP_MASK | RXE_RWR_MASK
506 				| RXE_START_MASK | RXE_END_MASK,
507 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_RETH_BYTES,
508 		.offset = {
509 			[RXE_BTH]	= 0,
510 			[RXE_RETH]	= RXE_BTH_BYTES,
511 			[RXE_IMMDT]	= RXE_BTH_BYTES
512 						+ RXE_RETH_BYTES,
513 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
514 						+ RXE_RETH_BYTES
515 						+ RXE_IMMDT_BYTES,
516 		}
517 	},
518 
519 	/* RD */
520 	[IB_OPCODE_RD_SEND_FIRST]			= {
521 		.name	= "IB_OPCODE_RD_SEND_FIRST",
522 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
523 				| RXE_REQ_MASK | RXE_RWR_MASK | RXE_SEND_MASK
524 				| RXE_START_MASK,
525 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
526 		.offset = {
527 			[RXE_BTH]	= 0,
528 			[RXE_RDETH]	= RXE_BTH_BYTES,
529 			[RXE_DETH]	= RXE_BTH_BYTES
530 						+ RXE_RDETH_BYTES,
531 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
532 						+ RXE_RDETH_BYTES
533 						+ RXE_DETH_BYTES,
534 		}
535 	},
536 	[IB_OPCODE_RD_SEND_MIDDLE]		= {
537 		.name	= "IB_OPCODE_RD_SEND_MIDDLE",
538 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
539 				| RXE_REQ_MASK | RXE_SEND_MASK
540 				| RXE_MIDDLE_MASK,
541 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
542 		.offset = {
543 			[RXE_BTH]	= 0,
544 			[RXE_RDETH]	= RXE_BTH_BYTES,
545 			[RXE_DETH]	= RXE_BTH_BYTES
546 						+ RXE_RDETH_BYTES,
547 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
548 						+ RXE_RDETH_BYTES
549 						+ RXE_DETH_BYTES,
550 		}
551 	},
552 	[IB_OPCODE_RD_SEND_LAST]			= {
553 		.name	= "IB_OPCODE_RD_SEND_LAST",
554 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
555 				| RXE_REQ_MASK | RXE_COMP_MASK | RXE_SEND_MASK
556 				| RXE_END_MASK,
557 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
558 		.offset = {
559 			[RXE_BTH]	= 0,
560 			[RXE_RDETH]	= RXE_BTH_BYTES,
561 			[RXE_DETH]	= RXE_BTH_BYTES
562 						+ RXE_RDETH_BYTES,
563 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
564 						+ RXE_RDETH_BYTES
565 						+ RXE_DETH_BYTES,
566 		}
567 	},
568 	[IB_OPCODE_RD_SEND_LAST_WITH_IMMEDIATE]		= {
569 		.name	= "IB_OPCODE_RD_SEND_LAST_WITH_IMMEDIATE",
570 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_IMMDT_MASK
571 				| RXE_PAYLOAD_MASK | RXE_REQ_MASK
572 				| RXE_COMP_MASK | RXE_SEND_MASK
573 				| RXE_END_MASK,
574 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_DETH_BYTES
575 				+ RXE_RDETH_BYTES,
576 		.offset = {
577 			[RXE_BTH]	= 0,
578 			[RXE_RDETH]	= RXE_BTH_BYTES,
579 			[RXE_DETH]	= RXE_BTH_BYTES
580 						+ RXE_RDETH_BYTES,
581 			[RXE_IMMDT]	= RXE_BTH_BYTES
582 						+ RXE_RDETH_BYTES
583 						+ RXE_DETH_BYTES,
584 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
585 						+ RXE_RDETH_BYTES
586 						+ RXE_DETH_BYTES
587 						+ RXE_IMMDT_BYTES,
588 		}
589 	},
590 	[IB_OPCODE_RD_SEND_ONLY]			= {
591 		.name	= "IB_OPCODE_RD_SEND_ONLY",
592 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
593 				| RXE_REQ_MASK | RXE_COMP_MASK | RXE_RWR_MASK
594 				| RXE_SEND_MASK | RXE_START_MASK | RXE_END_MASK,
595 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
596 		.offset = {
597 			[RXE_BTH]	= 0,
598 			[RXE_RDETH]	= RXE_BTH_BYTES,
599 			[RXE_DETH]	= RXE_BTH_BYTES
600 						+ RXE_RDETH_BYTES,
601 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
602 						+ RXE_RDETH_BYTES
603 						+ RXE_DETH_BYTES,
604 		}
605 	},
606 	[IB_OPCODE_RD_SEND_ONLY_WITH_IMMEDIATE]		= {
607 		.name	= "IB_OPCODE_RD_SEND_ONLY_WITH_IMMEDIATE",
608 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_IMMDT_MASK
609 				| RXE_PAYLOAD_MASK | RXE_REQ_MASK
610 				| RXE_COMP_MASK | RXE_RWR_MASK | RXE_SEND_MASK
611 				| RXE_START_MASK | RXE_END_MASK,
612 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_DETH_BYTES
613 				+ RXE_RDETH_BYTES,
614 		.offset = {
615 			[RXE_BTH]	= 0,
616 			[RXE_RDETH]	= RXE_BTH_BYTES,
617 			[RXE_DETH]	= RXE_BTH_BYTES
618 						+ RXE_RDETH_BYTES,
619 			[RXE_IMMDT]	= RXE_BTH_BYTES
620 						+ RXE_RDETH_BYTES
621 						+ RXE_DETH_BYTES,
622 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
623 						+ RXE_RDETH_BYTES
624 						+ RXE_DETH_BYTES
625 						+ RXE_IMMDT_BYTES,
626 		}
627 	},
628 	[IB_OPCODE_RD_RDMA_WRITE_FIRST]		= {
629 		.name	= "IB_OPCODE_RD_RDMA_WRITE_FIRST",
630 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_RETH_MASK
631 				| RXE_PAYLOAD_MASK | RXE_REQ_MASK
632 				| RXE_WRITE_MASK | RXE_START_MASK,
633 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES + RXE_DETH_BYTES
634 				+ RXE_RDETH_BYTES,
635 		.offset = {
636 			[RXE_BTH]	= 0,
637 			[RXE_RDETH]	= RXE_BTH_BYTES,
638 			[RXE_DETH]	= RXE_BTH_BYTES
639 						+ RXE_RDETH_BYTES,
640 			[RXE_RETH]	= RXE_BTH_BYTES
641 						+ RXE_RDETH_BYTES
642 						+ RXE_DETH_BYTES,
643 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
644 						+ RXE_RDETH_BYTES
645 						+ RXE_DETH_BYTES
646 						+ RXE_RETH_BYTES,
647 		}
648 	},
649 	[IB_OPCODE_RD_RDMA_WRITE_MIDDLE]		= {
650 		.name	= "IB_OPCODE_RD_RDMA_WRITE_MIDDLE",
651 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
652 				| RXE_REQ_MASK | RXE_WRITE_MASK
653 				| RXE_MIDDLE_MASK,
654 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
655 		.offset = {
656 			[RXE_BTH]	= 0,
657 			[RXE_RDETH]	= RXE_BTH_BYTES,
658 			[RXE_DETH]	= RXE_BTH_BYTES
659 						+ RXE_RDETH_BYTES,
660 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
661 						+ RXE_RDETH_BYTES
662 						+ RXE_DETH_BYTES,
663 		}
664 	},
665 	[IB_OPCODE_RD_RDMA_WRITE_LAST]			= {
666 		.name	= "IB_OPCODE_RD_RDMA_WRITE_LAST",
667 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
668 				| RXE_REQ_MASK | RXE_WRITE_MASK
669 				| RXE_END_MASK,
670 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
671 		.offset = {
672 			[RXE_BTH]	= 0,
673 			[RXE_RDETH]	= RXE_BTH_BYTES,
674 			[RXE_DETH]	= RXE_BTH_BYTES
675 						+ RXE_RDETH_BYTES,
676 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
677 						+ RXE_RDETH_BYTES
678 						+ RXE_DETH_BYTES,
679 		}
680 	},
681 	[IB_OPCODE_RD_RDMA_WRITE_LAST_WITH_IMMEDIATE]		= {
682 		.name	= "IB_OPCODE_RD_RDMA_WRITE_LAST_WITH_IMMEDIATE",
683 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_IMMDT_MASK
684 				| RXE_PAYLOAD_MASK | RXE_REQ_MASK
685 				| RXE_WRITE_MASK | RXE_COMP_MASK | RXE_RWR_MASK
686 				| RXE_END_MASK,
687 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_DETH_BYTES
688 				+ RXE_RDETH_BYTES,
689 		.offset = {
690 			[RXE_BTH]	= 0,
691 			[RXE_RDETH]	= RXE_BTH_BYTES,
692 			[RXE_DETH]	= RXE_BTH_BYTES
693 						+ RXE_RDETH_BYTES,
694 			[RXE_IMMDT]	= RXE_BTH_BYTES
695 						+ RXE_RDETH_BYTES
696 						+ RXE_DETH_BYTES,
697 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
698 						+ RXE_RDETH_BYTES
699 						+ RXE_DETH_BYTES
700 						+ RXE_IMMDT_BYTES,
701 		}
702 	},
703 	[IB_OPCODE_RD_RDMA_WRITE_ONLY]			= {
704 		.name	= "IB_OPCODE_RD_RDMA_WRITE_ONLY",
705 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_RETH_MASK
706 				| RXE_PAYLOAD_MASK | RXE_REQ_MASK
707 				| RXE_WRITE_MASK | RXE_START_MASK
708 				| RXE_END_MASK,
709 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES + RXE_DETH_BYTES
710 				+ RXE_RDETH_BYTES,
711 		.offset = {
712 			[RXE_BTH]	= 0,
713 			[RXE_RDETH]	= RXE_BTH_BYTES,
714 			[RXE_DETH]	= RXE_BTH_BYTES
715 						+ RXE_RDETH_BYTES,
716 			[RXE_RETH]	= RXE_BTH_BYTES
717 						+ RXE_RDETH_BYTES
718 						+ RXE_DETH_BYTES,
719 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
720 						+ RXE_RDETH_BYTES
721 						+ RXE_DETH_BYTES
722 						+ RXE_RETH_BYTES,
723 		}
724 	},
725 	[IB_OPCODE_RD_RDMA_WRITE_ONLY_WITH_IMMEDIATE]		= {
726 		.name	= "IB_OPCODE_RD_RDMA_WRITE_ONLY_WITH_IMMEDIATE",
727 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_RETH_MASK
728 				| RXE_IMMDT_MASK | RXE_PAYLOAD_MASK
729 				| RXE_REQ_MASK | RXE_WRITE_MASK
730 				| RXE_COMP_MASK | RXE_RWR_MASK
731 				| RXE_START_MASK | RXE_END_MASK,
732 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_RETH_BYTES
733 				+ RXE_DETH_BYTES + RXE_RDETH_BYTES,
734 		.offset = {
735 			[RXE_BTH]	= 0,
736 			[RXE_RDETH]	= RXE_BTH_BYTES,
737 			[RXE_DETH]	= RXE_BTH_BYTES
738 						+ RXE_RDETH_BYTES,
739 			[RXE_RETH]	= RXE_BTH_BYTES
740 						+ RXE_RDETH_BYTES
741 						+ RXE_DETH_BYTES,
742 			[RXE_IMMDT]	= RXE_BTH_BYTES
743 						+ RXE_RDETH_BYTES
744 						+ RXE_DETH_BYTES
745 						+ RXE_RETH_BYTES,
746 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
747 						+ RXE_RDETH_BYTES
748 						+ RXE_DETH_BYTES
749 						+ RXE_RETH_BYTES
750 						+ RXE_IMMDT_BYTES,
751 		}
752 	},
753 	[IB_OPCODE_RD_RDMA_READ_REQUEST]			= {
754 		.name	= "IB_OPCODE_RD_RDMA_READ_REQUEST",
755 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_RETH_MASK
756 				| RXE_REQ_MASK | RXE_READ_MASK
757 				| RXE_START_MASK | RXE_END_MASK,
758 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES + RXE_DETH_BYTES
759 				+ RXE_RDETH_BYTES,
760 		.offset = {
761 			[RXE_BTH]	= 0,
762 			[RXE_RDETH]	= RXE_BTH_BYTES,
763 			[RXE_DETH]	= RXE_BTH_BYTES
764 						+ RXE_RDETH_BYTES,
765 			[RXE_RETH]	= RXE_BTH_BYTES
766 						+ RXE_RDETH_BYTES
767 						+ RXE_DETH_BYTES,
768 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
769 						+ RXE_RETH_BYTES
770 						+ RXE_DETH_BYTES
771 						+ RXE_RDETH_BYTES,
772 		}
773 	},
774 	[IB_OPCODE_RD_RDMA_READ_RESPONSE_FIRST]		= {
775 		.name	= "IB_OPCODE_RD_RDMA_READ_RESPONSE_FIRST",
776 		.mask	= RXE_RDETH_MASK | RXE_AETH_MASK
777 				| RXE_PAYLOAD_MASK | RXE_ACK_MASK
778 				| RXE_START_MASK,
779 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES + RXE_RDETH_BYTES,
780 		.offset = {
781 			[RXE_BTH]	= 0,
782 			[RXE_RDETH]	= RXE_BTH_BYTES,
783 			[RXE_AETH]	= RXE_BTH_BYTES
784 						+ RXE_RDETH_BYTES,
785 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
786 						+ RXE_RDETH_BYTES
787 						+ RXE_AETH_BYTES,
788 		}
789 	},
790 	[IB_OPCODE_RD_RDMA_READ_RESPONSE_MIDDLE]		= {
791 		.name	= "IB_OPCODE_RD_RDMA_READ_RESPONSE_MIDDLE",
792 		.mask	= RXE_RDETH_MASK | RXE_PAYLOAD_MASK | RXE_ACK_MASK
793 				| RXE_MIDDLE_MASK,
794 		.length = RXE_BTH_BYTES + RXE_RDETH_BYTES,
795 		.offset = {
796 			[RXE_BTH]	= 0,
797 			[RXE_RDETH]	= RXE_BTH_BYTES,
798 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
799 						+ RXE_RDETH_BYTES,
800 		}
801 	},
802 	[IB_OPCODE_RD_RDMA_READ_RESPONSE_LAST]		= {
803 		.name	= "IB_OPCODE_RD_RDMA_READ_RESPONSE_LAST",
804 		.mask	= RXE_RDETH_MASK | RXE_AETH_MASK | RXE_PAYLOAD_MASK
805 				| RXE_ACK_MASK | RXE_END_MASK,
806 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES + RXE_RDETH_BYTES,
807 		.offset = {
808 			[RXE_BTH]	= 0,
809 			[RXE_RDETH]	= RXE_BTH_BYTES,
810 			[RXE_AETH]	= RXE_BTH_BYTES
811 						+ RXE_RDETH_BYTES,
812 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
813 						+ RXE_RDETH_BYTES
814 						+ RXE_AETH_BYTES,
815 		}
816 	},
817 	[IB_OPCODE_RD_RDMA_READ_RESPONSE_ONLY]		= {
818 		.name	= "IB_OPCODE_RD_RDMA_READ_RESPONSE_ONLY",
819 		.mask	= RXE_RDETH_MASK | RXE_AETH_MASK | RXE_PAYLOAD_MASK
820 				| RXE_ACK_MASK | RXE_START_MASK | RXE_END_MASK,
821 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES + RXE_RDETH_BYTES,
822 		.offset = {
823 			[RXE_BTH]	= 0,
824 			[RXE_RDETH]	= RXE_BTH_BYTES,
825 			[RXE_AETH]	= RXE_BTH_BYTES
826 						+ RXE_RDETH_BYTES,
827 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
828 						+ RXE_RDETH_BYTES
829 						+ RXE_AETH_BYTES,
830 		}
831 	},
832 	[IB_OPCODE_RD_ACKNOWLEDGE]			= {
833 		.name	= "IB_OPCODE_RD_ACKNOWLEDGE",
834 		.mask	= RXE_RDETH_MASK | RXE_AETH_MASK | RXE_ACK_MASK
835 				| RXE_START_MASK | RXE_END_MASK,
836 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES + RXE_RDETH_BYTES,
837 		.offset = {
838 			[RXE_BTH]	= 0,
839 			[RXE_RDETH]	= RXE_BTH_BYTES,
840 			[RXE_AETH]	= RXE_BTH_BYTES
841 						+ RXE_RDETH_BYTES,
842 		}
843 	},
844 	[IB_OPCODE_RD_ATOMIC_ACKNOWLEDGE]			= {
845 		.name	= "IB_OPCODE_RD_ATOMIC_ACKNOWLEDGE",
846 		.mask	= RXE_RDETH_MASK | RXE_AETH_MASK | RXE_ATMACK_MASK
847 				| RXE_ACK_MASK | RXE_START_MASK | RXE_END_MASK,
848 		.length = RXE_BTH_BYTES + RXE_ATMACK_BYTES + RXE_AETH_BYTES
849 				+ RXE_RDETH_BYTES,
850 		.offset = {
851 			[RXE_BTH]	= 0,
852 			[RXE_RDETH]	= RXE_BTH_BYTES,
853 			[RXE_AETH]	= RXE_BTH_BYTES
854 						+ RXE_RDETH_BYTES,
855 			[RXE_ATMACK]	= RXE_BTH_BYTES
856 						+ RXE_RDETH_BYTES
857 						+ RXE_AETH_BYTES,
858 		}
859 	},
860 	[IB_OPCODE_RD_COMPARE_SWAP]			= {
861 		.name	= "RD_COMPARE_SWAP",
862 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_ATMETH_MASK
863 				| RXE_REQ_MASK | RXE_ATOMIC_MASK
864 				| RXE_START_MASK | RXE_END_MASK,
865 		.length = RXE_BTH_BYTES + RXE_ATMETH_BYTES + RXE_DETH_BYTES
866 				+ RXE_RDETH_BYTES,
867 		.offset = {
868 			[RXE_BTH]	= 0,
869 			[RXE_RDETH]	= RXE_BTH_BYTES,
870 			[RXE_DETH]	= RXE_BTH_BYTES
871 						+ RXE_RDETH_BYTES,
872 			[RXE_ATMETH]	= RXE_BTH_BYTES
873 						+ RXE_RDETH_BYTES
874 						+ RXE_DETH_BYTES,
875 			[RXE_PAYLOAD]	= RXE_BTH_BYTES +
876 						+ RXE_ATMETH_BYTES
877 						+ RXE_DETH_BYTES +
878 						+ RXE_RDETH_BYTES,
879 		}
880 	},
881 	[IB_OPCODE_RD_FETCH_ADD]			= {
882 		.name	= "IB_OPCODE_RD_FETCH_ADD",
883 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_ATMETH_MASK
884 				| RXE_REQ_MASK | RXE_ATOMIC_MASK
885 				| RXE_START_MASK | RXE_END_MASK,
886 		.length = RXE_BTH_BYTES + RXE_ATMETH_BYTES + RXE_DETH_BYTES
887 				+ RXE_RDETH_BYTES,
888 		.offset = {
889 			[RXE_BTH]	= 0,
890 			[RXE_RDETH]	= RXE_BTH_BYTES,
891 			[RXE_DETH]	= RXE_BTH_BYTES
892 						+ RXE_RDETH_BYTES,
893 			[RXE_ATMETH]	= RXE_BTH_BYTES
894 						+ RXE_RDETH_BYTES
895 						+ RXE_DETH_BYTES,
896 			[RXE_PAYLOAD]	= RXE_BTH_BYTES +
897 						+ RXE_ATMETH_BYTES
898 						+ RXE_DETH_BYTES +
899 						+ RXE_RDETH_BYTES,
900 		}
901 	},
902 
903 	/* UD */
904 	[IB_OPCODE_UD_SEND_ONLY]			= {
905 		.name	= "IB_OPCODE_UD_SEND_ONLY",
906 		.mask	= RXE_DETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
907 				| RXE_COMP_MASK | RXE_RWR_MASK | RXE_SEND_MASK
908 				| RXE_START_MASK | RXE_END_MASK,
909 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES,
910 		.offset = {
911 			[RXE_BTH]	= 0,
912 			[RXE_DETH]	= RXE_BTH_BYTES,
913 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
914 						+ RXE_DETH_BYTES,
915 		}
916 	},
917 	[IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE]		= {
918 		.name	= "IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE",
919 		.mask	= RXE_DETH_MASK | RXE_IMMDT_MASK | RXE_PAYLOAD_MASK
920 				| RXE_REQ_MASK | RXE_COMP_MASK | RXE_RWR_MASK
921 				| RXE_SEND_MASK | RXE_START_MASK | RXE_END_MASK,
922 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_DETH_BYTES,
923 		.offset = {
924 			[RXE_BTH]	= 0,
925 			[RXE_DETH]	= RXE_BTH_BYTES,
926 			[RXE_IMMDT]	= RXE_BTH_BYTES
927 						+ RXE_DETH_BYTES,
928 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
929 						+ RXE_DETH_BYTES
930 						+ RXE_IMMDT_BYTES,
931 		}
932 	},
933 
934 };
935