From: "Björn Töpel" <bjorn@kernel.org>
To: netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
Andrew Lunn <andrew+netdev@lunn.ch>,
Donald Hunter <donald.hunter@gmail.com>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>,
Maxime Chevallier <maxime.chevallier@bootlin.com>,
Naveen Mamindlapalli <naveenm@marvell.com>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>
Cc: "Björn Töpel" <bjorn@kernel.org>,
"Danielle Ratson" <danieller@nvidia.com>,
"Hariprasad Kelam" <hkelam@marvell.com>,
"Ido Schimmel" <idosch@nvidia.com>,
"Kory Maincent" <kory.maincent@bootlin.com>,
"Leon Romanovsky" <leon@kernel.org>,
"Michael Chan" <michael.chan@broadcom.com>,
"Oleksij Rempel" <o.rempel@pengutronix.de>,
"Pavan Chebbi" <pavan.chebbi@broadcom.com>,
"Piergiorgio Beruto" <piergiorgio.beruto@gmail.com>,
"Russell King" <linux@armlinux.org.uk>,
"Saeed Mahameed" <saeedm@nvidia.com>,
"Shuah Khan" <shuah@kernel.org>,
"Tariq Toukan" <tariqt@nvidia.com>,
"Willem de Bruijn" <willemb@google.com>,
"Kees Cook" <kees@kernel.org>,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-rdma@vger.kernel.org
Subject: [PATCH net-next v2 11/12] netdevsim: Add module EEPROM simulation via debugfs
Date: Wed, 25 Mar 2026 15:50:18 +0100 [thread overview]
Message-ID: <20260325145022.2607545-12-bjorn@kernel.org> (raw)
In-Reply-To: <20260325145022.2607545-1-bjorn@kernel.org>
Add get/set_module_eeprom_by_page ethtool ops to netdevsim, enabling
testing of kernel features that depend on module EEPROM access (e.g.
CMIS loopback) without real hardware.
The EEPROM is backed by a 256-page x 128-byte array exposed as binary
debugfs files under ports/<N>/ethtool/module/pages/{0..255}. Offsets
0-127 map to page 0 (lower memory), 128-255 to the requested page's
upper memory, following the CMIS layout. Error injection via get_err
and set_err follows the existing netdevsim pattern.
Signed-off-by: Björn Töpel <bjorn@kernel.org>
---
drivers/net/netdevsim/ethtool.c | 83 +++++++++++++++++++++++++++++++
drivers/net/netdevsim/netdevsim.h | 11 ++++
2 files changed, 94 insertions(+)
diff --git a/drivers/net/netdevsim/ethtool.c b/drivers/net/netdevsim/ethtool.c
index 39c681284700..1ef48802fcbd 100644
--- a/drivers/net/netdevsim/ethtool.c
+++ b/drivers/net/netdevsim/ethtool.c
@@ -247,6 +247,68 @@ static int nsim_set_loopback(struct net_device *dev,
return 1;
}
+static u8 *nsim_module_eeprom_ptr(struct netdevsim *ns,
+ const struct ethtool_module_eeprom *page_data,
+ u32 *len)
+{
+ u32 offset;
+ u8 page;
+
+ if (page_data->offset < NSIM_MODULE_EEPROM_PAGE_LEN) {
+ page = 0;
+ offset = page_data->offset;
+ } else {
+ page = page_data->page;
+ offset = page_data->offset - NSIM_MODULE_EEPROM_PAGE_LEN;
+ }
+
+ *len = min_t(u32, page_data->length,
+ NSIM_MODULE_EEPROM_PAGE_LEN - offset);
+ return ns->ethtool.module.pages[page] + offset;
+}
+
+static int
+nsim_get_module_eeprom_by_page(struct net_device *dev,
+ const struct ethtool_module_eeprom *page_data,
+ struct netlink_ext_ack *extack)
+{
+ struct netdevsim *ns = netdev_priv(dev);
+ u32 len;
+ u8 *ptr;
+
+ if (ns->ethtool.module.get_err)
+ return -ns->ethtool.module.get_err;
+
+ ptr = nsim_module_eeprom_ptr(ns, page_data, &len);
+ if (!ptr)
+ return -EINVAL;
+
+ memcpy(page_data->data, ptr, len);
+
+ return len;
+}
+
+static int
+nsim_set_module_eeprom_by_page(struct net_device *dev,
+ const struct ethtool_module_eeprom *page_data,
+ struct netlink_ext_ack *extack)
+{
+ struct netdevsim *ns = netdev_priv(dev);
+ u32 len;
+ u8 *ptr;
+
+ if (ns->ethtool.module.set_err)
+ return -ns->ethtool.module.set_err;
+
+ ptr = nsim_module_eeprom_ptr(ns, page_data, &len);
+ if (!ptr)
+ return -EINVAL;
+
+ memcpy(ptr, page_data->data, len);
+
+ return 0;
+}
+
static int nsim_get_ts_info(struct net_device *dev,
struct kernel_ethtool_ts_info *info)
{
@@ -274,6 +336,8 @@ static const struct ethtool_ops nsim_ethtool_ops = {
.set_fecparam = nsim_set_fecparam,
.get_fec_stats = nsim_get_fec_stats,
.get_ts_info = nsim_get_ts_info,
+ .get_module_eeprom_by_page = nsim_get_module_eeprom_by_page,
+ .set_module_eeprom_by_page = nsim_set_module_eeprom_by_page,
.get_loopback = nsim_get_loopback,
.get_loopback_by_index = nsim_get_loopback_by_index,
.set_loopback = nsim_set_loopback,
@@ -292,6 +356,7 @@ static void nsim_ethtool_ring_init(struct netdevsim *ns)
void nsim_ethtool_init(struct netdevsim *ns)
{
struct dentry *ethtool, *dir;
+ int i;
ns->netdev->ethtool_ops = &nsim_ethtool_ops;
@@ -326,6 +391,24 @@ void nsim_ethtool_init(struct netdevsim *ns)
debugfs_create_u32("tx_max_pending", 0600, dir,
&ns->ethtool.ring.tx_max_pending);
+ dir = debugfs_create_dir("module", ethtool);
+ debugfs_create_u32("get_err", 0600, dir, &ns->ethtool.module.get_err);
+ debugfs_create_u32("set_err", 0600, dir, &ns->ethtool.module.set_err);
+
+ dir = debugfs_create_dir("pages", dir);
+ for (i = 0; i < NSIM_MODULE_EEPROM_PAGES; i++) {
+ char name[8];
+
+ ns->ethtool.module.page_blobs[i].data =
+ ns->ethtool.module.pages[i];
+ ns->ethtool.module.page_blobs[i].size =
+ NSIM_MODULE_EEPROM_PAGE_LEN;
+
+ snprintf(name, sizeof(name), "%u", i);
+ debugfs_create_blob(name, 0600, dir,
+ &ns->ethtool.module.page_blobs[i]);
+ }
+
ns->ethtool.mac_lb.supported = ETHTOOL_LOOPBACK_DIRECTION_LOCAL |
ETHTOOL_LOOPBACK_DIRECTION_REMOTE;
diff --git a/drivers/net/netdevsim/netdevsim.h b/drivers/net/netdevsim/netdevsim.h
index 7a3382562287..816e8ddd2551 100644
--- a/drivers/net/netdevsim/netdevsim.h
+++ b/drivers/net/netdevsim/netdevsim.h
@@ -82,6 +82,16 @@ struct nsim_ethtool_pauseparam {
bool report_stats_tx;
};
+#define NSIM_MODULE_EEPROM_PAGES 256
+#define NSIM_MODULE_EEPROM_PAGE_LEN 128
+
+struct nsim_ethtool_module {
+ u32 get_err;
+ u32 set_err;
+ u8 pages[NSIM_MODULE_EEPROM_PAGES][NSIM_MODULE_EEPROM_PAGE_LEN];
+ struct debugfs_blob_wrapper page_blobs[NSIM_MODULE_EEPROM_PAGES];
+};
+
struct nsim_ethtool {
u32 get_err;
u32 set_err;
@@ -94,6 +104,7 @@ struct nsim_ethtool {
u32 supported;
u32 direction;
} mac_lb;
+ struct nsim_ethtool_module module;
};
struct nsim_rq {
--
2.53.0
next prev parent reply other threads:[~2026-03-25 14:51 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-25 14:50 [PATCH net-next v2 00/12] ethtool: Generic loopback support Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 01/12] ethtool: Add dump_one_dev callback for per-device sub-iteration Björn Töpel
2026-03-25 18:20 ` Maxime Chevallier
2026-03-25 14:50 ` [PATCH net-next v2 02/12] ethtool: Convert per-PHY commands to dump_one_dev Björn Töpel
2026-03-25 18:21 ` Maxime Chevallier
2026-03-25 14:50 ` [PATCH net-next v2 03/12] ethtool: Add loopback netlink UAPI definitions Björn Töpel
2026-03-26 8:10 ` Maxime Chevallier
2026-03-26 8:55 ` Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 04/12] ethtool: Add loopback GET/SET netlink implementation Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 05/12] ethtool: Add CMIS loopback helpers for module loopback control Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 06/12] selftests: drv-net: Add loopback driver test Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 07/12] ethtool: Add MAC loopback support via ethtool_ops Björn Töpel
2026-03-26 9:49 ` Breno Leitao
2026-03-25 14:50 ` [PATCH net-next v2 08/12] netdevsim: Add MAC loopback simulation Björn Töpel
2026-03-26 9:40 ` Breno Leitao
2026-03-25 14:50 ` [PATCH net-next v2 09/12] selftests: drv-net: Add MAC loopback netdevsim test Björn Töpel
2026-03-26 9:32 ` Breno Leitao
2026-03-26 9:44 ` Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 10/12] MAINTAINERS: Add entry for ethtool loopback Björn Töpel
2026-03-25 14:50 ` Björn Töpel [this message]
2026-03-25 14:50 ` [PATCH net-next v2 12/12] selftests: drv-net: Add CMIS loopback netdevsim test Björn Töpel
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=20260325145022.2607545-12-bjorn@kernel.org \
--to=bjorn@kernel.org \
--cc=andrew+netdev@lunn.ch \
--cc=danieller@nvidia.com \
--cc=davem@davemloft.net \
--cc=donald.hunter@gmail.com \
--cc=edumazet@google.com \
--cc=hkelam@marvell.com \
--cc=horms@kernel.org \
--cc=idosch@nvidia.com \
--cc=kees@kernel.org \
--cc=kory.maincent@bootlin.com \
--cc=kuba@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=maxime.chevallier@bootlin.com \
--cc=michael.chan@broadcom.com \
--cc=naveenm@marvell.com \
--cc=netdev@vger.kernel.org \
--cc=o.rempel@pengutronix.de \
--cc=pabeni@redhat.com \
--cc=pavan.chebbi@broadcom.com \
--cc=piergiorgio.beruto@gmail.com \
--cc=saeedm@nvidia.com \
--cc=shuah@kernel.org \
--cc=tariqt@nvidia.com \
--cc=willemb@google.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox