diff mbox series

[RFC,net-next,7/9] net: pcs: xpcs: correct pause resolution

Message ID E1pxWYJ-002QsU-IT@rmk-PC.armlinux.org.uk (mailing list archive)
State Superseded
Delegated to: Netdev Maintainers
Headers show
Series net: pcs: xpcs: cleanups for clause 73 support | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 8 this patch: 8
netdev/cc_maintainers success CCed 9 of 9 maintainers
netdev/build_clang success Errors and warnings before: 8 this patch: 8
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 8 this patch: 8
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 21 lines checked
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Russell King (Oracle) May 12, 2023, 5:27 p.m. UTC
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.

Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
---
 drivers/net/pcs/pcs-xpcs.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

Comments

Andrew Lunn May 13, 2023, 5:47 p.m. UTC | #1
On Fri, May 12, 2023 at 06:27:35PM +0100, Russell King (Oracle) wrote:
> 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.
> 
> Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
> ---
>  drivers/net/pcs/pcs-xpcs.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c
> index 43115d04c01a..beed799a69a7 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;
> +

Hi Russell

I must be missing something. Why not use phylink_resolve_an_pause()?

	Andrew
Russell King (Oracle) May 13, 2023, 6:13 p.m. UTC | #2
On Sat, May 13, 2023 at 07:47:35PM +0200, Andrew Lunn wrote:
> On Fri, May 12, 2023 at 06:27:35PM +0100, Russell King (Oracle) wrote:
> > 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.
> > 
> > Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
> > ---
> >  drivers/net/pcs/pcs-xpcs.c | 11 ++++++++++-
> >  1 file changed, 10 insertions(+), 1 deletion(-)
> > 
> > diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c
> > index 43115d04c01a..beed799a69a7 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;
> > +
> 
> Hi Russell
> 
> I must be missing something. Why not use phylink_resolve_an_pause()?

Check the next few patches... it eventually gets to using the c73
helper, entirely eliminating this function. This is a staged
conversion, so that its easier to bisect down to the change that
caused the breakage. Converting straight to the c73 helper would
be a big change - not only fixing the pause resolution mechanism
but also how we do the c73 priority resolution.

Moreover, the above patch can be backported to stable kernels
without too much effort if there's a desire to do so.
Andrew Lunn May 13, 2023, 6:17 p.m. UTC | #3
> > Hi Russell
> > 
> > I must be missing something. Why not use phylink_resolve_an_pause()?
> 
> Check the next few patches... it eventually gets to using the c73
> helper, entirely eliminating this function.

Yes, i got to that eventually.

What might of helped would of been to include something like:

  This is a staged conversion, so that its easier to bisect down to
  the change that caused anye breakage. The aim is to replace this code
  with the c73 helper.

in the commit message. 

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew
diff mbox series

Patch

diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c
index 43115d04c01a..beed799a69a7 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;
 }