From nobody Sat May 30 13:23:02 2026 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.153.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE8F73A8739; Thu, 14 May 2026 10:51:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.153.233 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778755862; cv=none; b=H0Ptwg2TnrwGLCiA12aGxQuoQQksFO+Y0c9hbS5fTEONuou+Kpi8u2bcDxKRnB5NCMYTYQN4CB46X9zamvPG+27YusUvgit0pto+50GiGSkKe88muv1LBJxJKCfzxZXLKsNz/xicaFa6paPC76WiuhRC97JizzwG5ducfSTCOmo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778755862; c=relaxed/simple; bh=/WadYXeNsvZ0sj7kfWtCdyJIzDwGWspdCLPutduhIbI=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Q19DDycR4+8B6RkgtZKD2jOptvgqjbgggLzWzb6K7TUFth+Iyp6hSK2D0HDSuz6a8S7s/U711upJ8N8hBRN3wMzjYtigq5gwRg+CgUFFDFdqffrl1MqC3pGURP9vvCVV1Br/2AOWThbdfJ4yw4jcu2ZRADpp9R/X+Bc6WSePi5E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=BbY0fwrr; arc=none smtp.client-ip=68.232.153.233 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="BbY0fwrr" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1778755860; x=1810291860; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=/WadYXeNsvZ0sj7kfWtCdyJIzDwGWspdCLPutduhIbI=; b=BbY0fwrrrm4LYCtLjrtIO/w2Z4wNaNwPhVoNyiibOMV0scUGkOlJeUSj S384IOhTUxFgtf1RmtV7xJoN1Inq/bwce6VRJqu7XjarXJBsb7guSMbi+ VyOL0mbDNTuMgsqRHMTfqojWGsub0otdoAZn1acMAzGNQVjA9w/i8Hl2o deO23CR+zJxfnSjAlUlq44We15Bk36H9SklPKHSnA8Ceyn2AxWXCsTyAU zhG26JlxsahbbQLbfzPwIxzvLa9kc1uobmWhdG88z06UHtSSBJCn+Lp6j JuoD/CBfDYx400yW3pnK1Fm1T4w1V9CMIvkZnZU1Yqf3cJrC5ia7XrKoW w==; X-CSE-ConnectionGUID: J87ETWj7TquzucIxuwH+Fw== X-CSE-MsgGUID: JdpkNrejSIW6OSOdgXTqXg== X-IronPort-AV: E=Sophos;i="6.23,234,1770620400"; d="scan'208";a="65858088" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa1.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 May 2026 03:50:54 -0700 Received: from chn-vm-ex01.mchp-main.com (10.10.87.71) by chn-vm-ex3.mchp-main.com (10.10.87.32) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.2562.37; Thu, 14 May 2026 03:50:53 -0700 Received: from che-ld-unglab06.microchip.com (10.10.85.11) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server id 15.1.2507.58 via Frontend Transport; Thu, 14 May 2026 03:50:50 -0700 From: Thangaraj Samynathan To: CC: , , , , , , , , Subject: [PATCH v4 1/5] net: lan743x: rename is_sgmii_en to is_pcs_en Date: Thu, 14 May 2026 16:20:24 +0530 Message-ID: <20260514105028.42942-2-thangaraj.s@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260514105028.42942-1-thangaraj.s@microchip.com> References: <20260514105028.42942-1-thangaraj.s@microchip.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The flag is_sgmii_en indicates whether the PCS interface is enabled. However, the name implies that the interface is strictly SGMII, which is misleading. Rename the variable to is_pcs_en to better reflect that the flag represents the PCS enable state rather than a specific interface mode. Update all references and logs accordingly (but keep device registers unchanged to match its documentation). No functional change intended. Signed-off-by: Thangaraj Samynathan --- .../net/ethernet/microchip/lan743x_ethtool.c | 4 ++-- drivers/net/ethernet/microchip/lan743x_main.c | 18 +++++++++--------- drivers/net/ethernet/microchip/lan743x_main.h | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_ethtool.c b/drivers/net= /ethernet/microchip/lan743x_ethtool.c index 9195419ecee0..743acfd56554 100644 --- a/drivers/net/ethernet/microchip/lan743x_ethtool.c +++ b/drivers/net/ethernet/microchip/lan743x_ethtool.c @@ -1312,7 +1312,7 @@ static int lan743x_get_regs_len(struct net_device *de= v) struct lan743x_adapter *adapter =3D netdev_priv(dev); u32 num_regs =3D MAX_LAN743X_ETH_COMMON_REGS; =20 - if (adapter->is_sgmii_en) + if (adapter->is_pcs_en) num_regs +=3D MAX_LAN743X_ETH_SGMII_REGS; =20 return num_regs * sizeof(u32); @@ -1333,7 +1333,7 @@ static void lan743x_get_regs(struct net_device *dev, lan743x_common_regs(dev, p); p =3D (u32 *)p + MAX_LAN743X_ETH_COMMON_REGS; =20 - if (adapter->is_sgmii_en) { + if (adapter->is_pcs_en) { lan743x_sgmii_regs(dev, p); p =3D (u32 *)p + MAX_LAN743X_ETH_SGMII_REGS; } diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/et= hernet/microchip/lan743x_main.c index f3332417162e..fad4a246e06e 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -59,22 +59,22 @@ static void pci11x1x_strap_get_status(struct lan743x_ad= apter *adapter) hw_cfg & HW_CFG_RST_PROTECT_)) || (strap & STRAP_READ_USE_SGMII_EN_)) { if (strap & STRAP_READ_SGMII_EN_) - adapter->is_sgmii_en =3D true; + adapter->is_pcs_en =3D true; else - adapter->is_sgmii_en =3D false; + adapter->is_pcs_en =3D false; } else { fpga_rev =3D lan743x_csr_read(adapter, FPGA_REV); if (fpga_rev) { if (fpga_rev & FPGA_SGMII_OP) - adapter->is_sgmii_en =3D true; + adapter->is_pcs_en =3D true; else - adapter->is_sgmii_en =3D false; + adapter->is_pcs_en =3D false; } else { - adapter->is_sgmii_en =3D false; + adapter->is_pcs_en =3D false; } } netif_dbg(adapter, drv, adapter->netdev, - "SGMII I/F %sable\n", adapter->is_sgmii_en ? "En" : "Dis"); + "PCS I/F %s\n", str_enable_disable(adapter->is_pcs_en)); } =20 static bool is_pci11x1x_chip(struct lan743x_adapter *adapter) @@ -1361,7 +1361,7 @@ static void lan743x_phy_interface_select(struct lan74= 3x_adapter *adapter) data =3D lan743x_csr_read(adapter, MAC_CR); id_rev =3D adapter->csr.id_rev & ID_REV_ID_MASK_; =20 - if (adapter->is_pci11x1x && adapter->is_sgmii_en) + if (adapter->is_pci11x1x && adapter->is_pcs_en) adapter->phy_interface =3D PHY_INTERFACE_MODE_SGMII; else if (id_rev =3D=3D ID_REV_ID_LAN7430_) adapter->phy_interface =3D PHY_INTERFACE_MODE_GMII; @@ -3515,7 +3515,7 @@ static int lan743x_hardware_init(struct lan743x_adapt= er *adapter, mutex_init(&adapter->sgmii_rw_lock); pci11x1x_set_rfe_rd_fifo_threshold(adapter); sgmii_ctl =3D lan743x_csr_read(adapter, SGMII_CTL); - if (adapter->is_sgmii_en) { + if (adapter->is_pcs_en) { sgmii_ctl |=3D SGMII_CTL_SGMII_ENABLE_; sgmii_ctl &=3D ~SGMII_CTL_SGMII_POWER_DN_; } else { @@ -3580,7 +3580,7 @@ static int lan743x_mdiobus_init(struct lan743x_adapte= r *adapter) =20 adapter->mdiobus->priv =3D (void *)adapter; if (adapter->is_pci11x1x) { - if (adapter->is_sgmii_en) { + if (adapter->is_pcs_en) { netif_dbg(adapter, drv, adapter->netdev, "SGMII operation\n"); adapter->mdiobus->read =3D lan743x_mdiobus_read_c22; diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/et= hernet/microchip/lan743x_main.h index 160d94a7cee6..f0fa0580b04e 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.h +++ b/drivers/net/ethernet/microchip/lan743x_main.h @@ -1070,7 +1070,7 @@ struct lan743x_adapter { struct lan743x_tx tx[PCI11X1X_USED_TX_CHANNELS]; struct lan743x_rx rx[LAN743X_USED_RX_CHANNELS]; bool is_pci11x1x; - bool is_sgmii_en; + bool is_pcs_en; /* protect ethernet syslock */ spinlock_t eth_syslock_spinlock; bool eth_syslock_en; --=20 2.34.1 From nobody Sat May 30 13:23:02 2026 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.153.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3AC283B27C6; Thu, 14 May 2026 10:51:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.153.233 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778755863; cv=none; b=pEB10ygbsaApwVn8EdyaFnUnS1iZe6idLc5xq/TvG8ZJ9zSOSKQrsrypiSHk14YeeLx1HXKyZKliQf7rQ5yBwvF9yw2Os+9Im2S0BDNJ3RpjXOraGdEOoH5sm/9L598YnKwyi8pt5tMNEDBFVDB/xLIYyPxCzLe+jOun5PEqMS8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778755863; c=relaxed/simple; bh=acyoDuUwj1EZwWtotrmwzaqW9W/kOls3BxemOwPKds0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=VkRCANY4C4k5SD73G5VxIQCMSlAzUr7hgM0lWlgVHOnQAq2v0Ny78OeghhzKcn0jDzdO/N/SgVKLGis7PWr31hkdAiw0KMjMuo0CLto4Vrnf99jkspAlERy/4016/T05RowejytK45PWf6Q0yhhM9e4Tu2wDtUEgJl6ms/q5bOI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=ZWeqCujk; arc=none smtp.client-ip=68.232.153.233 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="ZWeqCujk" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1778755862; x=1810291862; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=acyoDuUwj1EZwWtotrmwzaqW9W/kOls3BxemOwPKds0=; b=ZWeqCujkLgSKdL5JZprCS5WjV/LnztXD4oMUpp+1qVqfebYFKQRCOi3D wqyeezWojSgH6ZY7CZOABbji3QJcc+TPWv9pzCRfXxCE286XtsOw4sGuw NVAXSsk0L5CGKObLfOxGtF37FyIB02RePM6ORGT7JIsqYOiDBLrddFSZ6 FoTjmSlNeLqMiQqPUsjn3+GVc4D3X355soijmTEntI10/+NoapqNBZv79 lpr+mU9LkAcGCn8L0pSPQPPR+yJAL4QiUl94o2m+l3iysn9b8KdNnW+E+ ND+MMoWUnGP7GNfh0Owrp54sOmHjvnGCNllsT/LCaQqwIpUMkg1+nYqRB Q==; X-CSE-ConnectionGUID: cbIlmiQpSLmlTBRpT6NgNg== X-CSE-MsgGUID: GNGhjyd/Su2HW/T0XdSHWw== X-IronPort-AV: E=Sophos;i="6.23,234,1770620400"; d="scan'208";a="65858092" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa1.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 14 May 2026 03:50:59 -0700 Received: from chn-vm-ex01.mchp-main.com (10.10.85.143) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.58; Thu, 14 May 2026 03:50:58 -0700 Received: from che-ld-unglab06.microchip.com (10.10.85.11) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server id 15.1.2507.58 via Frontend Transport; Thu, 14 May 2026 03:50:54 -0700 From: Thangaraj Samynathan To: CC: , , , , , , , , Subject: [PATCH v4 2/5] net: lan743x: read SFP straps from PCI11x1x device Date: Thu, 14 May 2026 16:20:25 +0530 Message-ID: <20260514105028.42942-3-thangaraj.s@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260514105028.42942-1-thangaraj.s@microchip.com> References: <20260514105028.42942-1-thangaraj.s@microchip.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Reads the SFP enable bits from the strap registers to determine if the hardware is configured for SFP usage. Introduce CONFIG_LAN743X_SFP to guard SFP-specific code and select the required peripheral dependencies (I2C_PCI1XXXX, GP_PCI1XXXX, SFP, PCS_XPCS) only when SFP hardware is present. HWMON is also selected to support thermal monitoring of SFP modules via the sfp subsystem. - Add STRAP_SFP_USE_EN_ and STRAP_SFP_EN_ definitions to read SFP straps. - Store SFP status in the adapter's is_sfp_support_en flag. - Add a validation check when SFP support is requested without SGMII_EN strap; log the invalid combination and force is_sfp_support_en to false so subsequent SFP/PCS paths are safely skipped. - Add debug logging for is_sfp_support_en using str_enable_disable() helper, consistent with the existing PCS debug log. Signed-off-by: Thangaraj Samynathan --- drivers/net/ethernet/microchip/Kconfig | 15 ++++++++++++ drivers/net/ethernet/microchip/lan743x_main.c | 23 +++++++++++++++++++ drivers/net/ethernet/microchip/lan743x_main.h | 3 +++ 3 files changed, 41 insertions(+) diff --git a/drivers/net/ethernet/microchip/Kconfig b/drivers/net/ethernet/= microchip/Kconfig index ee046468652c..0cc55d00ab52 100644 --- a/drivers/net/ethernet/microchip/Kconfig +++ b/drivers/net/ethernet/microchip/Kconfig @@ -57,6 +57,21 @@ config LAN743X To compile this driver as a module, choose M here. The module will be called lan743x. =20 +config LAN743X_SFP + bool "SFP support for PCI11x1x" + depends on LAN743X + select HWMON if LAN743X=3Dy + select I2C_PCI1XXXX + select GP_PCI1XXXX + select SFP + select PCS_XPCS + help + Enable SFP module support for the Microchip PCI11x1x Ethernet + controller. Requires the GPIO and I2C peripheral controllers on + the PCI11x1x device to be present and probed. + + If unsure, say N. + source "drivers/net/ethernet/microchip/lan865x/Kconfig" source "drivers/net/ethernet/microchip/lan966x/Kconfig" source "drivers/net/ethernet/microchip/sparx5/Kconfig" diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/et= hernet/microchip/lan743x_main.c index fad4a246e06e..77a554a0432c 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -62,6 +62,14 @@ static void pci11x1x_strap_get_status(struct lan743x_ada= pter *adapter) adapter->is_pcs_en =3D true; else adapter->is_pcs_en =3D false; + +#ifdef CONFIG_LAN743X_SFP + if ((strap & STRAP_SFP_USE_EN_) && (strap & STRAP_SFP_EN_)) + adapter->is_sfp_support_en =3D true; + else + adapter->is_sfp_support_en =3D false; +#endif + } else { fpga_rev =3D lan743x_csr_read(adapter, FPGA_REV); if (fpga_rev) { @@ -73,8 +81,22 @@ static void pci11x1x_strap_get_status(struct lan743x_ada= pter *adapter) adapter->is_pcs_en =3D false; } } + +#ifdef CONFIG_LAN743X_SFP + if (adapter->is_pci11x1x && !adapter->is_pcs_en && + adapter->is_sfp_support_en) { + netif_err(adapter, drv, adapter->netdev, + "Invalid EEPROM configuration: SFP_EN strap specified without SGMII_E= N strap\n"); + adapter->is_sfp_support_en =3D false; + } +#endif + netif_dbg(adapter, drv, adapter->netdev, "PCS I/F %s\n", str_enable_disable(adapter->is_pcs_en)); +#ifdef CONFIG_LAN743X_SFP + netif_dbg(adapter, drv, adapter->netdev, + "SFP support %s\n", str_enable_disable(adapter->is_sfp_support_en)); +#endif } =20 static bool is_pci11x1x_chip(struct lan743x_adapter *adapter) @@ -3665,6 +3687,7 @@ static int lan743x_pcidev_probe(struct pci_dev *pdev, NETIF_MSG_LINK | NETIF_MSG_IFUP | NETIF_MSG_IFDOWN | NETIF_MSG_TX_QUEUED; netdev->max_mtu =3D LAN743X_MAX_FRAME_SIZE; + adapter->is_sfp_support_en =3D false; =20 of_get_mac_address(pdev->dev.of_node, adapter->mac_address); =20 diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/et= hernet/microchip/lan743x_main.h index f0fa0580b04e..d9eb10ffac6c 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.h +++ b/drivers/net/ethernet/microchip/lan743x_main.h @@ -37,6 +37,8 @@ =20 #define STRAP_READ (0x0C) #define STRAP_READ_USE_SGMII_EN_ BIT(22) +#define STRAP_SFP_USE_EN_ BIT(31) +#define STRAP_SFP_EN_ BIT(15) #define STRAP_READ_SGMII_EN_ BIT(6) #define STRAP_READ_SGMII_REFCLK_ BIT(5) #define STRAP_READ_SGMII_2_5G_ BIT(4) @@ -1081,6 +1083,7 @@ struct lan743x_adapter { u8 max_tx_channels; u8 used_tx_channels; u8 max_vector_count; + bool is_sfp_support_en; =20 #define LAN743X_ADAPTER_FLAG_OTP BIT(0) u32 flags; --=20 2.34.1 From nobody Sat May 30 13:23:02 2026 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.153.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5A3563B9D8C; Thu, 14 May 2026 10:51:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.153.233 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778755867; cv=none; b=gPFCF/mUzoQpPj8NPYGu4khaZCivukNK0ME0NIy/2EKM85CMLm3Z6CLLBeWYIzx4TfqDSkj2gierrJWMbv/r9qtnctms+vgx5PXgiA76WkANFU/FR36wvK+UCkeWNQPdNXQitNMrqAWKzLO23VTZjCUMCqS3VjZTzmVtOoeycYI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778755867; c=relaxed/simple; bh=v9wVTyUTLOcbFxcTLl5NoveieUtTljJG4yrT320KOgQ=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=u4rruwHnWrdqnfoJA4ccMVSDC2ka40GtAXBghDAP8wmqf2ZiBhvc2r+t0YsNl2Oz+mp3GolC7HAi77lgKyCHsthqxztZG7ZYvuY2nLiF0tKkHWOB0bcJIBcP4UPaKPaOd2oiAviSMzhAQKR56lchZZSsj2S8wDMTqYh8EB7oXV0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=ztdz5jP9; arc=none smtp.client-ip=68.232.153.233 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="ztdz5jP9" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1778755865; x=1810291865; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=v9wVTyUTLOcbFxcTLl5NoveieUtTljJG4yrT320KOgQ=; b=ztdz5jP9g4g1mhMUSS5XG+wLIzCUaRfDKw3SXLezCA3wgU3o62fqETZq 38VkBKMQM1MPEz5NyOULxbYbVosrYNCDnUD3mm/35ETgUZy/75PrhowK0 e1vxR1JZ4gh8xf7UcBxTUnRZbbBvcXKZjLT0kARhOdW/wDxXRLuNSWWc+ /hPWAt4T+cvc6W36WkDzMCz3LjOf4nKF23W07DWX5yoqQt7ASf4OkU/qq 6uczD5VsGMHRvbkY8DXodJvnqbunvco4qSyUYpbVjOXVIOYOYS5ymtFPg 13fKDt3b4dow9BwrzGa4Pmv/OU76YPvexUzlmAqhHR/eRTiR8whU0/RnX g==; X-CSE-ConnectionGUID: gg+kE8jZRnCAyBMDCwGXsA== X-CSE-MsgGUID: 4tN2LVnsQ5W28XAltCUN7A== X-IronPort-AV: E=Sophos;i="6.23,234,1770620400"; d="scan'208";a="57503048" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa3.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 May 2026 03:51:04 -0700 Received: from chn-vm-ex01.mchp-main.com (10.10.87.71) by chn-vm-ex2.mchp-main.com (10.10.87.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.2562.37; Thu, 14 May 2026 03:51:03 -0700 Received: from che-ld-unglab06.microchip.com (10.10.85.11) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server id 15.1.2507.58 via Frontend Transport; Thu, 14 May 2026 03:51:00 -0700 From: Thangaraj Samynathan To: CC: , , , , , , , , Subject: [PATCH v4 3/5] net: lan743x: Add support to software-nodes for SFP Date: Thu, 14 May 2026 16:20:26 +0530 Message-ID: <20260514105028.42942-4-thangaraj.s@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260514105028.42942-1-thangaraj.s@microchip.com> References: <20260514105028.42942-1-thangaraj.s@microchip.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Register software nodes to describe the SFP hardware topology: the GPIO device (for TX-fault, TX-disable, LOS, mod-def0, and rate-select0 signals), the I2C adapter (for SFP EEPROM access), the SFP cage node, and a phylink node configured for in-band-status mode. Property entry arrays are sized with a trailing zero-initialised entry as required by swnode.c iteration. Error paths in lan743x_swnodes_register() free the nodes allocation via a common return_error label to avoid memory leaks. Signed-off-by: Thangaraj Samynathan --- drivers/net/ethernet/microchip/lan743x_main.c | 261 +++++++++++++++++- drivers/net/ethernet/microchip/lan743x_main.h | 58 ++++ 2 files changed, 317 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/et= hernet/microchip/lan743x_main.c index 77a554a0432c..b7bdf361705e 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -16,6 +16,7 @@ #include #include #include + #include "lan743x_main.h" #include "lan743x_ethtool.h" =20 @@ -119,6 +120,139 @@ static void lan743x_pci_cleanup(struct lan743x_adapte= r *adapter) pci_disable_device(adapter->pdev); } =20 +#ifdef CONFIG_LAN743X_SFP +/* Walk the PCI11x1x topology to find a peripheral controller function by = its + * device ID. Returns the matching pci_dev with its reference count increm= ented + * (caller must call pci_dev_put()), or NULL if not found. + * + * PCI11x1x devices consist of a PCIe switch with downstream ports. One po= rt + * carries the embedded ethernet controller handled by this driver; another + * carries a multifunction peripheral endpoint (I2C, GPIO, UART, SPI). + * + * pci_walk_bus() is used to traverse the bus safely, as it holds the + * appropriate PCI bus lock during the walk. + */ +struct pci1xxxx_perif_ctx { + u16 perif_id; + struct pci_dev *found; +}; + +static int pci1xxxx_perif_match(struct pci_dev *dev, void *data) +{ + struct pci1xxxx_perif_ctx *ctx =3D data; + + if (dev->vendor =3D=3D PCI1XXXX_VENDOR_ID && + (dev->device & ~PCI1XXXX_DEV_MASK) =3D=3D ctx->perif_id) { + ctx->found =3D pci_dev_get(dev); + return 1; + } + return 0; +} + +static struct pci_dev *pci1xxxx_perif_dev_find(struct lan743x_adapter *ada= pter, + u16 perif_id) +{ + struct pci1xxxx_perif_ctx ctx =3D { .perif_id =3D perif_id }; + struct pci_dev *br_dev; + + br_dev =3D pci_upstream_bridge(adapter->pdev); + if (!br_dev) { + netif_err(adapter, drv, adapter->netdev, + "upstream bridge not found\n"); + return NULL; + } + + pci_walk_bus(br_dev->bus, pci1xxxx_perif_match, &ctx); + + if (!ctx.found) + netif_err(adapter, drv, adapter->netdev, + "pci1xxxx peripheral (0x%X) device not found\n", + perif_id); + return ctx.found; +} + +static int pci1xxxx_i2c_dev_match(struct device *dev, const void *data) +{ + return i2c_verify_adapter(dev); +} + +static int pci1xxxx_i2c_adapter_get(struct lan743x_adapter *adapter) +{ + struct pci_dev *perif_dev; + struct device *adap_dev; + + perif_dev =3D pci1xxxx_perif_dev_find(adapter, PCI1XXXX_PERIF_I2C_ID); + if (!perif_dev) + return -EPROBE_DEFER; + + adap_dev =3D device_find_child(&perif_dev->dev, NULL, + pci1xxxx_i2c_dev_match); + if (!adap_dev) { + pci_dev_put(perif_dev); + return -EPROBE_DEFER; + } + + if (!device_link_add(&perif_dev->dev, &adapter->pdev->dev, + DL_FLAG_MANAGED | DL_FLAG_AUTOREMOVE_CONSUMER)) { + netif_err(adapter, drv, adapter->netdev, + "failed to link I2C peripheral device\n"); + put_device(adap_dev); + pci_dev_put(perif_dev); + return -EINVAL; + } + + adapter->i2c_adap =3D i2c_verify_adapter(adap_dev); + strscpy(adapter->nodes->i2c_name, adapter->i2c_adap->name, + sizeof(adapter->nodes->i2c_name)); + netif_dbg(adapter, drv, adapter->netdev, "Found %s\n", + adapter->i2c_adap->name); + put_device(adap_dev); + pci_dev_put(perif_dev); + return 0; +} + +static int pci1xxxx_gpio_aux_dev_match(struct device *dev, const void *dat= a) +{ + if (!dev_is_auxiliary(dev)) + return 0; + return strcmp(to_auxiliary_dev(dev)->name, "gp_gpio") =3D=3D 0; +} + +static int pci1xxxx_gpio_dev_get(struct lan743x_adapter *adapter) +{ + struct pci_dev *perif_dev; + struct device *gpio_dev; + + perif_dev =3D pci1xxxx_perif_dev_find(adapter, PCI1XXXX_PERIF_GPIO_ID); + if (!perif_dev) + return -EPROBE_DEFER; + + gpio_dev =3D device_find_child(&perif_dev->dev, NULL, + pci1xxxx_gpio_aux_dev_match); + if (!gpio_dev) { + pci_dev_put(perif_dev); + return -EPROBE_DEFER; + } + + if (!device_link_add(&perif_dev->dev, &adapter->pdev->dev, + DL_FLAG_MANAGED | DL_FLAG_AUTOREMOVE_CONSUMER)) { + netif_err(adapter, drv, adapter->netdev, + "failed to link GPIO peripheral device\n"); + put_device(gpio_dev); + pci_dev_put(perif_dev); + return -EINVAL; + } + + strscpy(adapter->nodes->gpio_name, dev_name(gpio_dev), + sizeof(adapter->nodes->gpio_name)); + netif_dbg(adapter, drv, adapter->netdev, "Found %s\n", + adapter->nodes->gpio_name); + put_device(gpio_dev); + pci_dev_put(perif_dev); + return 0; +} +#endif /* CONFIG_LAN743X_SFP */ + static int lan743x_pci_init(struct lan743x_adapter *adapter, struct pci_dev *pdev) { @@ -2897,6 +3031,107 @@ static int lan743x_rx_open(struct lan743x_rx *rx) return ret; } =20 +#ifdef CONFIG_LAN743X_SFP +static void lan743x_swnodes_unregister(struct lan743x_adapter *adapter) +{ + if (adapter->nodes) { + software_node_unregister_node_group(adapter->nodes->group); + kfree(adapter->nodes); + adapter->nodes =3D NULL; + } +} + +static int lan743x_swnodes_register(struct lan743x_adapter *adapter) +{ + struct pci_dev *pdev =3D adapter->pdev; + struct lan743x_sw_nodes *nodes; + struct software_node *swnodes; + int ret; + u32 id; + + nodes =3D kzalloc_obj(*nodes); + if (!nodes) + return -ENOMEM; + + adapter->nodes =3D nodes; + + ret =3D pci1xxxx_gpio_dev_get(adapter); + if (ret < 0) + goto return_error; + + ret =3D pci1xxxx_i2c_adapter_get(adapter); + if (ret < 0) + goto return_error; + + id =3D (pdev->bus->number << 8) | pdev->devfn; + snprintf(nodes->sfp_name, sizeof(nodes->sfp_name), "sfp-%d", id); + snprintf(nodes->phylink_name, sizeof(nodes->phylink_name), + "mchp-pci1xxxx-phylink-%d", id); + + swnodes =3D nodes->swnodes; + + nodes->gpio_props[0] =3D PROPERTY_ENTRY_STRING("pinctrl-names", "default"= ); + swnodes[SWNODE_GPIO] =3D NODE_PROP(nodes->gpio_name, nodes->gpio_props); + + nodes->tx_fault_ref[0] =3D SOFTWARE_NODE_REFERENCE(&swnodes[SWNODE_GPIO], + PCI11X1X_TX_FAULT_GPIO, + GPIO_ACTIVE_HIGH); + nodes->tx_disable_ref[0] =3D SOFTWARE_NODE_REFERENCE(&swnodes[SWNODE_GPIO= ], + PCI11X1X_TX_DIS_GPIO, + GPIO_ACTIVE_HIGH); + nodes->mod_def0_ref[0] =3D SOFTWARE_NODE_REFERENCE(&swnodes[SWNODE_GPIO], + PCI11X1X_MOD_DEF0_GPIO, + GPIO_ACTIVE_LOW); + nodes->los_ref[0] =3D SOFTWARE_NODE_REFERENCE(&swnodes[SWNODE_GPIO], + PCI11X1X_LOS_GPIO, + GPIO_ACTIVE_HIGH); + nodes->rate_sel0_ref[0] =3D SOFTWARE_NODE_REFERENCE(&swnodes[SWNODE_GPIO], + PCI11X1X_RATE_SEL0_GPIO, + GPIO_ACTIVE_HIGH); + + nodes->i2c_props[0] =3D PROPERTY_ENTRY_STRING("pinctrl-names", "default"); + swnodes[SWNODE_I2C] =3D NODE_PROP(nodes->i2c_name, nodes->i2c_props); + nodes->i2c_ref[0] =3D SOFTWARE_NODE_REFERENCE(&swnodes[SWNODE_I2C]); + + nodes->sfp_props[0] =3D PROPERTY_ENTRY_STRING("compatible", "sff,sfp"); + nodes->sfp_props[1] =3D PROPERTY_ENTRY_REF_ARRAY("i2c-bus", nodes->i2c_re= f); + nodes->sfp_props[2] =3D PROPERTY_ENTRY_REF_ARRAY("tx-fault-gpios", + nodes->tx_fault_ref); + nodes->sfp_props[3] =3D PROPERTY_ENTRY_REF_ARRAY("tx-disable-gpios", + nodes->tx_disable_ref); + nodes->sfp_props[4] =3D PROPERTY_ENTRY_REF_ARRAY("mod-def0-gpios", + nodes->mod_def0_ref); + nodes->sfp_props[5] =3D PROPERTY_ENTRY_REF_ARRAY("los-gpios", + nodes->los_ref); + nodes->sfp_props[6] =3D PROPERTY_ENTRY_REF_ARRAY("rate-select0-gpios", + nodes->rate_sel0_ref); + swnodes[SWNODE_SFP] =3D NODE_PROP(nodes->sfp_name, nodes->sfp_props); + nodes->sfp_ref[0] =3D SOFTWARE_NODE_REFERENCE(&swnodes[SWNODE_SFP]); + nodes->phylink_props[0] =3D PROPERTY_ENTRY_STRING("managed", + "in-band-status"); + nodes->phylink_props[1] =3D PROPERTY_ENTRY_REF_ARRAY("sfp", + nodes->sfp_ref); + swnodes[SWNODE_PHYLINK] =3D NODE_PROP(nodes->phylink_name, + nodes->phylink_props); + + nodes->group[SWNODE_GPIO] =3D &swnodes[SWNODE_GPIO]; + nodes->group[SWNODE_I2C] =3D &swnodes[SWNODE_I2C]; + nodes->group[SWNODE_SFP] =3D &swnodes[SWNODE_SFP]; + nodes->group[SWNODE_PHYLINK] =3D &swnodes[SWNODE_PHYLINK]; + + ret =3D software_node_register_node_group(nodes->group); + if (ret) + goto return_error; + + return 0; + +return_error: + kfree(nodes); + adapter->nodes =3D NULL; + return ret; +} +#endif /* CONFIG_LAN743X_SFP */ + static int lan743x_phylink_sgmii_config(struct lan743x_adapter *adapter) { u32 sgmii_ctl; @@ -3141,7 +3376,9 @@ static const struct phylink_mac_ops lan743x_phylink_m= ac_ops =3D { static int lan743x_phylink_create(struct lan743x_adapter *adapter) { struct net_device *netdev =3D adapter->netdev; + struct fwnode_handle *fwnode =3D NULL; struct phylink *pl; + int ret; =20 adapter->phylink_config.dev =3D &netdev->dev; adapter->phylink_config.type =3D PHYLINK_NETDEV; @@ -3181,11 +3418,28 @@ static int lan743x_phylink_create(struct lan743x_ad= apter *adapter) adapter->phylink_config.supported_interfaces, sizeof(adapter->phylink_config.lpi_interfaces)); =20 - pl =3D phylink_create(&adapter->phylink_config, NULL, - adapter->phy_interface, &lan743x_phylink_mac_ops); +#ifdef CONFIG_LAN743X_SFP + if (adapter->is_sfp_support_en) { + ret =3D lan743x_swnodes_register(adapter); + if (ret) { + netdev_err(netdev, "failed to register software nodes\n"); + return ret; + } + fwnode =3D software_node_fwnode(adapter->nodes->group[SWNODE_PHYLINK]); + if (!fwnode) { + lan743x_swnodes_unregister(adapter); + return -ENODEV; + } + } +#endif =20 + pl =3D phylink_create(&adapter->phylink_config, fwnode, + adapter->phy_interface, &lan743x_phylink_mac_ops); if (IS_ERR(pl)) { netdev_err(netdev, "Could not create phylink (%pe)\n", pl); +#ifdef CONFIG_LAN743X_SFP + lan743x_swnodes_unregister(adapter); +#endif return PTR_ERR(pl); } =20 @@ -3492,6 +3746,9 @@ static void lan743x_destroy_phylink(struct lan743x_ad= apter *adapter) { phylink_destroy(adapter->phylink); adapter->phylink =3D NULL; +#ifdef CONFIG_LAN743X_SFP + lan743x_swnodes_unregister(adapter); +#endif } =20 static void lan743x_full_cleanup(struct lan743x_adapter *adapter) diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/et= hernet/microchip/lan743x_main.h index d9eb10ffac6c..1bff59f43d50 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.h +++ b/drivers/net/ethernet/microchip/lan743x_main.h @@ -4,14 +4,36 @@ #ifndef _LAN743X_H #define _LAN743X_H =20 +#include +#include +#include #include #include +#include +#include #include "lan743x_ptp.h" =20 #define DRIVER_AUTHOR "Bryan Whitehead " #define DRIVER_DESC "LAN743x PCIe Gigabit Ethernet Driver" #define DRIVER_NAME "lan743x" =20 +#define PCI1XXXX_VENDOR_ID 0x1055 +#define PCI1XXXX_BR_PERIF_ID 0xA00C +#define PCI1XXXX_PERIF_I2C_ID 0xA003 +#define PCI1XXXX_PERIF_GPIO_ID 0xA005 +#define PCI1XXXX_DEV_MASK GENMASK(7, 4) +#define PCI11X1X_TX_FAULT_GPIO 46 +#define PCI11X1X_TX_DIS_GPIO 47 +#define PCI11X1X_RATE_SEL0_GPIO 48 +#define PCI11X1X_LOS_GPIO 49 +#define PCI11X1X_MOD_DEF0_GPIO 51 + +#define NODE_PROP(_NAME, _PROP) \ + ((const struct software_node) { \ + .name =3D _NAME, \ + .properties =3D _PROP, \ + }) + /* Register Definitions */ #define ID_REV (0x00) #define ID_REV_ID_MASK_ (0xFFFF0000) @@ -1049,6 +1071,40 @@ enum lan743x_sgmii_lsd { =20 #define MAC_SUPPORTED_WAKES (WAKE_BCAST | WAKE_UCAST | WAKE_MCAST | \ WAKE_MAGIC | WAKE_ARP) + +enum lan743x_swnodes { + SWNODE_GPIO =3D 0, + SWNODE_I2C, + SWNODE_SFP, + SWNODE_PHYLINK, + SWNODE_MAX +}; + +#define I2C_DRV_NAME 48 +#define GPIO_DRV_NAME 32 +#define SFP_NODE_NAME 32 +#define PHYLINK_NODE_NAME 32 + +struct lan743x_sw_nodes { + char gpio_name[GPIO_DRV_NAME]; + char i2c_name[I2C_DRV_NAME]; + char sfp_name[SFP_NODE_NAME]; + char phylink_name[PHYLINK_NODE_NAME]; + struct property_entry gpio_props[2]; + struct property_entry i2c_props[2]; + struct property_entry sfp_props[8]; + struct property_entry phylink_props[3]; + struct software_node_ref_args i2c_ref[1]; + struct software_node_ref_args tx_fault_ref[1]; + struct software_node_ref_args tx_disable_ref[1]; + struct software_node_ref_args mod_def0_ref[1]; + struct software_node_ref_args los_ref[1]; + struct software_node_ref_args rate_sel0_ref[1]; + struct software_node_ref_args sfp_ref[1]; + struct software_node swnodes[SWNODE_MAX]; + const struct software_node *group[SWNODE_MAX + 1]; +}; + struct lan743x_adapter { struct net_device *netdev; struct mii_bus *mdiobus; @@ -1092,6 +1148,8 @@ struct lan743x_adapter { struct phylink *phylink; struct phylink_config phylink_config; int rx_tstamp_filter; + struct lan743x_sw_nodes *nodes; + struct i2c_adapter *i2c_adap; }; =20 #define LAN743X_COMPONENT_FLAG_RX(channel) BIT(20 + (channel)) --=20 2.34.1 From nobody Sat May 30 13:23:02 2026 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.153.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AEFE23B7B71; Thu, 14 May 2026 10:51:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.153.233 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778755872; cv=none; b=nbau5kvQMCl9IBlrPZFn9Ds6aHpZYgXYRDbcZ9ZPfp4vBgiDt2pBFg0Z+cjdvJV9BLoFjq9Fin34zQTYURBwSikPKQIEC/SlLM5jgEB6beqhQRwxZ/16YIV42iToOYUymufMnWtRNNpI6l1FWWNf1eGOWcqDjCuap9hEwku5idU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778755872; c=relaxed/simple; bh=nc+LssMnHiim6lFPG3GL5ZUz2cDCvzO1E7+0uTSJxw4=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=cexszb+h7RN9DZsIW6D43rxPKglvYZvQajeq6av/tfmjmXW9mjJs4WGa9G2RcQPydBwlOJ0Wh0AI4Hk/ZABEe+E3PBQ7pNw7D4/9t6kEYAUpAms9tFbMDDkh6YW9Z8bf4HsOdOVoR1d3+lOfjXCL7lZ55E8sICnS9TDowgzMRR8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=AI3zcx2O; arc=none smtp.client-ip=68.232.153.233 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="AI3zcx2O" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1778755870; x=1810291870; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=nc+LssMnHiim6lFPG3GL5ZUz2cDCvzO1E7+0uTSJxw4=; b=AI3zcx2OtErma0MmC4oIDrozZh9ueKMMS5a0KRYMGssLx/FcgZgRVMtp NaxZkJNxEm02RbH4U6zvSydTwokuVYQydkHiBO8MdJdfEnycVWvChGtJs FSKcOi18G1VERHn51ZL/IoKP5gPI0EydA3YQaTzFc0Tld1p26owCl/+bI MFreTVVTMARLeyd0MU7YMYskr7E0gfGgxOCiTmG/5eHXoBLA1wYu5QD9d I2YoZTm6DoGNF2IumfGMxT/RAR21a2e6VEv2iRQukO+mY65N2oFn/Up5T 2QQaS2QhIrBUEb6EiKr+Ktxc8xssB2pP7Y0jHYV/+VHFdAjduoouM7KCu Q==; X-CSE-ConnectionGUID: IBE4cFAPQnOFOZTFHmylNQ== X-CSE-MsgGUID: G4sXtU9LS9m4ZtixDCiahg== X-IronPort-AV: E=Sophos;i="6.23,234,1770620400"; d="scan'208";a="65858100" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa1.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 May 2026 03:51:10 -0700 Received: from chn-vm-ex01.mchp-main.com (10.10.87.71) by chn-vm-ex2.mchp-main.com (10.10.87.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.2.2562.37; Thu, 14 May 2026 03:51:09 -0700 Received: from che-ld-unglab06.microchip.com (10.10.85.11) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server id 15.1.2507.58 via Frontend Transport; Thu, 14 May 2026 03:51:05 -0700 From: Thangaraj Samynathan To: CC: , , , , , , , , Subject: [PATCH v4 4/5] net: lan743x: Register SFP platform device for PCI11x1x Date: Thu, 14 May 2026 16:20:27 +0530 Message-ID: <20260514105028.42942-5-thangaraj.s@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260514105028.42942-1-thangaraj.s@microchip.com> References: <20260514105028.42942-1-thangaraj.s@microchip.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Register an SFP platform device backed by the SFP software node when SFP support is enabled, and associate the I2C adapter's firmware node so the SFP subsystem can manage module detection and EEPROM reads. Signed-off-by: Thangaraj Samynathan --- drivers/net/ethernet/microchip/lan743x_main.c | 64 +++++++++++++++++-- drivers/net/ethernet/microchip/lan743x_main.h | 1 + 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/et= hernet/microchip/lan743x_main.c index b7bdf361705e..649065c36434 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -192,8 +192,8 @@ static int pci1xxxx_i2c_adapter_get(struct lan743x_adap= ter *adapter) return -EPROBE_DEFER; } =20 - if (!device_link_add(&perif_dev->dev, &adapter->pdev->dev, - DL_FLAG_MANAGED | DL_FLAG_AUTOREMOVE_CONSUMER)) { + if (!device_link_add(&adapter->pdev->dev, &perif_dev->dev, + DL_FLAG_AUTOREMOVE_CONSUMER)) { netif_err(adapter, drv, adapter->netdev, "failed to link I2C peripheral device\n"); put_device(adap_dev); @@ -234,8 +234,8 @@ static int pci1xxxx_gpio_dev_get(struct lan743x_adapter= *adapter) return -EPROBE_DEFER; } =20 - if (!device_link_add(&perif_dev->dev, &adapter->pdev->dev, - DL_FLAG_MANAGED | DL_FLAG_AUTOREMOVE_CONSUMER)) { + if (!device_link_add(&adapter->pdev->dev, &perif_dev->dev, + DL_FLAG_AUTOREMOVE_CONSUMER)) { netif_err(adapter, drv, adapter->netdev, "failed to link GPIO peripheral device\n"); put_device(gpio_dev); @@ -3132,6 +3132,34 @@ static int lan743x_swnodes_register(struct lan743x_a= dapter *adapter) } #endif /* CONFIG_LAN743X_SFP */ =20 +#ifdef CONFIG_LAN743X_SFP +static int lan743x_sfp_register(struct lan743x_adapter *adapter) +{ + struct pci_dev *pdev =3D adapter->pdev; + struct platform_device_info sfp_info; + struct platform_device *sfp_dev; + + memset(&sfp_info, 0, sizeof(sfp_info)); + sfp_info.parent =3D &adapter->pdev->dev; + sfp_info.fwnode =3D software_node_fwnode(adapter->nodes->group[SWNODE_SFP= ]); + sfp_info.name =3D "sfp"; + sfp_info.id =3D (pci_domain_nr(pdev->bus) << 16) | + (pdev->bus->number << 8) | pdev->devfn; + sfp_dev =3D platform_device_register_full(&sfp_info); + if (IS_ERR(sfp_dev)) { + netif_err(adapter, drv, adapter->netdev, + "Failed to register SFP device\n"); + return PTR_ERR(sfp_dev); + } + + adapter->sfp_dev =3D sfp_dev; + netif_dbg(adapter, drv, adapter->netdev, + "SFP platform device registered\n"); + + return 0; +} +#endif /* CONFIG_LAN743X_SFP */ + static int lan743x_phylink_sgmii_config(struct lan743x_adapter *adapter) { u32 sgmii_ctl; @@ -3754,6 +3782,12 @@ static void lan743x_destroy_phylink(struct lan743x_a= dapter *adapter) static void lan743x_full_cleanup(struct lan743x_adapter *adapter) { unregister_netdev(adapter->netdev); + if (adapter->sfp_dev) { + platform_device_unregister(adapter->sfp_dev); + adapter->sfp_dev =3D NULL; + } + if (adapter->i2c_adap) + adapter->i2c_adap =3D NULL; =20 lan743x_destroy_phylink(adapter); lan743x_mdiobus_cleanup(adapter); @@ -3981,11 +4015,31 @@ static int lan743x_pcidev_probe(struct pci_dev *pde= v, goto cleanup_mdiobus; } =20 +#ifdef CONFIG_LAN743X_SFP + if (adapter->is_sfp_support_en) { + adapter->i2c_adap->dev.fwnode =3D + software_node_fwnode(adapter->nodes->group[SWNODE_I2C]); + + ret =3D lan743x_sfp_register(adapter); + if (ret < 0) { + netif_err(adapter, probe, netdev, + "failed to sfp register (%d)\n", ret); + goto cleanup_phylink; + } + } +#endif + ret =3D register_netdev(adapter->netdev); if (ret < 0) - goto cleanup_phylink; + goto cleanup_sfp; return 0; =20 +cleanup_sfp: + if (adapter->sfp_dev) { + platform_device_unregister(adapter->sfp_dev); + adapter->sfp_dev =3D NULL; + } + cleanup_phylink: lan743x_destroy_phylink(adapter); =20 diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/et= hernet/microchip/lan743x_main.h index 1bff59f43d50..a25864bd8328 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.h +++ b/drivers/net/ethernet/microchip/lan743x_main.h @@ -1150,6 +1150,7 @@ struct lan743x_adapter { int rx_tstamp_filter; struct lan743x_sw_nodes *nodes; struct i2c_adapter *i2c_adap; + struct platform_device *sfp_dev; }; =20 #define LAN743X_COMPONENT_FLAG_RX(channel) BIT(20 + (channel)) --=20 2.34.1 From nobody Sat May 30 13:23:02 2026 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.153.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 040363BB687; Thu, 14 May 2026 10:51:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=68.232.153.233 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778755877; cv=none; b=OX7+DwEZsmrGaXbLNdnKhp91kxsoM9oUAGqbGHMB3838UQqTUby2qd1uLeKwoH8DiIf4YamcBzFaJoBnRJ253ZuHUO+ntEQb4H3qfZ6vfkaWfgSHrClzQJxhgj3w1zeKS7UyAVhHVN+cIQ6Y34CVY9UTmr5GM0Ew5snyPJHtP2s= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778755877; c=relaxed/simple; bh=GLC1Dg4DAQYOUX5stTUxmUbQS2csfmdPXEjjgpMel0c=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=qMbTCeq89KUoc6WH21Oeslf7Q+BGP3JExnZOXVv/JbEHZpDI970+u9VnywwfdcUZtB6t5m2zEtlf2Et6h6x9M697FUardKVJZGK5qmkPvyU3msNCkPCVoUOVrIl+rnYATxG9DbMFoujuWIGk+9ij03+h0TW7gt7J/PD6f2EXsE4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com; spf=pass smtp.mailfrom=microchip.com; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b=ckGOYb3E; arc=none smtp.client-ip=68.232.153.233 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=microchip.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=microchip.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=microchip.com header.i=@microchip.com header.b="ckGOYb3E" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1778755876; x=1810291876; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=GLC1Dg4DAQYOUX5stTUxmUbQS2csfmdPXEjjgpMel0c=; b=ckGOYb3EzZ8VOZdSS5YYDoAKLQb9WBSFVUnGd4v4/Bdi7S3YlhNHUtTU efa4rNtdDgyHxBJCq0tSZXsw+2tFeTkdWoFDXxPGWikPp7eNzGEY7WHrE 5VnY06dm7I6I7GE6NiaX5qnrrej9b6rSCCiF/8FmqfUxkYhLiKM6Dd2G1 t9ImyRbs4Eh6iRq+rPje3JWApG9mVGxVl9UBNPVwrJ8TD8oc3pAqLzX2I 3arGQ65XDetktXGLuuEIcx/neBNmDUIM85Lz7ETxZeSsSs1OwYAtJQzdL ypvNRk7T1CxJXNpIYDOc3mc/EE/RGDfkl9awROh0Md26IXa1z5btGinfl g==; X-CSE-ConnectionGUID: kYThZSFMTzyTA5rtXI+lEw== X-CSE-MsgGUID: h4zf1VzfQ0OdptI4p7gMkg== X-IronPort-AV: E=Sophos;i="6.23,234,1770620400"; d="scan'208";a="57503058" X-Amp-Result: SKIPPED(no attachment in message) Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa3.microchip.iphmx.com with ESMTP/TLS/ECDHE-RSA-AES128-GCM-SHA256; 14 May 2026 03:51:15 -0700 Received: from chn-vm-ex01.mchp-main.com (10.10.85.143) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.58; Thu, 14 May 2026 03:51:14 -0700 Received: from che-ld-unglab06.microchip.com (10.10.85.11) by chn-vm-ex01.mchp-main.com (10.10.85.143) with Microsoft SMTP Server id 15.1.2507.58 via Frontend Transport; Thu, 14 May 2026 03:51:11 -0700 From: Thangaraj Samynathan To: CC: , , , , , , , , Subject: [PATCH v4 5/5] net: lan743x: Add PCS/XPCS support for SFP on PCI11x1x Date: Thu, 14 May 2026 16:20:28 +0530 Message-ID: <20260514105028.42942-6-thangaraj.s@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260514105028.42942-1-thangaraj.s@microchip.com> References: <20260514105028.42942-1-thangaraj.s@microchip.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a PCS MII bus and XPCS instance to support SFP modules on PCI11x1x platforms. Register a dedicated mdiobus for PCS access when SFP support is enabled and initialize it with C45 read/write callbacks wired to the internal SGMII access functions. Set phy_mask to ~0 to prevent the MDIO bus scan from probing internal SGMII registers as PHY addresses. Integrate the XPCS instance with phylink by providing a mac_select_pcs callback. Support SGMII and 2.5GBASE-X interfaces in phylink, allowing proper link configuration for SFP modules. Cleanup the PCS mdiobus and XPCS instance during driver removal. Update adapter structure to hold PCS mdiobus and XPCS references. Signed-off-by: Thangaraj Samynathan --- drivers/net/ethernet/microchip/lan743x_main.c | 92 ++++++++++++++++++- drivers/net/ethernet/microchip/lan743x_main.h | 5 + 2 files changed, 94 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/microchip/lan743x_main.c b/drivers/net/et= hernet/microchip/lan743x_main.c index 649065c36434..72f135fba8e2 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.c +++ b/drivers/net/ethernet/microchip/lan743x_main.c @@ -15,7 +15,6 @@ #include #include #include -#include =20 #include "lan743x_main.h" #include "lan743x_ethtool.h" @@ -1192,6 +1191,28 @@ static int lan743x_get_lsd(int speed, int duplex, u8= mss) return lsd; } =20 +static int pci11x1x_pcs_read(struct mii_bus *bus, int addr, int devnum, + int regnum) +{ + struct lan743x_adapter *adapter =3D bus->priv; + + if (addr) + return -EOPNOTSUPP; + + return lan743x_sgmii_read(adapter, devnum, regnum); +} + +static int pci11x1x_pcs_write(struct mii_bus *bus, int addr, int devnum, + int regnum, u16 val) +{ + struct lan743x_adapter *adapter =3D bus->priv; + + if (addr) + return -EOPNOTSUPP; + + return lan743x_sgmii_write(adapter, devnum, regnum, val); +} + static int lan743x_sgmii_mpll_set(struct lan743x_adapter *adapter, u16 baud) { @@ -3268,6 +3289,18 @@ static void lan743x_mac_eee_enable(struct lan743x_ad= apter *adapter, bool enable) lan743x_csr_write(adapter, MAC_CR, mac_cr); } =20 +static struct phylink_pcs *lan743x_phylink_mac_select(struct phylink_confi= g *config, + phy_interface_t interface) +{ + struct net_device *netdev =3D to_net_dev(config->dev); + struct lan743x_adapter *adapter =3D netdev_priv(netdev); + + if (adapter->xpcs) + return adapter->xpcs; + + return NULL; +} + static void lan743x_phylink_mac_config(struct phylink_config *config, unsigned int link_an_mode, const struct phylink_link_state *state) @@ -3399,6 +3432,7 @@ static const struct phylink_mac_ops lan743x_phylink_m= ac_ops =3D { .mac_link_up =3D lan743x_phylink_mac_link_up, .mac_disable_tx_lpi =3D lan743x_mac_disable_tx_lpi, .mac_enable_tx_lpi =3D lan743x_mac_enable_tx_lpi, + .mac_select_pcs =3D lan743x_phylink_mac_select, }; =20 static int lan743x_phylink_create(struct lan743x_adapter *adapter) @@ -3422,6 +3456,7 @@ static int lan743x_phylink_create(struct lan743x_adap= ter *adapter) =20 switch (adapter->phy_interface) { case PHY_INTERFACE_MODE_SGMII: + case PHY_INTERFACE_MODE_2500BASEX: __set_bit(PHY_INTERFACE_MODE_SGMII, adapter->phylink_config.supported_interfaces); __set_bit(PHY_INTERFACE_MODE_1000BASEX, @@ -3489,12 +3524,13 @@ static int lan743x_phylink_connect(struct lan743x_a= dapter *adapter) struct device_node *dn =3D adapter->pdev->dev.of_node; struct net_device *dev =3D adapter->netdev; struct phy_device *phydev; - int ret; + int ret =3D 0; =20 if (dn) ret =3D phylink_of_phy_connect(adapter->phylink, dn, 0); =20 - if (!dn || (ret && !lan743x_phy_handle_exists(dn))) { + if (!adapter->is_sfp_support_en && + (!dn || (ret && !lan743x_phy_handle_exists(dn)))) { phydev =3D phy_find_first(adapter->mdiobus); if (phydev) { /* attach the mac to the phy */ @@ -3767,6 +3803,11 @@ static void lan743x_hardware_cleanup(struct lan743x_= adapter *adapter) =20 static void lan743x_mdiobus_cleanup(struct lan743x_adapter *adapter) { +#ifdef CONFIG_LAN743X_SFP + if (adapter->xpcs) + xpcs_destroy_pcs(adapter->xpcs); +#endif + mdiobus_unregister(adapter->mdiobus); } =20 @@ -3881,6 +3922,44 @@ static int lan743x_hardware_init(struct lan743x_adap= ter *adapter, return 0; } =20 +#ifdef CONFIG_LAN743X_SFP +static int lan743x_pcs_mdiobus_init(struct lan743x_adapter *adapter) +{ + struct phylink_pcs *pcs; + int ret; + + adapter->pcs_mdiobus =3D devm_mdiobus_alloc(&adapter->pdev->dev); + if (!adapter->pcs_mdiobus) + return -ENOMEM; + + adapter->pcs_mdiobus->priv =3D (void *)adapter; + adapter->pcs_mdiobus->read_c45 =3D pci11x1x_pcs_read; + adapter->pcs_mdiobus->write_c45 =3D pci11x1x_pcs_write; + adapter->pcs_mdiobus->name =3D "lan743x-pcs-mdiobus-c45"; + adapter->pcs_mdiobus->phy_mask =3D ~0; + netif_dbg(adapter, drv, adapter->netdev, "lan743x-pcs-mdiobus-c45\n"); + snprintf(adapter->pcs_mdiobus->id, MII_BUS_ID_SIZE, "pci-pcs-%s", pci_nam= e(adapter->pdev)); + + if (!adapter->phy_interface) + lan743x_phy_interface_select(adapter); + + ret =3D devm_mdiobus_register(&adapter->pdev->dev, adapter->pcs_mdiobus); + if (ret) { + netdev_err(adapter->netdev, "failed to register pcs mdiobus\n"); + return ret; + } + + pcs =3D xpcs_create_pcs_mdiodev(adapter->pcs_mdiobus, 0); + if (IS_ERR(pcs)) { + netdev_err(adapter->netdev, "failed to create xpcs\n"); + return PTR_ERR(pcs); + } + + adapter->xpcs =3D pcs; + return 0; +} +#endif /* CONFIG_LAN743X_SFP */ + static int lan743x_mdiobus_init(struct lan743x_adapter *adapter) { int ret; @@ -4002,6 +4081,13 @@ static int lan743x_pcidev_probe(struct pci_dev *pdev, if (ret) goto cleanup_hardware; =20 +#ifdef CONFIG_LAN743X_SFP + if (adapter->is_sfp_support_en) { + ret =3D lan743x_pcs_mdiobus_init(adapter); + if (ret) + goto cleanup_mdiobus; + } +#endif adapter->netdev->netdev_ops =3D &lan743x_netdev_ops; adapter->netdev->ethtool_ops =3D &lan743x_ethtool_ops; adapter->netdev->features =3D NETIF_F_SG | NETIF_F_TSO | diff --git a/drivers/net/ethernet/microchip/lan743x_main.h b/drivers/net/et= hernet/microchip/lan743x_main.h index a25864bd8328..a16fc69c4466 100644 --- a/drivers/net/ethernet/microchip/lan743x_main.h +++ b/drivers/net/ethernet/microchip/lan743x_main.h @@ -8,6 +8,9 @@ #include #include #include +#ifdef CONFIG_LAN743X_SFP +#include +#endif #include #include #include @@ -1108,6 +1111,7 @@ struct lan743x_sw_nodes { struct lan743x_adapter { struct net_device *netdev; struct mii_bus *mdiobus; + struct mii_bus *pcs_mdiobus; int msg_enable; #ifdef CONFIG_PM u32 wolopts; @@ -1145,6 +1149,7 @@ struct lan743x_adapter { u32 flags; u32 hw_cfg; phy_interface_t phy_interface; + struct phylink_pcs *xpcs; struct phylink *phylink; struct phylink_config phylink_config; int rx_tstamp_filter; --=20 2.34.1