Configurable Rx CRC stripping is allowed only if
running firmware variant supports it and if NIC is
configured with single PF per port and without VFs.
When KEEP_CRC is supported, CRC will be part of
the packet payload. The packet length will also
contain CRC length. At the same time, CRC length
should be removed from stats.
Signed-off-by: Denis Pryazhennikov <denis.pryazhennikov@arknetworks.am>
Signed-off-by: Roman Zhukov <roman.zhukov@arknetworks.am>
Reviewed-by: Andy Moreton <amoreton@xilinx.com>
Acked-by: Andrew Rybchenko <andrew.rybchenko@oktetlabs.ru>
---
doc/guides/nics/features/sfc.ini | 1 +
doc/guides/nics/sfc_efx.rst | 6 ++++--
doc/guides/rel_notes/release_23_07.rst | 2 ++
drivers/net/sfc/sfc.h | 1 +
drivers/net/sfc/sfc_ef100_rx.c | 2 +-
drivers/net/sfc/sfc_ef10_rx.c | 3 ++-
drivers/net/sfc/sfc_ethdev.c | 7 ++++++-
drivers/net/sfc/sfc_port.c | 12 ++++++++++++
drivers/net/sfc/sfc_rx.c | 6 +++++-
9 files changed, 34 insertions(+), 6 deletions(-)
@@ -23,6 +23,7 @@ RSS key update = Y
RSS reta update = Y
SR-IOV = Y
Flow control = Y
+CRC offload = Y
VLAN offload = P
FEC = Y
L3 checksum offload = Y
@@ -114,6 +114,10 @@ SFC EFX PMD has support for:
- Loopback
+- Configurable Rx CRC stripping (if running firmware variant supports it and
+ if NIC is configured with single PF per port and without VFs, otherwise
+ always stripped)
+
- SR-IOV PF
- Port representors (see :ref: switch_representation)
@@ -126,8 +130,6 @@ The features not yet supported include:
- Priority-based flow control
-- Configurable RX CRC stripping (always stripped)
-
- Header split on receive
- VLAN filtering
@@ -145,6 +145,8 @@ New Features
* Added support for transfer flow action INDIRECT with subtype COUNT,
for aggregated statistics.
+ * Added support for keeping CRC.
+
* **Added vmxnet3 version 7 support.**
Added support for vmxnet3 version 7 which includes support
@@ -74,6 +74,7 @@ struct sfc_port {
unsigned int flow_ctrl;
boolean_t flow_ctrl_autoneg;
+ boolean_t include_fcs;
size_t pdu;
/*
@@ -1004,7 +1004,7 @@ struct sfc_dp_rx sfc_ef100_rx = {
SFC_DP_RX_FEAT_FLOW_MARK |
SFC_DP_RX_FEAT_INTR |
SFC_DP_RX_FEAT_STATS,
- .dev_offload_capa = 0,
+ .dev_offload_capa = RTE_ETH_RX_OFFLOAD_KEEP_CRC,
.queue_offload_capa = RTE_ETH_RX_OFFLOAD_CHECKSUM |
RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM |
RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM |
@@ -825,7 +825,8 @@ struct sfc_dp_rx sfc_ef10_rx = {
SFC_DP_RX_FEAT_INTR,
.dev_offload_capa = RTE_ETH_RX_OFFLOAD_CHECKSUM |
RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM |
- RTE_ETH_RX_OFFLOAD_RSS_HASH,
+ RTE_ETH_RX_OFFLOAD_RSS_HASH |
+ RTE_ETH_RX_OFFLOAD_KEEP_CRC,
.queue_offload_capa = RTE_ETH_RX_OFFLOAD_SCATTER,
.get_dev_info = sfc_ef10_rx_get_dev_info,
.qsize_up_rings = sfc_ef10_rx_qsize_up_rings,
@@ -689,8 +689,13 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
sfc_adapter_lock(sa);
- if (have_dp_rx_stats)
+ if (have_dp_rx_stats) {
sfc_stats_get_dp_rx(sa, &stats->ipackets, &stats->ibytes);
+ if (dev->data->dev_conf.rxmode.offloads &
+ RTE_ETH_RX_OFFLOAD_KEEP_CRC) {
+ stats->ibytes -= stats->ipackets * RTE_ETHER_CRC_LEN;
+ }
+ }
if (have_dp_tx_stats)
sfc_stats_get_dp_tx(sa, &stats->opackets, &stats->obytes);
@@ -241,6 +241,11 @@ sfc_port_start(struct sfc_adapter *sa)
if (rc != 0)
goto fail_mac_pdu_set;
+ sfc_log_init(sa, "set include FCS=%u", port->include_fcs);
+ rc = efx_mac_include_fcs_set(sa->nic, port->include_fcs);
+ if (rc != 0)
+ goto fail_include_fcs_set;
+
if (!sfc_sa2shared(sa)->isolated) {
struct rte_ether_addr *addr = &port->default_mac_addr;
@@ -328,6 +333,7 @@ sfc_port_start(struct sfc_adapter *sa)
(void)efx_mac_drain(sa->nic, B_TRUE);
fail_mac_drain:
+fail_include_fcs_set:
fail_mac_stats_upload:
(void)efx_mac_stats_periodic(sa->nic, &port->mac_stats_dma_mem,
0, B_FALSE);
@@ -375,11 +381,17 @@ sfc_port_configure(struct sfc_adapter *sa)
{
const struct rte_eth_dev_data *dev_data = sa->eth_dev->data;
struct sfc_port *port = &sa->port;
+ const struct rte_eth_rxmode *rxmode = &dev_data->dev_conf.rxmode;
sfc_log_init(sa, "entry");
port->pdu = EFX_MAC_PDU(dev_data->mtu);
+ if (rxmode->offloads & RTE_ETH_RX_OFFLOAD_KEEP_CRC)
+ port->include_fcs = true;
+ else
+ port->include_fcs = false;
+
return 0;
}
@@ -654,7 +654,8 @@ struct sfc_dp_rx sfc_efx_rx = {
},
.features = SFC_DP_RX_FEAT_INTR,
.dev_offload_capa = RTE_ETH_RX_OFFLOAD_CHECKSUM |
- RTE_ETH_RX_OFFLOAD_RSS_HASH,
+ RTE_ETH_RX_OFFLOAD_RSS_HASH |
+ RTE_ETH_RX_OFFLOAD_KEEP_CRC,
.queue_offload_capa = RTE_ETH_RX_OFFLOAD_SCATTER,
.qsize_up_rings = sfc_efx_rx_qsize_up_rings,
.qcreate = sfc_efx_rx_qcreate,
@@ -938,6 +939,9 @@ sfc_rx_get_offload_mask(struct sfc_adapter *sa)
if (encp->enc_tunnel_encapsulations_supported == 0)
no_caps |= RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM;
+ if (encp->enc_rx_include_fcs_supported == 0)
+ no_caps |= RTE_ETH_RX_OFFLOAD_KEEP_CRC;
+
return ~no_caps;
}