net/hinic: optimize Rx performance for x86
[dpdk.git] / drivers / net / octeontx2 / otx2_tx.h
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
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
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
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
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
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
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                 }
367                 /* Mark mempool object as "put" since it is freed by NIX */
368                 if (!send_hdr->w0.df)
369                         __mempool_check_cookies(m->pool, (void **)&m, 1, 0);
370         }
371 }
372
373
374 static __rte_always_inline void
375 otx2_nix_xmit_one(uint64_t *cmd, void *lmt_addr,
376                   const rte_iova_t io_addr, const uint32_t flags)
377 {
378         uint64_t lmt_status;
379
380         do {
381                 otx2_lmt_mov(lmt_addr, cmd, otx2_nix_tx_ext_subs(flags));
382                 lmt_status = otx2_lmt_submit(io_addr);
383         } while (lmt_status == 0);
384 }
385
386 static __rte_always_inline uint16_t
387 otx2_nix_prepare_mseg(struct rte_mbuf *m, uint64_t *cmd, const uint16_t flags)
388 {
389         struct nix_send_hdr_s *send_hdr;
390         union nix_send_sg_s *sg;
391         struct rte_mbuf *m_next;
392         uint64_t *slist, sg_u;
393         uint64_t nb_segs;
394         uint64_t segdw;
395         uint8_t off, i;
396
397         send_hdr = (struct nix_send_hdr_s *)cmd;
398         send_hdr->w0.total = m->pkt_len;
399         send_hdr->w0.aura = npa_lf_aura_handle_to_aura(m->pool->pool_id);
400
401         if (flags & NIX_TX_NEED_EXT_HDR)
402                 off = 2;
403         else
404                 off = 0;
405
406         sg = (union nix_send_sg_s *)&cmd[2 + off];
407         /* Clear sg->u header before use */
408         sg->u &= 0xFC00000000000000;
409         sg_u = sg->u;
410         slist = &cmd[3 + off];
411
412         i = 0;
413         nb_segs = m->nb_segs;
414
415         /* Fill mbuf segments */
416         do {
417                 m_next = m->next;
418                 sg_u = sg_u | ((uint64_t)m->data_len << (i << 4));
419                 *slist = rte_mbuf_data_iova(m);
420                 /* Set invert df if buffer is not to be freed by H/W */
421                 if (flags & NIX_TX_OFFLOAD_MBUF_NOFF_F)
422                         sg_u |= (otx2_nix_prefree_seg(m) << (i + 55));
423                 /* Mark mempool object as "put" since it is freed by NIX */
424                 if (!(sg_u & (1ULL << (i + 55)))) {
425                         m->next = NULL;
426                         __mempool_check_cookies(m->pool, (void **)&m, 1, 0);
427                 }
428                 slist++;
429                 i++;
430                 nb_segs--;
431                 if (i > 2 && nb_segs) {
432                         i = 0;
433                         /* Next SG subdesc */
434                         *(uint64_t *)slist = sg_u & 0xFC00000000000000;
435                         sg->u = sg_u;
436                         sg->segs = 3;
437                         sg = (union nix_send_sg_s *)slist;
438                         sg_u = sg->u;
439                         slist++;
440                 }
441                 m = m_next;
442         } while (nb_segs);
443
444         sg->u = sg_u;
445         sg->segs = i;
446         segdw = (uint64_t *)slist - (uint64_t *)&cmd[2 + off];
447         /* Roundup extra dwords to multiple of 2 */
448         segdw = (segdw >> 1) + (segdw & 0x1);
449         /* Default dwords */
450         segdw += (off >> 1) + 1 + !!(flags & NIX_TX_OFFLOAD_TSTAMP_F);
451         send_hdr->w0.sizem1 = segdw - 1;
452
453         return segdw;
454 }
455
456 static __rte_always_inline void
457 otx2_nix_xmit_mseg_one(uint64_t *cmd, void *lmt_addr,
458                        rte_iova_t io_addr, uint16_t segdw)
459 {
460         uint64_t lmt_status;
461
462         do {
463                 otx2_lmt_mov_seg(lmt_addr, (const void *)cmd, segdw);
464                 lmt_status = otx2_lmt_submit(io_addr);
465         } while (lmt_status == 0);
466 }
467
468 #define L3L4CSUM_F   NIX_TX_OFFLOAD_L3_L4_CSUM_F
469 #define OL3OL4CSUM_F NIX_TX_OFFLOAD_OL3_OL4_CSUM_F
470 #define VLAN_F       NIX_TX_OFFLOAD_VLAN_QINQ_F
471 #define NOFF_F       NIX_TX_OFFLOAD_MBUF_NOFF_F
472 #define TSP_F        NIX_TX_OFFLOAD_TSTAMP_F
473 #define TSO_F        NIX_TX_OFFLOAD_TSO_F
474 #define TX_SEC_F     NIX_TX_OFFLOAD_SECURITY_F
475
476 /* [SEC] [TSO] [TSTMP] [NOFF] [VLAN] [OL3OL4CSUM] [L3L4CSUM] */
477 #define NIX_TX_FASTPATH_MODES                                           \
478 T(no_offload,                           0, 0, 0, 0, 0, 0, 0,    4,      \
479                 NIX_TX_OFFLOAD_NONE)                                    \
480 T(l3l4csum,                             0, 0, 0, 0, 0, 0, 1,    4,      \
481                 L3L4CSUM_F)                                             \
482 T(ol3ol4csum,                           0, 0, 0, 0, 0, 1, 0,    4,      \
483                 OL3OL4CSUM_F)                                           \
484 T(ol3ol4csum_l3l4csum,                  0, 0, 0, 0, 0, 1, 1,    4,      \
485                 OL3OL4CSUM_F | L3L4CSUM_F)                              \
486 T(vlan,                                 0, 0, 0, 0, 1, 0, 0,    6,      \
487                 VLAN_F)                                                 \
488 T(vlan_l3l4csum,                        0, 0, 0, 0, 1, 0, 1,    6,      \
489                 VLAN_F | L3L4CSUM_F)                                    \
490 T(vlan_ol3ol4csum,                      0, 0, 0, 0, 1, 1, 0,    6,      \
491                 VLAN_F | OL3OL4CSUM_F)                                  \
492 T(vlan_ol3ol4csum_l3l4csum,             0, 0, 0, 0, 1, 1, 1,    6,      \
493                 VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)                     \
494 T(noff,                                 0, 0, 0, 1, 0, 0, 0,    4,      \
495                 NOFF_F)                                                 \
496 T(noff_l3l4csum,                        0, 0, 0, 1, 0, 0, 1,    4,      \
497                 NOFF_F | L3L4CSUM_F)                                    \
498 T(noff_ol3ol4csum,                      0, 0, 0, 1, 0, 1, 0,    4,      \
499                 NOFF_F | OL3OL4CSUM_F)                                  \
500 T(noff_ol3ol4csum_l3l4csum,             0, 0, 0, 1, 0, 1, 1,    4,      \
501                 NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)                     \
502 T(noff_vlan,                            0, 0, 0, 1, 1, 0, 0,    6,      \
503                 NOFF_F | VLAN_F)                                        \
504 T(noff_vlan_l3l4csum,                   0, 0, 0, 1, 1, 0, 1,    6,      \
505                 NOFF_F | VLAN_F | L3L4CSUM_F)                           \
506 T(noff_vlan_ol3ol4csum,                 0, 0, 0, 1, 1, 1, 0,    6,      \
507                 NOFF_F | VLAN_F | OL3OL4CSUM_F)                         \
508 T(noff_vlan_ol3ol4csum_l3l4csum,        0, 0, 0, 1, 1, 1, 1,    6,      \
509                 NOFF_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)            \
510 T(ts,                                   0, 0, 1, 0, 0, 0, 0,    8,      \
511                 TSP_F)                                                  \
512 T(ts_l3l4csum,                          0, 0, 1, 0, 0, 0, 1,    8,      \
513                 TSP_F | L3L4CSUM_F)                                     \
514 T(ts_ol3ol4csum,                        0, 0, 1, 0, 0, 1, 0,    8,      \
515                 TSP_F | OL3OL4CSUM_F)                                   \
516 T(ts_ol3ol4csum_l3l4csum,               0, 0, 1, 0, 0, 1, 1,    8,      \
517                 TSP_F | OL3OL4CSUM_F | L3L4CSUM_F)                      \
518 T(ts_vlan,                              0, 0, 1, 0, 1, 0, 0,    8,      \
519                 TSP_F | VLAN_F)                                         \
520 T(ts_vlan_l3l4csum,                     0, 0, 1, 0, 1, 0, 1,    8,      \
521                 TSP_F | VLAN_F | L3L4CSUM_F)                            \
522 T(ts_vlan_ol3ol4csum,                   0, 0, 1, 0, 1, 1, 0,    8,      \
523                 TSP_F | VLAN_F | OL3OL4CSUM_F)                          \
524 T(ts_vlan_ol3ol4csum_l3l4csum,          0, 0, 1, 0, 1, 1, 1,    8,      \
525                 TSP_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)             \
526 T(ts_noff,                              0, 0, 1, 1, 0, 0, 0,    8,      \
527                 TSP_F | NOFF_F)                                         \
528 T(ts_noff_l3l4csum,                     0, 0, 1, 1, 0, 0, 1,    8,      \
529                 TSP_F | NOFF_F | L3L4CSUM_F)                            \
530 T(ts_noff_ol3ol4csum,                   0, 0, 1, 1, 0, 1, 0,    8,      \
531                 TSP_F | NOFF_F | OL3OL4CSUM_F)                          \
532 T(ts_noff_ol3ol4csum_l3l4csum,          0, 0, 1, 1, 0, 1, 1,    8,      \
533                 TSP_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)             \
534 T(ts_noff_vlan,                         0, 0, 1, 1, 1, 0, 0,    8,      \
535                 TSP_F | NOFF_F | VLAN_F)                                \
536 T(ts_noff_vlan_l3l4csum,                0, 0, 1, 1, 1, 0, 1,    8,      \
537                 TSP_F | NOFF_F | VLAN_F | L3L4CSUM_F)                   \
538 T(ts_noff_vlan_ol3ol4csum,              0, 0, 1, 1, 1, 1, 0,    8,      \
539                 TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)                 \
540 T(ts_noff_vlan_ol3ol4csum_l3l4csum,     0, 0, 1, 1, 1, 1, 1,    8,      \
541                 TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)    \
542                                                                         \
543 T(tso,                                  0, 1, 0, 0, 0, 0, 0,    6,      \
544                 TSO_F)                                                  \
545 T(tso_l3l4csum,                         0, 1, 0, 0, 0, 0, 1,    6,      \
546                 TSO_F | L3L4CSUM_F)                                     \
547 T(tso_ol3ol4csum,                       0, 1, 0, 0, 0, 1, 0,    6,      \
548                 TSO_F | OL3OL4CSUM_F)                                   \
549 T(tso_ol3ol4csum_l3l4csum,              0, 1, 0, 0, 0, 1, 1,    6,      \
550                 TSO_F | OL3OL4CSUM_F | L3L4CSUM_F)                      \
551 T(tso_vlan,                             0, 1, 0, 0, 1, 0, 0,    6,      \
552                 TSO_F | VLAN_F)                                         \
553 T(tso_vlan_l3l4csum,                    0, 1, 0, 0, 1, 0, 1,    6,      \
554                 TSO_F | VLAN_F | L3L4CSUM_F)                            \
555 T(tso_vlan_ol3ol4csum,                  0, 1, 0, 0, 1, 1, 0,    6,      \
556                 TSO_F | VLAN_F | OL3OL4CSUM_F)                          \
557 T(tso_vlan_ol3ol4csum_l3l4csum,         0, 1, 0, 0, 1, 1, 1,    6,      \
558                 TSO_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)             \
559 T(tso_noff,                             0, 1, 0, 1, 0, 0, 0,    6,      \
560                 TSO_F | NOFF_F)                                         \
561 T(tso_noff_l3l4csum,                    0, 1, 0, 1, 0, 0, 1,    6,      \
562                 TSO_F | NOFF_F | L3L4CSUM_F)                            \
563 T(tso_noff_ol3ol4csum,                  0, 1, 0, 1, 0, 1, 0,    6,      \
564                 TSO_F | NOFF_F | OL3OL4CSUM_F)                          \
565 T(tso_noff_ol3ol4csum_l3l4csum,         0, 1, 0, 1, 0, 1, 1,    6,      \
566                 TSO_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)             \
567 T(tso_noff_vlan,                        0, 1, 0, 1, 1, 0, 0,    6,      \
568                 TSO_F | NOFF_F | VLAN_F)                                \
569 T(tso_noff_vlan_l3l4csum,               0, 1, 0, 1, 1, 0, 1,    6,      \
570                 TSO_F | NOFF_F | VLAN_F | L3L4CSUM_F)                   \
571 T(tso_noff_vlan_ol3ol4csum,             0, 1, 0, 1, 1, 1, 0,    6,      \
572                 TSO_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)                 \
573 T(tso_noff_vlan_ol3ol4csum_l3l4csum,    0, 1, 0, 1, 1, 1, 1,    6,      \
574                 TSO_F | NOFF_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)    \
575 T(tso_ts,                               0, 1, 1, 0, 0, 0, 0,    8,      \
576                 TSO_F | TSP_F)                                          \
577 T(tso_ts_l3l4csum,                      0, 1, 1, 0, 0, 0, 1,    8,      \
578                 TSO_F | TSP_F | L3L4CSUM_F)                             \
579 T(tso_ts_ol3ol4csum,                    0, 1, 1, 0, 0, 1, 0,    8,      \
580                 TSO_F | TSP_F | OL3OL4CSUM_F)                           \
581 T(tso_ts_ol3ol4csum_l3l4csum,           0, 1, 1, 0, 0, 1, 1,    8,      \
582                 TSO_F | TSP_F | OL3OL4CSUM_F | L3L4CSUM_F)              \
583 T(tso_ts_vlan,                          0, 1, 1, 0, 1, 0, 0,    8,      \
584                 TSO_F | TSP_F | VLAN_F)                                 \
585 T(tso_ts_vlan_l3l4csum,                 0, 1, 1, 0, 1, 0, 1,    8,      \
586                 TSO_F | TSP_F | VLAN_F | L3L4CSUM_F)                    \
587 T(tso_ts_vlan_ol3ol4csum,               0, 1, 1, 0, 1, 1, 0,    8,      \
588                 TSO_F | TSP_F | VLAN_F | OL3OL4CSUM_F)                  \
589 T(tso_ts_vlan_ol3ol4csum_l3l4csum,      0, 1, 1, 0, 1, 1, 1,    8,      \
590                 TSO_F | TSP_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)     \
591 T(tso_ts_noff,                          0, 1, 1, 1, 0, 0, 0,    8,      \
592                 TSO_F | TSP_F | NOFF_F)                                 \
593 T(tso_ts_noff_l3l4csum,                 0, 1, 1, 1, 0, 0, 1,    8,      \
594                 TSO_F | TSP_F | NOFF_F | L3L4CSUM_F)                    \
595 T(tso_ts_noff_ol3ol4csum,               0, 1, 1, 1, 0, 1, 0,    8,      \
596                 TSO_F | TSP_F | NOFF_F | OL3OL4CSUM_F)                  \
597 T(tso_ts_noff_ol3ol4csum_l3l4csum,      0, 1, 1, 1, 0, 1, 1,    8,      \
598                 TSO_F | TSP_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)     \
599 T(tso_ts_noff_vlan,                     0, 1, 1, 1, 1, 0, 0,    8,      \
600                 TSO_F | TSP_F | NOFF_F | VLAN_F)                        \
601 T(tso_ts_noff_vlan_l3l4csum,            0, 1, 1, 1, 1, 0, 1,    8,      \
602                 TSO_F | TSP_F | NOFF_F | VLAN_F | L3L4CSUM_F)           \
603 T(tso_ts_noff_vlan_ol3ol4csum,          0, 1, 1, 1, 1, 1, 0,    8,      \
604                 TSO_F | TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)         \
605 T(tso_ts_noff_vlan_ol3ol4csum_l3l4csum, 0, 1, 1, 1, 1, 1, 1,    8,      \
606                 TSO_F | TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F |        \
607                 L3L4CSUM_F)                                             \
608 T(sec,                                  1, 0, 0, 0, 0, 0, 0,    8,      \
609                 TX_SEC_F)                                               \
610 T(sec_l3l4csum,                         1, 0, 0, 0, 0, 0, 1,    8,      \
611                 TX_SEC_F | L3L4CSUM_F)                                  \
612 T(sec_ol3ol4csum,                       1, 0, 0, 0, 0, 1, 0,    8,      \
613                 TX_SEC_F | OL3OL4CSUM_F)                                \
614 T(sec_ol3ol4csum_l3l4csum,              1, 0, 0, 0, 0, 1, 1,    8,      \
615                 TX_SEC_F | OL3OL4CSUM_F | L3L4CSUM_F)                   \
616 T(sec_vlan,                             1, 0, 0, 0, 1, 0, 0,    8,      \
617                 TX_SEC_F | VLAN_F)                                      \
618 T(sec_vlan_l3l4csum,                    1, 0, 0, 0, 1, 0, 1,    8,      \
619                 TX_SEC_F | VLAN_F | L3L4CSUM_F)                         \
620 T(sec_vlan_ol3ol4csum,                  1, 0, 0, 0, 1, 1, 0,    8,      \
621                 TX_SEC_F | VLAN_F | OL3OL4CSUM_F)                       \
622 T(sec_vlan_ol3ol4csum_l3l4csum,         1, 0, 0, 0, 1, 1, 1,    8,      \
623                 TX_SEC_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)          \
624 T(sec_noff,                             1, 0, 0, 1, 0, 0, 0,    8,      \
625                 TX_SEC_F | NOFF_F)                                      \
626 T(sec_noff_l3l4csum,                    1, 0, 0, 1, 0, 0, 1,    8,      \
627                 TX_SEC_F | NOFF_F | L3L4CSUM_F)                         \
628 T(sec_noff_ol3ol4csum,                  1, 0, 0, 1, 0, 1, 0,    8,      \
629                 TX_SEC_F | NOFF_F | OL3OL4CSUM_F)                       \
630 T(sec_noff_ol3ol4csum_l3l4csum,         1, 0, 0, 1, 0, 1, 1,    8,      \
631                 TX_SEC_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)          \
632 T(sec_noff_vlan,                        1, 0, 0, 1, 1, 0, 0,    8,      \
633                 TX_SEC_F | NOFF_F | VLAN_F)                             \
634 T(sec_noff_vlan_l3l4csum,               1, 0, 0, 1, 1, 0, 1,    8,      \
635                 TX_SEC_F | NOFF_F | VLAN_F | L3L4CSUM_F)                \
636 T(sec_noff_vlan_ol3ol4csum,             1, 0, 0, 1, 1, 1, 0,    8,      \
637                 TX_SEC_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)              \
638 T(sec_noff_vlan_ol3ol4csum_l3l4csum,    1, 0, 0, 1, 1, 1, 1,    8,      \
639                 TX_SEC_F | NOFF_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F) \
640 T(sec_ts,                               1, 0, 1, 0, 0, 0, 0,    8,      \
641                 TX_SEC_F | TSP_F)                                       \
642 T(sec_ts_l3l4csum,                      1, 0, 1, 0, 0, 0, 1,    8,      \
643                 TX_SEC_F | TSP_F | L3L4CSUM_F)                          \
644 T(sec_ts_ol3ol4csum,                    1, 0, 1, 0, 0, 1, 0,    8,      \
645                 TX_SEC_F | TSP_F | OL3OL4CSUM_F)                        \
646 T(sec_ts_ol3ol4csum_l3l4csum,           1, 0, 1, 0, 0, 1, 1,    8,      \
647                 TX_SEC_F | TSP_F | OL3OL4CSUM_F | L3L4CSUM_F)           \
648 T(sec_ts_vlan,                          1, 0, 1, 0, 1, 0, 0,    8,      \
649                 TX_SEC_F | TSP_F | VLAN_F)                              \
650 T(sec_ts_vlan_l3l4csum,                 1, 0, 1, 0, 1, 0, 1,    8,      \
651                 TX_SEC_F | TSP_F | VLAN_F | L3L4CSUM_F)                 \
652 T(sec_ts_vlan_ol3ol4csum,               1, 0, 1, 0, 1, 1, 0,    8,      \
653                 TX_SEC_F | TSP_F | VLAN_F | OL3OL4CSUM_F)               \
654 T(sec_ts_vlan_ol3ol4csum_l3l4csum,      1, 0, 1, 0, 1, 1, 1,    8,      \
655                 TX_SEC_F | TSP_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)  \
656 T(sec_ts_noff,                          1, 0, 1, 1, 0, 0, 0,    8,      \
657                 TX_SEC_F | TSP_F | NOFF_F)                              \
658 T(sec_ts_noff_l3l4csum,                 1, 0, 1, 1, 0, 0, 1,    8,      \
659                 TX_SEC_F | TSP_F | NOFF_F | L3L4CSUM_F)                 \
660 T(sec_ts_noff_ol3ol4csum,               1, 0, 1, 1, 0, 1, 0,    8,      \
661                 TX_SEC_F | TSP_F | NOFF_F | OL3OL4CSUM_F)               \
662 T(sec_ts_noff_ol3ol4csum_l3l4csum,      1, 0, 1, 1, 0, 1, 1,    8,      \
663                 TX_SEC_F | TSP_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)  \
664 T(sec_ts_noff_vlan,                     1, 0, 1, 1, 1, 0, 0,    8,      \
665                 TX_SEC_F | TSP_F | NOFF_F | VLAN_F)                     \
666 T(sec_ts_noff_vlan_l3l4csum,            1, 0, 1, 1, 1, 0, 1,    8,      \
667                 TX_SEC_F | TSP_F | NOFF_F | VLAN_F | L3L4CSUM_F)        \
668 T(sec_ts_noff_vlan_ol3ol4csum,          1, 0, 1, 1, 1, 1, 0,    8,      \
669                 TX_SEC_F | TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)      \
670 T(sec_ts_noff_vlan_ol3ol4csum_l3l4csum, 1, 0, 1, 1, 1, 1, 1,    8,      \
671                 TX_SEC_F | TSP_F | NOFF_F | VLAN_F | OL3OL4CSUM_F |     \
672                 L3L4CSUM_F)                                             \
673 T(sec_tso,                              1, 1, 0, 0, 0, 0, 0,    8,      \
674                 TX_SEC_F | TSO_F)                                       \
675 T(sec_tso_l3l4csum,                     1, 1, 0, 0, 0, 0, 1,    8,      \
676                 TX_SEC_F | TSO_F | L3L4CSUM_F)                          \
677 T(sec_tso_ol3ol4csum,                   1, 1, 0, 0, 0, 1, 0,    8,      \
678                 TX_SEC_F | TSO_F | OL3OL4CSUM_F)                        \
679 T(sec_tso_ol3ol4csum_l3l4csum,          1, 1, 0, 0, 0, 1, 1,    8,      \
680                 TX_SEC_F | TSO_F | OL3OL4CSUM_F | L3L4CSUM_F)           \
681 T(sec_tso_vlan,                         1, 1, 0, 0, 1, 0, 0,    8,      \
682                 TX_SEC_F | TSO_F | VLAN_F)                              \
683 T(sec_tso_vlan_l3l4csum,                1, 1, 0, 0, 1, 0, 1,    8,      \
684                 TX_SEC_F | TSO_F | VLAN_F | L3L4CSUM_F)                 \
685 T(sec_tso_vlan_ol3ol4csum,              1, 1, 0, 0, 1, 1, 0,    8,      \
686                 TX_SEC_F | TSO_F | VLAN_F | OL3OL4CSUM_F)               \
687 T(sec_tso_vlan_ol3ol4csum_l3l4csum,     1, 1, 0, 0, 1, 1, 1,    8,      \
688                 TX_SEC_F | TSO_F | VLAN_F | OL3OL4CSUM_F | L3L4CSUM_F)  \
689 T(sec_tso_noff,                         1, 1, 0, 1, 0, 0, 0,    8,      \
690                 TX_SEC_F | TSO_F | NOFF_F)                              \
691 T(sec_tso_noff_l3l4csum,                1, 1, 0, 1, 0, 0, 1,    8,      \
692                 TX_SEC_F | TSO_F | NOFF_F | L3L4CSUM_F)                 \
693 T(sec_tso_noff_ol3ol4csum,              1, 1, 0, 1, 0, 1, 0,    8,      \
694                 TX_SEC_F | TSO_F | NOFF_F | OL3OL4CSUM_F)               \
695 T(sec_tso_noff_ol3ol4csum_l3l4csum,     1, 1, 0, 1, 0, 1, 1,    8,      \
696                 TX_SEC_F | TSO_F | NOFF_F | OL3OL4CSUM_F | L3L4CSUM_F)  \
697 T(sec_tso_noff_vlan,                    1, 1, 0, 1, 1, 0, 0,    8,      \
698                 TX_SEC_F | TSO_F | NOFF_F | VLAN_F)                     \
699 T(sec_tso_noff_vlan_l3l4csum,           1, 1, 0, 1, 1, 0, 1,    8,      \
700                 TX_SEC_F | TSO_F | NOFF_F | VLAN_F | L3L4CSUM_F)        \
701 T(sec_tso_noff_vlan_ol3ol4csum,         1, 1, 0, 1, 1, 1, 0,    8,      \
702                 TX_SEC_F | TSO_F | NOFF_F | VLAN_F | OL3OL4CSUM_F)      \
703 T(sec_tso_noff_vlan_ol3ol4csum_l3l4csum,                                \
704                                         1, 1, 0, 1, 1, 1, 1,    8,      \
705                 TX_SEC_F | TSO_F | NOFF_F | VLAN_F | OL3OL4CSUM_F |     \
706                 L3L4CSUM_F)                                             \
707 T(sec_tso_ts,                           1, 1, 1, 0, 0, 0, 0,    8,      \
708                 TX_SEC_F | TSO_F | TSP_F)                               \
709 T(sec_tso_ts_l3l4csum,                  1, 1, 1, 0, 0, 0, 1,    8,      \
710                 TX_SEC_F | TSO_F | TSP_F | L3L4CSUM_F)                  \
711 T(sec_tso_ts_ol3ol4csum,                1, 1, 1, 0, 0, 1, 0,    8,      \
712                 TX_SEC_F | TSO_F | TSP_F | OL3OL4CSUM_F)                \
713 T(sec_tso_ts_ol3ol4csum_l3l4csum,       1, 1, 1, 0, 0, 1, 1,    8,      \
714                 TX_SEC_F | TSO_F | TSP_F | OL3OL4CSUM_F | L3L4CSUM_F)   \
715 T(sec_tso_ts_vlan,                      1, 1, 1, 0, 1, 0, 0,    8,      \
716                 TX_SEC_F | TSO_F | TSP_F | VLAN_F)                      \
717 T(sec_tso_ts_vlan_l3l4csum,             1, 1, 1, 0, 1, 0, 1,    8,      \
718                 TX_SEC_F | TSO_F | TSP_F | VLAN_F | L3L4CSUM_F)         \
719 T(sec_tso_ts_vlan_ol3ol4csum,           1, 1, 1, 0, 1, 1, 0,    8,      \
720                 TX_SEC_F | TSO_F | TSP_F | VLAN_F | OL3OL4CSUM_F)       \
721 T(sec_tso_ts_vlan_ol3ol4csum_l3l4csum,  1, 1, 1, 0, 1, 1, 1,    8,      \
722                 TX_SEC_F | TSO_F | TSP_F | VLAN_F | OL3OL4CSUM_F |      \
723                 L3L4CSUM_F)                                             \
724 T(sec_tso_ts_noff,                      1, 1, 1, 1, 0, 0, 0,    8,      \
725                 TX_SEC_F | TSO_F | TSP_F | NOFF_F)                      \
726 T(sec_tso_ts_noff_l3l4csum,             1, 1, 1, 1, 0, 0, 1,    8,      \
727                 TX_SEC_F | TSO_F | TSP_F | NOFF_F | L3L4CSUM_F)         \
728 T(sec_tso_ts_noff_ol3ol4csum,           1, 1, 1, 1, 0, 1, 0,    8,      \
729                 TX_SEC_F | TSO_F | TSP_F | NOFF_F | OL3OL4CSUM_F)       \
730 T(sec_tso_ts_noff_ol3ol4csum_l3l4csum,  1, 1, 1, 1, 0, 1, 1,    8,      \
731                 TX_SEC_F | TSO_F | TSP_F | NOFF_F | OL3OL4CSUM_F |      \
732                 L3L4CSUM_F)                                             \
733 T(sec_tso_ts_noff_vlan,                 1, 1, 1, 1, 1, 0, 0,    8,      \
734                 TX_SEC_F | TSO_F | TSP_F | NOFF_F | VLAN_F)             \
735 T(sec_tso_ts_noff_vlan_l3l4csum,        1, 1, 1, 1, 1, 0, 1,    8,      \
736                 TX_SEC_F | TSO_F | TSP_F | NOFF_F | VLAN_F | L3L4CSUM_F)\
737 T(sec_tso_ts_noff_vlan_ol3ol4csum,      1, 1, 1, 1, 1, 1, 0,    8,      \
738                 TX_SEC_F | TSO_F | TSP_F | NOFF_F | VLAN_F |            \
739                 OL3OL4CSUM_F)                                           \
740 T(sec_tso_ts_noff_vlan_ol3ol4csum_l3l4csum,                             \
741                                         1, 1, 1, 1, 1, 1, 1,    8,      \
742                 TX_SEC_F | TSO_F | TSP_F | NOFF_F | VLAN_F |            \
743                 OL3OL4CSUM_F | L3L4CSUM_F)
744 #endif /* __OTX2_TX_H__ */