From patchwork Fri Jan 15 17:19:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rahul Lakkireddy X-Patchwork-Id: 86711 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 D3E33A0A05; Fri, 15 Jan 2021 18:36:39 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 3056D1411FE; Fri, 15 Jan 2021 18:36:34 +0100 (CET) Received: from stargate.chelsio.com (stargate.chelsio.com [12.32.117.8]) by mails.dpdk.org (Postfix) with ESMTP id 33B4D1411FC for ; Fri, 15 Jan 2021 18:36:32 +0100 (CET) Received: from localhost (scalar.blr.asicdesigners.com [10.193.185.94]) by stargate.chelsio.com (8.13.8/8.13.8) with ESMTP id 10FHaTdQ013288; Fri, 15 Jan 2021 09:36:29 -0800 From: Rahul Lakkireddy To: dev@dpdk.org Cc: kaara.satwik@chelsio.com Date: Fri, 15 Jan 2021 22:49:17 +0530 Message-Id: <92d7ce2b978c6dd777d2c25e536530972789d10c.1610730372.git.rahul.lakkireddy@chelsio.com> X-Mailer: git-send-email 2.5.3 In-Reply-To: References: In-Reply-To: References: Subject: [dpdk-dev] [PATCH 2/2] net/cxgbe: avoid link FEC retraining during probe 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 Sender: "dev" If link FEC has already been saved by firmware during link training in probe, then use the saved FEC value, instead of retraining the link. If link training is still not complete in probe, then firmware will send the actual FEC later in link config change reply after training is complete. Also, there can only be 1 active FEC at any time. So, simplify the FEC get ops. If FEC is supported and if none of the supported FEC caps are set, then assume NOFEC by default, instead of AUTO. Fixes: b99a547371e3 ("net/cxgbe: support configuring link FEC") Signed-off-by: Rahul Lakkireddy --- drivers/net/cxgbe/base/t4_hw.c | 11 ++++++++++- drivers/net/cxgbe/cxgbe_ethdev.c | 21 +++++---------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/drivers/net/cxgbe/base/t4_hw.c b/drivers/net/cxgbe/base/t4_hw.c index 8587eec60..ef20dc667 100644 --- a/drivers/net/cxgbe/base/t4_hw.c +++ b/drivers/net/cxgbe/base/t4_hw.c @@ -4700,6 +4700,7 @@ void t4_reset_link_config(struct adapter *adap, int idx) void t4_init_link_config(struct port_info *pi, u32 pcaps, u32 acaps, u8 mdio_addr, u8 port_type, u8 mod_type) { + u8 fec_rs = 0, fec_baser = 0, fec_none = 0; struct link_config *lc = &pi->link_cfg; lc->pcaps = pcaps; @@ -4722,8 +4723,16 @@ void t4_init_link_config(struct port_info *pi, u32 pcaps, u32 acaps, /* Reset FEC caps to default values */ if (lc->pcaps & V_FW_PORT_CAP32_FEC(M_FW_PORT_CAP32_FEC)) { + if (lc->acaps & FW_PORT_CAP32_FEC_RS) + fec_rs = 1; + else if (lc->acaps & FW_PORT_CAP32_FEC_BASER_RS) + fec_baser = 1; + else + fec_none = 1; + lc->admin_caps &= ~V_FW_PORT_CAP32_FEC(M_FW_PORT_CAP32_FEC); - t4_set_link_fec(pi, 0, 0, 0, &lc->admin_caps); + t4_set_link_fec(pi, fec_rs, fec_baser, fec_none, + &lc->admin_caps); } if (lc->pcaps & FW_PORT_CAP32_FORCE_FEC) diff --git a/drivers/net/cxgbe/cxgbe_ethdev.c b/drivers/net/cxgbe/cxgbe_ethdev.c index 6f481551d..eb4258fe1 100644 --- a/drivers/net/cxgbe/cxgbe_ethdev.c +++ b/drivers/net/cxgbe/cxgbe_ethdev.c @@ -1256,24 +1256,13 @@ static int cxgbe_fec_get(struct rte_eth_dev *dev, uint32_t *fec_capa) if (!(lc->pcaps & V_FW_PORT_CAP32_FEC(M_FW_PORT_CAP32_FEC))) return -EOPNOTSUPP; - if (caps & FW_PORT_CAP32_FEC_NO_FEC) { - fec_caps = RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC); - goto out; - } - - if (caps & FW_PORT_CAP32_FEC_BASER_RS) { - fec_caps = RTE_ETH_FEC_MODE_CAPA_MASK(BASER); - goto out; - } - - if (caps & FW_PORT_CAP32_FEC_RS) { + if (caps & FW_PORT_CAP32_FEC_RS) fec_caps = RTE_ETH_FEC_MODE_CAPA_MASK(RS); - goto out; - } - - fec_caps = RTE_ETH_FEC_MODE_CAPA_MASK(AUTO); + else if (caps & FW_PORT_CAP32_FEC_BASER_RS) + fec_caps = RTE_ETH_FEC_MODE_CAPA_MASK(BASER); + else + fec_caps = RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC); -out: *fec_capa = fec_caps; return 0; }