net/ice/base: add inner VLAN protocol type for QinQ filter
[dpdk.git] / drivers / net / sfc / sfc_ef10_tx.c
index 6fb4ac8..a8d34ea 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: BSD-3-Clause
  *
- * Copyright(c) 2019-2020 Xilinx, Inc.
+ * Copyright(c) 2019-2021 Xilinx, Inc.
  * Copyright(c) 2016-2019 Solarflare Communications Inc.
  *
  * This software was jointly developed between OKTET Labs (under contract
@@ -247,7 +247,7 @@ sfc_ef10_tx_qpush(struct sfc_ef10_txq *txq, unsigned int added,
         */
        rte_io_wmb();
 
-       *(volatile __m128i *)txq->doorbell = oword.eo_u128[0];
+       *(volatile efsys_uint128_t *)txq->doorbell = oword.eo_u128[0];
 }
 
 static unsigned int
@@ -352,7 +352,7 @@ sfc_ef10_prepare_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
                        }
                }
 #endif
-               ret = sfc_dp_tx_prepare_pkt(m,
+               ret = sfc_dp_tx_prepare_pkt(m, 0, SFC_TSOH_STD_LEN,
                                txq->tso_tcp_header_offset_limit,
                                txq->max_fill_level,
                                SFC_EF10_TSO_OPT_DESCS_NUM, 0);
@@ -481,6 +481,25 @@ sfc_ef10_xmit_tso_pkt(struct sfc_ef10_txq * const txq, struct rte_mbuf *m_seg,
                        needed_desc--;
        }
 
+       /*
+        * 8000-series EF10 hardware requires that innermost IP length
+        * be greater than or equal to the value which each segment is
+        * supposed to have; otherwise, TCP checksum will be incorrect.
+        *
+        * The same concern applies to outer UDP datagram length field.
+        */
+       switch (m_seg->ol_flags & PKT_TX_TUNNEL_MASK) {
+       case PKT_TX_TUNNEL_VXLAN:
+               /* FALLTHROUGH */
+       case PKT_TX_TUNNEL_GENEVE:
+               sfc_tso_outer_udp_fix_len(first_m_seg, hdr_addr);
+               break;
+       default:
+               break;
+       }
+
+       sfc_tso_innermost_ip_fix_len(first_m_seg, hdr_addr, iph_off);
+
        /*
         * Tx prepare has debug-only checks that offload flags are correctly
         * filled in in TSO mbuf. Use zero IPID if there is no IPv4 flag.