From patchwork Sat Jun 1 08:42:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 54000 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E83211B9A4; Sat, 1 Jun 2019 10:43:10 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id 867161B9A1 for ; Sat, 1 Jun 2019 10:43:09 +0200 (CEST) X-Virus-Scanned: Proofpoint Essentials engine Received: from webmail.solarflare.com (webmail.solarflare.com [12.187.104.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us3.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 59336B4006C for ; Sat, 1 Jun 2019 08:43:06 +0000 (UTC) Received: from ocex03.SolarFlarecom.com (10.20.40.36) by ocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Sat, 1 Jun 2019 01:43:04 -0700 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server (TLS) id 15.0.1395.4 via Frontend Transport; Sat, 1 Jun 2019 01:43:02 -0700 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id x518h1bH018895 for ; Sat, 1 Jun 2019 09:43:01 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 723921616E0 for ; Sat, 1 Jun 2019 09:43:01 +0100 (BST) From: Andrew Rybchenko To: Date: Sat, 1 Jun 2019 09:42:43 +0100 Message-ID: <1559378564-14636-1-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.5.1010-24650.005 X-TM-AS-Result: No-8.259300-4.000000-10 X-TMASE-MatchedRID: NRnEJqDQkro2jeY+Udg/IuNI3Mct2lzaoPPOu2yMJlMLXLVnAP6YT6in GtMhn7Ok25g8qsPx73N+7m5nQ3vrnv9IzD24yv0fRTO9mhIXG40xXH/dlhvLv4VfwwX/hpa6fnD b8/DFzrBY4YQXcZwoeoiuG/EceiPW7c0is1Jg1Ff0VCHd+VQiHmnjGis711KZYy6fApvL8BcKHk UYQmViAXxs7qFZ9FbOj0IvV7jlqDg7q91bcxSy1TXgRPG8ApuyUg5zxCPHJW3YzDFd3mQzYakOm p+Vjuo8CcE2TFzC1Nvom8v9cDlCRlreT3goXqiU5venhychcY3DAPSbMWlGt/8aP6EIcLWEUZGE 0qUrJUWWkqk2IvguWlmfgLyyiGcTgPBMDqhk21HrobZps+Pq2ENWaKIdBIV4wtH/UJoR+okV9Av xm8OyI3VsgNYIKwqQbOUsBbIsdlMfE8yM4pjsD4mGcq1C0C9WxEHRux+uk8jHUU+U0ACZwAERNJ tVYLb76jC6f3o1r763qQ+bA6iTll3WYxDGKIArnqg/VrSZEiM= X-TM-AS-User-Approved-Sender: No X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--8.259300-4.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24650.005 X-MDID: 1559378586-Q12v6kaXbBeI Subject: [dpdk-dev] [PATCH 1/2] net/sfc: advertise offload caps directly by Rx datapaths X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Rx datapath feature bits were useful on migration from the old offload API to the new one. However, right now it just adds indirection which complicates code reading and understanding. Also addition of a new offloads requires addition of a new feature bits and makes patches longer and harder to understand. So, remove feature bits which correspond to Rx offloads and simply advertise device and per-queue offloads directly. Generic code could still mask some offloads if running HW or FW does not support it. Signed-off-by: Andrew Rybchenko Reviewed-by: Igor Romanov Reviewed-by: Ivan Malov --- drivers/net/sfc/sfc_dp_rx.h | 25 +++++++++++++++++------ drivers/net/sfc/sfc_ef10_essb_rx.c | 5 +++-- drivers/net/sfc/sfc_ef10_rx.c | 8 ++++---- drivers/net/sfc/sfc_rx.c | 42 ++++++++++++++++++-------------------- 4 files changed, 46 insertions(+), 34 deletions(-) diff --git a/drivers/net/sfc/sfc_dp_rx.h b/drivers/net/sfc/sfc_dp_rx.h index 042c014..a374311 100644 --- a/drivers/net/sfc/sfc_dp_rx.h +++ b/drivers/net/sfc/sfc_dp_rx.h @@ -199,12 +199,19 @@ struct sfc_dp_rx { struct sfc_dp dp; unsigned int features; -#define SFC_DP_RX_FEAT_SCATTER 0x1 -#define SFC_DP_RX_FEAT_MULTI_PROCESS 0x2 -#define SFC_DP_RX_FEAT_TUNNELS 0x4 -#define SFC_DP_RX_FEAT_FLOW_FLAG 0x8 -#define SFC_DP_RX_FEAT_FLOW_MARK 0x10 -#define SFC_DP_RX_FEAT_CHECKSUM 0x20 +#define SFC_DP_RX_FEAT_MULTI_PROCESS 0x1 +#define SFC_DP_RX_FEAT_FLOW_FLAG 0x2 +#define SFC_DP_RX_FEAT_FLOW_MARK 0x4 + /** + * Rx offload capabilities supported by the datapath on device + * level only if HW/FW supports it. + */ + uint64_t dev_offload_capa; + /** + * Rx offload capabilities supported by the datapath per-queue + * if HW/FW supports it. + */ + uint64_t queue_offload_capa; sfc_dp_rx_get_dev_info_t *get_dev_info; sfc_dp_rx_pool_ops_supported_t *pool_ops_supported; sfc_dp_rx_qsize_up_rings_t *qsize_up_rings; @@ -237,6 +244,12 @@ struct sfc_dp_rx { return (p == NULL) ? NULL : container_of(p, struct sfc_dp_rx, dp); } +static inline uint64_t +sfc_dp_rx_offload_capa(const struct sfc_dp_rx *dp_rx) +{ + return dp_rx->dev_offload_capa | dp_rx->queue_offload_capa; +} + /** Get Rx datapath ops by the datapath RxQ handle */ const struct sfc_dp_rx *sfc_dp_rx_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq); diff --git a/drivers/net/sfc/sfc_ef10_essb_rx.c b/drivers/net/sfc/sfc_ef10_essb_rx.c index ccb6aea..63da807 100644 --- a/drivers/net/sfc/sfc_ef10_essb_rx.c +++ b/drivers/net/sfc/sfc_ef10_essb_rx.c @@ -714,8 +714,9 @@ struct sfc_dp_rx sfc_ef10_essb_rx = { SFC_DP_HW_FW_CAP_RX_ES_SUPER_BUFFER, }, .features = SFC_DP_RX_FEAT_FLOW_FLAG | - SFC_DP_RX_FEAT_FLOW_MARK | - SFC_DP_RX_FEAT_CHECKSUM, + SFC_DP_RX_FEAT_FLOW_MARK, + .dev_offload_capa = DEV_RX_OFFLOAD_CHECKSUM, + .queue_offload_capa = 0, .get_dev_info = sfc_ef10_essb_rx_get_dev_info, .pool_ops_supported = sfc_ef10_essb_rx_pool_ops_supported, .qsize_up_rings = sfc_ef10_essb_rx_qsize_up_rings, diff --git a/drivers/net/sfc/sfc_ef10_rx.c b/drivers/net/sfc/sfc_ef10_rx.c index 49e32fa..b294b43 100644 --- a/drivers/net/sfc/sfc_ef10_rx.c +++ b/drivers/net/sfc/sfc_ef10_rx.c @@ -750,10 +750,10 @@ struct sfc_dp_rx sfc_ef10_rx = { .type = SFC_DP_RX, .hw_fw_caps = SFC_DP_HW_FW_CAP_EF10, }, - .features = SFC_DP_RX_FEAT_SCATTER | - SFC_DP_RX_FEAT_MULTI_PROCESS | - SFC_DP_RX_FEAT_TUNNELS | - SFC_DP_RX_FEAT_CHECKSUM, + .features = SFC_DP_RX_FEAT_MULTI_PROCESS, + .dev_offload_capa = DEV_RX_OFFLOAD_CHECKSUM | + DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM, + .queue_offload_capa = DEV_RX_OFFLOAD_SCATTER, .get_dev_info = sfc_ef10_rx_get_dev_info, .qsize_up_rings = sfc_ef10_rx_qsize_up_rings, .qcreate = sfc_ef10_rx_qcreate, diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c index f222111..70e7614 100644 --- a/drivers/net/sfc/sfc_rx.c +++ b/drivers/net/sfc/sfc_rx.c @@ -557,8 +557,9 @@ struct sfc_dp_rx sfc_efx_rx = { .type = SFC_DP_RX, .hw_fw_caps = 0, }, - .features = SFC_DP_RX_FEAT_SCATTER | - SFC_DP_RX_FEAT_CHECKSUM, + .features = 0, + .dev_offload_capa = DEV_RX_OFFLOAD_CHECKSUM, + .queue_offload_capa = DEV_RX_OFFLOAD_SCATTER, .qsize_up_rings = sfc_efx_rx_qsize_up_rings, .qcreate = sfc_efx_rx_qcreate, .qdestroy = sfc_efx_rx_qdestroy, @@ -806,36 +807,32 @@ struct sfc_dp_rx sfc_efx_rx = { sfc_ev_qstop(rxq->evq); } -uint64_t -sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa) +static uint64_t +sfc_rx_get_offload_mask(struct sfc_adapter *sa) { const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); - uint64_t caps = 0; + uint64_t no_caps = 0; - caps |= DEV_RX_OFFLOAD_JUMBO_FRAME; + if (encp->enc_tunnel_encapsulations_supported == 0) + no_caps |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM; - if (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_CHECKSUM) { - caps |= DEV_RX_OFFLOAD_IPV4_CKSUM; - caps |= DEV_RX_OFFLOAD_UDP_CKSUM; - caps |= DEV_RX_OFFLOAD_TCP_CKSUM; - } + return ~no_caps; +} - if (encp->enc_tunnel_encapsulations_supported && - (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_TUNNELS)) - caps |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM; +uint64_t +sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa) +{ + uint64_t caps = sa->priv.dp_rx->dev_offload_capa; + + caps |= DEV_RX_OFFLOAD_JUMBO_FRAME; - return caps; + return caps & sfc_rx_get_offload_mask(sa); } uint64_t sfc_rx_get_queue_offload_caps(struct sfc_adapter *sa) { - uint64_t caps = 0; - - if (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_SCATTER) - caps |= DEV_RX_OFFLOAD_SCATTER; - - return caps; + return sa->priv.dp_rx->queue_offload_capa & sfc_rx_get_offload_mask(sa); } static int @@ -1047,7 +1044,8 @@ struct sfc_dp_rx sfc_efx_rx = { EFX_RXQ_FLAG_SCATTER : EFX_RXQ_FLAG_NONE; if ((encp->enc_tunnel_encapsulations_supported != 0) && - (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_TUNNELS)) + (sfc_dp_rx_offload_capa(sa->priv.dp_rx) & + DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) != 0) rxq_info->type_flags |= EFX_RXQ_FLAG_INNER_CLASSES; rc = sfc_ev_qinit(sa, SFC_EVQ_TYPE_RX, sw_index, From patchwork Sat Jun 1 08:42:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Rybchenko X-Patchwork-Id: 53999 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 218A31B99E; Sat, 1 Jun 2019 10:43:09 +0200 (CEST) Received: from dispatch1-us1.ppe-hosted.com (dispatch1-us1.ppe-hosted.com [148.163.129.52]) by dpdk.org (Postfix) with ESMTP id C30CF1B99D for ; Sat, 1 Jun 2019 10:43:07 +0200 (CEST) X-Virus-Scanned: Proofpoint Essentials engine Received: from webmail.solarflare.com (webmail.solarflare.com [12.187.104.26]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by mx1-us3.ppe-hosted.com (PPE Hosted ESMTP Server) with ESMTPS id 220A8B4005A for ; Sat, 1 Jun 2019 08:43:06 +0000 (UTC) Received: from ocex03.SolarFlarecom.com (10.20.40.36) by ocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Sat, 1 Jun 2019 01:43:03 -0700 Received: from opal.uk.solarflarecom.com (10.17.10.1) by ocex03.SolarFlarecom.com (10.20.40.36) with Microsoft SMTP Server (TLS) id 15.0.1395.4 via Frontend Transport; Sat, 1 Jun 2019 01:43:02 -0700 Received: from ukv-loginhost.uk.solarflarecom.com (ukv-loginhost.uk.solarflarecom.com [10.17.10.39]) by opal.uk.solarflarecom.com (8.13.8/8.13.8) with ESMTP id x518h1wo018902 for ; Sat, 1 Jun 2019 09:43:01 +0100 Received: from ukv-loginhost.uk.solarflarecom.com (localhost [127.0.0.1]) by ukv-loginhost.uk.solarflarecom.com (Postfix) with ESMTP id 753A316353B for ; Sat, 1 Jun 2019 09:43:01 +0100 (BST) From: Andrew Rybchenko To: Date: Sat, 1 Jun 2019 09:42:44 +0100 Message-ID: <1559378564-14636-2-git-send-email-arybchenko@solarflare.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1559378564-14636-1-git-send-email-arybchenko@solarflare.com> References: <1559378564-14636-1-git-send-email-arybchenko@solarflare.com> MIME-Version: 1.0 X-TM-AS-Product-Ver: SMEX-12.5.0.1300-8.5.1010-24650.005 X-TM-AS-Result: No-13.169500-4.000000-10 X-TMASE-MatchedRID: P/t7wJ/pK0KczisXkLghg4FM5Qu48bxgoYSqKB/v38sv4fVTr0+gIA0h MgLyaDPsli+pdh0D/ZtqUmD8YRpTDcc7x4DEI6P2pd+L8amq7UzLlinyo+kVD1IxScKXZnK03ME 6Ad7WsxUcIAvteQEPNhdYV5l0cMWN/U9i5JnnJemolIr4dI9j7+lUxvXGcRIyBph69XjMbdlAHO g8qEtqyAjN8Ql23yICTGorldI0hamioiiVcDC26WUcDj960n6v+r3DIOwP4KUfVuGrjP7J9FHDk 9DzfOk+ZPgE+II3444j9dQJVaMNBJmRr1k6e+lg66G2abPj6tg9/b618SpbHV9QIc+ez/4+SNhu Pi0fpNurvuM3qVPJMznUt21Ba5NCwxJ3bCddR8b805SSvoAPNzB4tWHctlhIUcsh8SEXA6nmjdG ayJaQ9jrD96NzPB03m9qbsT+aRikM8jMXjBF+sBRFJJyf5BJeAPpGmOpAZoX6C0ePs7A07fk39L XMSri6paDZTWHfvlq05s3joly7PZCnfYb8jdQrKhi8E7vGbjg= X-TM-AS-User-Approved-Sender: No X-TM-AS-User-Blocked-Sender: No X-TMASE-Result: 10--13.169500-4.000000 X-TMASE-Version: SMEX-12.5.0.1300-8.5.1010-24650.005 X-MDID: 1559378586-LtXBU3gDHuTs Subject: [dpdk-dev] [PATCH 2/2] net/sfc: advertise offload caps directly by Tx datapaths X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Tx datapath feature bits were useful on migration from the old offload API to the new one. However, right now it just adds indirection which complicates code reading and understanding. Also addition of a new offloads requires addition of a new feature bits and makes patches longer and harder to understand. So, remove feature bits which correspond to Tx offloads and simply advertise device and per-queue offloads directly. Generic code could still mask some offloads if running HW or FW does not support it. Signed-off-by: Andrew Rybchenko Reviewed-by: Igor Romanov Reviewed-by: Ivan Malov --- drivers/net/sfc/sfc.c | 7 +++-- drivers/net/sfc/sfc_dp_tx.h | 24 +++++++++++----- drivers/net/sfc/sfc_ef10_tx.c | 20 ++++++++++---- drivers/net/sfc/sfc_tx.c | 64 ++++++++++++++++++++----------------------- 4 files changed, 65 insertions(+), 50 deletions(-) diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c index 406386a..dea57b2 100644 --- a/drivers/net/sfc/sfc.c +++ b/drivers/net/sfc/sfc.c @@ -744,13 +744,16 @@ sa->priv.shared->tunnel_encaps = encp->enc_tunnel_encapsulations_supported; - if (sa->priv.dp_tx->features & SFC_DP_TX_FEAT_TSO) { + if (sfc_dp_tx_offload_capa(sa->priv.dp_tx) & DEV_TX_OFFLOAD_TCP_TSO) { sa->tso = encp->enc_fw_assisted_tso_v2_enabled; if (!sa->tso) sfc_info(sa, "TSO support isn't available on this adapter"); } - if (sa->tso && sa->priv.dp_tx->features & SFC_DP_TX_FEAT_TSO_ENCAP) { + if (sa->tso && + (sfc_dp_tx_offload_capa(sa->priv.dp_tx) & + (DEV_TX_OFFLOAD_VXLAN_TNL_TSO | + DEV_TX_OFFLOAD_GENEVE_TNL_TSO)) != 0) { sa->tso_encap = encp->enc_fw_assisted_tso_v2_encap_enabled; if (!sa->tso_encap) sfc_info(sa, "Encapsulated TSO support isn't available on this adapter"); diff --git a/drivers/net/sfc/sfc_dp_tx.h b/drivers/net/sfc/sfc_dp_tx.h index 72a6914..7105d27 100644 --- a/drivers/net/sfc/sfc_dp_tx.h +++ b/drivers/net/sfc/sfc_dp_tx.h @@ -157,13 +157,17 @@ struct sfc_dp_tx { struct sfc_dp dp; unsigned int features; -#define SFC_DP_TX_FEAT_VLAN_INSERT 0x1 -#define SFC_DP_TX_FEAT_TSO 0x2 -#define SFC_DP_TX_FEAT_MULTI_SEG 0x4 -#define SFC_DP_TX_FEAT_MULTI_PROCESS 0x8 -#define SFC_DP_TX_FEAT_MULTI_POOL 0x10 -#define SFC_DP_TX_FEAT_REFCNT 0x20 -#define SFC_DP_TX_FEAT_TSO_ENCAP 0x40 +#define SFC_DP_TX_FEAT_MULTI_PROCESS 0x1 + /** + * Tx offload capabilities supported by the datapath on device + * level only if HW/FW supports it. + */ + uint64_t dev_offload_capa; + /** + * Tx offload capabilities supported by the datapath per-queue + * if HW/FW supports it. + */ + uint64_t queue_offload_capa; sfc_dp_tx_get_dev_info_t *get_dev_info; sfc_dp_tx_qsize_up_rings_t *qsize_up_rings; sfc_dp_tx_qcreate_t *qcreate; @@ -196,6 +200,12 @@ struct sfc_dp_tx { /** Get Tx datapath ops by the datapath TxQ handle */ const struct sfc_dp_tx *sfc_dp_tx_by_dp_txq(const struct sfc_dp_txq *dp_txq); +static inline uint64_t +sfc_dp_tx_offload_capa(const struct sfc_dp_tx *dp_tx) +{ + return dp_tx->dev_offload_capa | dp_tx->queue_offload_capa; +} + static inline int sfc_dp_tx_prepare_pkt(struct rte_mbuf *m, uint32_t tso_tcp_header_offset_limit, diff --git a/drivers/net/sfc/sfc_ef10_tx.c b/drivers/net/sfc/sfc_ef10_tx.c index 4e4f358..43e3447 100644 --- a/drivers/net/sfc/sfc_ef10_tx.c +++ b/drivers/net/sfc/sfc_ef10_tx.c @@ -1098,12 +1098,15 @@ struct sfc_dp_tx sfc_ef10_tx = { .type = SFC_DP_TX, .hw_fw_caps = SFC_DP_HW_FW_CAP_EF10, }, - .features = SFC_DP_TX_FEAT_TSO | - SFC_DP_TX_FEAT_TSO_ENCAP | - SFC_DP_TX_FEAT_MULTI_SEG | - SFC_DP_TX_FEAT_MULTI_POOL | - SFC_DP_TX_FEAT_REFCNT | - SFC_DP_TX_FEAT_MULTI_PROCESS, + .features = SFC_DP_TX_FEAT_MULTI_PROCESS, + .dev_offload_capa = DEV_TX_OFFLOAD_MULTI_SEGS, + .queue_offload_capa = DEV_TX_OFFLOAD_IPV4_CKSUM | + DEV_TX_OFFLOAD_UDP_CKSUM | + DEV_TX_OFFLOAD_TCP_CKSUM | + DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM | + DEV_TX_OFFLOAD_TCP_TSO | + DEV_TX_OFFLOAD_VXLAN_TNL_TSO | + DEV_TX_OFFLOAD_GENEVE_TNL_TSO, .get_dev_info = sfc_ef10_get_dev_info, .qsize_up_rings = sfc_ef10_tx_qsize_up_rings, .qcreate = sfc_ef10_tx_qcreate, @@ -1123,6 +1126,11 @@ struct sfc_dp_tx sfc_ef10_simple_tx = { .type = SFC_DP_TX, }, .features = SFC_DP_TX_FEAT_MULTI_PROCESS, + .dev_offload_capa = DEV_TX_OFFLOAD_MBUF_FAST_FREE, + .queue_offload_capa = DEV_TX_OFFLOAD_IPV4_CKSUM | + DEV_TX_OFFLOAD_UDP_CKSUM | + DEV_TX_OFFLOAD_TCP_CKSUM | + DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM, .get_dev_info = sfc_ef10_get_dev_info, .qsize_up_rings = sfc_ef10_tx_qsize_up_rings, .qcreate = sfc_ef10_tx_qcreate, diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c index e1ef00c..7d0e18a 100644 --- a/drivers/net/sfc/sfc_tx.c +++ b/drivers/net/sfc/sfc_tx.c @@ -34,47 +34,38 @@ */ #define SFC_TX_QFLUSH_POLL_ATTEMPTS (2000) -uint64_t -sfc_tx_get_dev_offload_caps(struct sfc_adapter *sa) +static uint64_t +sfc_tx_get_offload_mask(struct sfc_adapter *sa) { const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); - uint64_t caps = 0; + uint64_t no_caps = 0; - if ((sa->priv.dp_tx->features & SFC_DP_TX_FEAT_VLAN_INSERT) && - encp->enc_hw_tx_insert_vlan_enabled) - caps |= DEV_TX_OFFLOAD_VLAN_INSERT; + if (!encp->enc_hw_tx_insert_vlan_enabled) + no_caps |= DEV_TX_OFFLOAD_VLAN_INSERT; - if (sa->priv.dp_tx->features & SFC_DP_TX_FEAT_MULTI_SEG) - caps |= DEV_TX_OFFLOAD_MULTI_SEGS; + if (!encp->enc_tunnel_encapsulations_supported) + no_caps |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM; - if ((~sa->priv.dp_tx->features & SFC_DP_TX_FEAT_MULTI_POOL) && - (~sa->priv.dp_tx->features & SFC_DP_TX_FEAT_REFCNT)) - caps |= DEV_TX_OFFLOAD_MBUF_FAST_FREE; + if (!sa->tso) + no_caps |= DEV_TX_OFFLOAD_TCP_TSO; - return caps; + if (!sa->tso_encap) + no_caps |= (DEV_TX_OFFLOAD_VXLAN_TNL_TSO | + DEV_TX_OFFLOAD_GENEVE_TNL_TSO); + + return ~no_caps; } uint64_t -sfc_tx_get_queue_offload_caps(struct sfc_adapter *sa) +sfc_tx_get_dev_offload_caps(struct sfc_adapter *sa) { - const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic); - uint64_t caps = 0; - - caps |= DEV_TX_OFFLOAD_IPV4_CKSUM; - caps |= DEV_TX_OFFLOAD_UDP_CKSUM; - caps |= DEV_TX_OFFLOAD_TCP_CKSUM; - - if (encp->enc_tunnel_encapsulations_supported) - caps |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM; - - if (sa->tso) - caps |= DEV_TX_OFFLOAD_TCP_TSO; - - if (sa->tso_encap) - caps |= (DEV_TX_OFFLOAD_VXLAN_TNL_TSO | - DEV_TX_OFFLOAD_GENEVE_TNL_TSO); + return sa->priv.dp_tx->dev_offload_capa & sfc_tx_get_offload_mask(sa); +} - return caps; +uint64_t +sfc_tx_get_queue_offload_caps(struct sfc_adapter *sa) +{ + return sa->priv.dp_tx->queue_offload_capa & sfc_tx_get_offload_mask(sa); } static int @@ -1149,11 +1140,14 @@ struct sfc_dp_tx sfc_efx_tx = { .type = SFC_DP_TX, .hw_fw_caps = 0, }, - .features = SFC_DP_TX_FEAT_VLAN_INSERT | - SFC_DP_TX_FEAT_TSO | - SFC_DP_TX_FEAT_MULTI_POOL | - SFC_DP_TX_FEAT_REFCNT | - SFC_DP_TX_FEAT_MULTI_SEG, + .features = 0, + .dev_offload_capa = DEV_TX_OFFLOAD_VLAN_INSERT | + DEV_TX_OFFLOAD_MULTI_SEGS, + .queue_offload_capa = DEV_TX_OFFLOAD_IPV4_CKSUM | + DEV_TX_OFFLOAD_UDP_CKSUM | + DEV_TX_OFFLOAD_TCP_CKSUM | + DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM | + DEV_TX_OFFLOAD_TCP_TSO, .qsize_up_rings = sfc_efx_tx_qsize_up_rings, .qcreate = sfc_efx_tx_qcreate, .qdestroy = sfc_efx_tx_qdestroy,