From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB21960A261F for ; Fri, 13 Nov 2026 00:32:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.a=rsa-sha256 header.s=bombadil.20210309 header.b=gAxdiIP1; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20260707 header.b=TMscv3Ks DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Content-Transfer-Encoding: MIME-Version:Message-ID:Date:Subject:To:From:Reply-To:Cc:Content-Type: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Unsubscribe-Post:List-Owner; bh=uai/5LgacOngRy+lPwjlt1ceXIEJT+x7kJMhfO8OeOo=; b=gAxdiIP1LRjtpEwFe9KZOhZDdI RGDXMsacR+4ko8WsvF//BWlLBWnzCIiJLzbw5VdAEQv4rxgcdKTOOO18s6AQbi5lRivkg2+oAfqKv WpMsGasSfhgpW1tdN9O8f3CQgnXMf214QFk49gIAbF0n2dOFBAKwD2AiTdd0wn0L+pikiswxZO0yp bP7tcR5ZPc8rrES68VYDvXJFTILnAkYO1akwJsDY/6SQqZ3p43CL+yT6593BMX6QWmDYoRvHpOlH4 93ACy6JrXIE6drp7yRH0nWiM7bHfRv4D1gx2w+JeGwtGnutNpij6QzhJUKeNmhGyMfMTcq8udoAhf waX7s+5A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.100.1 #2 (Red Hat Linux)) id 1xRfDS-0000000BJ7E-3haH; Fri, 13 Nov 2026 00:32:30 +0000 Received: from mail-wr1-x436.google.com ([2a00:1450:4864:20::436]) by bombadil.infradead.org with esmtps (Exim 4.100.1 #2 (Red Hat Linux)) id 1xRfDP-0000000BJ5w-298C for linux-arm-kernel@lists.infradead.org; Fri, 13 Nov 2026 00:32:28 +0000 Received: by mail-wr1-x436.google.com with SMTP id ffacd0b85a97d-492fcbfaa87so156380f8f.3 for ; Thu, 12 Nov 2026 16:32:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20260707; t=1794529945; x=1795134745; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=uai/5LgacOngRy+lPwjlt1ceXIEJT+x7kJMhfO8OeOo=; b=TMscv3Ks9QaIzsiORifR5EKCfLIc2DSz1NzvQhe0uD+HPnS4S0YdjKlJmjzymJ/gxl tMCKx8537qMxRbeHrGhZhC1x6niRAB6rCtfgIV0W1wm3OgSUq3ikL5bFFZ0iZY/1ljna OiKWWZMTgMiQusKmf4m50+nwiVQUZEoaoNOoAGIMb5PTMck5LarRBKD2AxIokEh1dXPE cgDyJ6+5szKyM88ZyUSjVIDuvlW3EWIPckUCikpy5AB77faM5yZu34v6L2+RP3CWMEjf U9uuZDNntXZEPEwLfyBpNbJTX8T868ripxRza0qGYFLS0yXtz1ZHz5S+jbP2imTjhehb S5AQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1794529945; x=1795134745; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to:content-type; bh=uai/5LgacOngRy+lPwjlt1ceXIEJT+x7kJMhfO8OeOo=; b=QG026mye+L0NpUarrN65PXTQoe5Z0dvsumhF/bliCFTSDGuhXpmfvnVe4U3oA9b+U6 B+JYbaNZVVEcWEIXOe2IQICkW6SY3n1iLnAGCj8mS5MQn3LcmrGUReXOwlGOK1qqsG/G 3JSsoyd5dJ9mQvpr6WdfB+8/GaLQgqqyO5IxpQ2sCM1UWoLILOFi9dQA6ANjPq4QymBe Kygw5653XElqSMd08wPcnBIUW4Hn2g650/El9UwOEX6SpY3dONJqaqHNY66ylPRNzsZ6 h2GJNMMALKs3UbCRYmaLgjVcIniyhjigA2Mx+S7+KqzMDkhHb+GEdMlUwcXb60yc2ByX pwjA== X-Forwarded-Encrypted: i=1; AL+hErGZXiiRGgYM+P8pisao4lVOEqjF1wYhJVgt+LVoDD2tGdo2ttrke3taUl11r0dn+HZ0VKgJxxbQRBP08CZT3wiD@lists.infradead.org X-Gm-Message-State: APuU4Z9dG8vryvryl66dUAiaSt87Rd4Zu4M4YQm/Ho0ZWZ1R8Ys3Y2og Nt3zNrq9WtXNPa8xldNB2329iS918gitMu/gbcCdaYD9lfx3RHW5kyy2 X-Gm-Gg: AYBFou2jOuZyGI40MWuHw+GjZLQn2+N4pfIHw0DNaMabbgvPvmfKFwHP0qyUJaywpGa CXQpCB21AYxHu9VsX/FDNB3tkGRW98joKHegRSYr3QYQxEL+CdMFM7CMJZnUvkRBkfr5EItqQJn wX9CHeT3Kdp/4b3FJpsf98lJokutoWoLmH8H5LGOhmN4xhJvXhvTU+Ev25gF4dHDDhtBePQcOdc pPCI5V/f5M/Mv0TQaj7FWC7R6ZRG81ioFMEw3P3sFq3o5qXT2SlCFUeaS2xe/CxeNDxBjwvgWIK Aahivq2ZITLuthnvXyprLR2+oL942an9alkY/+8WB9zWM/mQD9w92bBf+3R4kXvMe2HroYS7jkR 16we0x+JE2IePQcF+tmtkF3DBmftujVQw/wLztkTyexkib/zF4AI4qRC003fv/JoGhV9jJMuvzO loE+3/jmALdVUCOXdV3XSCtT62Z+JwnS3jqE63sUoY+HlMkkz8dJ+f2mqpxh0iREm1fLGam/z6Y aknmHjpHyFxQqPGtm5DEmIUZiltQ3tzl+ZGYj1orpxmdFNl2nG9YpgZjPCGPr4B9vb19gYUcruI gS6k8PB+xx1HFKokJFMBguHDO78hE3fx0E6ZRjR53nr7C6Rw5t83pTSqZUcaBskEqJl22rhnVTx 1rlUor1tV8vBUzNKDvZJyWkknu3z7v9Hotf3i/CZdteD2AlK6H8Xq4A== X-Received: by 2002:a05:6000:29c9:b0:493:1004:96f7 with SMTP id ffacd0b85a97d-49c747700f2mr1324877f8f.54.1794529945019; Thu, 12 Nov 2026 16:32:25 -0800 (PST) Received: from Ansuel-XPS24.localdomain (host-212-171-11-167.retail.telecomitalia.it. [212.171.11.167]) by smtp.googlemail.com with ESMTPSA id ffacd0b85a97d-49c5f7828a4sm2029768f8f.23.2026.11.12.16.32.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Nov 2026 16:32:23 -0800 (PST) From: Christian Marangi To: 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 , Randy Dunlap , Christian Marangi , 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: [PATCH net-next v19 00/15] net: pcs: Introduce support for fwnode PCS Date: Fri, 13 Nov 2026 01:31:50 +0100 Message-ID: <20261113003217.197757-1-ansuelsmth@gmail.com> X-Mailer: git-send-email 2.55.0 X-Archived-By: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.9.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20261112_163227_627208_DEA65E25 X-CRM114-Status: GOOD ( 33.09 ) X-Spam-Score: -2.1 (--) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" X-Spam-Status: No, score=-10.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 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. At times there were 2 different implementation (this and the one from Sean) but Sean agreed that this can be picked and used in favor of his implementation as long as his case with race condition is correctly handled. --- First the PCS fwnode: The concept is to implement a producer-consumer API similar to other subsystem like clock or PHY. That seems to be the best solution to the problem as PCS driver needs to be detached from phylink and implement a simple way to provide a PCS while maintaining support for probe defer or driver removal. To keep the implementation simple, the PCS driver devs needs some collaboration to correctly implement this. This is O.K. as helper to correctly implement this are provided hence it's really a matter of following a pattern to correct follow removal of a PCS driver. A PCS provider have to implement and call fwnode_pcs_add_provider() in probe function and define an xlate function to define how the PCS should be provided based on the requested interface and phandle spec defined in fwnode (based on the #pcs-cells) fwnode_pcs_get() is provided to provide a specific PCS declared in fwnode at index. A simple xlate function is provided for simple single PCS implementation, fwnode_pcs_simple_xlate. A PCS provider on driver removal must call fwnode_pcs_del_provider() to delete itself as a provider. --- Second PCS handling in phylink: We have the PCS problem for the only reason that in initial implementation, we permitted way too much flexibility to MAC driver and things started to deviate. At times we couldn't think SoC would start to put PCS outside the MAC hence it was OK to assume they would live in the same driver. With the introduction of 10g in more consumer devices, we are observing a rapid growth of this pattern with multiple PCS external to MAC. To put a stop on this, the only solution is to give back to phylink control on PCS handling and enforce more robust supported interface definition from both MAC and PCS side. It's suggested to read patch 0003 of this series for more info, here a brief explaination of the idea: This series introduce handling of PCS in phylink and try to deprecate .mac_select_pcs. Phylink now might contain a linked list of available PCS and those will be used for PCS selection on phylink_major_config. MAC driver needs to define pcs_interfaces mask in phylink_config for every interface that needs a dedicated PCS. These PCS needs to be provided to phylink at phylink_create time by setting the .fill_available_pcs and .num_possible_pcs in phylink_config. Helpers to parse PCS from fwnode are provided fwnode_phylink_pcs_count() that will return the count of PCS entries described in the firmware node and fwnode_phylink_pcs_parse() that will fill a preallocated array of PCS pointer with the actual available PCS (ignoring the one that still needs to be probed). phylink_create() will fill the internal PCS list with the passed array of PCS. phylink_major_config and other user of .mac_select_pcs are adapted to make use of this new PCS list. The supported interface value is also moved internally to phylink struct. This is to handle late removal and addition of PCS. (the bonus effect to this is giving phylink a clear idea of what is actually supported by the MAC and his constraint with PCS) The supported interface mask in phylink is done by OR the supported_interfaces in phylink_config with every PCS in PCS list. PCS removal is supported by forcing a mac_config, refresh the supported interfaces and run a phy_resolve(). PCS late addition is supported by introducing a global notifier for PCS provider. If a phylink have the pcs_interfaces mask not zero, it's registered to this notifier. PCS provider will emit a global PCS add event to signal any interface that a new PCS might be available. The function will then check if the PCS is related to the MAC fwnode and add it accordingly. A user for this new implementation is provided as an Airoha PCS driver. This was also tested downstream with the IPQ95xx QCOM SoC and with the help of Daniel also on the various Mediatek MT7988 SoC with both SFP cage implementation and DSA attached. Lots of tests were done with driver unbind/bind and with interface up/down also by adding print to make sure major_config_fail gets correctly triggered and reset once the PCS comes back. The dedicated commits have longer description on the implementation so it's suggested to also check there for additional info. It's worth to mention that OpenWrt is currently using this on Mediatek SoC and QCOM ipq807x/ipq60xx/ipq50xx and Airoha are already ported in staging tree for testing. Also realtek is using this and proved to correctly work. --- Changes v19: - Rebase on top of net-next - RCU protect phylink from pcs struct - Fix dead-lock on phylink_validate - Handle possible PCS provider returning NULL (protective coding) - Improve capabilities handling refresh Changes v18: - Improve handling on late PCS addition - Fix wrong comment on airoha PCS driver - Rebase on top of net-next Changes v17: - Rebase on top of net-next - Add Review tag for DT patch - Recalculate capabilities on late removal/attach Changes v16: - Rebase on top of net-next - Add Tested-by tag - Add ACK for airoha ethernet patch + nit fix Changes v15: - Rebase on top of net-next - Fix Coccicheck warning Changes v14: - Fix deadlock when fill_available_pcs fails - Move notifier and fill down after resolve disable bit is set - Fix kconfig description Changes v13: - Fix regression in fwnode_pcs_get_from_pcsspec from v12 - Fix reverse lock for phy_lock and state_mutex - Better handle lock in phylink_validate_mac_and_pcs and inband - Fix wrong pointer to fwnode_pcs_add_provider notifier - Fix compilation error for new C type in pcs_provider_notify Changes v12: - Fix kdoc for function - Rework PCS provider add and delete to be provider driven (instead of relaying on scan of fwnode every time) (this also handle multi PCS scenario) - Even further rework state mutex locking for concurrent pcs list - Restore MAC supported_interfaces validation in phylink_create() wrongly dropped. - Use get/put for fwnode reference - Fix possible unment depndency for FWNODE_PCS - Fix almost impossible problem for PCS calibration - Hold rtnl with PCS deletion Changes v11: - Rework PCS release to notifier way (fix race as pointed out by bot) - Add Ack from Lorenzo for Airoha Ethernet driver - Introduce devm variant for pcs_provider_add - Better support firmware node reference for PCS late attach - Better protect list iteration with state mutex - Minor fixup to airoha pcs driver (flow control fixup) - Rebase on top of net-next Changes v10: - Minor code cleanup and fixes as suggested by bot - Drop devlink patch - Add reviewed by tag - Configure old_link_state on PCS release - Unlink PCS on error in phylink_create() - Use list_add_tail - Fix typo in Airoha PCS driver - Update phylink migration guide - Better handle late PCS attach (idempotent function and add unser state_mutex) - Use dedicated lock in Airoha ethernet driver Changes v9: - Rebase on top of net-next/main - Drop early verification of supported_interface (it can also be provided by get_capabilites MAC OP) Changes v8: - Back to RFC (net-next closed) - Address additional bug reported by Sashiko bot - Better handle priv interface for Airoha PCS driver - Better handle locking for modifying the PCS list in phylink code - Improve fwnode_phylink_pcs_parse() parsing on -ENOENT - Better handle error condition in phylink_create() - Turn down the link when current PCS is released - Fix compilation warning caused by copy paste error Changes v7: - Address all the bug from the Sashiko bot - Rename .num_available_pcs to .num_possible_pcs - Link PCS in phylink_create() - Correctly unregister the notifier on phylink_destroy() - Introduce fwnode_phylink_pcs_count() - Better handle locking in phylink for PCS handling - Better handle unavailable PCS at phylink_create() time - Improve Documentation file - Other minor fixes to address suggestion from bot - Rebase on top of net-next Changes v6: - Rebase on top of net-next - Add Documentation files - Add fw_devlink patch - Fix some comments typo - Rework the airoha_eth.c implementation with new multi serdes code - Extend PCS code with PCIe and USB support - Align schema to new property Changes v5: - Rebase on top of net-next - Use the new force_major_config - Reword some comments and commit description - Return -ENODEV instead of -EPROBE_DEFER to perevent race condition - Drop phy_interface_copy patch (Russell pushed an equivalent version) Changes v4: - Move patch 0002 phy_interface_copy to 0002 (fix bisectability problem) - Address review from Lorenzo for Airoha ethernet driver - Fix kdoc error with missing Return (actually missing : before Return) - Fix UNMET dependency reported error for CONFIG_FWNODE_PCS - Revert to pcs.c instead of core.c (due to name conflict with other kmod) - Fix clang compilation error for Airoha PCS driver - Add missing inline function to pcs.h function Changes v3: - Out of RFC - Fix various spelling mistake - Drop circular dependency patch - Complete Airoha Ethernet phylink integration - Introduce .pcs_link_down PCS OP Changes v2: - Switch to fwnode - Implement PCS provider notifier - Better split changes - Move supported_interfaces to phylink - Add circular dependency patch - Rework handling with indirect addition/removal and trigger of phylink_resolve() Christian Marangi (15): net: phylink: keep and use MAC supported_interfaces in phylink struct net: phylink: make PCS phylink instance access RCU protected net: phylink: introduce internal phylink PCS handling net: pcs: implement Firmware node support for PCS driver net: phylink: save phylink instance fwnode on phylink_create net: phylink: make phylink_validate state locked net: phylink: add capabilities helper and track modified advertising net: phylink: support PCS provider release net: phylink: support late PCS provider attach net: Document PCS subsystem MAINTAINERS: add myself as PCS subsystem maintainer net: phylink: add .pcs_link_down PCS OP dt-bindings: net: pcs: Document support for Airoha Ethernet PCS net: pcs: airoha: add PCS driver for Airoha AN7581 SoC net: airoha: add phylink support .../bindings/net/pcs/airoha,pcs.yaml | 261 ++ Documentation/networking/index.rst | 1 + Documentation/networking/pcs.rst | 234 ++ Documentation/networking/sfp-phylink.rst | 35 +- MAINTAINERS | 9 + drivers/net/ethernet/airoha/Kconfig | 2 + drivers/net/ethernet/airoha/airoha_eth.c | 197 +- drivers/net/ethernet/airoha/airoha_eth.h | 5 + drivers/net/ethernet/airoha/airoha_regs.h | 12 + drivers/net/pcs/Kconfig | 8 + drivers/net/pcs/Makefile | 3 + drivers/net/pcs/airoha/Kconfig | 13 + drivers/net/pcs/airoha/Makefile | 7 + drivers/net/pcs/airoha/pcs-airoha-common.c | 1306 ++++++++++ drivers/net/pcs/airoha/pcs-airoha.h | 1311 ++++++++++ drivers/net/pcs/airoha/pcs-an7581.c | 2100 +++++++++++++++++ drivers/net/pcs/pcs.c | 314 +++ drivers/net/phy/phylink.c | 501 +++- include/linux/linkmode.h | 6 + include/linux/pcs/pcs-provider.h | 70 + include/linux/pcs/pcs.h | 174 ++ include/linux/phylink.h | 30 +- 22 files changed, 6530 insertions(+), 69 deletions(-) create mode 100644 Documentation/devicetree/bindings/net/pcs/airoha,pcs.yaml create mode 100644 Documentation/networking/pcs.rst create mode 100644 drivers/net/pcs/airoha/Kconfig create mode 100644 drivers/net/pcs/airoha/Makefile create mode 100644 drivers/net/pcs/airoha/pcs-airoha-common.c create mode 100644 drivers/net/pcs/airoha/pcs-airoha.h create mode 100644 drivers/net/pcs/airoha/pcs-an7581.c create mode 100644 drivers/net/pcs/pcs.c create mode 100644 include/linux/pcs/pcs-provider.h create mode 100644 include/linux/pcs/pcs.h -- 2.55.0