net: phylink: use pcs_neg_mode in phylink_mac_pcs_get_state()
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Mon, 13 Jan 2025 09:22:24 +0000 (09:22 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 15 Jan 2025 21:23:30 +0000 (13:23 -0800)
As in-band AN no longer just depends on MLO_AN_INBAND + Autoneg bit,
we need to take account of the pcs_neg_mode when deciding how to
initialise the speed, duplex and pause state members before calling
into the .pcs_neg_mode() method. Add this.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
Reviewed-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Tested-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
Link: https://patch.msgid.link/E1tXGeO-000Esx-0r@rmk-PC.armlinux.org.uk
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/phylink.c

index 31754d5fd6590372d36f2daf35735c494608c88d..31f2d8a8ff19d9027e80e369db276dbeca461329 100644 (file)
@@ -1492,12 +1492,24 @@ static int phylink_change_inband_advert(struct phylink *pl)
 static void phylink_mac_pcs_get_state(struct phylink *pl,
                                      struct phylink_link_state *state)
 {
+       struct phylink_pcs *pcs;
+       bool autoneg;
+
        linkmode_copy(state->advertising, pl->link_config.advertising);
        linkmode_zero(state->lp_advertising);
        state->interface = pl->link_config.interface;
        state->rate_matching = pl->link_config.rate_matching;
-       if (linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
-                             state->advertising)) {
+       state->an_complete = 0;
+       state->link = 1;
+
+       pcs = pl->pcs;
+       if (!pcs || pcs->neg_mode)
+               autoneg = pl->pcs_neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED;
+       else
+               autoneg = linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
+                                           state->advertising);
+
+       if (autoneg) {
                state->speed = SPEED_UNKNOWN;
                state->duplex = DUPLEX_UNKNOWN;
                state->pause = MLO_PAUSE_NONE;
@@ -1506,11 +1518,9 @@ static void phylink_mac_pcs_get_state(struct phylink *pl,
                state->duplex = pl->link_config.duplex;
                state->pause = pl->link_config.pause;
        }
-       state->an_complete = 0;
-       state->link = 1;
 
-       if (pl->pcs)
-               pl->pcs->ops->pcs_get_state(pl->pcs, state);
+       if (pcs)
+               pcs->ops->pcs_get_state(pcs, state);
        else
                state->link = 0;
 }