Commit 1f94ba19 authored by Russell King (Oracle)'s avatar Russell King (Oracle) Committed by Jakub Kicinski

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: default avatarAndrew Lunn <andrew@lunn.ch>
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 3f0360e0
...@@ -531,18 +531,19 @@ static int xpcs_read_lpa_c73(struct dw_xpcs *xpcs, ...@@ -531,18 +531,19 @@ static int xpcs_read_lpa_c73(struct dw_xpcs *xpcs,
mii_c73_mod_linkmode(state->lp_advertising, lpa); mii_c73_mod_linkmode(state->lp_advertising, lpa);
linkmode_and(state->lp_advertising, state->lp_advertising,
state->advertising);
return 0; return 0;
} }
static void xpcs_resolve_lpa_c73(struct dw_xpcs *xpcs, static void xpcs_resolve_lpa_c73(struct dw_xpcs *xpcs,
struct phylink_link_state *state) 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->pause = MLO_PAUSE_TX | MLO_PAUSE_RX;
state->speed = max_speed; state->speed = xpcs_get_max_usxgmii_speed(res);
state->duplex = DUPLEX_FULL; state->duplex = DUPLEX_FULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment