xref: /f-stack/dpdk/drivers/net/octeontx2/otx2_tx.h (revision 2d9fd380)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2019 Marvell International Ltd.
3  */
4 
5 #ifndef __OTX2_TX_H__
6 #define __OTX2_TX_H__
7 
8 #define NIX_TX_OFFLOAD_NONE		(0)
9 #define NIX_TX_OFFLOAD_L3_L4_CSUM_F	BIT(0)
10 #define NIX_TX_OFFLOAD_OL3_OL4_CSUM_F	BIT(1)
11 #define NIX_TX_OFFLOAD_VLAN_QINQ_F	BIT(2)
12 #define NIX_TX_OFFLOAD_MBUF_NOFF_F	BIT(3)
13 #define NIX_TX_OFFLOAD_TSTAMP_F		BIT(4)
14 #define NIX_TX_OFFLOAD_TSO_F		BIT(5)
15 #define NIX_TX_OFFLOAD_SECURITY_F	BIT(6)
16 
17 /* Flags to control xmit_prepare function.
18  * Defining it from backwards to denote its been
19  * not used as offload flags to pick function
20  */
21 #define NIX_TX_MULTI_SEG_F		BIT(15)
22 
23 #define NIX_TX_NEED_SEND_HDR_W1	\
24 	(NIX_TX_OFFLOAD_L3_L4_CSUM_F | NIX_TX_OFFLOAD_OL3_OL4_CSUM_F |	\
25 	 NIX_TX_OFFLOAD_VLAN_QINQ_F | NIX_TX_OFFLOAD_TSO_F)
26 
27 #define NIX_TX_NEED_EXT_HDR \
28 	(NIX_TX_OFFLOAD_VLAN_QINQ_F | NIX_TX_OFFLOAD_TSTAMP_F | \
29 	 NIX_TX_OFFLOAD_TSO_F)
30 
31 #define NIX_UDP_TUN_BITMASK \
32 	((1ull << (PKT_TX_TUNNEL_VXLAN >> 45)) | \
33 	 (1ull << (PKT_TX_TUNNEL_GENEVE >> 45)))
34 
35 #define NIX_LSO_FORMAT_IDX_TSOV4	(0)
36 #define NIX_LSO_FORMAT_IDX_TSOV6	(1)
37 
38 /* Function to determine no of tx subdesc required in case ext
39  * sub desc is enabled.
40  */
41 static __rte_always_inline int
otx2_nix_tx_ext_subs(const uint16_t flags)42 otx2_nix_tx_ext_subs(const uint16_t flags)
43 {
44 	return (flags & NIX_TX_OFFLOAD_TSTAMP_F) ? 2 :
45 		((flags & (NIX_TX_OFFLOAD_VLAN_QINQ_F | NIX_TX_OFFLOAD_TSO_F)) ?
46 		 1 : 0);
47 }
48 
49 static __rte_always_inline void
otx2_nix_xmit_prepare_tstamp(uint64_t * cmd,const uint64_t * send_mem_desc,const uint64_t ol_flags,const uint16_t no_segdw,const uint16_t flags)50 otx2_nix_xmit_prepare_tstamp(uint64_t *cmd,  const uint64_t *send_mem_desc,
51 			     const uint64_t ol_flags, const uint16_t no_segdw,
52 			     const uint16_t flags)
53 {
54 	if (flags & NIX_TX_OFFLOAD_TSTAMP_F) {
55 		struct nix_send_mem_s *send_mem;
56 		uint16_t off = (no_segdw - 1) << 1;
57 		const uint8_t is_ol_tstamp = !(ol_flags & PKT_TX_IEEE1588_TMST);
58 
59 		send_mem = (struct nix_send_mem_s *)(cmd + off);
60 		if (flags & NIX_TX_MULTI_SEG_F) {
61 			/* Retrieving the default desc values */
62 			cmd[off] = send_mem_desc[6];
63 
64 			/* Using compiler barier to avoid voilation of C
65 			 * aliasing rules.
66 			 */
67 			rte_compiler_barrier();
68 		}
69 
70 		/* Packets for which PKT_TX_IEEE1588_TMST is not set, tx tstamp
71 		 * should not be recorded, hence changing the alg type to
72 		 * NIX_SENDMEMALG_SET and also changing send mem addr field to
73 		 * next 8 bytes as it corrpt the actual tx tstamp registered
74 		 * address.
75 		 */
76 		send_mem->alg = NIX_SENDMEMALG_SETTSTMP - (is_ol_tstamp);
77 
78 		send_mem->addr = (rte_iova_t)((uint64_t *)send_mem_desc[7] +
79 					      (is_ol_tstamp));
80 	}
81 }
82 
83 static __rte_always_inline uint64_t
otx2_pktmbuf_detach(struct rte_mbuf * m)84 otx2_pktmbuf_detach(struct rte_mbuf *m)
85 {
86 	struct rte_mempool *mp = m->pool;
87 	uint32_t mbuf_size, buf_len;
88 	struct rte_mbuf *md;
89 	uint16_t priv_size;
90 	uint16_t refcount;
91 
92 	/* Update refcount of direct mbuf */
93 	md = rte_mbuf_from_indirect(m);
94 	refcount = rte_mbuf_refcnt_update(md, -1);
95 
96 	priv_size = rte_pktmbuf_priv_size(mp);
97 	mbuf_size = (uint32_t)(sizeof(struct rte_mbuf) + priv_size);
98 	buf_len = rte_pktmbuf_data_room_size(mp);
99 
100 	m->priv_size = priv_size;
101 	m->buf_addr = (char *)m + mbuf_size;
102 	m->buf_iova = rte_mempool_virt2iova(m) + mbuf_size;
103 	m->buf_len = (uint16_t)buf_len;
104 	rte_pktmbuf_reset_headroom(m);
105 	m->data_len = 0;
106 	m->ol_flags = 0;
107 	m->next = NULL;
108 	m->nb_segs = 1;
109 
110 	/* Now indirect mbuf is safe to free */
111 	rte_pktmbuf_free(m);
112 
113 	if (refcount == 0) {
114 		rte_mbuf_refcnt_set(md, 1);
115 		md->data_len = 0;
116 		md->ol_flags = 0;
117 		md->next = NULL;
118 		md->nb_segs = 1;
119 		return 0;
120 	} else {
121 		return 1;
122 	}
123 }
124 
125 static __rte_always_inline uint64_t
otx2_nix_prefree_seg(struct rte_mbuf * m)126 otx2_nix_prefree_seg(struct rte_mbuf *m)
127 {
128 	if (likely(rte_mbuf_refcnt_read(m) == 1)) {
129 		if (!RTE_MBUF_DIRECT(m))
130 			return otx2_pktmbuf_detach(m);
131 
132 		m->next = NULL;
133 		m->nb_segs = 1;
134 		return 0;
135 	} else if (rte_mbuf_refcnt_update(m, -1) == 0) {
136 		if (!RTE_MBUF_DIRECT(m))
137 			return otx2_pktmbuf_detach(m);
138 
139 		rte_mbuf_refcnt_set(m, 1);
140 		m->next = NULL;
141 		m->nb_segs = 1;
142 		return 0;
143 	}
144 
145 	/* Mbuf is having refcount more than 1 so need not to be freed */
146 	return 1;
147 }
148 
149 static __rte_always_inline void
otx2_nix_xmit_prepare_tso(struct rte_mbuf * m,const uint64_t flags)150 otx2_nix_xmit_prepare_tso(struct rte_mbuf *m, const uint64_t flags)
151 {
152 	uint64_t mask, ol_flags = m->ol_flags;
153 
154 	if (flags & NIX_TX_OFFLOAD_TSO_F &&
155 	    (ol_flags & PKT_TX_TCP_SEG)) {
156 		uintptr_t mdata = rte_pktmbuf_mtod(m, uintptr_t);
157 		uint16_t *iplen, *oiplen, *oudplen;
158 		uint16_t lso_sb, paylen;
159 
160 		mask = -!!(ol_flags & (PKT_TX_OUTER_IPV4 | PKT_TX_OUTER_IPV6));
161 		lso_sb = (mask & (m->outer_l2_len + m->outer_l3_len)) +
162 			m->l2_len + m->l3_len + m->l4_len;
163 
164 		/* Reduce payload len from base headers */
165 		paylen = m->pkt_len - lso_sb;
166 
167 		/* Get iplen position assuming no tunnel hdr */
168 		iplen = (uint16_t *)(mdata + m->l2_len +
169 				     (2 << !!(ol_flags & PKT_TX_IPV6)));
170 		/* Handle tunnel tso */
171 		if ((flags & NIX_TX_OFFLOAD_OL3_OL4_CSUM_F) &&
172 		    (ol_flags & PKT_TX_TUNNEL_MASK)) {
173 			const uint8_t is_udp_tun = (NIX_UDP_TUN_BITMASK >>
174 				((ol_flags & PKT_TX_TUNNEL_MASK) >> 45)) & 0x1;
175 
176 			oiplen = (uint16_t *)(mdata + m->outer_l2_len +
177 				(2 << !!(ol_flags & PKT_TX_OUTER_IPV6)));
178 			*oiplen = rte_cpu_to_be_16(rte_be_to_cpu_16(*oiplen) -
179 						   paylen);
180 
181 			/* Update format for UDP tunneled packet */
182 			if (is_udp_tun) {
183 				oudplen = (uint16_t *)(mdata + m->outer_l2_len +
184 						       m->outer_l3_len + 4);
185 				*oudplen =
186 				rte_cpu_to_be_16(rte_be_to_cpu_16(*oudplen) -
187 						 paylen);
188 			}
189 
190 			/* Update iplen position to inner ip hdr */
191 			iplen = (uint16_t *)(mdata + lso_sb - m->l3_len -
192 				m->l4_len + (2 << !!(ol_flags & PKT_TX_IPV6)));
193 		}
194 
195 		*iplen = rte_cpu_to_be_16(rte_be_to_cpu_16(*iplen) - paylen);
196 	}
197 }
198 
199 static __rte_always_inline void
otx2_nix_xmit_prepare(struct rte_mbuf * m,uint64_t * cmd,const uint16_t flags)200 otx2_nix_xmit_prepare(struct rte_mbuf *m, uint64_t *cmd, const uint16_t flags)
201 {
202 	struct nix_send_ext_s *send_hdr_ext;
203 	struct nix_send_hdr_s *send_hdr;
204 	uint64_t ol_flags = 0, mask;
205 	union nix_send_hdr_w1_u w1;
206 	union nix_send_sg_s *sg;
207 
208 	send_hdr = (struct nix_send_hdr_s *)cmd;
209 	if (flags & NIX_TX_NEED_EXT_HDR) {
210 		send_hdr_ext = (struct nix_send_ext_s *)(cmd + 2);
211 		sg = (union nix_send_sg_s *)(cmd + 4);
212 		/* Clear previous markings */
213 		send_hdr_ext->w0.lso = 0;
214 		send_hdr_ext->w1.u = 0;
215 	} else {
216 		sg = (union nix_send_sg_s *)(cmd + 2);
217 	}
218 
219 	if (flags & NIX_TX_NEED_SEND_HDR_W1) {
220 		ol_flags = m->ol_flags;
221 		w1.u = 0;
222 	}
223 
224 	if (!(flags & NIX_TX_MULTI_SEG_F)) {
225 		send_hdr->w0.total = m->data_len;
226 		send_hdr->w0.aura =
227 			npa_lf_aura_handle_to_aura(m->pool->pool_id);
228 	}
229 
230 	/*
231 	 * L3type:  2 => IPV4
232 	 *          3 => IPV4 with csum
233 	 *          4 => IPV6
234 	 * L3type and L3ptr needs to be set for either
235 	 * L3 csum or L4 csum or LSO
236 	 *
237 	 */
238 
239 	if ((flags & NIX_TX_OFFLOAD_OL3_OL4_CSUM_F) &&
240 	    (flags & NIX_TX_OFFLOAD_L3_L4_CSUM_F)) {
241 		const uint8_t csum = !!(ol_flags & PKT_TX_OUTER_UDP_CKSUM);
242 		const uint8_t ol3type =
243 			((!!(ol_flags & PKT_TX_OUTER_IPV4)) << 1) +
244 			((!!(ol_flags & PKT_TX_OUTER_IPV6)) << 2) +
245 			!!(ol_flags & PKT_TX_OUTER_IP_CKSUM);
246 
247 		/* Outer L3 */
248 		w1.ol3type = ol3type;
249 		mask = 0xffffull << ((!!ol3type) << 4);
250 		w1.ol3ptr = ~mask & m->outer_l2_len;
251 		w1.ol4ptr = ~mask & (w1.ol3ptr + m->outer_l3_len);
252 
253 		/* Outer L4 */
254 		w1.ol4type = csum + (csum << 1);
255 
256 		/* Inner L3 */
257 		w1.il3type = ((!!(ol_flags & PKT_TX_IPV4)) << 1) +
258 			((!!(ol_flags & PKT_TX_IPV6)) << 2);
259 		w1.il3ptr = w1.ol4ptr + m->l2_len;
260 		w1.il4ptr = w1.il3ptr + m->l3_len;
261 		/* Increment it by 1 if it is IPV4 as 3 is with csum */
262 		w1.il3type = w1.il3type + !!(ol_flags & PKT_TX_IP_CKSUM);
263 
264 		/* Inner L4 */
265 		w1.il4type =  (ol_flags & PKT_TX_L4_MASK) >> 52;
266 
267 		/* In case of no tunnel header use only
268 		 * shift IL3/IL4 fields a bit to use
269 		 * OL3/OL4 for header checksum
270 		 */
271 		mask = !ol3type;
272 		w1.u = ((w1.u & 0xFFFFFFFF00000000) >> (mask << 3)) |
273 			((w1.u & 0X00000000FFFFFFFF) >> (mask << 4));
274 
275 	} else if (flags & NIX_TX_OFFLOAD_OL3_OL4_CSUM_F) {
276 		const uint8_t csum = !!(ol_flags & PKT_TX_OUTER_UDP_CKSUM);
277 		const uint8_t outer_l2_len = m->outer_l2_len;
278 
279 		/* Outer L3 */
280 		w1.ol3ptr = outer_l2_len;
281 		w1.ol4ptr = outer_l2_len + m->outer_l3_len;
282 		/* Increment it by 1 if it is IPV4 as 3 is with csum */
283 		w1.ol3type = ((!!(ol_flags & PKT_TX_OUTER_IPV4)) << 1) +
284 			((!!(ol_flags & PKT_TX_OUTER_IPV6)) << 2) +
285 			!!(ol_flags & PKT_TX_OUTER_IP_CKSUM);
286 
287 		/* Outer L4 */
288 		w1.ol4type = csum + (csum << 1);
289 
290 	} else if (flags & NIX_TX_OFFLOAD_L3_L4_CSUM_F) {
291 		const uint8_t l2_len = m->l2_len;
292 
293 		/* Always use OLXPTR and OLXTYPE when only
294 		 * when one header is present
295 		 */
296 
297 		/* Inner L3 */
298 		w1.ol3ptr = l2_len;
299 		w1.ol4ptr = l2_len + m->l3_len;
300 		/* Increment it by 1 if it is IPV4 as 3 is with csum */
301 		w1.ol3type = ((!!(ol_flags & PKT_TX_IPV4)) << 1) +
302 			((!!(ol_flags & PKT_TX_IPV6)) << 2) +
303 			!!(ol_flags & PKT_TX_IP_CKSUM);
304 
305 		/* Inner L4 */
306 		w1.ol4type =  (ol_flags & PKT_TX_L4_MASK) >> 52;
307 	}
308 
309 	if (flags & NIX_TX_NEED_EXT_HDR &&
310 	    flags & NIX_TX_OFFLOAD_VLAN_QINQ_F) {
311 		send_hdr_ext->w1.vlan1_ins_ena = !!(ol_flags & PKT_TX_VLAN);
312 		/* HW will update ptr after vlan0 update */
313 		send_hdr_ext->w1.vlan1_ins_ptr = 12;
314 		send_hdr_ext->w1.vlan1_ins_tci = m->vlan_tci;
315 
316 		send_hdr_ext->w1.vlan0_ins_ena = !!(ol_flags & PKT_TX_QINQ);
317 		/* 2B before end of l2 header */
318 		send_hdr_ext->w1.vlan0_ins_ptr = 12;
319 		send_hdr_ext->w1.vlan0_ins_tci = m->vlan_tci_outer;
320 	}
321 
322 	if (flags & NIX_TX_OFFLOAD_TSO_F &&
323 	    (ol_flags & PKT_TX_TCP_SEG)) {
324 		uint16_t lso_sb;
325 		uint64_t mask;
326 
327 		mask = -(!w1.il3type);
328 		lso_sb = (mask & w1.ol4ptr) + (~mask & w1.il4ptr) + m->l4_len;
329 
330 		send_hdr_ext->w0.lso_sb = lso_sb;
331 		send_hdr_ext->w0.lso = 1;
332 		send_hdr_ext->w0.lso_mps = m->tso_segsz;
333 		send_hdr_ext->w0.lso_format =
334 			NIX_LSO_FORMAT_IDX_TSOV4 + !!(ol_flags & PKT_TX_IPV6);
335 		w1.ol4type = NIX_SENDL4TYPE_TCP_CKSUM;
336 
337 		/* Handle tunnel tso */
338 		if ((flags & NIX_TX_OFFLOAD_OL3_OL4_CSUM_F) &&
339 		    (ol_flags & PKT_TX_TUNNEL_MASK)) {
340 			const uint8_t is_udp_tun = (NIX_UDP_TUN_BITMASK >>
341 				((ol_flags & PKT_TX_TUNNEL_MASK) >> 45)) & 0x1;
342 
343 			w1.il4type = NIX_SENDL4TYPE_TCP_CKSUM;
344 			w1.ol4type = is_udp_tun ? NIX_SENDL4TYPE_UDP_CKSUM : 0;
345 			/* Update format for UDP tunneled packet */
346 			send_hdr_ext->w0.lso_format += is_udp_tun ? 2 : 6;
347 
348 			send_hdr_ext->w0.lso_format +=
349 				!!(ol_flags & PKT_TX_OUTER_IPV6) << 1;
350 		}
351 	}
352 
353 	if (flags & NIX_TX_NEED_SEND_HDR_W1)
354 		send_hdr->w1.u = w1.u;
355 
356 	if (!(flags & NIX_TX_MULTI_SEG_F)) {
357 		sg->seg1_size = m->data_len;
358 		*(rte_iova_t *)(++sg) = rte_mbuf_data_iova(m);
359 
360 		if (flags & NIX_TX_OFFLOAD_MBUF_NOFF_F) {
361 			/* DF bit = 1 if refcount of current mbuf or parent mbuf
362 			 *		is greater than 1
363 			 * DF bit = 0 otherwise
364 			 */
365 			send_hdr->w0.df = otx2_nix_prefree_seg(m);
366 			/* Ensuring mbuf fields which got updated in
367 			 * otx2_nix_prefree_seg are written before LMTST.
368 			 */
369 			rte_io_wmb();
370 		}
371 		/* Mark mempool object as "put" since it is freed by NIX */
372 		if (!send_hdr->w0.df)
373 			__mempool_check_cookies(m->pool, (void **)&m, 1, 0);
374 	}
375 }
376 
377 
378 static __rte_always_inline void
otx2_nix_xmit_one(uint64_t * cmd,void * lmt_addr,const rte_iova_t io_addr,const uint32_t flags)379 otx2_nix_xmit_one(uint64_t *cmd, void *lmt_addr,
380 		  const rte_iova_t io_addr, const uint32_t flags)
381 {
382 	uint64_t lmt_status;
383 
384 	do {
385 		otx2_lmt_mov(lmt_addr, cmd, otx2_nix_tx_ext_subs(flags));
386 		lmt_status = otx2_lmt_submit(io_addr);
387 	} while (lmt_status == 0);
388 }
389 
390 static __rte_always_inline void
otx2_nix_xmit_prep_lmt(uint64_t * cmd,void * lmt_addr,const uint32_t flags)391 otx2_nix_xmit_prep_lmt(uint64_t *cmd, void *lmt_addr, const uint32_t flags)
392 {
393 	otx2_lmt_mov(lmt_addr, cmd, otx2_nix_tx_ext_subs(flags));
394 }
395 
396 static __rte_always_inline uint64_t
otx2_nix_xmit_submit_lmt(const rte_iova_t io_addr)397 otx2_nix_xmit_submit_lmt(const rte_iova_t io_addr)
398 {
399 	return otx2_lmt_submit(io_addr);
400 }
401 
402 static __rte_always_inline uint64_t
otx2_nix_xmit_submit_lmt_release(const rte_iova_t io_addr)403 otx2_nix_xmit_submit_lmt_release(const rte_iova_t io_addr)
404 {
405 	return otx2_lmt_submit_release(io_addr);
406 }
407 
408 static __rte_always_inline uint16_t
otx2_nix_prepare_mseg(struct rte_mbuf * m,uint64_t * cmd,const uint16_t flags)409 otx2_nix_prepare_mseg(struct rte_mbuf *m, uint64_t *cmd, const uint16_t flags)
410 {
411 	struct nix_send_hdr_s *send_hdr;
412 	union nix_send_sg_s *sg;
413 	struct rte_mbuf *m_next;
414 	uint64_t *slist, sg_u;
415 	uint64_t nb_segs;
416 	uint64_t segdw;
417 	uint8_t off, i;
418 
419 	send_hdr = (struct nix_send_hdr_s *)cmd;
420 	send_hdr->w0.total = m->pkt_len;
421 	send_hdr->w0.aura = npa_lf_aura_handle_to_aura(m->pool->pool_id);
422 
423 	if (flags & NIX_TX_NEED_EXT_HDR)
424 		off = 2;
425 	else
426 		off = 0;
427 
428 	sg = (union nix_send_sg_s *)&cmd[2 + off];
429 	/* Clear sg->u header before use */
430 	sg->u &= 0xFC00000000000000;
431 	sg_u = sg->u;
432 	slist = &cmd[3 + off];
433 
434 	i = 0;
435 	nb_segs = m->nb_segs;
436 
437 	/* Fill mbuf segments */
438 	do {
439 		m_next = m->next;
440 		sg_u = sg_u | ((uint64_t)m->data_len << (i << 4));
441 		*slist = rte_mbuf_data_iova(m);
442 		/* Set invert df if buffer is not to be freed by H/W */
443 		if (flags & NIX_TX_OFFLOAD_MBUF_NOFF_F) {
444 			sg_u |=	(otx2_nix_prefree_seg(m) << (i + 55));
445 			/* Commit changes to mbuf */
446 			rte_io_wmb();
447 		}
448 		/* Mark mempool object as "put" since it is freed by NIX */
449 #ifdef RTE_LIBRTE_MEMPOOL_DEBUG
450 		if (!(sg_u & (1ULL << (i + 55))))
451 			__mempool_check_cookies(m->pool, (void **)&m, 1, 0);
452 		rte_io_wmb();
453 #endif
454 		slist++;
455 		i++;
456 		nb_segs--;
457 		if (i > 2 && nb_segs) {
458 			i = 0;
459 			/* Next SG subdesc */
460 			*(uint64_t *)slist = sg_u & 0xFC00000000000000;
461 			sg->u = sg_u;
462 			sg->segs = 3;
463 			sg = (union nix_send_sg_s *)slist;
464 			sg_u = sg->u;
465 			slist++;
466 		}
467 		m = m_next;
468 	} while (nb_segs);
469 
470 	sg->u = sg_u;
471 	sg->segs = i;
472 	segdw = (uint64_t *)slist - (uint64_t *)&cmd[2 + off];
473 	/* Roundup extra dwords to multiple of 2 */
474 	segdw = (segdw >> 1) + (segdw & 0x1);
475 	/* Default dwords */
476 	segdw += (off >> 1) + 1 + !!(flags & NIX_TX_OFFLOAD_TSTAMP_F);
477 	send_hdr->w0.sizem1 = segdw - 1;
478 
479 	return segdw;
480 }
481 
482 static __rte_always_inline void
otx2_nix_xmit_mseg_prep_lmt(uint64_t * cmd,void * lmt_addr,uint16_t segdw)483 otx2_nix_xmit_mseg_prep_lmt(uint64_t *cmd, void *lmt_addr, uint16_t segdw)
484 {
485 	otx2_lmt_mov_seg(lmt_addr, (const void *)cmd, segdw);
486 }
487 
488 static __rte_always_inline void
otx2_nix_xmit_mseg_one(uint64_t * cmd,void * lmt_addr,rte_iova_t io_addr,uint16_t segdw)489 otx2_nix_xmit_mseg_one(uint64_t *cmd, void *lmt_addr,
490 		       rte_iova_t io_addr, uint16_t segdw)
491 {
492 	uint64_t lmt_status;
493 
494 	do {
495 		otx2_lmt_mov_seg(lmt_addr, (const void *)cmd, segdw);
496 		lmt_status = otx2_lmt_submit(io_addr);
497 	} while (lmt_status == 0);
498 }
499 
500 static __rte_always_inline void
otx2_nix_xmit_mseg_one_release(uint64_t * cmd,void * lmt_addr,rte_iova_t io_addr,uint16_t segdw)501 otx2_nix_xmit_mseg_one_release(uint64_t *cmd, void *lmt_addr,
502 		       rte_iova_t io_addr, uint16_t segdw)
503 {
504 	uint64_t lmt_status;
505 
506 	rte_io_wmb();
507 	do {
508 		otx2_lmt_mov_seg(lmt_addr, (const void *)cmd, segdw);
509 		lmt_status = otx2_lmt_submit(io_addr);
510 	} while (lmt_status == 0);
511 }
512 
513 #define L3L4CSUM_F   NIX_TX_OFFLOAD_L3_L4_CSUM_F
514 #define OL3OL4CSUM_F NIX_TX_OFFLOAD_OL3_OL4_CSUM_F
515 #define VLAN_F       NIX_TX_OFFLOAD_VLAN_QINQ_F
516 #define NOFF_F       NIX_TX_OFFLOAD_MBUF_NOFF_F
517 #define TSP_F        NIX_TX_OFFLOAD_TSTAMP_F
518 #define TSO_F        NIX_TX_OFFLOAD_TSO_F
519 #define TX_SEC_F     NIX_TX_OFFLOAD_SECURITY_F
520 
521 /* [SEC] [TSO] [TSTMP] [NOFF] [VLAN] [OL3OL4CSUM] [L3L4CSUM] */
522 #define NIX_TX_FASTPATH_MODES						\
523 T(no_offload,				0, 0, 0, 0, 0, 0, 0,	4,	\
524 		NIX_TX_OFFLOAD_NONE)					\
525 T(l3l4csum,				0, 0, 0, 0, 0, 0, 1,	4,	\
526 		L3L4CSUM_F)						\
527 T(ol3ol4csum,				0, 0, 0, 0, 0, 1, 0,	4,	\
528 		OL3OL4CSUM_F)						\
529 T(ol3ol4csum_l3l4csum,			0, 0, 0, 0, 0, 1, 1,	4,	\
530 		OL3OL4CSUM_F | L3L4CSUM_F)				\
531 T(vlan,					0, 0, 0, 0, 1, 0, 0,	6,	\
532 		VLAN_F)							\
533 T(vlan_l3l4csum,			0, 0, 0, 0, 1, 0, 1,	6,	\
534 		VLAN_F | L3L4CSUM_F)					\
535 T(vlan_ol3ol4csum,			0, 0, 0, 0, 1, 1, 0,	6,	\
536 		VLAN_F | OL3OL4CSUM_F)					\
537 T(vlan_ol3ol4csum_l3l4csum,		0, 0, 0, 0, 1, 1, 1,	6,	\
538 		VLAN_F | OL3OL4CSUM_F |	L3L4CSUM_F)			\
539 T(noff,					0, 0, 0, 1, 0, 0, 0,	4,	\
540 		NOFF_F)							\
541 T(noff_l3l4csum,			0, 0, 0, 1, 0, 0, 1,	4,	\
542 		NOFF_F | L3L4CSUM_F)					\
543 T(noff_ol3ol4csum,			0, 0, 0, 1, 0, 1, 0,	4,	\
544 		NOFF_F | OL3OL4CSUM_F)					\
545 T(noff_ol3ol4csum_l3l4csum,		0, 0, 0, 1, 0, 1, 1,	4,	\
546 		NOFF_F | OL3OL4CSUM_F |	L3L4CSUM_F)			\
547 T(noff_vlan,				0, 0, 0, 1, 1, 0, 0,	6,	\
548 		NOFF_F | VLAN_F)					\
549 T(noff_vlan_l3l4csum,			0, 0, 0, 1, 1, 0, 1,	6,	\
550 		NOFF_F | VLAN_F | L3L4CSUM_F)				\
551 T(noff_vlan_ol3ol4csum,			0, 0, 0, 1, 1, 1, 0,	6,	\
552 		NOFF_F | VLAN_F | OL3OL4CSUM_F)				\
553 T(noff_vlan_ol3ol4csum_l3l4csum,	0, 0, 0, 1, 1, 1, 1,	6,	\
554 		NOFF_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)		\
555 T(ts,					0, 0, 1, 0, 0, 0, 0,	8,	\
556 		TSP_F)							\
557 T(ts_l3l4csum,				0, 0, 1, 0, 0, 0, 1,	8,	\
558 		TSP_F | L3L4CSUM_F)					\
559 T(ts_ol3ol4csum,			0, 0, 1, 0, 0, 1, 0,	8,	\
560 		TSP_F | OL3OL4CSUM_F)					\
561 T(ts_ol3ol4csum_l3l4csum,		0, 0, 1, 0, 0, 1, 1,	8,	\
562 		TSP_F | OL3OL4CSUM_F | L3L4CSUM_F)			\
563 T(ts_vlan,				0, 0, 1, 0, 1, 0, 0,	8,	\
564 		TSP_F | VLAN_F)						\
565 T(ts_vlan_l3l4csum,			0, 0, 1, 0, 1, 0, 1,	8,	\
566 		TSP_F | VLAN_F | L3L4CSUM_F)				\
567 T(ts_vlan_ol3ol4csum,			0, 0, 1, 0, 1, 1, 0,	8,	\
568 		TSP_F | VLAN_F | OL3OL4CSUM_F)				\
569 T(ts_vlan_ol3ol4csum_l3l4csum,		0, 0, 1, 0, 1, 1, 1,	8,	\
570 		TSP_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)		\
571 T(ts_noff,				0, 0, 1, 1, 0, 0, 0,	8,	\
572 		TSP_F | NOFF_F)						\
573 T(ts_noff_l3l4csum,			0, 0, 1, 1, 0, 0, 1,	8,	\
574 		TSP_F | NOFF_F | L3L4CSUM_F)				\
575 T(ts_noff_ol3ol4csum,			0, 0, 1, 1, 0, 1, 0,	8,	\
576 		TSP_F | NOFF_F | OL3OL4CSUM_F)				\
577 T(ts_noff_ol3ol4csum_l3l4csum,		0, 0, 1, 1, 0, 1, 1,	8,	\
578 		TSP_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)		\
579 T(ts_noff_vlan,				0, 0, 1, 1, 1, 0, 0,	8,	\
580 		TSP_F | NOFF_F | VLAN_F)				\
581 T(ts_noff_vlan_l3l4csum,		0, 0, 1, 1, 1, 0, 1,	8,	\
582 		TSP_F | NOFF_F | VLAN_F | L3L4CSUM_F)			\
583 T(ts_noff_vlan_ol3ol4csum,		0, 0, 1, 1, 1, 1, 0,	8,	\
584 		TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)			\
585 T(ts_noff_vlan_ol3ol4csum_l3l4csum,	0, 0, 1, 1, 1, 1, 1,	8,	\
586 		TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)	\
587 									\
588 T(tso,					0, 1, 0, 0, 0, 0, 0,	6,	\
589 		TSO_F)							\
590 T(tso_l3l4csum,				0, 1, 0, 0, 0, 0, 1,	6,	\
591 		TSO_F | L3L4CSUM_F)					\
592 T(tso_ol3ol4csum,			0, 1, 0, 0, 0, 1, 0,	6,	\
593 		TSO_F | OL3OL4CSUM_F)					\
594 T(tso_ol3ol4csum_l3l4csum,		0, 1, 0, 0, 0, 1, 1,	6,	\
595 		TSO_F | OL3OL4CSUM_F | L3L4CSUM_F)			\
596 T(tso_vlan,				0, 1, 0, 0, 1, 0, 0,	6,	\
597 		TSO_F | VLAN_F)						\
598 T(tso_vlan_l3l4csum,			0, 1, 0, 0, 1, 0, 1,	6,	\
599 		TSO_F | VLAN_F | L3L4CSUM_F)				\
600 T(tso_vlan_ol3ol4csum,			0, 1, 0, 0, 1, 1, 0,	6,	\
601 		TSO_F | VLAN_F | OL3OL4CSUM_F)				\
602 T(tso_vlan_ol3ol4csum_l3l4csum,		0, 1, 0, 0, 1, 1, 1,	6,	\
603 		TSO_F | VLAN_F | OL3OL4CSUM_F |	L3L4CSUM_F)		\
604 T(tso_noff,				0, 1, 0, 1, 0, 0, 0,	6,	\
605 		TSO_F | NOFF_F)						\
606 T(tso_noff_l3l4csum,			0, 1, 0, 1, 0, 0, 1,	6,	\
607 		TSO_F | NOFF_F | L3L4CSUM_F)				\
608 T(tso_noff_ol3ol4csum,			0, 1, 0, 1, 0, 1, 0,	6,	\
609 		TSO_F | NOFF_F | OL3OL4CSUM_F)				\
610 T(tso_noff_ol3ol4csum_l3l4csum,		0, 1, 0, 1, 0, 1, 1,	6,	\
611 		TSO_F | NOFF_F | OL3OL4CSUM_F |	L3L4CSUM_F)		\
612 T(tso_noff_vlan,			0, 1, 0, 1, 1, 0, 0,	6,	\
613 		TSO_F | NOFF_F | VLAN_F)				\
614 T(tso_noff_vlan_l3l4csum,		0, 1, 0, 1, 1, 0, 1,	6,	\
615 		TSO_F | NOFF_F | VLAN_F | L3L4CSUM_F)			\
616 T(tso_noff_vlan_ol3ol4csum,		0, 1, 0, 1, 1, 1, 0,	6,	\
617 		TSO_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)			\
618 T(tso_noff_vlan_ol3ol4csum_l3l4csum,	0, 1, 0, 1, 1, 1, 1,	6,	\
619 		TSO_F | NOFF_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)	\
620 T(tso_ts,				0, 1, 1, 0, 0, 0, 0,	8,	\
621 		TSO_F | TSP_F)						\
622 T(tso_ts_l3l4csum,			0, 1, 1, 0, 0, 0, 1,	8,	\
623 		TSO_F | TSP_F | L3L4CSUM_F)				\
624 T(tso_ts_ol3ol4csum,			0, 1, 1, 0, 0, 1, 0,	8,	\
625 		TSO_F | TSP_F | OL3OL4CSUM_F)				\
626 T(tso_ts_ol3ol4csum_l3l4csum,		0, 1, 1, 0, 0, 1, 1,	8,	\
627 		TSO_F | TSP_F | OL3OL4CSUM_F | L3L4CSUM_F)		\
628 T(tso_ts_vlan,				0, 1, 1, 0, 1, 0, 0,	8,	\
629 		TSO_F | TSP_F | VLAN_F)					\
630 T(tso_ts_vlan_l3l4csum,			0, 1, 1, 0, 1, 0, 1,	8,	\
631 		TSO_F | TSP_F | VLAN_F | L3L4CSUM_F)			\
632 T(tso_ts_vlan_ol3ol4csum,		0, 1, 1, 0, 1, 1, 0,	8,	\
633 		TSO_F | TSP_F | VLAN_F | OL3OL4CSUM_F)			\
634 T(tso_ts_vlan_ol3ol4csum_l3l4csum,	0, 1, 1, 0, 1, 1, 1,	8,	\
635 		TSO_F | TSP_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)	\
636 T(tso_ts_noff,				0, 1, 1, 1, 0, 0, 0,	8,	\
637 		TSO_F | TSP_F | NOFF_F)					\
638 T(tso_ts_noff_l3l4csum,			0, 1, 1, 1, 0, 0, 1,	8,	\
639 		TSO_F | TSP_F | NOFF_F | L3L4CSUM_F)			\
640 T(tso_ts_noff_ol3ol4csum,		0, 1, 1, 1, 0, 1, 0,	8,	\
641 		TSO_F | TSP_F | NOFF_F | OL3OL4CSUM_F)			\
642 T(tso_ts_noff_ol3ol4csum_l3l4csum,	0, 1, 1, 1, 0, 1, 1,	8,	\
643 		TSO_F | TSP_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)	\
644 T(tso_ts_noff_vlan,			0, 1, 1, 1, 1, 0, 0,	8,	\
645 		TSO_F | TSP_F | NOFF_F | VLAN_F)			\
646 T(tso_ts_noff_vlan_l3l4csum,		0, 1, 1, 1, 1, 0, 1,	8,	\
647 		TSO_F | TSP_F | NOFF_F | VLAN_F | L3L4CSUM_F)		\
648 T(tso_ts_noff_vlan_ol3ol4csum,		0, 1, 1, 1, 1, 1, 0,	8,	\
649 		TSO_F | TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)		\
650 T(tso_ts_noff_vlan_ol3ol4csum_l3l4csum,	0, 1, 1, 1, 1, 1, 1,	8,	\
651 		TSO_F | TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F |	\
652 		L3L4CSUM_F)						\
653 T(sec,					1, 0, 0, 0, 0, 0, 0,	8,	\
654 		TX_SEC_F)						\
655 T(sec_l3l4csum,				1, 0, 0, 0, 0, 0, 1,	8,	\
656 		TX_SEC_F | L3L4CSUM_F)					\
657 T(sec_ol3ol4csum,			1, 0, 0, 0, 0, 1, 0,	8,	\
658 		TX_SEC_F | OL3OL4CSUM_F)				\
659 T(sec_ol3ol4csum_l3l4csum,		1, 0, 0, 0, 0, 1, 1,	8,	\
660 		TX_SEC_F | OL3OL4CSUM_F | L3L4CSUM_F)			\
661 T(sec_vlan,				1, 0, 0, 0, 1, 0, 0,	8,	\
662 		TX_SEC_F | VLAN_F)					\
663 T(sec_vlan_l3l4csum,			1, 0, 0, 0, 1, 0, 1,	8,	\
664 		TX_SEC_F | VLAN_F | L3L4CSUM_F)				\
665 T(sec_vlan_ol3ol4csum,			1, 0, 0, 0, 1, 1, 0,	8,	\
666 		TX_SEC_F | VLAN_F | OL3OL4CSUM_F)			\
667 T(sec_vlan_ol3ol4csum_l3l4csum,		1, 0, 0, 0, 1, 1, 1,	8,	\
668 		TX_SEC_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)		\
669 T(sec_noff,				1, 0, 0, 1, 0, 0, 0,	8,	\
670 		TX_SEC_F | NOFF_F)					\
671 T(sec_noff_l3l4csum,			1, 0, 0, 1, 0, 0, 1,	8,	\
672 		TX_SEC_F | NOFF_F | L3L4CSUM_F)				\
673 T(sec_noff_ol3ol4csum,			1, 0, 0, 1, 0, 1, 0,	8,	\
674 		TX_SEC_F | NOFF_F | OL3OL4CSUM_F)			\
675 T(sec_noff_ol3ol4csum_l3l4csum,		1, 0, 0, 1, 0, 1, 1,	8,	\
676 		TX_SEC_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)		\
677 T(sec_noff_vlan,			1, 0, 0, 1, 1, 0, 0,	8,	\
678 		TX_SEC_F | NOFF_F | VLAN_F)				\
679 T(sec_noff_vlan_l3l4csum,		1, 0, 0, 1, 1, 0, 1,	8,	\
680 		TX_SEC_F | NOFF_F | VLAN_F | L3L4CSUM_F)		\
681 T(sec_noff_vlan_ol3ol4csum,		1, 0, 0, 1, 1, 1, 0,	8,	\
682 		TX_SEC_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)		\
683 T(sec_noff_vlan_ol3ol4csum_l3l4csum,	1, 0, 0, 1, 1, 1, 1,	8,	\
684 		TX_SEC_F | NOFF_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)	\
685 T(sec_ts,				1, 0, 1, 0, 0, 0, 0,	8,	\
686 		TX_SEC_F | TSP_F)					\
687 T(sec_ts_l3l4csum,			1, 0, 1, 0, 0, 0, 1,	8,	\
688 		TX_SEC_F | TSP_F | L3L4CSUM_F)				\
689 T(sec_ts_ol3ol4csum,			1, 0, 1, 0, 0, 1, 0,	8,	\
690 		TX_SEC_F | TSP_F | OL3OL4CSUM_F)			\
691 T(sec_ts_ol3ol4csum_l3l4csum,		1, 0, 1, 0, 0, 1, 1,	8,	\
692 		TX_SEC_F | TSP_F | OL3OL4CSUM_F | L3L4CSUM_F)		\
693 T(sec_ts_vlan,				1, 0, 1, 0, 1, 0, 0,	8,	\
694 		TX_SEC_F | TSP_F | VLAN_F)				\
695 T(sec_ts_vlan_l3l4csum,			1, 0, 1, 0, 1, 0, 1,	8,	\
696 		TX_SEC_F | TSP_F | VLAN_F | L3L4CSUM_F)			\
697 T(sec_ts_vlan_ol3ol4csum,		1, 0, 1, 0, 1, 1, 0,	8,	\
698 		TX_SEC_F | TSP_F | VLAN_F | OL3OL4CSUM_F)		\
699 T(sec_ts_vlan_ol3ol4csum_l3l4csum,	1, 0, 1, 0, 1, 1, 1,	8,	\
700 		TX_SEC_F | TSP_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)	\
701 T(sec_ts_noff,				1, 0, 1, 1, 0, 0, 0,	8,	\
702 		TX_SEC_F | TSP_F | NOFF_F)				\
703 T(sec_ts_noff_l3l4csum,			1, 0, 1, 1, 0, 0, 1,	8,	\
704 		TX_SEC_F | TSP_F | NOFF_F | L3L4CSUM_F)			\
705 T(sec_ts_noff_ol3ol4csum,		1, 0, 1, 1, 0, 1, 0,	8,	\
706 		TX_SEC_F | TSP_F | NOFF_F | OL3OL4CSUM_F)		\
707 T(sec_ts_noff_ol3ol4csum_l3l4csum,	1, 0, 1, 1, 0, 1, 1,	8,	\
708 		TX_SEC_F | TSP_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)	\
709 T(sec_ts_noff_vlan,			1, 0, 1, 1, 1, 0, 0,	8,	\
710 		TX_SEC_F | TSP_F | NOFF_F | VLAN_F)			\
711 T(sec_ts_noff_vlan_l3l4csum,		1, 0, 1, 1, 1, 0, 1,	8,	\
712 		TX_SEC_F | TSP_F | NOFF_F | VLAN_F | L3L4CSUM_F)	\
713 T(sec_ts_noff_vlan_ol3ol4csum,		1, 0, 1, 1, 1, 1, 0,	8,	\
714 		TX_SEC_F | TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)	\
715 T(sec_ts_noff_vlan_ol3ol4csum_l3l4csum,	1, 0, 1, 1, 1, 1, 1,	8,	\
716 		TX_SEC_F | TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F |	\
717 		L3L4CSUM_F)						\
718 T(sec_tso,				1, 1, 0, 0, 0, 0, 0,	8,	\
719 		TX_SEC_F | TSO_F)					\
720 T(sec_tso_l3l4csum,			1, 1, 0, 0, 0, 0, 1,	8,	\
721 		TX_SEC_F | TSO_F | L3L4CSUM_F)				\
722 T(sec_tso_ol3ol4csum,			1, 1, 0, 0, 0, 1, 0,	8,	\
723 		TX_SEC_F | TSO_F | OL3OL4CSUM_F)			\
724 T(sec_tso_ol3ol4csum_l3l4csum,		1, 1, 0, 0, 0, 1, 1,	8,	\
725 		TX_SEC_F | TSO_F | OL3OL4CSUM_F | L3L4CSUM_F)		\
726 T(sec_tso_vlan,				1, 1, 0, 0, 1, 0, 0,	8,	\
727 		TX_SEC_F | TSO_F | VLAN_F)				\
728 T(sec_tso_vlan_l3l4csum,		1, 1, 0, 0, 1, 0, 1,	8,	\
729 		TX_SEC_F | TSO_F | VLAN_F | L3L4CSUM_F)			\
730 T(sec_tso_vlan_ol3ol4csum,		1, 1, 0, 0, 1, 1, 0,	8,	\
731 		TX_SEC_F | TSO_F | VLAN_F | OL3OL4CSUM_F)		\
732 T(sec_tso_vlan_ol3ol4csum_l3l4csum,	1, 1, 0, 0, 1, 1, 1,	8,	\
733 		TX_SEC_F | TSO_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)	\
734 T(sec_tso_noff,				1, 1, 0, 1, 0, 0, 0,	8,	\
735 		TX_SEC_F | TSO_F | NOFF_F)				\
736 T(sec_tso_noff_l3l4csum,		1, 1, 0, 1, 0, 0, 1,	8,	\
737 		TX_SEC_F | TSO_F | NOFF_F | L3L4CSUM_F)			\
738 T(sec_tso_noff_ol3ol4csum,		1, 1, 0, 1, 0, 1, 0,	8,	\
739 		TX_SEC_F | TSO_F | NOFF_F | OL3OL4CSUM_F)		\
740 T(sec_tso_noff_ol3ol4csum_l3l4csum,	1, 1, 0, 1, 0, 1, 1,	8,	\
741 		TX_SEC_F | TSO_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)	\
742 T(sec_tso_noff_vlan,			1, 1, 0, 1, 1, 0, 0,	8,	\
743 		TX_SEC_F | TSO_F | NOFF_F | VLAN_F)			\
744 T(sec_tso_noff_vlan_l3l4csum,		1, 1, 0, 1, 1, 0, 1,	8,	\
745 		TX_SEC_F | TSO_F | NOFF_F | VLAN_F | L3L4CSUM_F)	\
746 T(sec_tso_noff_vlan_ol3ol4csum,		1, 1, 0, 1, 1, 1, 0,	8,	\
747 		TX_SEC_F | TSO_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)	\
748 T(sec_tso_noff_vlan_ol3ol4csum_l3l4csum,				\
749 					1, 1, 0, 1, 1, 1, 1,	8,	\
750 		TX_SEC_F | TSO_F | NOFF_F | VLAN_F | OL3OL4CSUM_F |	\
751 		L3L4CSUM_F)						\
752 T(sec_tso_ts,				1, 1, 1, 0, 0, 0, 0,	8,	\
753 		TX_SEC_F | TSO_F | TSP_F)				\
754 T(sec_tso_ts_l3l4csum,			1, 1, 1, 0, 0, 0, 1,	8,	\
755 		TX_SEC_F | TSO_F | TSP_F | L3L4CSUM_F)			\
756 T(sec_tso_ts_ol3ol4csum,		1, 1, 1, 0, 0, 1, 0,	8,	\
757 		TX_SEC_F | TSO_F | TSP_F | OL3OL4CSUM_F)		\
758 T(sec_tso_ts_ol3ol4csum_l3l4csum,	1, 1, 1, 0, 0, 1, 1,	8,	\
759 		TX_SEC_F | TSO_F | TSP_F | OL3OL4CSUM_F | L3L4CSUM_F)	\
760 T(sec_tso_ts_vlan,			1, 1, 1, 0, 1, 0, 0,	8,	\
761 		TX_SEC_F | TSO_F | TSP_F | VLAN_F)			\
762 T(sec_tso_ts_vlan_l3l4csum,		1, 1, 1, 0, 1, 0, 1,	8,	\
763 		TX_SEC_F | TSO_F | TSP_F | VLAN_F | L3L4CSUM_F)		\
764 T(sec_tso_ts_vlan_ol3ol4csum,		1, 1, 1, 0, 1, 1, 0,	8,	\
765 		TX_SEC_F | TSO_F | TSP_F | VLAN_F | OL3OL4CSUM_F)	\
766 T(sec_tso_ts_vlan_ol3ol4csum_l3l4csum,	1, 1, 1, 0, 1, 1, 1,	8,	\
767 		TX_SEC_F | TSO_F | TSP_F | VLAN_F | OL3OL4CSUM_F |	\
768 		L3L4CSUM_F)						\
769 T(sec_tso_ts_noff,			1, 1, 1, 1, 0, 0, 0,	8,	\
770 		TX_SEC_F | TSO_F | TSP_F | NOFF_F)			\
771 T(sec_tso_ts_noff_l3l4csum,		1, 1, 1, 1, 0, 0, 1,	8,	\
772 		TX_SEC_F | TSO_F | TSP_F | NOFF_F | L3L4CSUM_F)		\
773 T(sec_tso_ts_noff_ol3ol4csum,		1, 1, 1, 1, 0, 1, 0,	8,	\
774 		TX_SEC_F | TSO_F | TSP_F | NOFF_F | OL3OL4CSUM_F)	\
775 T(sec_tso_ts_noff_ol3ol4csum_l3l4csum,	1, 1, 1, 1, 0, 1, 1,	8,	\
776 		TX_SEC_F | TSO_F | TSP_F | NOFF_F | OL3OL4CSUM_F |	\
777 		L3L4CSUM_F)						\
778 T(sec_tso_ts_noff_vlan,			1, 1, 1, 1, 1, 0, 0,	8,	\
779 		TX_SEC_F | TSO_F | TSP_F | NOFF_F | VLAN_F)		\
780 T(sec_tso_ts_noff_vlan_l3l4csum,	1, 1, 1, 1, 1, 0, 1,	8,	\
781 		TX_SEC_F | TSO_F | TSP_F | NOFF_F | VLAN_F | L3L4CSUM_F)\
782 T(sec_tso_ts_noff_vlan_ol3ol4csum,	1, 1, 1, 1, 1, 1, 0,	8,	\
783 		TX_SEC_F | TSO_F | TSP_F | NOFF_F | VLAN_F |		\
784 		OL3OL4CSUM_F)						\
785 T(sec_tso_ts_noff_vlan_ol3ol4csum_l3l4csum,				\
786 					1, 1, 1, 1, 1, 1, 1,	8,	\
787 		TX_SEC_F | TSO_F | TSP_F | NOFF_F | VLAN_F |		\
788 		OL3OL4CSUM_F | L3L4CSUM_F)
789 #endif /* __OTX2_TX_H__ */
790