summaryrefslogtreecommitdiff
path: root/drivers/net/pcs/pcs-xpcs.c
diff options
context:
space:
mode:
authorRussell King (Oracle) <rmk+kernel@armlinux.org.uk>2023-05-23 11:16:13 +0100
committerJakub Kicinski <kuba@kernel.org>2023-05-24 09:13:22 -0700
commit1f94ba198bda5738bd26cb7633dca4b33a43dff2 (patch)
treeba672e0b151b3a83bca5dd20962edcb823846edb /drivers/net/pcs/pcs-xpcs.c
parent3f0360e09c8d92bb0a99c6eeeb2f3f6e7732955e (diff)
net: pcs: xpcs: correct lp_advertising contents
lp_advertising is supposed to reflect the link partner's advertisement unmodified by the local advertisement, but xpcs bitwise ands it with the local advertisement prior to calculating the resolution of the negotiation. Fix this by moving the bitwise and to xpcs_resolve_lpa_c73() so it can place the results in a temporary bitmap before passing that to ixpcs_get_max_usxgmii_speed(). Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers/net/pcs/pcs-xpcs.c')
-rw-r--r--drivers/net/pcs/pcs-xpcs.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c
index 2165859a063c..90920a7ba136 100644
--- a/drivers/net/pcs/pcs-xpcs.c
+++ b/drivers/net/pcs/pcs-xpcs.c
@@ -531,18 +531,19 @@ static int xpcs_read_lpa_c73(struct dw_xpcs *xpcs,
mii_c73_mod_linkmode(state->lp_advertising, lpa);
- linkmode_and(state->lp_advertising, state->lp_advertising,
- state->advertising);
return 0;
}
static void xpcs_resolve_lpa_c73(struct dw_xpcs *xpcs,
struct phylink_link_state *state)
{
- int max_speed = xpcs_get_max_usxgmii_speed(state->lp_advertising);
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(res);
+
+ /* Calculate the union of the advertising masks */
+ linkmode_and(res, state->lp_advertising, state->advertising);
state->pause = MLO_PAUSE_TX | MLO_PAUSE_RX;
- state->speed = max_speed;
+ state->speed = xpcs_get_max_usxgmii_speed(res);
state->duplex = DUPLEX_FULL;
}