From patchwork Thu Jun 22 03:47:38 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Pryazhennikov X-Patchwork-Id: 128902 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id C35E242D1D; Thu, 22 Jun 2023 05:48:06 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2728842D20; Thu, 22 Jun 2023 05:47:53 +0200 (CEST) Received: from agw.arknetworks.am (agw.arknetworks.am [79.141.165.80]) by mails.dpdk.org (Postfix) with ESMTP id 1D7D541104 for ; Thu, 22 Jun 2023 05:47:43 +0200 (CEST) Received: from localhost.localdomain (unknown [37.252.90.118]) (using TLSv1.3 with cipher TLS_CHACHA20_POLY1305_SHA256 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA512) (No client certificate requested) by agw.arknetworks.am (Postfix) with ESMTPSA id 8F085E1198; Thu, 22 Jun 2023 07:47:42 +0400 (+04) From: Denis Pryazhennikov To: dev@dpdk.org Cc: Ferruh Yigit , Andrew Rybchenko , Roman Zhukov , Andy Moreton Subject: [PATCH v2 4/4] net/sfc: add configurable Rx CRC stripping Date: Thu, 22 Jun 2023 07:47:38 +0400 Message-Id: <20230622034738.51288-5-denis.pryazhennikov@arknetworks.am> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: <20230622034738.51288-1-denis.pryazhennikov@arknetworks.am> References: <20230601114220.17796-1-denis.pryazhennikov@arknetworks.am> <20230622034738.51288-1-denis.pryazhennikov@arknetworks.am> MIME-Version: 1.0 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org 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 Signed-off-by: Roman Zhukov Reviewed-by: Andy Moreton Acked-by: Andrew Rybchenko --- 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(-) diff --git a/doc/guides/nics/features/sfc.ini b/doc/guides/nics/features/sfc.ini index a4b53c619c12..8a9198adcb5b 100644 --- a/doc/guides/nics/features/sfc.ini +++ b/doc/guides/nics/features/sfc.ini @@ -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 diff --git a/doc/guides/nics/sfc_efx.rst b/doc/guides/nics/sfc_efx.rst index ba82b020932b..24459da33ea8 100644 --- a/doc/guides/nics/sfc_efx.rst +++ b/doc/guides/nics/sfc_efx.rst @@ -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 diff --git a/doc/guides/rel_notes/release_23_07.rst b/doc/guides/rel_notes/release_23_07.rst index 3db443d16018..738d35d9f7c6 100644 --- a/doc/guides/rel_notes/release_23_07.rst +++ b/doc/guides/rel_notes/release_23_07.rst @@ -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 diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h index 89e2c46fa974..25cdeaa5cd25 100644 --- a/drivers/net/sfc/sfc.h +++ b/drivers/net/sfc/sfc.h @@ -74,6 +74,7 @@ struct sfc_port { unsigned int flow_ctrl; boolean_t flow_ctrl_autoneg; + boolean_t include_fcs; size_t pdu; /* diff --git a/drivers/net/sfc/sfc_ef100_rx.c b/drivers/net/sfc/sfc_ef100_rx.c index 37b754fa3305..5563bd9a0bd1 100644 --- a/drivers/net/sfc/sfc_ef100_rx.c +++ b/drivers/net/sfc/sfc_ef100_rx.c @@ -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 | diff --git a/drivers/net/sfc/sfc_ef10_rx.c b/drivers/net/sfc/sfc_ef10_rx.c index 7be224c9c412..30a320d0791c 100644 --- a/drivers/net/sfc/sfc_ef10_rx.c +++ b/drivers/net/sfc/sfc_ef10_rx.c @@ -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, diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index f120ddc5a8d8..1efe64a36a7f 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -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); diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c index 0c887ddedb09..3897facfbc5b 100644 --- a/drivers/net/sfc/sfc_port.c +++ b/drivers/net/sfc/sfc_port.c @@ -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; } diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c index edd0f0c03842..ac94d973de04 100644 --- a/drivers/net/sfc/sfc_rx.c +++ b/drivers/net/sfc/sfc_rx.c @@ -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; }