From: Maxime Chevallier <maxime.chevallier@bootlin.com>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
thomas.petazzoni@bootlin.com, "Andrew Lunn" <andrew@lunn.ch>,
"Jakub Kicinski" <kuba@kernel.org>,
"Eric Dumazet" <edumazet@google.com>,
"Paolo Abeni" <pabeni@redhat.com>,
"Russell King" <linux@armlinux.org.uk>,
"Florian Fainelli" <f.fainelli@gmail.com>,
"Heiner Kallweit" <hkallweit1@gmail.com>,
"Vladimir Oltean" <vladimir.oltean@nxp.com>,
"Köry Maincent" <kory.maincent@bootlin.com>,
"Oleksij Rempel" <o.rempel@pengutronix.de>,
"Simon Horman" <horms@kernel.org>,
"Shuah Khan" <shuah@kernel.org>,
linux-kselftest@vger.kernel.org
Subject: Re: [PATCH net-next v2 1/3] net: netdevsim: Add PHY support in netdevsim
Date: Wed, 9 Jul 2025 13:34:56 +0200 [thread overview]
Message-ID: <20250709133456.46a1908e@fedora> (raw)
In-Reply-To: <20250708115531.111326-2-maxime.chevallier@bootlin.com>
On Tue, 8 Jul 2025 13:55:28 +0200
Maxime Chevallier <maxime.chevallier@bootlin.com> wrote:
> With the introduction of phy_link_topology, we have the ability to keep
> track of PHY devices that sit behind a net_device. While we still can
> only attach one single PHY to a netdev, we can look at all these PHYs
> through netlink, with the ETHTOOL_MSG_PHY_GET command.
>
> Moreover, netlink commands that are targeting PHY devices also now
> allow specifying which PHY we want to address in a given netlink
> command.
>
> That whole process comes with its own complexity, and a few bugs were
> dicovered over the months following the introduction of
> phy_link_topology.
>
> As devices with multiple PHYs are fairly uncommon, testing the corner
> cases of multi-phy setups proves to be difficult.
>
> To that extent, introduce PHY support in netdevsim. The main goal (for
> now) is not to be able to test PHYlib, but these phy-specific
> netlink interfaces.
>
> These netdevsim PHYs use a custom phy_driver that relies on
> re-implementing the phy_driver callbacks. In other words, this is not a
> PHY driver that relies on mdio emulation, and will not work with any of
> the genphy helpers.
>
> The debugfs API for PHY creation and deletion works as follows :
>
> PHY device creation :
>
> echo $ID > /sys/kernel/debug/netdevsim/netdevsimXXX/ports/YY/phy_add
>
> if $ID is 0, then the PHY parent will be the netdev corresponding to the
> port's netdev. The first PHY that is added with the netdev as a parent
> will be attached to the netdev.
>
> if $ID > 0, the index must correspond to a previously added PHY. This
> allows creating any arbitrary tree of PHYs.
>
> Upon PHY addition, a phyXX directory will be created, XX being the
> phyindex of the PHY in the topology:
>
> [...]/ports/YY/phyXX/
>
> This directory contains a "link" file, allowing to toggle the virtual
> PHY's link state.
>
> One can then list the PHYs with "ethtool --show-phys ethX".
>
> Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
> ---
> drivers/net/netdevsim/Makefile | 4 +
> drivers/net/netdevsim/dev.c | 2 +
> drivers/net/netdevsim/netdev.c | 8 +
> drivers/net/netdevsim/netdevsim.h | 25 ++
> drivers/net/netdevsim/phy.c | 398 ++++++++++++++++++++++++++++++
> 5 files changed, 437 insertions(+)
> create mode 100644 drivers/net/netdevsim/phy.c
>
> diff --git a/drivers/net/netdevsim/Makefile b/drivers/net/netdevsim/Makefile
> index f8de93bc5f5b..49f4c515e5e3 100644
> --- a/drivers/net/netdevsim/Makefile
> +++ b/drivers/net/netdevsim/Makefile
> @@ -21,3 +21,7 @@ endif
> ifneq ($(CONFIG_MACSEC),)
> netdevsim-objs += macsec.o
> endif
> +
> +ifneq ($(CONFIG_PHYLIB),)
> +netdevsim-objs += phy.o
> +endif
> diff --git a/drivers/net/netdevsim/dev.c b/drivers/net/netdevsim/dev.c
> index b3647691060c..1ebb4f5b3bdd 100644
> --- a/drivers/net/netdevsim/dev.c
> +++ b/drivers/net/netdevsim/dev.c
> @@ -1510,6 +1510,7 @@ static int nsim_dev_reload_create(struct nsim_dev *nsim_dev,
> devlink = priv_to_devlink(nsim_dev);
> nsim_dev = devlink_priv(devlink);
> INIT_LIST_HEAD(&nsim_dev->port_list);
> + INIT_LIST_HEAD(&nsim_dev->phy_list);
> nsim_dev->fw_update_status = true;
> nsim_dev->fw_update_overwrite_mask = 0;
>
> @@ -1583,6 +1584,7 @@ int nsim_drv_probe(struct nsim_bus_dev *nsim_bus_dev)
> nsim_dev->switch_id.id_len = sizeof(nsim_dev->switch_id.id);
> get_random_bytes(nsim_dev->switch_id.id, nsim_dev->switch_id.id_len);
> INIT_LIST_HEAD(&nsim_dev->port_list);
> + INIT_LIST_HEAD(&nsim_dev->phy_list);
> nsim_dev->fw_update_status = true;
> nsim_dev->fw_update_overwrite_mask = 0;
> nsim_dev->max_macs = NSIM_DEV_MAX_MACS_DEFAULT;
> diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
> index e36d3e846c2d..ff891536f691 100644
> --- a/drivers/net/netdevsim/netdev.c
> +++ b/drivers/net/netdevsim/netdev.c
> @@ -952,6 +952,7 @@ static int nsim_init_netdevsim(struct netdevsim *ns)
>
> nsim_macsec_init(ns);
> nsim_ipsec_init(ns);
> + nsim_phy_init(ns);
>
> err = register_netdevice(ns->netdev);
> if (err)
> @@ -968,6 +969,7 @@ static int nsim_init_netdevsim(struct netdevsim *ns)
> return 0;
>
> err_ipsec_teardown:
> + nsim_phy_teardown(ns);
> nsim_ipsec_teardown(ns);
> nsim_macsec_teardown(ns);
> nsim_bpf_uninit(ns);
> @@ -1058,6 +1060,7 @@ void nsim_destroy(struct netdevsim *ns)
> RCU_INIT_POINTER(ns->peer, NULL);
> unregister_netdevice(dev);
> if (nsim_dev_port_is_pf(ns->nsim_dev_port)) {
> + nsim_phy_teardown(ns);
> nsim_macsec_teardown(ns);
> nsim_ipsec_teardown(ns);
> nsim_bpf_uninit(ns);
> @@ -1098,6 +1101,10 @@ static int __init nsim_module_init(void)
> {
> int err;
>
> + err = nsim_phy_drv_register();
> + if (err)
> + return err;
> +
> err = nsim_dev_init();
> if (err)
> return err;
> @@ -1124,6 +1131,7 @@ static void __exit nsim_module_exit(void)
> rtnl_link_unregister(&nsim_link_ops);
> nsim_bus_exit();
> nsim_dev_exit();
> + nsim_phy_drv_unregister();
> }
>
> module_init(nsim_module_init);
> diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h
> index 809dd29fc5fe..c73d16e67a3c 100644
> --- a/drivers/net/netdevsim/netdevsim.h
> +++ b/drivers/net/netdevsim/netdevsim.h
> @@ -314,6 +314,7 @@ struct nsim_dev {
> struct list_head bpf_bound_maps;
> struct netdev_phys_item_id switch_id;
> struct list_head port_list;
> + struct list_head phy_list;
> bool fw_update_status;
> u32 fw_update_overwrite_mask;
> u32 max_macs;
> @@ -419,6 +420,30 @@ static inline void nsim_macsec_teardown(struct netdevsim *ns)
> }
> #endif
>
> +#if IS_ENABLED(CONFIG_PHYLIB)
> +void nsim_phy_init(struct netdevsim *ns);
> +void nsim_phy_teardown(struct netdevsim *dev);
> +int nsim_phy_drv_register(void);
> +void nsim_phy_drv_unregister(void);
> +#else
> +static inline void nsim_phy_init(struct netdevsim *ns)
> +{
> +}
> +
> +static inline void nsim_phy_teardown(struct netdevsim *ns);
Meh... that's why this fails, stray ';' that slept through the cracks
when building netdevsim with CONFIG_PHYLIB=n ...
I'll address that,
Maxime
next prev parent reply other threads:[~2025-07-09 11:35 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-08 11:55 [PATCH net-next v2 0/3] netdevsim: add support for PHY devices Maxime Chevallier
2025-07-08 11:55 ` [PATCH net-next v2 1/3] net: netdevsim: Add PHY support in netdevsim Maxime Chevallier
2025-07-09 11:34 ` Maxime Chevallier [this message]
2025-07-08 11:55 ` [PATCH net-next v2 2/3] selftests: ethtool: Drop the unused old_netdevs variable Maxime Chevallier
2025-07-08 11:55 ` [PATCH net-next v2 3/3] selftests: ethtool: Introduce ethernet PHY selftests on netdevsim Maxime Chevallier
2025-07-08 20:55 ` [PATCH net-next v2 0/3] netdevsim: add support for PHY devices Jakub Kicinski
2025-07-09 11:19 ` Maxime Chevallier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250709133456.46a1908e@fedora \
--to=maxime.chevallier@bootlin.com \
--cc=andrew@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=hkallweit1@gmail.com \
--cc=horms@kernel.org \
--cc=kory.maincent@bootlin.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=o.rempel@pengutronix.de \
--cc=pabeni@redhat.com \
--cc=shuah@kernel.org \
--cc=thomas.petazzoni@bootlin.com \
--cc=vladimir.oltean@nxp.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.