From patchwork Thu Jun 22 11:47:52 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Pryazhennikov X-Patchwork-Id: 128917 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 2789342D23; Thu, 22 Jun 2023 13:49:31 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id BF47C42B71; Thu, 22 Jun 2023 13:49:27 +0200 (CEST) Received: from agw.arknetworks.am (agw.arknetworks.am [79.141.165.80]) by mails.dpdk.org (Postfix) with ESMTP id EADF4406A2 for ; Thu, 22 Jun 2023 13:49:25 +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 65A11E123E; Thu, 22 Jun 2023 15:49:25 +0400 (+04) From: Denis Pryazhennikov To: dev@dpdk.org Cc: Ferruh Yigit , Andrew Rybchenko , Sandilya Bhagi , Andy Moreton Subject: [PATCH v4 1/4] common/sfc_efx/base: discover NIC partitioning mode Date: Thu, 22 Jun 2023 15:47:52 +0400 Message-Id: <20230622114755.1754-2-denis.pryazhennikov@arknetworks.am> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: <20230622114755.1754-1-denis.pryazhennikov@arknetworks.am> References: <20230601114220.17796-1-denis.pryazhennikov@arknetworks.am> <20230622114755.1754-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 From: Sandilya Bhagi NIC Partitioning mode in SFC devices means multiple PFs per network port. When NIC Partitioning is configured, apart from the privileged adapter(s) the other unprivileged adapter(s) will share the same physical port. Determining NIC Partitioning mode is required to take necessary action(s) for unprivileged adapter to work seamlessly. NIC Partitioning is determined using heuristic approach. If the physical ports are shared between PFs then either NIC Partitioning or SR-IOV is in use. Signed-off-by: Sandilya Bhagi Signed-off-by: Denis Pryazhennikov Reviewed-by: Andy Moreton Acked-by: Andrew Rybchenko --- drivers/common/sfc_efx/base/ef10_nic.c | 101 +++++++++++++++++++++++++ drivers/common/sfc_efx/base/efx.h | 8 ++ 2 files changed, 109 insertions(+) diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c index e1709d120093..0c6a2eee4453 100644 --- a/drivers/common/sfc_efx/base/ef10_nic.c +++ b/drivers/common/sfc_efx/base/ef10_nic.c @@ -1044,6 +1044,83 @@ ef10_mcdi_get_pf_count( return (rc); } +static __checkReturn efx_rc_t +ef10_nic_get_physical_port_usage( + __in efx_nic_t *enp, + __in_ecount(pfs_to_ports_size) uint8_t *pfs_to_ports, + __in size_t pfs_to_ports_size, + __out efx_port_usage_t *port_usagep) +{ + efx_nic_cfg_t *encp = &(enp->en_nic_cfg); + efx_port_usage_t port_usage; + uint8_t phy_port; + efx_rc_t rc; + size_t pf; + + /* + * The sharing of physical ports between functions are determined + * in the following way. + * 1. If VFs are enabled then the physical port is shared. + * 2. Retrieve PFs to ports assignment. + * 3. If PF 0 assignment cannot be retrieved(ACCESS_DENIED), it + * implies this is an unprivileged function. An unprivileged + * function indicates the physical port must be shared with + * another privileged function. + * 4. If PF 0 assignment can be retrieved, it indicates this + * function is privileged. Now, read all other PF's physical + * port number assignment and check if the current PF's physical + * port is shared with any other PF's physical port. + * NOTE: PF 0 is always privileged function. + */ + + if (EFX_PCI_FUNCTION_IS_VF(encp)) { + port_usage = EFX_PORT_USAGE_SHARED; + goto out; + } + + if (pfs_to_ports[0] == + MC_CMD_GET_CAPABILITIES_V2_OUT_ACCESS_NOT_PERMITTED) { + /* + * This is unprivileged function as it do not have sufficient + * privileges to read the value, this implies the physical port + * is shared between this function and another privileged + * function + */ + port_usage = EFX_PORT_USAGE_SHARED; + goto out; + } + + if (encp->enc_pf >= pfs_to_ports_size) { + rc = EINVAL; + goto fail1; + } + phy_port = pfs_to_ports[encp->enc_pf]; + + /* + * This is privileged function as it is able read the value of + * PF 0. Now, check if any other function share the same physical + * port number as this function. + */ + for (pf = 0; pf < pfs_to_ports_size; pf++) { + if ((encp->enc_pf != pf) && (phy_port == pfs_to_ports[pf])) { + /* Found match, PFs share the same physical port */ + port_usage = EFX_PORT_USAGE_SHARED; + goto out; + } + } + + port_usage = EFX_PORT_USAGE_EXCLUSIVE; + +out: + *port_usagep = port_usage; + return (0); + +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + + return (rc); +} + static __checkReturn efx_rc_t ef10_get_datapath_caps( __in efx_nic_t *enp) @@ -1307,6 +1384,30 @@ ef10_get_datapath_caps( encp->enc_tunnel_config_udp_entries_max = 0; } +#define CAP_PFS_TO_PORTS(_n) \ + (MC_CMD_GET_CAPABILITIES_V2_OUT_PFS_TO_PORTS_ASSIGNMENT_ ## _n) + + encp->enc_port_usage = EFX_PORT_USAGE_UNKNOWN; + + if (req.emr_out_length_used >= MC_CMD_GET_CAPABILITIES_V2_OUT_LEN) { + /* PFs to ports assignment */ + uint8_t pfs_to_ports[CAP_PFS_TO_PORTS(NUM)]; + + EFX_STATIC_ASSERT((CAP_PFS_TO_PORTS(NUM) * CAP_PFS_TO_PORTS(LEN)) == + EFX_ARRAY_SIZE(pfs_to_ports)); + + memcpy(pfs_to_ports, MCDI_OUT(req, efx_byte_t, CAP_PFS_TO_PORTS(OFST)), + EFX_ARRAY_SIZE(pfs_to_ports)); + + rc = ef10_nic_get_physical_port_usage(enp, pfs_to_ports, + EFX_ARRAY_SIZE(pfs_to_ports), &encp->enc_port_usage); + if (rc != 0) { + /* PF to port mapping lookup failed */ + encp->enc_port_usage = EFX_PORT_USAGE_UNKNOWN; + } + } +#undef CAP_PFS_TO_PORTS + /* * Check if firmware reports the VI window mode. * Medford2 has a variable VI window size (8K, 16K or 64K). diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index f156f8b5b31a..a63211612249 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -311,6 +311,12 @@ efx_nic_check_pcie_link_speed( __in uint32_t pcie_link_gen, __out efx_pcie_link_performance_t *resultp); +typedef enum efx_port_usage_e { + EFX_PORT_USAGE_UNKNOWN = 0, + EFX_PORT_USAGE_EXCLUSIVE, /* Port only used by this PF */ + EFX_PORT_USAGE_SHARED, /* Port shared with other PFs */ +} efx_port_usage_t; + #define EFX_MAC_ADDR_LEN 6 #if EFSYS_OPT_MCDI @@ -1682,6 +1688,8 @@ typedef struct efx_nic_cfg_s { uint32_t enc_assigned_port; /* NIC DMA mapping type */ efx_nic_dma_mapping_t enc_dma_mapping; + /* Physical ports shared by PFs */ + efx_port_usage_t enc_port_usage; } efx_nic_cfg_t; #define EFX_PCI_VF_INVALID 0xffff From patchwork Thu Jun 22 11:47:53 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Pryazhennikov X-Patchwork-Id: 128918 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 7FB2242D23; Thu, 22 Jun 2023 13:49:36 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1E1D042D0B; Thu, 22 Jun 2023 13:49:34 +0200 (CEST) Received: from agw.arknetworks.am (agw.arknetworks.am [79.141.165.80]) by mails.dpdk.org (Postfix) with ESMTP id 8AE33406B8 for ; Thu, 22 Jun 2023 13:49:26 +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 028A0E1274; Thu, 22 Jun 2023 15:49:25 +0400 (+04) From: Denis Pryazhennikov To: dev@dpdk.org Cc: Ferruh Yigit , Andrew Rybchenko , Roman Zhukov , Viacheslav Galaktionov Subject: [PATCH v4 2/4] common/sfc_efx/base: detect and report FCS include support Date: Thu, 22 Jun 2023 15:47:53 +0400 Message-Id: <20230622114755.1754-3-denis.pryazhennikov@arknetworks.am> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: <20230622114755.1754-1-denis.pryazhennikov@arknetworks.am> References: <20230601114220.17796-1-denis.pryazhennikov@arknetworks.am> <20230622114755.1754-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 From: Roman Zhukov A new variable was added to efx_nic_cfg_s to detect and report if FCS is supported by FW. Signed-off-by: Roman Zhukov Signed-off-by: Denis Pryazhennikov Reviewed-by: Viacheslav Galaktionov Acked-by: Andrew Rybchenko --- drivers/common/sfc_efx/base/ef10_nic.c | 6 ++++++ drivers/common/sfc_efx/base/efx.h | 1 + drivers/common/sfc_efx/base/siena_nic.c | 1 + 3 files changed, 8 insertions(+) diff --git a/drivers/common/sfc_efx/base/ef10_nic.c b/drivers/common/sfc_efx/base/ef10_nic.c index 0c6a2eee4453..bf9cb9d30990 100644 --- a/drivers/common/sfc_efx/base/ef10_nic.c +++ b/drivers/common/sfc_efx/base/ef10_nic.c @@ -1244,6 +1244,12 @@ ef10_get_datapath_caps( /* No limit on maximum number of Rx scatter elements per packet. */ encp->enc_rx_scatter_max = -1; + /* Check if the firmware supports include FCS on RX */ + if (CAP_FLAGS1(req, RX_INCLUDE_FCS)) + encp->enc_rx_include_fcs_supported = B_TRUE; + else + encp->enc_rx_include_fcs_supported = B_FALSE; + /* Check if the firmware supports packed stream mode */ if (CAP_FLAGS1(req, RX_PACKED_STREAM)) encp->enc_rx_packed_stream_supported = B_TRUE; diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index a63211612249..b5bd390169ae 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -1629,6 +1629,7 @@ typedef struct efx_nic_cfg_s { /* Datapath firmware vport reconfigure support */ boolean_t enc_vport_reconfigure_supported; boolean_t enc_rx_disable_scatter_supported; + boolean_t enc_rx_include_fcs_supported; /* Maximum number of Rx scatter segments supported by HW */ uint32_t enc_rx_scatter_max; boolean_t enc_allow_set_mac_with_installed_filters; diff --git a/drivers/common/sfc_efx/base/siena_nic.c b/drivers/common/sfc_efx/base/siena_nic.c index 1f1fb7d2afd1..ca38eefa7e37 100644 --- a/drivers/common/sfc_efx/base/siena_nic.c +++ b/drivers/common/sfc_efx/base/siena_nic.c @@ -187,6 +187,7 @@ siena_board_cfg( encp->enc_allow_set_mac_with_installed_filters = B_TRUE; encp->enc_rx_packed_stream_supported = B_FALSE; encp->enc_rx_var_packed_stream_supported = B_FALSE; + encp->enc_rx_include_fcs_supported = B_FALSE; encp->enc_rx_es_super_buffer_supported = B_FALSE; encp->enc_fw_subvariant_no_tx_csum_supported = B_FALSE; From patchwork Thu Jun 22 11:47:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Pryazhennikov X-Patchwork-Id: 128919 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 AB44842D23; Thu, 22 Jun 2023 13:49:43 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5D6A442D16; Thu, 22 Jun 2023 13:49:35 +0200 (CEST) Received: from agw.arknetworks.am (agw.arknetworks.am [79.141.165.80]) by mails.dpdk.org (Postfix) with ESMTP id 247C4406B8 for ; Thu, 22 Jun 2023 13:49:27 +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 9641AE1278; Thu, 22 Jun 2023 15:49:26 +0400 (+04) From: Denis Pryazhennikov To: dev@dpdk.org Cc: Ferruh Yigit , Andrew Rybchenko , Roman Zhukov , Andy Moreton Subject: [PATCH v4 3/4] common/sfc_efx/base: add support for configure MAC to keep FCS Date: Thu, 22 Jun 2023 15:47:54 +0400 Message-Id: <20230622114755.1754-4-denis.pryazhennikov@arknetworks.am> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: <20230622114755.1754-1-denis.pryazhennikov@arknetworks.am> References: <20230601114220.17796-1-denis.pryazhennikov@arknetworks.am> <20230622114755.1754-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 From: Roman Zhukov Drivers cannot determine if received packet includes the FCS or not. Only packets with an external port have the FCS included and functions without link control privilege cannot determine the MAC configuration. This patch is trying to make assumptions that: if PF is the only function (there are no VFs or additional PFs); it can set the MAC configuration and it never expects packets it sends to be looped back then it can assume that changed the MAC configuration to include the FCS is safe and that all received packets will include their FCS. Signed-off-by: Roman Zhukov Signed-off-by: Denis Pryazhennikov Reviewed-by: Andy Moreton Acked-by: Andrew Rybchenko --- drivers/common/sfc_efx/base/ef10_mac.c | 5 +-- drivers/common/sfc_efx/base/efx.h | 5 +++ drivers/common/sfc_efx/base/efx_impl.h | 1 + drivers/common/sfc_efx/base/efx_mac.c | 48 ++++++++++++++++++++++++++ drivers/common/sfc_efx/version.map | 1 + 5 files changed, 58 insertions(+), 2 deletions(-) diff --git a/drivers/common/sfc_efx/base/ef10_mac.c b/drivers/common/sfc_efx/base/ef10_mac.c index 28228a9fb784..bfc82b80c7e5 100644 --- a/drivers/common/sfc_efx/base/ef10_mac.c +++ b/drivers/common/sfc_efx/base/ef10_mac.c @@ -307,9 +307,10 @@ ef10_mac_reconfigure( */ MCDI_IN_SET_DWORD(req, SET_MAC_IN_FCNTL, MC_CMD_FCNTL_AUTO); - /* Do not include the Ethernet frame checksum in RX packets */ + /* Include the Ethernet frame checksum in RX packets if it's required */ MCDI_IN_POPULATE_DWORD_1(req, SET_MAC_IN_FLAGS, - SET_MAC_IN_FLAG_INCLUDE_FCS, 0); + SET_MAC_IN_FLAG_INCLUDE_FCS, + epp->ep_include_fcs ? 1 : 0); efx_mcdi_execute_quiet(enp, &req); diff --git a/drivers/common/sfc_efx/base/efx.h b/drivers/common/sfc_efx/base/efx.h index b5bd390169ae..ef626cc55a7e 100644 --- a/drivers/common/sfc_efx/base/efx.h +++ b/drivers/common/sfc_efx/base/efx.h @@ -747,6 +747,11 @@ efx_mac_fcntl_get( __out unsigned int *fcntl_wantedp, __out unsigned int *fcntl_linkp); +LIBEFX_API +extern __checkReturn efx_rc_t +efx_mac_include_fcs_set( + __in efx_nic_t *enp, + __in boolean_t enabled); #if EFSYS_OPT_MAC_STATS diff --git a/drivers/common/sfc_efx/base/efx_impl.h b/drivers/common/sfc_efx/base/efx_impl.h index 09b1e95c594c..92a30c34ae28 100644 --- a/drivers/common/sfc_efx/base/efx_impl.h +++ b/drivers/common/sfc_efx/base/efx_impl.h @@ -363,6 +363,7 @@ typedef struct efx_port_s { uint32_t ep_default_adv_cap_mask; uint32_t ep_phy_cap_mask; boolean_t ep_mac_drain; + boolean_t ep_include_fcs; #if EFSYS_OPT_BIST efx_bist_type_t ep_current_bist; #endif diff --git a/drivers/common/sfc_efx/base/efx_mac.c b/drivers/common/sfc_efx/base/efx_mac.c index c51e86b52c29..13cac5a75130 100644 --- a/drivers/common/sfc_efx/base/efx_mac.c +++ b/drivers/common/sfc_efx/base/efx_mac.c @@ -527,6 +527,54 @@ efx_mac_filter_default_rxq_clear( emop->emo_filter_default_rxq_clear(enp); } + __checkReturn efx_rc_t +efx_mac_include_fcs_set( + __in efx_nic_t *enp, + __in boolean_t enabled) +{ + efx_port_t *epp = &(enp->en_port); + efx_nic_cfg_t *encp = &(enp->en_nic_cfg); + const efx_mac_ops_t *emop = epp->ep_emop; + efx_rc_t rc; + + EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC); + EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PORT); + EFSYS_ASSERT(emop != NULL); + + if (enabled && !encp->enc_rx_include_fcs_supported) { + rc = ENOTSUP; + goto fail1; + } + + /* + * Enabling 'include FCS' changes link control state and affects + * behaviour for all PCI functions on the port, so to avoid this it + * can be enabled only if the PCI function is exclusive port user + */ + if (enabled && encp->enc_port_usage != EFX_PORT_USAGE_EXCLUSIVE) { + rc = EACCES; + goto fail2; + } + + if (epp->ep_include_fcs != enabled) { + epp->ep_include_fcs = enabled; + + rc = emop->emo_reconfigure(enp); + if (rc != 0) + goto fail3; + } + + return 0; + +fail3: + EFSYS_PROBE(fail3); +fail2: + EFSYS_PROBE(fail2); +fail1: + EFSYS_PROBE1(fail1, efx_rc_t, rc); + + return rc; +} #if EFSYS_OPT_MAC_STATS diff --git a/drivers/common/sfc_efx/version.map b/drivers/common/sfc_efx/version.map index e91bcbcad863..01113bffa7cb 100644 --- a/drivers/common/sfc_efx/version.map +++ b/drivers/common/sfc_efx/version.map @@ -71,6 +71,7 @@ INTERNAL { efx_mac_drain; efx_mac_fcntl_get; efx_mac_fcntl_set; + efx_mac_include_fcs_set; efx_mac_filter_default_rxq_clear; efx_mac_filter_default_rxq_set; efx_mac_filter_get_all_ucast_mcast; From patchwork Thu Jun 22 11:47:55 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Denis Pryazhennikov X-Patchwork-Id: 128920 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 6CB8342D23; Thu, 22 Jun 2023 13:49:50 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 71F7A42D2D; Thu, 22 Jun 2023 13:49:36 +0200 (CEST) Received: from agw.arknetworks.am (agw.arknetworks.am [79.141.165.80]) by mails.dpdk.org (Postfix) with ESMTP id B6F1A4113F for ; Thu, 22 Jun 2023 13:49:27 +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 3075DE127E; Thu, 22 Jun 2023 15:49:27 +0400 (+04) From: Denis Pryazhennikov To: dev@dpdk.org Cc: Ferruh Yigit , Andrew Rybchenko , Roman Zhukov , Andy Moreton Subject: [PATCH v4 4/4] net/sfc: add configurable Rx CRC stripping Date: Thu, 22 Jun 2023 15:47:55 +0400 Message-Id: <20230622114755.1754-5-denis.pryazhennikov@arknetworks.am> X-Mailer: git-send-email 2.39.2 (Apple Git-143) In-Reply-To: <20230622114755.1754-1-denis.pryazhennikov@arknetworks.am> References: <20230601114220.17796-1-denis.pryazhennikov@arknetworks.am> <20230622114755.1754-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; }