aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKrzysztof Galazka <kgalazka@FreeBSD.org>2026-06-12 11:56:15 +0000
committerKrzysztof Galazka <kgalazka@FreeBSD.org>2026-06-12 12:19:06 +0000
commit310145642312e1c5fb3d8efa8321cf905d0354c4 (patch)
tree9ecaae511ca62e18390acdb0d6953062d43d3756
parentfcb31b57112425a4eb64241651a0206108105298 (diff)
ice(4): Fix link speed after changing cable type
When interface was connected to a link partner with a cable type limitting maximum supported speed, e.g. SFP+ cable in 25G port, driver incorrectly saved a supported speed as the user configured speed. This prevented interface from using all supported speeds after switching cable to SFP28. Link was established at 10G as supported by previously used SFP+ cable. Don't set user requested speed unless actually configured by an user, to allow automatic selection of highest available speed. Only when user sets custom config using advertise_speed sysctl save it and try to apply after cable is changed. Also don't save initial supported speeds if FW supports reporting default PHY config. Signed-off-by: Krzysztof Galazka <krzysztof.galazka@intel.com> Reviewed by: kbowling, erj, mateusz.moga_intel.com Sponsored by: Intel Corporation MFC after: 2 weeks Differential Revision: https://reviews.freebsd.org/D53611
-rw-r--r--sys/dev/ice/ice_lib.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/sys/dev/ice/ice_lib.c b/sys/dev/ice/ice_lib.c
index baf5c6889aa8..25e189823072 100644
--- a/sys/dev/ice/ice_lib.c
+++ b/sys/dev/ice/ice_lib.c
@@ -9654,8 +9654,7 @@ ice_apply_saved_phy_req_to_cfg(struct ice_softc *sc,
finalize_link_speed:
- /* Cache new user settings for speeds */
- pi->phy.curr_user_speed_req = phy_data.user_speeds_intr;
+ /* Update phy types in config */
cfg->phy_type_low = htole64(phy_low);
cfg->phy_type_high = htole64(phy_high);
@@ -9961,16 +9960,21 @@ ice_init_saved_phy_cfg(struct ice_softc *sc)
device_t dev = sc->dev;
int status;
u64 phy_low, phy_high;
- u8 report_mode = ICE_AQC_REPORT_TOPO_CAP_MEDIA;
+ /*
+ * If the FW supports Link Management V2 we don't need
+ * to save initial PHY configuration as it can be always
+ * read from FW.
+ */
if (ice_is_bit_set(sc->feat_en, ICE_FEATURE_LINK_MGMT_VER_2))
- report_mode = ICE_AQC_REPORT_DFLT_CFG;
- status = ice_aq_get_phy_caps(pi, false, report_mode, &pcaps, NULL);
+ return;
+
+ status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_TOPO_CAP_MEDIA,
+ &pcaps, NULL);
if (status) {
device_printf(dev,
- "%s: ice_aq_get_phy_caps (%s) failed; status %s, aq_err %s\n",
+ "%s: ice_aq_get_phy_caps failed; status %s, aq_err %s\n",
__func__,
- report_mode == ICE_AQC_REPORT_DFLT_CFG ? "DFLT" : "w/MEDIA",
ice_status_str(status),
ice_aq_str(hw->adminq.sq_last_status));
return;