patch 'net/sfc: fix reporting status of autonegotiation' has been queued to stable release 25.11.1
Kevin Traynor
ktraynor at redhat.com
Thu Feb 26 14:08:41 CET 2026
Hi,
FYI, your patch has been queued to stable release 25.11.1
Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 03/02/26. So please
shout if anyone has objections.
Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.
Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable
This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable/commit/83e20178898daae4ad12a948977e9c35c671512e
Thanks.
Kevin
---
>From 83e20178898daae4ad12a948977e9c35c671512e Mon Sep 17 00:00:00 2001
From: Ivan Malov <ivan.malov at arknetworks.am>
Date: Tue, 30 Dec 2025 01:35:27 +0400
Subject: [PATCH] net/sfc: fix reporting status of autonegotiation
[ upstream commit 95330ee234cd2d4e60dec4ca7c02bb09e766ce86 ]
Currently, the driver always indicates speed autonegotiation to be enabled,
even when the user has disabled it. Fix the code to report the true status.
Fixes: 886f8d8a05bf ("net/sfc: retrieve link info")
Signed-off-by: Ivan Malov <ivan.malov at arknetworks.am>
Reviewed-by: Andy Moreton <andy.moreton at amd.com>
---
drivers/net/sfc/sfc.h | 2 +-
drivers/net/sfc/sfc_ethdev.c | 5 +++--
drivers/net/sfc/sfc_ev.c | 7 ++++++-
drivers/net/sfc/sfc_port.c | 8 +++++---
drivers/net/sfc/sfc_repr.c | 2 +-
5 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index af32ccfaa3..629578549f 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -418,5 +418,5 @@ void sfc_port_close(struct sfc_adapter *sa);
int sfc_port_start(struct sfc_adapter *sa);
void sfc_port_stop(struct sfc_adapter *sa);
-void sfc_port_link_mode_to_info(efx_link_mode_t link_mode,
+void sfc_port_link_mode_to_info(efx_link_mode_t link_mode, uint32_t phy_cap_req,
struct rte_eth_link *link_info);
int sfc_port_update_mac_stats(struct sfc_adapter *sa, boolean_t manual_update);
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 7c2abaab6b..6be98c49d0 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -263,5 +263,5 @@ sfc_dev_get_rte_link(struct rte_eth_dev *dev, int wait_to_complete,
if (sa->state != SFC_ETHDEV_STARTED) {
- sfc_port_link_mode_to_info(EFX_LINK_UNKNOWN, link);
+ sfc_port_link_mode_to_info(EFX_LINK_UNKNOWN, 0, link);
} else if (wait_to_complete) {
efx_link_mode_t link_mode;
@@ -269,5 +269,6 @@ sfc_dev_get_rte_link(struct rte_eth_dev *dev, int wait_to_complete,
if (efx_port_poll(sa->nic, &link_mode) != 0)
link_mode = EFX_LINK_UNKNOWN;
- sfc_port_link_mode_to_info(link_mode, link);
+ sfc_port_link_mode_to_info(link_mode, sa->port.phy_adv_cap,
+ link);
} else {
sfc_ev_mgmt_qpoll(sa);
diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index 1d1ee0671f..f058b3cb9b 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -517,5 +517,10 @@ sfc_ev_link_change(void *arg, efx_link_mode_t link_mode)
decode_comprehensive:
- sfc_port_link_mode_to_info(link_mode, &new_link);
+ /*
+ * Reading 'sa->port.phy_adv_cap' without acquiring adaptor lock may
+ * render autonegotiation status inaccurate, but that's not critical,
+ * as it's unlikely to happen often and may be a practical trade-off.
+ */
+ sfc_port_link_mode_to_info(link_mode, sa->port.phy_adv_cap, &new_link);
set:
diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c
index e5a7b8358d..33b53f7ac8 100644
--- a/drivers/net/sfc/sfc_port.c
+++ b/drivers/net/sfc/sfc_port.c
@@ -131,5 +131,6 @@ sfc_port_init_dev_link(struct sfc_adapter *sa)
return rc;
- sfc_port_link_mode_to_info(link_mode, ¤t_link);
+ sfc_port_link_mode_to_info(link_mode, sa->port.phy_adv_cap,
+ ¤t_link);
EFX_STATIC_ASSERT(sizeof(*dev_link) == sizeof(rte_atomic64_t));
@@ -615,5 +616,5 @@ sfc_set_rx_mode(struct sfc_adapter *sa)
void
-sfc_port_link_mode_to_info(efx_link_mode_t link_mode,
+sfc_port_link_mode_to_info(efx_link_mode_t link_mode, uint32_t phy_cap_req,
struct rte_eth_link *link_info)
{
@@ -685,5 +686,6 @@ sfc_port_link_mode_to_info(efx_link_mode_t link_mode,
}
- link_info->link_autoneg = RTE_ETH_LINK_AUTONEG;
+ if ((phy_cap_req & (1U << EFX_PHY_CAP_AN)) != 0)
+ link_info->link_autoneg = RTE_ETH_LINK_AUTONEG;
}
diff --git a/drivers/net/sfc/sfc_repr.c b/drivers/net/sfc/sfc_repr.c
index 93da97387c..fbb5f58a8e 100644
--- a/drivers/net/sfc/sfc_repr.c
+++ b/drivers/net/sfc/sfc_repr.c
@@ -534,5 +534,5 @@ sfc_repr_dev_link_update(struct rte_eth_dev *dev,
if (sr->state != SFC_ETHDEV_STARTED) {
- sfc_port_link_mode_to_info(EFX_LINK_UNKNOWN, &link);
+ sfc_port_link_mode_to_info(EFX_LINK_UNKNOWN, 0, &link);
} else {
memset(&link, 0, sizeof(link));
--
2.53.0
---
Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- - 2026-02-26 10:16:48.643458291 +0000
+++ 0039-net-sfc-fix-reporting-status-of-autonegotiation.patch 2026-02-26 10:16:46.949459229 +0000
@@ -1 +1 @@
-From 95330ee234cd2d4e60dec4ca7c02bb09e766ce86 Mon Sep 17 00:00:00 2001
+From 83e20178898daae4ad12a948977e9c35c671512e Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 95330ee234cd2d4e60dec4ca7c02bb09e766ce86 ]
+
@@ -10 +11,0 @@
-Cc: stable at dpdk.org
More information about the stable
mailing list