mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andrew Lunn <andrew@lunn.ch>
To: Javen <javen_xu@realsil.com.cn>
Cc: "hkallweit1@gmail.com" <hkallweit1@gmail.com>,
	"nic_swsd@realtek.com" <nic_swsd@realtek.com>,
	"andrew+netdev@lunn.ch" <andrew+netdev@lunn.ch>,
	"davem@davemloft.net" <davem@davemloft.net>,
	"edumazet@google.com" <edumazet@google.com>,
	"kuba@kernel.org" <kuba@kernel.org>,
	"pabeni@redhat.com" <pabeni@redhat.com>,
	"maxime.chevallier@bootlin.com" <maxime.chevallier@bootlin.com>,
	"horms@kernel.org" <horms@kernel.org>,
	"netdev@vger.kernel.org" <netdev@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"daniel@makrotopia.org" <daniel@makrotopia.org>,
	"linux@armlinux.org.uk" <linux@armlinux.org.uk>,
	"enelsonmoore@gmail.com" <enelsonmoore@gmail.com>,
	"daniel@thingy.jp" <daniel@thingy.jp>
Subject: Re: [PATCH net-next v7 2/7] net: phy: phylink: add helper to modify pause
Date: Thu, 23 Jul 2026 14:47:55 +0200	[thread overview]
Message-ID: <7503ed7f-5f89-438e-b43a-5c5b466ca1ef@lunn.ch> (raw)
In-Reply-To: <65141a327af44b938ba2fb94e3344da3@realsil.com.cn>

On Thu, Jul 23, 2026 at 02:50:46AM +0000, Javen wrote:
> 
> >
> >> +/**
> >> + * phylink_update_mac_pause_capabilities() - Dynamically update MAC
> >> +pause
> >> + * @pl: a pointer to a &struct phylink returned from phylink_create()
> >> + * @mac_pause: the new MAC pause capabilities mask
> >> + *
> >> + * This function allows a MAC driver to dynamically change its pause
> >> +state,
> >> + * such as losing/gaining Pause frame support based on MTU size.
> >> + * It recalculates supported link modes and triggers renegotiation if needed.
> >> + */
> >> +void phylink_update_mac_pause_capabilities(struct phylink *pl,
> >> +unsigned long mac_pause) {
> >> +     struct phylink_link_state *config = &pl->link_config;
> >> +     unsigned long old_pause;
> >> +     int pause_state;
> >> +
> >> +     ASSERT_RTNL();
> >> +
> >> +     if (mac_pause & ~(MAC_SYM_PAUSE | MAC_ASYM_PAUSE)) {
> >> +             phylink_err(pl, "Attempted to dynamically change non-pause MAC
> >capabilities\n");
> >> +             return;
> >> +     }
> >> +
> >> +     old_pause = pl->config->mac_capabilities & (MAC_SYM_PAUSE |
> >MAC_ASYM_PAUSE);
> >> +     if (old_pause == mac_pause)
> >> +             return;
> >> +
> >> +     mutex_lock(&pl->state_mutex);
> >> +
> >> +     pl->config->mac_capabilities &= ~(MAC_SYM_PAUSE |
> >MAC_ASYM_PAUSE);
> >> +     pl->config->mac_capabilities |= mac_pause;
> >> +
> >> +     phylink_set(pl->supported, Pause);
> >> +     phylink_set(pl->supported, Asym_Pause);
> >
> >I don't know the phylink code very well. Could you explain why these are
> >unconditional? It is not obvious to me.
> 
> Thanks for review.
> The unconditional phylink_set() is required precisely because of how phylink_validate() works. It acts as a necessary "reset" to prevent the permanent loss of capabilities in pl->supported across MTU changes.
> Consider the following scenario when MTU changes:
> 1. MTU 1500 -> 9000: The MAC loses Pause support. mac_pause becomes 0. When phylink_validate() is called, it correctly clears the Pause and Asym_Pause bits in pl->supported. This happens in the function call trace phylink_validate()=>phylink_validate_mac_and_pcs()=>phylink_validate_mask_caps()=>linkmode_and(supported, supported, mask), where mask represent the capability.
> 2. MTU 9000 -> 1500: The MAC regains Pause support. We update mac_pause back to 1. But if we simply call phylink_validate() at this point without unconditionally setting the bits first, it will take the current pl->supported (where Pause is 0 from step 1) as its input. The Pause capability will be permanently masked out and never restored.
> By unconditionally setting them here, we restore the baseline to 1, allowing phylink_validate() to correctly decide whether to keep them or clear them based on the current PHY/MAC capabilities.
 
Thanks for the explanation.

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

    Andrew

  reply	other threads:[~2026-07-23 12:48 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-22  2:28 [PATCH net-next v7 0/7] r8169: add support for phylink javen
2026-07-22  2:29 ` [PATCH net-next v7 1/7] r8169: add speed in private struct javen
2026-07-22  2:29 ` [PATCH net-next v7 2/7] net: phy: phylink: add helper to modify pause javen
2026-07-23  0:57   ` Andrew Lunn
2026-07-23  2:50     ` Javen
2026-07-23 12:47       ` Andrew Lunn [this message]
2026-07-22  2:29 ` [PATCH net-next v7 3/7] r8169: add support for phylink javen
2026-07-23  1:04   ` Andrew Lunn
2026-07-23  3:05     ` Javen
2026-07-22  2:29 ` [PATCH net-next v7 4/7] r8169: add support for RTL8116af javen
2026-07-23  1:13   ` Andrew Lunn
2026-07-23  3:21     ` Javen
2026-07-23 12:54       ` Andrew Lunn
2026-07-24  1:44         ` Javen
2026-07-28  6:18         ` Javen
2026-07-22  2:29 ` [PATCH net-next v7 5/7] r8169: add support for RTL8127atf javen
2026-07-22  2:29 ` [PATCH net-next v7 6/7] r8169: add ltr support for RTL8117 series javen
2026-07-22  2:29 ` [PATCH net-next v7 7/7] r8169: fix RTL8116af can not enter s0idle and c10 javen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7503ed7f-5f89-438e-b43a-5c5b466ca1ef@lunn.ch \
    --to=andrew@lunn.ch \
    --cc=andrew+netdev@lunn.ch \
    --cc=daniel@makrotopia.org \
    --cc=daniel@thingy.jp \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=enelsonmoore@gmail.com \
    --cc=hkallweit1@gmail.com \
    --cc=horms@kernel.org \
    --cc=javen_xu@realsil.com.cn \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=maxime.chevallier@bootlin.com \
    --cc=netdev@vger.kernel.org \
    --cc=nic_swsd@realtek.com \
    --cc=pabeni@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®