X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsfc%2Fsfc_ef10_tx.c;h=a8d34ead33d0bccbafad97b13423583777724daf;hb=0475c7770502cb4166b2577df3ff446af9d85515;hp=6fb4ac88a8dca76f7103dc539369bc5bf6d4936e;hpb=e7fbf6f5db6eead3ea9b980174e4332509175aef;p=dpdk.git diff --git a/drivers/net/sfc/sfc_ef10_tx.c b/drivers/net/sfc/sfc_ef10_tx.c index 6fb4ac88a8..a8d34ead33 100644 --- a/drivers/net/sfc/sfc_ef10_tx.c +++ b/drivers/net/sfc/sfc_ef10_tx.c @@ -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.