From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5277A39AD3B for ; Sun, 9 Aug 2026 17:50:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786297804; cv=none; b=QRbifgIjuG3wszTNcpK9JFUZcROuZUgmCfOwoCpkNgSi8stlEVuk/HK/rFa/Q0CCTPfvtqdRNMwqP2AVhi7p7QGzN5EsSwh/3el2iRZAo/Sya+gEYB/gpVcBsItLQ9NSyxV0wEA5gHqPH9t+jp+oM0VTjQ7nxIhaCStie9WY1TI= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786297804; c=relaxed/simple; bh=ihEhCpdOiQJ7RiLVFIbBDlHDMYkCQhxi8LGrQZaYQO8=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=mv5+M26Gi0T+GBg0QQXOurThowztNlzj2EpslX8NXiyhSWysS/zptaRJpCu2CBFLmdX2/t7nMtauNHp6bVfX8oEYRnHKbQHnk582tk5D7/uGoIsVqDNNekkaeqsFu/oVmRnPpSha9r8Yt9ktGjZqmo7qnLt3G3eIqBvDRFRkE40= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=LxGVtrKT; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="LxGVtrKT" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-496bb7cdf51so16247795e9.2 for ; Sun, 09 Aug 2026 10:50:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786297799; x=1786902599; darn=vger.kernel.org; h=in-reply-to:content-disposition:content-type:mime-version :references:subject:cc:to:from:date:message-id:from:to:cc:subject :date:message-id:reply-to:content-type; bh=XCnEd7tGfLsvqQ9t4dLxlXhkU3vDq79dR6i/bF6oDRI=; b=LxGVtrKTVKTZ3gLIsflWNx+JaeCprkBnpbXUh0ytcUWI/eq779xH7Cb8TvB2sf58D9 YlreMHyB209yDGsds9GPbXLvjGBvtabpftNmo+hzOagsndzMnRzXKkDtBAwGBPn67RbW 4+J30Tu4URJaw6PdjQY6aqcfU/6fyFyBK1FwatkWzU4lkZMt8JSk2xEDm8K7fzh1CXcD qqrEyrXdFiNYMNaPtRsKwaXy5yk1GS3dne1cgOy8daje/UvhLOALRm6Skb/osKWdGNY6 F4sup/ixyIuZfYkCYvXgKsDZodDWkXcuQSDIeJrhBLb9HlN6fV0ctUQWugauX9uNoiY7 IhEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786297799; x=1786902599; h=in-reply-to:content-disposition:content-type:mime-version :references:subject:cc:to:from:date:message-id:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=XCnEd7tGfLsvqQ9t4dLxlXhkU3vDq79dR6i/bF6oDRI=; b=TzQeQo22DUIrpnGK/GDqYgeiIBV8H33bIxW3AZhtVOB0PMelkXq4jLcREoMLBk98qB unCQaQl+EF3HHBkpePEALFNP7tAPeVpEa1RbPlLsz015vKO+YYsyp36+YaaYVRIMMxpO hB1tvbJUucsYNYtrU0QxF1xxfUr4jjHqEnMG8DLXKwk65Z45qbW8yIjBVK2x1+Sti6/c jpPlNwTQC0dnJBkeQGfVyVd2Iz48FWcBPjcWkIuZi9yoskQLTy9Y5QwxBC/ajW6XFKUv twmpY87iBKjjFvffS3F6OM0FG+NTSDOWDpxWxqn5I9U/Y4E8CvOdM0SmYPCn7bVUvwgs mVbQ== X-Forwarded-Encrypted: i=1; AHgh+RphF8qDPuiXJosyvYUYJiYW0KSXbIMJNOy1n1Wlk/iMgW5Ziki5enPsft9l5hpadbI4wm0yyHYzcmV+h3I=@vger.kernel.org X-Gm-Message-State: AOJu0Ywks+mwTYQqqHia4HJkbDIk0Ghbs8z/s/PXMtF/stkc7htQfW+G io6QrAVANe3z2A4ab4yR8v6/6E+eWcmdG8HgLVo9h3L4bRDfwkJcX4aX X-Gm-Gg: AR+sD12ruzadcwNn56+mqa5ZgrLD315iw+XpIPwMnRvQMFUr9Ne9Rqbt3O8Q9TD3t3h j7OwcvsdedP7m8qF/qJzK8Zg7FjU4C+KLVPMgS9FeN07bWXEdHFq9UHEnc2aR6JouyzNl+LQbIC IfZ81+5ft2yeCDufKema0z4WZZPoeqMCJGXhnvAS3pOidP+81T6wkK4hwjPHPsfDycpIiDcT26L zzXY5o6v7JlNuEZPVGa/OrBvSsekAgRJMcVwaEjocGUiKAjim4840QuO2ZMQjJ4TdQrtNg/r5zj FUVEsoqZ4xcO4v8Yn2pF5YcIisINg/atVtROTqiiPpY3fLswWGUBJwQSvG4shhDCvNPGufG/eWb RaE/OoBBL6g5aFyck7fTB1Mog+3KQJlivnddTtjFQZ1VdDZOjhwsSQVlikzZofYL7e8CFqIPHZA C74CtDnZiqgRN/XkCgm3r4hx3yXODEh9kQYauNSrm3dW0eckgdmO4Kb8WGPA8XL/J+/NHzP9CWT T63lGshw0ELMhjFjdW6GQUhPXfvH4w0OqJ273QBJp4= X-Received: by 2002:a05:600c:630c:b0:493:f140:c3fb with SMTP id 5b1f17b1804b1-4994e71c87bmr402295485e9.7.1786297799337; Sun, 09 Aug 2026 10:49:59 -0700 (PDT) Received: from Ansuel-XPS. (host-87-20-3-207.retail.telecomitalia.it. [87.20.3.207]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4995421934asm340945865e9.5.2026.08.09.10.49.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 09 Aug 2026 10:49:58 -0700 (PDT) Message-ID: <6a78bdc6.89544747.3fcae.b8e0@mx.google.com> X-Google-Original-Message-ID: Date: Sun, 9 Aug 2026 19:49:54 +0200 From: Christian Marangi To: Andrew Lunn Cc: Maxime Chevallier , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Simon Horman , Jonathan Corbet , Shuah Khan , Lorenzo Bianconi , Heiner Kallweit , Russell King , Philipp Zabel , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , 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 References: <20260807131301.192060-1-ansuelsmth@gmail.com> <4c595c15-17d9-4c23-bb44-344c48d36e9a@lunn.ch> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 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 --- .../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