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 CC2E84660E; Wed, 23 Apr 2025 18:05:30 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 5B60040E68; Wed, 23 Apr 2025 18:00:58 +0200 (CEST) Received: from agw.arknetworks.am (agw.arknetworks.am [79.141.165.80]) by mails.dpdk.org (Postfix) with ESMTP id 0096C40671 for ; Wed, 23 Apr 2025 18:00:45 +0200 (CEST) Received: from localhost.localdomain (unknown [78.109.72.186]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by agw.arknetworks.am (Postfix) with ESMTPSA id 4A791E013F; Wed, 23 Apr 2025 20:00:44 +0400 (+04) DKIM-Filter: OpenDKIM Filter v2.11.0 agw.arknetworks.am 4A791E013F DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arknetworks.am; s=default; t=1745424044; bh=rv9C/tSlKRNf3pbHlNiHlSeLVLlSQYZIuVzjAlwabow=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=J7h2ZibNXGZrvv/BSFS+1zaNUPHeP+btkTX+lCfkkc2WxDjc+88oFSx7FoIXwwWyF A1YTSkHBZri+3b/+RKuOyLAzA8xIxFE0bd+KUJQpPeNa65zfglw6VcACcFJwAHFyvu hS9GnlqK46nsZ1UxNXbar3IiHS7enE3JqQ+mBA7uDmL5Cgll5fXh5G38SQlyZEXY+P 8ejZJaDfF+Rb8vglUfSdCK7bddeK3bk4G1qqlq7ahkRswSc3N2G/cz4UfoLG3KQxh7 Ha6qag5ZU29npTTBKRxQ10VL2p3D2DEmhz0IpZo1FB46uFe5S0TsVCtuJnfuB3RBKT D88wnrSch27sw== From: Ivan Malov To: dev@dpdk.org Cc: Stephen Hemminger , Andrew Rybchenko , Andy Moreton , Pieter Jansen Van Vuuren , Viacheslav Galaktionov Subject: [PATCH v2 40/45] net/sfc: query link status on link change events on new NICs Date: Wed, 23 Apr 2025 19:59:57 +0400 Message-Id: <20250423160002.35706-41-ivan.malov@arknetworks.am> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250423160002.35706-1-ivan.malov@arknetworks.am> References: <20250416140016.36127-1-ivan.malov@arknetworks.am> <20250423160002.35706-1-ivan.malov@arknetworks.am> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 Link events signaled on new adaptors (Medford4 and later) do not carry any specifics, so query the link status separately. Signed-off-by: Ivan Malov Reviewed-by: Andy Moreton Reviewed-by: Pieter Jansen Van Vuuren --- drivers/net/sfc/sfc.h | 2 ++ drivers/net/sfc/sfc_ethdev.c | 2 ++ drivers/net/sfc/sfc_ev.c | 51 +++++++++++++++++++++++++++++++++++- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h index 2432a2307e..819ce52529 100644 --- a/drivers/net/sfc/sfc.h +++ b/drivers/net/sfc/sfc.h @@ -309,6 +309,8 @@ struct sfc_adapter { uint32_t rxd_wait_timeout_ns; bool switchdev; + + bool link_ev_need_poll; }; static inline struct sfc_adapter_shared * diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c index bd0061f557..05933b1d39 100644 --- a/drivers/net/sfc/sfc_ethdev.c +++ b/drivers/net/sfc/sfc_ethdev.c @@ -3252,6 +3252,8 @@ sfc_eth_dev_init(struct rte_eth_dev *dev, void *init_params) if (rc != 0) goto fail_nic_dma_attach; + sa->link_ev_need_poll = encp->enc_link_ev_need_poll; + sfc_adapter_unlock(sa); sfc_log_init(sa, "done"); diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c index c0d58c9554..1d1ee0671f 100644 --- a/drivers/net/sfc/sfc_ev.c +++ b/drivers/net/sfc/sfc_ev.c @@ -467,9 +467,58 @@ sfc_ev_link_change(void *arg, efx_link_mode_t link_mode) { struct sfc_evq *evq = arg; struct sfc_adapter *sa = evq->sa; - struct rte_eth_link new_link; + struct rte_eth_link new_link = {0}; + if (sa->link_ev_need_poll) { + efx_link_mode_t new_mode; + bool poll_done = false; + + /* + * The event provides only the general status. When the link is + * up, poll the port to get the speed, but it is not compulsory. + */ + if (link_mode != EFX_LINK_DOWN) { + int ret = 0; + + if (sfc_adapter_trylock(sa)) { + /* Never poll when the adaptor is going down. */ + if (sa->state == SFC_ETHDEV_STARTED) { + ret = efx_port_poll(sa->nic, &new_mode); + poll_done = true; + } + + sfc_adapter_unlock(sa); + } + + if (ret != 0) { + sfc_warn(sa, "port poll failed on link event"); + poll_done = false; + } + } + + if (poll_done) { + link_mode = new_mode; + goto decode_comprehensive; + } + + new_link.link_duplex = RTE_ETH_LINK_FULL_DUPLEX; + new_link.link_autoneg = RTE_ETH_LINK_AUTONEG; + + if (link_mode == EFX_LINK_DOWN) { + new_link.link_speed = RTE_ETH_SPEED_NUM_NONE; + new_link.link_status = RTE_ETH_LINK_DOWN; + } else { + new_link.link_speed = RTE_ETH_SPEED_NUM_UNKNOWN; + new_link.link_status = RTE_ETH_LINK_UP; + } + + goto set; + } + +decode_comprehensive: sfc_port_link_mode_to_info(link_mode, &new_link); + +set: if (rte_eth_linkstatus_set(sa->eth_dev, &new_link) == 0) evq->sa->port.lsc_seq++; -- 2.39.5