From: Christian Marangi <ansuelsmth@gmail.com>
To: Andrew Lunn <andrew@lunn.ch>
Cc: Maxime Chevallier <maxime.chevallier@bootlin.com>,
Andrew Lunn <andrew+netdev@lunn.ch>,
"David S. Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Simon Horman <horms@kernel.org>, Jonathan Corbet <corbet@lwn.net>,
Shuah Khan <skhan@linuxfoundation.org>,
Lorenzo Bianconi <lorenzo@kernel.org>,
Heiner Kallweit <hkallweit1@gmail.com>,
Russell King <linux@armlinux.org.uk>,
Philipp Zabel <p.zabel@pengutronix.de>,
Nathan Chancellor <nathan@kernel.org>,
Nick Desaulniers <ndesaulniers@google.com>,
Bill Wendling <morbo@google.com>,
Justin Stitt <justinstitt@google.com>,
netdev@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org, llvm@lists.linux.dev
Subject: Re: [PATCH net-next v11 00/12] net: pcs: Introduce support for fwnode PCS
Date: Sun, 9 Aug 2026 19:49:54 +0200 [thread overview]
Message-ID: <6a78bdc6.89544747.3fcae.b8e0@mx.google.com> (raw)
In-Reply-To: <4c595c15-17d9-4c23-bb44-344c48d36e9a@lunn.ch>
On Sun, Aug 09, 2026 at 07:44:55PM +0200, Andrew Lunn wrote:
> On Fri, Aug 07, 2026 at 03:12:42PM +0200, Christian Marangi wrote:
> > This series introduce a most awaited feature that is correctly
> > provide PCS with fwnode without having to use specific export symbol
> > and additional handling of PCS in phylink.
>
> One of Russells complaints was the phylink has too many bits of code
> for ideas which did not work out and were replaced by new ways of
> doing things.
>
> We want .mac_select_pcs to go away, this framework should replace it.
> Please could you convert one of the exist users of .mac_select_pcs, so
> we get an idea of what that involved. If that conversion is pretty
> mechanical, i think we should have a second patchset which converts
> all the current users, and then remove support for .mac_select_pcs.
>
> Overall i think the direction of this patchset is good.
>
Thanks for the initial check.
Maxime converted one device with this and the patch delta was small... let
me copy those patch here. (it was referenced in v9)
I think the most annoying one will be stmmac with the 3 different PCS
implementation but we already handled that in a upcoming ipq50xx driver
currently present in OpenWrt mainline.
Maybe if Maxime is O.K. I can include his patch in this series.
From 38ad94b1e62bf3523097983dfb515f59b1634477 Mon Sep 17 00:00:00 2001
From: Maxime Chevallier <maxime.chevallier@bootlin.com>
Date: Tue, 21 Jul 2026 13:52:57 +0200
Subject: [PATCH] net: marvell: mvpp2: Convert to the new PCS API
Following the introduction of the PCS framework, port mvpp2 to the new
PCS API.
Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
---
.../net/ethernet/marvell/mvpp2/mvpp2_main.c | 161 +++++++++++-------
1 file changed, 95 insertions(+), 66 deletions(-)
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
index ccc24a1301f2..8d9663c7a023 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
@@ -6499,21 +6499,6 @@ static void mvpp2_gmac_config(struct mvpp2_port *port, unsigned int mode,
writel(ctrl4, port->base + MVPP22_GMAC_CTRL_4_REG);
}
-static struct phylink_pcs *mvpp2_select_pcs(struct phylink_config *config,
- phy_interface_t interface)
-{
- struct mvpp2_port *port = mvpp2_phylink_to_port(config);
-
- /* Select the appropriate PCS operations depending on the
- * configured interface mode. We will only switch to a mode
- * that the validate() checks have already passed.
- */
- if (mvpp2_is_xlg(interface))
- return &port->pcs_xlg;
- else
- return &port->pcs_gmac;
-}
-
static int mvpp2_mac_prepare(struct phylink_config *config, unsigned int mode,
phy_interface_t interface)
{
@@ -6786,7 +6771,6 @@ static int mvpp2_mac_enable_tx_lpi(struct phylink_config *config, u32 timer,
}
static const struct phylink_mac_ops mvpp2_phylink_ops = {
- .mac_select_pcs = mvpp2_select_pcs,
.mac_prepare = mvpp2_mac_prepare,
.mac_config = mvpp2_mac_config,
.mac_finish = mvpp2_mac_finish,
@@ -6808,7 +6792,10 @@ static void mvpp2_acpi_start(struct mvpp2_port *port)
};
struct phylink_pcs *pcs;
- pcs = mvpp2_select_pcs(&port->phylink_config, port->phy_interface);
+ if (mvpp2_is_xlg(port->phy_interface))
+ pcs = &port->pcs_xlg;
+ else
+ pcs = &port->pcs_gmac;
mvpp2_mac_prepare(&port->phylink_config, MLO_AN_INBAND,
port->phy_interface);
@@ -6823,6 +6810,78 @@ static void mvpp2_acpi_start(struct mvpp2_port *port)
SPEED_UNKNOWN, DUPLEX_UNKNOWN, false, false);
}
+static int mvpp2_port_fill_pcs(struct phylink_config *config,
+ struct phylink_pcs **available_pcs,
+ unsigned int num_possible_pcs)
+{
+ struct mvpp2_port *port = mvpp2_phylink_to_port(config);
+
+ available_pcs[0] = &port->pcs_gmac;
+
+ if (mvpp2_port_supports_xlg(port)) {
+ if (num_possible_pcs < 2)
+ return -EINVAL;
+
+ available_pcs[1] = &port->pcs_xlg;
+ }
+
+ return 0;
+}
+
+static void mvpp2_port_init_pcs_xlg(struct phylink_pcs *pcs, bool has_comphy,
+ phy_interface_t phy_mode)
+{
+ if (has_comphy) {
+ __set_bit(PHY_INTERFACE_MODE_5GBASER,
+ pcs->supported_interfaces);
+ __set_bit(PHY_INTERFACE_MODE_10GBASER,
+ pcs->supported_interfaces);
+ __set_bit(PHY_INTERFACE_MODE_XAUI,
+ pcs->supported_interfaces);
+ } else if (phy_mode == PHY_INTERFACE_MODE_5GBASER) {
+ __set_bit(PHY_INTERFACE_MODE_5GBASER,
+ pcs->supported_interfaces);
+ } else if (phy_mode == PHY_INTERFACE_MODE_10GBASER) {
+ __set_bit(PHY_INTERFACE_MODE_10GBASER,
+ pcs->supported_interfaces);
+ } else if (phy_mode == PHY_INTERFACE_MODE_XAUI) {
+ __set_bit(PHY_INTERFACE_MODE_XAUI,
+ pcs->supported_interfaces);
+ }
+}
+
+static void mvpp2_port_init_pcs_gmac(struct phylink_pcs *pcs, bool has_comphy,
+ phy_interface_t phy_mode)
+{
+ if (has_comphy) {
+ /* If a COMPHY is present, we can support any of the
+ * serdes modes and switch between them.
+ */
+ __set_bit(PHY_INTERFACE_MODE_SGMII,
+ pcs->supported_interfaces);
+ __set_bit(PHY_INTERFACE_MODE_1000BASEX,
+ pcs->supported_interfaces);
+ __set_bit(PHY_INTERFACE_MODE_2500BASEX,
+ pcs->supported_interfaces);
+ } else if (phy_mode == PHY_INTERFACE_MODE_2500BASEX) {
+ /* No COMPHY, with only 2500BASE-X mode supported */
+ __set_bit(PHY_INTERFACE_MODE_2500BASEX,
+ pcs->supported_interfaces);
+ } else if (phy_mode == PHY_INTERFACE_MODE_1000BASEX ||
+ phy_mode == PHY_INTERFACE_MODE_SGMII) {
+ /* No COMPHY, we can switch between 1000BASE-X and SGMII
+ */
+ __set_bit(PHY_INTERFACE_MODE_1000BASEX,
+ pcs->supported_interfaces);
+ __set_bit(PHY_INTERFACE_MODE_SGMII,
+ pcs->supported_interfaces);
+ }
+
+ /* RGMII and MII are still routed through the gmac PCS */
+ phy_interface_set_rgmii(pcs->supported_interfaces);
+ __set_bit(PHY_INTERFACE_MODE_MII, pcs->supported_interfaces);
+}
+
/* In order to ensure backward compatibility for ACPI, check if the port
* firmware node comprises the necessary description allowing to use phylink.
*/
@@ -7082,28 +7141,17 @@ static int mvpp2_port_probe(struct platform_device *pdev,
port->phylink_config.mac_capabilities |=
MAC_SYM_PAUSE | MAC_ASYM_PAUSE;
- if (mvpp2_port_supports_xlg(port)) {
- /* If a COMPHY is present, we can support any of
- * the serdes modes and switch between them.
- */
- if (comphy) {
- __set_bit(PHY_INTERFACE_MODE_5GBASER,
- port->phylink_config.supported_interfaces);
- __set_bit(PHY_INTERFACE_MODE_10GBASER,
- port->phylink_config.supported_interfaces);
- __set_bit(PHY_INTERFACE_MODE_XAUI,
- port->phylink_config.supported_interfaces);
- } else if (phy_mode == PHY_INTERFACE_MODE_5GBASER) {
- __set_bit(PHY_INTERFACE_MODE_5GBASER,
- port->phylink_config.supported_interfaces);
- } else if (phy_mode == PHY_INTERFACE_MODE_10GBASER) {
- __set_bit(PHY_INTERFACE_MODE_10GBASER,
- port->phylink_config.supported_interfaces);
- } else if (phy_mode == PHY_INTERFACE_MODE_XAUI) {
- __set_bit(PHY_INTERFACE_MODE_XAUI,
- port->phylink_config.supported_interfaces);
- }
+ if (!mvpp2_port_supports_xlg(port))
+ port->phylink_config.num_possible_pcs = 1;
+ else
+ port->phylink_config.num_possible_pcs = 2;
+
+ port->phylink_config.fill_available_pcs = mvpp2_port_fill_pcs;
+ mvpp2_port_init_pcs_xlg(&port->pcs_xlg, comphy, phy_mode);
+ mvpp2_port_init_pcs_gmac(&port->pcs_gmac, comphy, phy_mode);
+
+ if (mvpp2_port_supports_xlg(port)) {
if (comphy)
port->phylink_config.mac_capabilities |=
MAC_10000FD | MAC_5000FD;
@@ -7115,35 +7163,16 @@ static int mvpp2_port_probe(struct platform_device *pdev,
MAC_10000FD;
}
- if (mvpp2_port_supports_rgmii(port)) {
- phy_interface_set_rgmii(port->phylink_config.supported_interfaces);
- __set_bit(PHY_INTERFACE_MODE_MII,
- port->phylink_config.supported_interfaces);
- }
+ phy_interface_copy(port->phylink_config.pcs_interfaces,
+ port->pcs_gmac.supported_interfaces);
- if (comphy) {
- /* If a COMPHY is present, we can support any of the
- * serdes modes and switch between them.
- */
- __set_bit(PHY_INTERFACE_MODE_SGMII,
- port->phylink_config.supported_interfaces);
- __set_bit(PHY_INTERFACE_MODE_1000BASEX,
- port->phylink_config.supported_interfaces);
- __set_bit(PHY_INTERFACE_MODE_2500BASEX,
- port->phylink_config.supported_interfaces);
- } else if (phy_mode == PHY_INTERFACE_MODE_2500BASEX) {
- /* No COMPHY, with only 2500BASE-X mode supported */
- __set_bit(PHY_INTERFACE_MODE_2500BASEX,
- port->phylink_config.supported_interfaces);
- } else if (phy_mode == PHY_INTERFACE_MODE_1000BASEX ||
- phy_mode == PHY_INTERFACE_MODE_SGMII) {
- /* No COMPHY, we can switch between 1000BASE-X and SGMII
- */
- __set_bit(PHY_INTERFACE_MODE_1000BASEX,
- port->phylink_config.supported_interfaces);
- __set_bit(PHY_INTERFACE_MODE_SGMII,
- port->phylink_config.supported_interfaces);
- }
+ if (mvpp2_port_supports_xlg(port))
+ phy_interface_or(port->phylink_config.pcs_interfaces,
+ port->phylink_config.pcs_interfaces,
+ port->pcs_xlg.supported_interfaces);
+
+ phy_interface_copy(port->phylink_config.supported_interfaces,
+ port->phylink_config.pcs_interfaces);
phylink = phylink_create(&port->phylink_config, port_fwnode,
phy_mode, &mvpp2_phylink_ops);
--
2.55.0
--
Ansuel
next prev parent reply other threads:[~2026-08-09 17:50 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-07 13:12 [PATCH net-next v11 00/12] net: pcs: Introduce support for fwnode PCS Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 01/12] net: phylink: keep and use MAC supported_interfaces in phylink struct Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 02/12] net: phylink: introduce internal phylink PCS handling Christian Marangi
2026-08-09 17:25 ` Andrew Lunn
2026-08-07 13:12 ` [PATCH net-next v11 03/12] net: pcs: implement Firmware node support for PCS driver Christian Marangi
2026-08-07 20:29 ` Randy Dunlap
2026-08-07 20:49 ` Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 04/12] net: phylink: save phylink instance fwnode on phylink_create Christian Marangi
2026-08-09 17:29 ` Andrew Lunn
2026-08-07 13:12 ` [PATCH net-next v11 05/12] net: phylink: support PCS provider release Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 06/12] net: phylink: support late PCS provider attach Christian Marangi
2026-08-09 17:35 ` Andrew Lunn
2026-08-07 13:12 ` [PATCH net-next v11 07/12] net: Document PCS subsystem Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 08/12] MAINTAINERS: add myself as PCS subsystem maintainer Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 09/12] net: phylink: add .pcs_link_down PCS OP Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 10/12] dt-bindings: net: pcs: Document support for Airoha Ethernet PCS Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 11/12] net: pcs: airoha: add PCS driver for Airoha AN7581 SoC Christian Marangi
2026-08-07 13:12 ` [PATCH net-next v11 12/12] net: airoha: add phylink support Christian Marangi
2026-08-09 17:44 ` [PATCH net-next v11 00/12] net: pcs: Introduce support for fwnode PCS Andrew Lunn
2026-08-09 17:49 ` Christian Marangi [this message]
2026-08-09 20:43 ` Andrew Lunn
2026-08-09 20:59 ` Christian Marangi
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=6a78bdc6.89544747.3fcae.b8e0@mx.google.com \
--to=ansuelsmth@gmail.com \
--cc=andrew+netdev@lunn.ch \
--cc=andrew@lunn.ch \
--cc=conor+dt@kernel.org \
--cc=corbet@lwn.net \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=edumazet@google.com \
--cc=hkallweit1@gmail.com \
--cc=horms@kernel.org \
--cc=justinstitt@google.com \
--cc=krzk+dt@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux@armlinux.org.uk \
--cc=llvm@lists.linux.dev \
--cc=lorenzo@kernel.org \
--cc=maxime.chevallier@bootlin.com \
--cc=morbo@google.com \
--cc=nathan@kernel.org \
--cc=ndesaulniers@google.com \
--cc=netdev@vger.kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=pabeni@redhat.com \
--cc=robh@kernel.org \
--cc=skhan@linuxfoundation.org \
/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