net: phylink: explicitly invalidate link_state members in mac_config
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Sat, 22 Jul 2023 20:33:05 +0000 (21:33 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 25 Jul 2023 13:02:03 +0000 (15:02 +0200)
Explicitly invalidate the phylink_link_state structure members in
mac_config that do not contain reliable information for this function,
thereby preventing their future incorrect use.

Reviewed-by: Daniel Golle <daniel@makrotopia.org>
Tested-by: Daniel Golle <daniel@makrotopia.org>
Tested-by: Frank Wunderlich <frank-w@public-files.de>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/phy/phylink.c

index df413fb..4f1c8bb 100644 (file)
@@ -1066,17 +1066,24 @@ static void phylink_pcs_poll_start(struct phylink *pl)
 static void phylink_mac_config(struct phylink *pl,
                               const struct phylink_link_state *state)
 {
+       struct phylink_link_state st = *state;
+
+       /* Stop drivers incorrectly using these */
+       linkmode_zero(st.lp_advertising);
+       st.speed = SPEED_UNKNOWN;
+       st.duplex = DUPLEX_UNKNOWN;
+       st.an_complete = false;
+       st.link = false;
+
        phylink_dbg(pl,
-                   "%s: mode=%s/%s/%s/%s/%s adv=%*pb pause=%02x link=%u\n",
+                   "%s: mode=%s/%s/%s adv=%*pb pause=%02x\n",
                    __func__, phylink_an_mode_str(pl->cur_link_an_mode),
-                   phy_modes(state->interface),
-                   phy_speed_to_str(state->speed),
-                   phy_duplex_to_str(state->duplex),
-                   phy_rate_matching_to_str(state->rate_matching),
-                   __ETHTOOL_LINK_MODE_MASK_NBITS, state->advertising,
-                   state->pause, state->link);
-
-       pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, state);
+                   phy_modes(st.interface),
+                   phy_rate_matching_to_str(st.rate_matching),
+                   __ETHTOOL_LINK_MODE_MASK_NBITS, st.advertising,
+                   st.pause);
+
+       pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, &st);
 }
 
 static void phylink_pcs_an_restart(struct phylink *pl)