Re: [PATCH net-next 12/13] net: phy: phylink: Use phy_caps_lookup for fixed-link configuration
From: Kory Maincent <kory.maincent@bootlin.com>
Date: 2025-02-24 14:04:43
Also in:
lkml, netdev
On Mon, 24 Feb 2025 13:53:28 +0000 "Russell King (Oracle)" [off-list ref] wrote:
On Mon, Feb 24, 2025 at 02:44:31PM +0100, Kory Maincent wrote:quoted
On Sat, 22 Feb 2025 15:27:24 +0100 Maxime Chevallier [off-list ref] wrote:quoted
When phylink creates a fixed-link configuration, it finds a matching linkmode to set as the advertised, lp_advertising and supported modes based on the speed and duplex of the fixed link. Use the newly introduced phy_caps_lookup to get these modes instead of phy_lookup_settings(). This has the side effect that the matched settings and configured linkmodes may now contain several linkmodes (the intersection of supported linkmodes from the phylink settings and the linkmodes that match speed/duplex) instead of the one from phy_lookup_settings()....quoted
linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, mask); linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, mask);@@ -588,9 +591,9 @@ static int phylink_parse_fixedlink(struct phylink *pl, phylink_set(pl->supported, MII); - if (s) { - __set_bit(s->bit, pl->supported); - __set_bit(s->bit, pl->link_config.lp_advertising); + if (c) { + linkmode_or(pl->supported, pl->supported, match); + linkmode_or(pl->link_config.lp_advertising,pl->supported, match);You are doing the OR twice. You should use linkmode_copy() instead.No, we don't want to copy pl->supported to pl->link_config.lp_advertising. We just want to set the linkmode bit that corresponds to the speed/duplex in each mask. That will result in e.g. the pause mode bits will be overwritten despite being appropriately set in the advertising mask in the code above this.
Ok, so the right thing should be this: linkmode_or(pl->link_config.lp_advertising, pl->link_config.lp_advertising, match) Regards, -- Köry Maincent, Bootlin Embedded Linux and kernel engineering https://bootlin.com