From nobody Sun Feb 8 23:04:00 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (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 D8C9235E55F; Tue, 27 Jan 2026 13:42:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769521369; cv=none; b=dNQSHnVYrQGwMTxq9fpDnnqmpaKD6wlSpoG9r6dETfPI1I8pJ8yYf8+SB02aa9wWoEGlva8fltwIyGdkcqJSbz8SEVeLL/Qsslqyn40tqBavNCnV+bboSJ5db9eexjTMnC7WMD8Wn6vvzPAuvKx9QC/N6KWrxQuBH++7PcAv+9o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769521369; c=relaxed/simple; bh=eaH4DCg8PG4Qegz0pzNo2jDRbz5YV59l7hffXKKyWVw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cSIp354Z/AsEgoT0zIeZNu8QFVCyL7LOviyYoA5OV2Yi10H1jAnkLw3hrEFD43HeWsbfvsMKRWn0r7I2wd/kFw96q6Qmtmc7NXjATwWYAqmOG6R69VEXt0R+9t0iU6+0+ET+mJCVCllz1+YMasoyu6q8X3zQANkUikhm94yCz3U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=YBc3+5Ug; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="YBc3+5Ug" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 9A4A14E422D2; Tue, 27 Jan 2026 13:42:46 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 6CAA9606F5; Tue, 27 Jan 2026 13:42:46 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 07AB0119A8695; Tue, 27 Jan 2026 14:42:42 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1769521365; h=from:subject:date:message-id:to:cc:mime-version: content-transfer-encoding:in-reply-to:references; bh=H9jO5cGzIFudrj2fBUC0gHtKPdipIN1zDR03sFJ/icQ=; b=YBc3+5UgxfAtJlCe0ul8djtlz0fzu18HWByJcAncmqIZ8hzk6Nt+PzFIq3q8unte4P2/LP KZHnwuvug7j4HpsU5Norfgr1SP/a4wpF9Aem2Wj6NCcvTXkuWrN3xFToujZ6Hh1NFBliN9 2M++ojZcRl3z7iKTTHcQV3pa5J3uPqXEfHNC0z7KAZl76OvFxTCBx2U0wIBQVVpNSCfOfF 4L+RKOsxILumhdtyDZQUvQbWL0e6T8C75+KSe8j7EZtWfEx2z0On08xaarpmp8xBajGGgJ nLRoB/W0busmPJXgdIwfAj7ZEdI+qhMJx3JPtWB24/MHB5PVjsJcDr3yK92/1Q== From: Maxime Chevallier To: davem@davemloft.net, Andrew Lunn , Jakub Kicinski , Eric Dumazet , Paolo Abeni , Russell King , Heiner Kallweit Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com, Christophe Leroy , Herve Codina , Florian Fainelli , Vladimir Oltean , =?UTF-8?q?K=C3=B6ry=20Maincent?= , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Oleksij Rempel , =?UTF-8?q?Nicol=C3=B2=20Veronese?= , Simon Horman , mwojtas@chromium.org, Romain Gantois , Daniel Golle , Dimitri Fedrau Subject: [PATCH net-next 11/13] net: phy: store phy_modes in a static array Date: Tue, 27 Jan 2026 14:41:59 +0100 Message-ID: <20260127134202.8208-12-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20260127134202.8208-1-maxime.chevallier@bootlin.com> References: <20260127134202.8208-1-maxime.chevallier@bootlin.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 X-Last-TLS-Session-Version: TLSv1.3 Content-Type: text/plain; charset="utf-8" The phy_modes() helper provided by include/linux/phy.h returns the name of a phy_interface_t value. As it may be used by callers that don't depend on PHYLIB, it's a static inline function. We want to report using netlink the phy_interface_t types that may be accessible on a phy_port, especially for SFP cages. We need access to that array of phy_interface_t names, let's therefore store it into a dedicated array in net/ethtool/common.c. This is part of CONFIG_NET, so it's accessible even without dependency on PHYLIB. Signed-off-by: Maxime Chevallier --- include/linux/phy.h | 84 +++----------------------------------------- net/ethtool/common.c | 44 +++++++++++++++++++++++ 2 files changed, 49 insertions(+), 79 deletions(-) diff --git a/include/linux/phy.h b/include/linux/phy.h index dc788ae4da64..cf607c1a5127 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -199,6 +199,8 @@ static inline void phy_interface_set_rgmii(unsigned lon= g *intf) __set_bit(PHY_INTERFACE_MODE_RGMII_TXID, intf); } =20 +extern const char phy_interface_names[][ETH_GSTRING_LEN]; + /** * phy_modes - map phy_interface_t enum to device tree binding of phy-mode * @interface: enum phy_interface_t value @@ -209,86 +211,10 @@ static inline void phy_interface_set_rgmii(unsigned l= ong *intf) */ static inline const char *phy_modes(phy_interface_t interface) { - switch (interface) { - case PHY_INTERFACE_MODE_NA: - return ""; - case PHY_INTERFACE_MODE_INTERNAL: - return "internal"; - case PHY_INTERFACE_MODE_MII: - return "mii"; - case PHY_INTERFACE_MODE_GMII: - return "gmii"; - case PHY_INTERFACE_MODE_SGMII: - return "sgmii"; - case PHY_INTERFACE_MODE_TBI: - return "tbi"; - case PHY_INTERFACE_MODE_REVMII: - return "rev-mii"; - case PHY_INTERFACE_MODE_RMII: - return "rmii"; - case PHY_INTERFACE_MODE_REVRMII: - return "rev-rmii"; - case PHY_INTERFACE_MODE_RGMII: - return "rgmii"; - case PHY_INTERFACE_MODE_RGMII_ID: - return "rgmii-id"; - case PHY_INTERFACE_MODE_RGMII_RXID: - return "rgmii-rxid"; - case PHY_INTERFACE_MODE_RGMII_TXID: - return "rgmii-txid"; - case PHY_INTERFACE_MODE_RTBI: - return "rtbi"; - case PHY_INTERFACE_MODE_SMII: - return "smii"; - case PHY_INTERFACE_MODE_XGMII: - return "xgmii"; - case PHY_INTERFACE_MODE_XLGMII: - return "xlgmii"; - case PHY_INTERFACE_MODE_MOCA: - return "moca"; - case PHY_INTERFACE_MODE_PSGMII: - return "psgmii"; - case PHY_INTERFACE_MODE_QSGMII: - return "qsgmii"; - case PHY_INTERFACE_MODE_TRGMII: - return "trgmii"; - case PHY_INTERFACE_MODE_1000BASEX: - return "1000base-x"; - case PHY_INTERFACE_MODE_1000BASEKX: - return "1000base-kx"; - case PHY_INTERFACE_MODE_2500BASEX: - return "2500base-x"; - case PHY_INTERFACE_MODE_5GBASER: - return "5gbase-r"; - case PHY_INTERFACE_MODE_RXAUI: - return "rxaui"; - case PHY_INTERFACE_MODE_XAUI: - return "xaui"; - case PHY_INTERFACE_MODE_10GBASER: - return "10gbase-r"; - case PHY_INTERFACE_MODE_25GBASER: - return "25gbase-r"; - case PHY_INTERFACE_MODE_USXGMII: - return "usxgmii"; - case PHY_INTERFACE_MODE_10GKR: - return "10gbase-kr"; - case PHY_INTERFACE_MODE_100BASEX: - return "100base-x"; - case PHY_INTERFACE_MODE_QUSGMII: - return "qusgmii"; - case PHY_INTERFACE_MODE_10G_QXGMII: - return "10g-qxgmii"; - case PHY_INTERFACE_MODE_50GBASER: - return "50gbase-r"; - case PHY_INTERFACE_MODE_LAUI: - return "laui"; - case PHY_INTERFACE_MODE_100GBASEP: - return "100gbase-p"; - case PHY_INTERFACE_MODE_MIILITE: - return "mii-lite"; - default: + if (interface > PHY_INTERFACE_MODE_MAX) return "unknown"; - } + + return phy_interface_names[interface]; } =20 /** diff --git a/net/ethtool/common.c b/net/ethtool/common.c index 4036561b078b..d795d9a8b0cd 100644 --- a/net/ethtool/common.c +++ b/net/ethtool/common.c @@ -483,6 +483,50 @@ static const char ethtool_link_medium_names[][ETH_GSTR= ING_LEN] =3D { }; static_assert(ARRAY_SIZE(ethtool_link_medium_names) =3D=3D __ETHTOOL_LINK_= MEDIUM_LAST); =20 +const char phy_interface_names[][ETH_GSTRING_LEN] =3D { + [PHY_INTERFACE_MODE_NA] =3D "", + [PHY_INTERFACE_MODE_INTERNAL] =3D "internal", + [PHY_INTERFACE_MODE_MII] =3D "mii", + [PHY_INTERFACE_MODE_GMII] =3D "gmii", + [PHY_INTERFACE_MODE_SGMII] =3D "sgmii", + [PHY_INTERFACE_MODE_TBI] =3D "tbi", + [PHY_INTERFACE_MODE_REVMII] =3D "rev-mii", + [PHY_INTERFACE_MODE_RMII] =3D "rmii", + [PHY_INTERFACE_MODE_REVRMII] =3D "rev-rmii", + [PHY_INTERFACE_MODE_RGMII] =3D "rgmii", + [PHY_INTERFACE_MODE_RGMII_ID] =3D "rgmii-id", + [PHY_INTERFACE_MODE_RGMII_RXID] =3D "rgmii-rxid", + [PHY_INTERFACE_MODE_RGMII_TXID] =3D "rgmii-txid", + [PHY_INTERFACE_MODE_RTBI] =3D "rtbi", + [PHY_INTERFACE_MODE_SMII] =3D "smii", + [PHY_INTERFACE_MODE_XGMII] =3D "xgmii", + [PHY_INTERFACE_MODE_XLGMII] =3D "xlgmii", + [PHY_INTERFACE_MODE_MOCA] =3D "moca", + [PHY_INTERFACE_MODE_PSGMII] =3D "psgmii", + [PHY_INTERFACE_MODE_QSGMII] =3D "qsgmii", + [PHY_INTERFACE_MODE_TRGMII] =3D "trgmii", + [PHY_INTERFACE_MODE_1000BASEX] =3D "1000base-x", + [PHY_INTERFACE_MODE_1000BASEKX] =3D "1000base-kx", + [PHY_INTERFACE_MODE_2500BASEX] =3D "2500base-x", + [PHY_INTERFACE_MODE_5GBASER] =3D "5gbase-r", + [PHY_INTERFACE_MODE_RXAUI] =3D "rxaui", + [PHY_INTERFACE_MODE_XAUI] =3D "xaui", + [PHY_INTERFACE_MODE_10GBASER] =3D "10gbase-r", + [PHY_INTERFACE_MODE_25GBASER] =3D "25gbase-r", + [PHY_INTERFACE_MODE_USXGMII] =3D "usxgmii", + [PHY_INTERFACE_MODE_10GKR] =3D "10gbase-kr", + [PHY_INTERFACE_MODE_100BASEX] =3D "100base-x", + [PHY_INTERFACE_MODE_QUSGMII] =3D "qusgmii", + [PHY_INTERFACE_MODE_10G_QXGMII] =3D "10g-qxgmii", + [PHY_INTERFACE_MODE_50GBASER] =3D "50gbase-r", + [PHY_INTERFACE_MODE_LAUI] =3D "laui", + [PHY_INTERFACE_MODE_100GBASEP] =3D "100gbase-p", + [PHY_INTERFACE_MODE_MIILITE] =3D "mii-lite", + +}; +static_assert(ARRAY_SIZE(phy_interface_names) =3D=3D PHY_INTERFACE_MODE_MA= X); +EXPORT_SYMBOL_GPL(phy_interface_names); + const char netif_msg_class_names[][ETH_GSTRING_LEN] =3D { [NETIF_MSG_DRV_BIT] =3D "drv", [NETIF_MSG_PROBE_BIT] =3D "probe", --=20 2.49.0