diff options
author | Russell King (Oracle) <rmk+kernel@armlinux.org.uk> | 2023-05-23 11:16:18 +0100 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2023-05-24 09:13:22 -0700 |
commit | 428d603fcaeb3c8135f9983c35619925f1a56f49 (patch) | |
tree | 96a00b39dfb7bb18608c8df9dcba73afbf5afb7c | |
parent | 1f94ba198bda5738bd26cb7633dca4b33a43dff2 (diff) | |
download | linux-stable-428d603fcaeb3c8135f9983c35619925f1a56f49.tar.gz linux-stable-428d603fcaeb3c8135f9983c35619925f1a56f49.tar.bz2 linux-stable-428d603fcaeb3c8135f9983c35619925f1a56f49.zip |
net: pcs: xpcs: correct pause resolution
xpcs was indicating symmetric pause should be enabled regardless of
the advertisements by either party. Fix this to use
linkmode_resolve_pause() now that we're no longer obliterating the
link partner's advertisement by logically anding it with our own.
This is transitional, the function will be entirely replaced with
phylink_resolve_c73() in the following patch.
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>
-rw-r--r-- | drivers/net/pcs/pcs-xpcs.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c index 90920a7ba136..eec10392e584 100644 --- a/drivers/net/pcs/pcs-xpcs.c +++ b/drivers/net/pcs/pcs-xpcs.c @@ -538,11 +538,20 @@ static void xpcs_resolve_lpa_c73(struct dw_xpcs *xpcs, struct phylink_link_state *state) { __ETHTOOL_DECLARE_LINK_MODE_MASK(res); + bool tx_pause, rx_pause; /* Calculate the union of the advertising masks */ linkmode_and(res, state->lp_advertising, state->advertising); - state->pause = MLO_PAUSE_TX | MLO_PAUSE_RX; + /* Resolve pause modes */ + linkmode_resolve_pause(state->advertising, state->lp_advertising, + &tx_pause, &rx_pause); + + if (tx_pause) + state->pause |= MLO_PAUSE_TX; + if (rx_pause) + state->pause |= MLO_PAUSE_RX; + state->speed = xpcs_get_max_usxgmii_speed(res); state->duplex = DUPLEX_FULL; } |