From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 85FC0A034C; Wed, 27 Apr 2022 16:59:10 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id CADC942811; Wed, 27 Apr 2022 16:58:38 +0200 (CEST) Received: from relay.smtp-ext.broadcom.com (relay.smtp-ext.broadcom.com [192.19.166.231]) by mails.dpdk.org (Postfix) with ESMTP id F02824280B for ; Wed, 27 Apr 2022 16:58:36 +0200 (CEST) Received: from dhcp-10-123-153-22.dhcp.broadcom.net (bgccx-dev-host-lnx2.bec.broadcom.net [10.123.153.22]) by relay.smtp-ext.broadcom.com (Postfix) with ESMTP id 8A1C2C0000F1; Wed, 27 Apr 2022 07:58:35 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 relay.smtp-ext.broadcom.com 8A1C2C0000F1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=broadcom.com; s=dkimrelay; t=1651071516; bh=8Tk5ZCNaGnEU/Y2lxyT2XNUQ8lWUIvTYQN/5oaoIp+U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kxb1AuRM2yyqQin6rV9rqpdO/CXHPBLhimQwL6GIQYU9TDF8q/r3E9jM0hzeXZKTY +LjcMavqP8Jwhp599LHEz1cLCjlnQxEOdymwLk/Kl1fx2smAePo8yY6+aDY4+c5mMs +zMLlSCizbjYCrvz6/CR+NU2GoS684JTH5caXDoI= From: Kalesh A P To: dev@dpdk.org Cc: ajit.khaparde@broadcom.com Subject: [PATCH 05/17] net/bnxt: fix support for tunnel stateless offloads Date: Wed, 27 Apr 2022 20:28:09 +0530 Message-Id: <20220427145821.5987-6-kalesh-anakkur.purayil@broadcom.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20220427145821.5987-1-kalesh-anakkur.purayil@broadcom.com> References: <20220427145821.5987-1-kalesh-anakkur.purayil@broadcom.com> 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: Kalesh AP The HW only supports tunnel header parsing globally for supported tunnel types. When a function uses one default VNIC to receive both the tunnel and non-tunnel packets, applying the same stateless offload operation to both tunnel and non-tunnel packets can cause problems in certain scenarios. To workaround these problems, the firmware advertises no tunnel header parsing capabilities to the driver using the HWRM_FUNC_QCAPS. The driver must check this flag setting and accordingly not advertise tunnel packet stateless offload capabilities to the stack. If the device supports VXLAN, GRE, IPIP and GENEVE tunnel parsing, then reports RX_OFFLOAD_OUTER_IPV4_CKSUM, RX_OFFLOAD_OUTER_UDP_CKSUM and TX_OFFLOAD_OUTER_IPV4_CKSUM in the Rx/Tx offload capabilities of the device. Also, advertise tunnel TSO capabilities based on FW support. Fixes: 0a6d2a720078 ("net/bnxt: get device infos") Cc: stable@dpdk.org Signed-off-by: Kalesh AP Reviewed-by: Ajit Khaparde Reviewed-by: Somnath Kotur --- drivers/net/bnxt/bnxt.h | 1 + drivers/net/bnxt/bnxt_hwrm.c | 5 +++++ drivers/net/bnxt/bnxt_hwrm.h | 20 ++++++++++++++++++++ drivers/net/bnxt/bnxt_rxq.c | 7 ++++--- drivers/net/bnxt/bnxt_txq.c | 18 ++++++++++++------ 5 files changed, 42 insertions(+), 9 deletions(-) diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h index 9e5ff74..e4e8e8e 100644 --- a/drivers/net/bnxt/bnxt.h +++ b/drivers/net/bnxt/bnxt.h @@ -871,6 +871,7 @@ struct bnxt { uint32_t max_mcast_addr; /* maximum number of mcast filters supported */ struct rte_eth_rss_conf rss_conf; /* RSS configuration. */ + uint16_t tunnel_disable_flag; /* tunnel stateless offloads status */ }; static diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c index bff73a9..178a112 100644 --- a/drivers/net/bnxt/bnxt_hwrm.c +++ b/drivers/net/bnxt/bnxt_hwrm.c @@ -939,6 +939,11 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp) bp->fw_cap |= BNXT_FW_CAP_VLAN_TX_INSERT; PMD_DRV_LOG(DEBUG, "VLAN acceleration for TX is enabled\n"); } + + bp->tunnel_disable_flag = rte_le_to_cpu_16(resp->tunnel_disable_flag); + if (bp->tunnel_disable_flag) + PMD_DRV_LOG(DEBUG, "Tunnel parsing capability is disabled, flags : %#x\n", + bp->tunnel_disable_flag); unlock: HWRM_UNLOCK(); diff --git a/drivers/net/bnxt/bnxt_hwrm.h b/drivers/net/bnxt/bnxt_hwrm.h index 63f8d8c..77f8521 100644 --- a/drivers/net/bnxt/bnxt_hwrm.h +++ b/drivers/net/bnxt/bnxt_hwrm.h @@ -121,6 +121,26 @@ struct bnxt_pf_resource_info { #define BNXT_CTX_VAL_INVAL 0xFFFF +#define BNXT_TUNNELED_OFFLOADS_CAP_VXLAN_EN(bp) \ + (!((bp)->tunnel_disable_flag & HWRM_FUNC_QCAPS_OUTPUT_TUNNEL_DISABLE_FLAG_DISABLE_VXLAN)) +#define BNXT_TUNNELED_OFFLOADS_CAP_NGE_EN(bp) \ + (!((bp)->tunnel_disable_flag & HWRM_FUNC_QCAPS_OUTPUT_TUNNEL_DISABLE_FLAG_DISABLE_NGE)) +#define BNXT_TUNNELED_OFFLOADS_CAP_GRE_EN(bp) \ + (!((bp)->tunnel_disable_flag & HWRM_FUNC_QCAPS_OUTPUT_TUNNEL_DISABLE_FLAG_DISABLE_GRE)) +#define BNXT_TUNNELED_OFFLOADS_CAP_IPINIP_EN(bp) \ + (!((bp)->tunnel_disable_flag & HWRM_FUNC_QCAPS_OUTPUT_TUNNEL_DISABLE_FLAG_DISABLE_IPINIP)) + +/* + * If the device supports VXLAN, GRE, IPIP and GENEVE tunnel parsing, then report + * RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM, RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM and + * RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM in the Rx/Tx offload capabilities of the device. + */ +#define BNXT_TUNNELED_OFFLOADS_CAP_ALL_EN(bp) \ + (BNXT_TUNNELED_OFFLOADS_CAP_VXLAN_EN(bp) && \ + BNXT_TUNNELED_OFFLOADS_CAP_NGE_EN(bp) && \ + BNXT_TUNNELED_OFFLOADS_CAP_GRE_EN(bp) && \ + BNXT_TUNNELED_OFFLOADS_CAP_IPINIP_EN(bp)) + int bnxt_hwrm_cfa_l2_clear_rx_mask(struct bnxt *bp, struct bnxt_vnic_info *vnic); int bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt *bp, struct bnxt_vnic_info *vnic, diff --git a/drivers/net/bnxt/bnxt_rxq.c b/drivers/net/bnxt/bnxt_rxq.c index 8977138..8147404 100644 --- a/drivers/net/bnxt/bnxt_rxq.c +++ b/drivers/net/bnxt/bnxt_rxq.c @@ -34,14 +34,15 @@ uint64_t bnxt_get_rx_port_offloads(struct bnxt *bp) RTE_ETH_RX_OFFLOAD_SCATTER | RTE_ETH_RX_OFFLOAD_RSS_HASH; - rx_offload_capa |= RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM | - RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM; - if (bp->flags & BNXT_FLAG_PTP_SUPPORTED) rx_offload_capa |= RTE_ETH_RX_OFFLOAD_TIMESTAMP; if (bp->vnic_cap_flags & BNXT_VNIC_CAP_VLAN_RX_STRIP) rx_offload_capa |= RTE_ETH_RX_OFFLOAD_VLAN_STRIP; + if (BNXT_TUNNELED_OFFLOADS_CAP_ALL_EN(bp)) + rx_offload_capa |= RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM | + RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM; + return rx_offload_capa; } diff --git a/drivers/net/bnxt/bnxt_txq.c b/drivers/net/bnxt/bnxt_txq.c index 86073a5..c8745ad 100644 --- a/drivers/net/bnxt/bnxt_txq.c +++ b/drivers/net/bnxt/bnxt_txq.c @@ -28,15 +28,21 @@ uint64_t bnxt_get_tx_port_offloads(struct bnxt *bp) RTE_ETH_TX_OFFLOAD_QINQ_INSERT | RTE_ETH_TX_OFFLOAD_MULTI_SEGS; - tx_offload_capa |= RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM | - RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO | - RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO | - RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO | - RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO; - if (bp->fw_cap & BNXT_FW_CAP_VLAN_TX_INSERT) tx_offload_capa |= RTE_ETH_TX_OFFLOAD_VLAN_INSERT; + if (BNXT_TUNNELED_OFFLOADS_CAP_ALL_EN(bp)) + tx_offload_capa |= RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM; + + if (BNXT_TUNNELED_OFFLOADS_CAP_VXLAN_EN(bp)) + tx_offload_capa |= RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO; + if (BNXT_TUNNELED_OFFLOADS_CAP_GRE_EN(bp)) + tx_offload_capa |= RTE_ETH_TX_OFFLOAD_GRE_TNL_TSO; + if (BNXT_TUNNELED_OFFLOADS_CAP_NGE_EN(bp)) + tx_offload_capa |= RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO; + if (BNXT_TUNNELED_OFFLOADS_CAP_IPINIP_EN(bp)) + tx_offload_capa |= RTE_ETH_TX_OFFLOAD_IPIP_TNL_TSO; + return tx_offload_capa; } -- 2.10.1