Devicetree
 help / color / mirror / Atom feed
From: Minghuan Lian <minghuan.lian@nxp.com>
To: netdev@vger.kernel.org
Cc: devicetree@vger.kernel.org, andrew+netdev@lunn.ch,
	olteanv@gmail.com, davem@davemloft.net, edumazet@google.com,
	kuba@kernel.org, pabeni@redhat.com, robh@kernel.org,
	krzk+dt@kernel.org, conor+dt@kernel.org,
	Minghuan Lian <minghuan.lian@nxp.com>
Subject: [PATCH net-next 4/4] net: dsa: hms: Add ethtool statistics support
Date: Sat,  9 May 2026 18:06:32 +0900	[thread overview]
Message-ID: <20260509090632.2959553-5-minghuan.lian@nxp.com> (raw)
In-Reply-To: <20260509090632.2959553-1-minghuan.lian@nxp.com>

Add ethtool statistics support for the HMS switch. This provides
per-port statistics including:
  - RX/TX byte and frame counters
  - Frame size distribution counters
  - Error and discard counters
  - Per-queue statistics for all 8 traffic classes

Statistics are retrieved from the RT1180 MCU via the SPI command
interface using HMS_CMD_PORT_ETHTOOL_STATS_GET.

Signed-off-by: Minghuan Lian <minghuan.lian@nxp.com>
---
 drivers/net/dsa/hms/Makefile      |   1 +
 drivers/net/dsa/hms/hms_ethtool.c | 346 ++++++++++++++++++++++++++++++
 drivers/net/dsa/hms/hms_main.c    |   4 +
 drivers/net/dsa/hms/hms_switch.h  |   6 +
 4 files changed, 357 insertions(+)
 create mode 100644 drivers/net/dsa/hms/hms_ethtool.c

diff --git a/drivers/net/dsa/hms/Makefile b/drivers/net/dsa/hms/Makefile
index acf6a8f2d953b..11bb215b270c6 100644
--- a/drivers/net/dsa/hms/Makefile
+++ b/drivers/net/dsa/hms/Makefile
@@ -5,4 +5,5 @@ obj-$(CONFIG_NET_DSA_HMS_SWITCH) += hms.o
 hms-objs := \
 	hms_spi.o \
 	hms_config.o \
+	hms_ethtool.o \
 	hms_main.o
diff --git a/drivers/net/dsa/hms/hms_ethtool.c b/drivers/net/dsa/hms/hms_ethtool.c
new file mode 100644
index 0000000000000..00c8406b12862
--- /dev/null
+++ b/drivers/net/dsa/hms/hms_ethtool.c
@@ -0,0 +1,346 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * NXP HMS (Heterogeneous Multi-SoC) DSA Switch ethtool Statistics
+ *
+ * Copyright 2025-2026 NXP
+ */
+
+#include "hms_switch.h"
+
+enum hms_stat_index {
+	/* RX stats */
+	HMS_STAT_RX_BYTES,
+	HMS_STAT_RX_VALID_BYTES,
+	HMS_STAT_RX_PAUSE_FRAMES,
+	HMS_STAT_RX_VALID_FRAMES,
+	HMS_STAT_RX_VLAN_FRAMES,
+	HMS_STAT_RX_UC_FRAMES,
+	HMS_STAT_RX_MC_FRAMES,
+	HMS_STAT_RX_BC_FRAMES,
+	HMS_STAT_RX_FRAMES,
+	HMS_STAT_RX_MIN_FRAMES,
+	HMS_STAT_RX_64_FRAMES,
+	HMS_STAT_RX_65_127_FRAMES,
+	HMS_STAT_RX_128_255_FRAMES,
+	HMS_STAT_RX_256_511_FRAMES,
+	HMS_STAT_RX_512_1023_FRAMES,
+	HMS_STAT_RX_1024_1522_FRAMES,
+	HMS_STAT_RX_1523_MAX_FRAMES,
+	HMS_STAT_RX_CONTROL_FRAMES,
+
+	/* TX stats */
+	HMS_STAT_TX_BYTES,
+	HMS_STAT_TX_VALID_BYTES,
+	HMS_STAT_TX_PAUSE_FRAMES,
+	HMS_STAT_TX_VALID_FRAMES,
+	HMS_STAT_TX_VLAN_FRAMES,
+	HMS_STAT_TX_UC_FRAMES,
+	HMS_STAT_TX_MC_FRAMES,
+	HMS_STAT_TX_BC_FRAMES,
+	HMS_STAT_TX_FRAMES,
+	HMS_STAT_TX_MIN_FRAMES,
+	HMS_STAT_TX_64_FRAMES,
+	HMS_STAT_TX_65_127_FRAMES,
+	HMS_STAT_TX_128_255_FRAMES,
+	HMS_STAT_TX_256_511_FRAMES,
+	HMS_STAT_TX_512_1023_FRAMES,
+	HMS_STAT_TX_1024_1522_FRAMES,
+	HMS_STAT_TX_1523_MAX_FRAMES,
+	HMS_STAT_TX_CONTROL_FRAMES,
+
+	HMS_STAT_RX_VALID_REASSEMBLED_FRAMES,
+	HMS_STAT_RX_ADDITIONAL_MPACKETS,
+	HMS_STAT_RX_ERROR_FRAME_REASSEMBLY,
+	HMS_STAT_RX_ERROR_FRAME_SMD,
+	HMS_STAT_TX_ADDITIONAL_MPACKETS,
+	HMS_STAT_TX_HOLD_TRANSITIONS,
+
+	/* Error stats */
+	HMS_STAT_RX_ERROR,
+	HMS_STAT_RX_ERROR_UNDERSIZE,
+	HMS_STAT_RX_ERROR_OVERSIZE,
+	HMS_STAT_RX_ERROR_FCS,
+	HMS_STAT_RX_ERROR_FRAGMENT,
+	HMS_STAT_RX_ERROR_JABBER,
+	HMS_STAT_RX_ERROR_DISCARD,
+	HMS_STAT_RX_ERROR_NO_TRUNCATED,
+	HMS_STAT_TX_ERROR_FCS,
+	HMS_STAT_TX_ERROR_UNDERSIZE,
+
+	/* Discard stats */
+	HMS_STAT_RX_DISCARD_COUNT,
+	HMS_STAT_RX_DISCARD_REASON0,
+	HMS_STAT_RX_DISCARD_TABLE_ID,
+	HMS_STAT_RX_DISCARD_ENTRY_ID,
+	HMS_STAT_TX_DISCARD_COUNT,
+	HMS_STAT_TX_DISCARD_REASON0,
+	HMS_STAT_TX_DISCARD_TABLE_ID,
+	HMS_STAT_TX_DISCARD_ENTRY_ID,
+	HMS_STAT_BRIDGE_DISCARD_COUNT,
+	HMS_STAT_BRIDGE_DISCARD_REASON0,
+	HMS_STAT_BRIDGE_DISCARD_TABLE_ID,
+	HMS_STAT_BRIDGE_DISCARD_ENTRY_ID,
+
+	/* Q0 stats */
+	HMS_STAT_Q0_REJECTED_BYTES,
+	HMS_STAT_Q0_REJECTED_FRAMES,
+	HMS_STAT_Q0_DEQUEUE_BYTES,
+	HMS_STAT_Q0_DEQUEUE_FRAMES,
+	HMS_STAT_Q0_DROPPED_BYTES,
+	HMS_STAT_Q0_DROPPED_FRAMES,
+	HMS_STAT_Q0_FRAMES,
+
+	/* Q1 stats */
+	HMS_STAT_Q1_REJECTED_BYTES,
+	HMS_STAT_Q1_REJECTED_FRAMES,
+	HMS_STAT_Q1_DEQUEUE_BYTES,
+	HMS_STAT_Q1_DEQUEUE_FRAMES,
+	HMS_STAT_Q1_DROPPED_BYTES,
+	HMS_STAT_Q1_DROPPED_FRAMES,
+	HMS_STAT_Q1_FRAMES,
+
+	/* Q2 stats */
+	HMS_STAT_Q2_REJECTED_BYTES,
+	HMS_STAT_Q2_REJECTED_FRAMES,
+	HMS_STAT_Q2_DEQUEUE_BYTES,
+	HMS_STAT_Q2_DEQUEUE_FRAMES,
+	HMS_STAT_Q2_DROPPED_BYTES,
+	HMS_STAT_Q2_DROPPED_FRAMES,
+	HMS_STAT_Q2_FRAMES,
+
+	/* Q3 stats */
+	HMS_STAT_Q3_REJECTED_BYTES,
+	HMS_STAT_Q3_REJECTED_FRAMES,
+	HMS_STAT_Q3_DEQUEUE_BYTES,
+	HMS_STAT_Q3_DEQUEUE_FRAMES,
+	HMS_STAT_Q3_DROPPED_BYTES,
+	HMS_STAT_Q3_DROPPED_FRAMES,
+	HMS_STAT_Q3_FRAMES,
+
+	/* Q4 stats */
+	HMS_STAT_Q4_REJECTED_BYTES,
+	HMS_STAT_Q4_REJECTED_FRAMES,
+	HMS_STAT_Q4_DEQUEUE_BYTES,
+	HMS_STAT_Q4_DEQUEUE_FRAMES,
+	HMS_STAT_Q4_DROPPED_BYTES,
+	HMS_STAT_Q4_DROPPED_FRAMES,
+	HMS_STAT_Q4_FRAMES,
+
+	/* Q5 stats */
+	HMS_STAT_Q5_REJECTED_BYTES,
+	HMS_STAT_Q5_REJECTED_FRAMES,
+	HMS_STAT_Q5_DEQUEUE_BYTES,
+	HMS_STAT_Q5_DEQUEUE_FRAMES,
+	HMS_STAT_Q5_DROPPED_BYTES,
+	HMS_STAT_Q5_DROPPED_FRAMES,
+	HMS_STAT_Q5_FRAMES,
+
+	/* Q6 stats */
+	HMS_STAT_Q6_REJECTED_BYTES,
+	HMS_STAT_Q6_REJECTED_FRAMES,
+	HMS_STAT_Q6_DEQUEUE_BYTES,
+	HMS_STAT_Q6_DEQUEUE_FRAMES,
+	HMS_STAT_Q6_DROPPED_BYTES,
+	HMS_STAT_Q6_DROPPED_FRAMES,
+	HMS_STAT_Q6_FRAMES,
+
+	/* Q7 stats */
+	HMS_STAT_Q7_REJECTED_BYTES,
+	HMS_STAT_Q7_REJECTED_FRAMES,
+	HMS_STAT_Q7_DEQUEUE_BYTES,
+	HMS_STAT_Q7_DEQUEUE_FRAMES,
+	HMS_STAT_Q7_DROPPED_BYTES,
+	HMS_STAT_Q7_DROPPED_FRAMES,
+	HMS_STAT_Q7_FRAMES,
+	HMS_STAT_NUM,
+};
+
+static const char hms_stat_name[][ETH_GSTRING_LEN] = {
+	/* RX stats */
+	[HMS_STAT_RX_BYTES] = "in-bytes",
+	[HMS_STAT_RX_VALID_BYTES] = "in-valid-bytes",
+	[HMS_STAT_RX_PAUSE_FRAMES] = "in-pause-frames",
+	[HMS_STAT_RX_VALID_FRAMES] = "in-valid-frames",
+	[HMS_STAT_RX_VLAN_FRAMES] = "in-vlan-frames",
+	[HMS_STAT_RX_UC_FRAMES] = "in-uc-frames",
+	[HMS_STAT_RX_MC_FRAMES] = "in-mc-frames",
+	[HMS_STAT_RX_BC_FRAMES] = "in-bc-frames",
+	[HMS_STAT_RX_FRAMES] = "in-frames",
+	[HMS_STAT_RX_MIN_FRAMES] = "in-min-frames",
+	[HMS_STAT_RX_64_FRAMES] = "in-64-frames",
+	[HMS_STAT_RX_65_127_FRAMES] = "in-65-127-frames",
+	[HMS_STAT_RX_128_255_FRAMES] = "in-128-255-frames",
+	[HMS_STAT_RX_256_511_FRAMES] = "in-256-511-frames",
+	[HMS_STAT_RX_512_1023_FRAMES] = "in-512-1023-frames",
+	[HMS_STAT_RX_1024_1522_FRAMES] = "in-1024-1522-frames",
+	[HMS_STAT_RX_1523_MAX_FRAMES] = "in-1523-max-frames",
+	[HMS_STAT_RX_CONTROL_FRAMES] = "in-control-frames",
+
+	/* TX stats */
+	[HMS_STAT_TX_BYTES] = "out-bytes",
+	[HMS_STAT_TX_VALID_BYTES] = "out-valid-bytes",
+	[HMS_STAT_TX_PAUSE_FRAMES] = "out-pause-frames",
+	[HMS_STAT_TX_VALID_FRAMES] = "out-valid-frames",
+	[HMS_STAT_TX_VLAN_FRAMES] = "out-vlan-frames",
+	[HMS_STAT_TX_UC_FRAMES] = "out-uc-frames",
+	[HMS_STAT_TX_MC_FRAMES] = "out-mc-frames",
+	[HMS_STAT_TX_BC_FRAMES] = "out-bc-frames",
+	[HMS_STAT_TX_FRAMES] = "out-frames",
+	[HMS_STAT_TX_MIN_FRAMES] = "out-min-frames",
+	[HMS_STAT_TX_64_FRAMES] = "out-64-frames",
+	[HMS_STAT_TX_65_127_FRAMES] = "out-65-127-frames",
+	[HMS_STAT_TX_128_255_FRAMES] = "out-128-255-frames",
+	[HMS_STAT_TX_256_511_FRAMES] = "out-256-511-frames",
+	[HMS_STAT_TX_512_1023_FRAMES] = "out-512-1023-frames",
+	[HMS_STAT_TX_1024_1522_FRAMES] = "out-1024-1522-frames",
+	[HMS_STAT_TX_1523_MAX_FRAMES] = "out-1523-max-frames",
+	[HMS_STAT_TX_CONTROL_FRAMES] = "out-control-frames",
+
+	[HMS_STAT_RX_VALID_REASSEMBLED_FRAMES] = "in-valid-reassembled-frames",
+	[HMS_STAT_RX_ADDITIONAL_MPACKETS] = "in-additional-mPackets",
+	[HMS_STAT_RX_ERROR_FRAME_REASSEMBLY] = "in-error-frame-reassembly",
+	[HMS_STAT_RX_ERROR_FRAME_SMD] = "in-error-frame-smd",
+	[HMS_STAT_TX_ADDITIONAL_MPACKETS] = "out-additional-mPackets",
+	[HMS_STAT_TX_HOLD_TRANSITIONS] = "out-hold-transitions",
+
+	/* Error stats */
+	[HMS_STAT_RX_ERROR] = "in-error",
+	[HMS_STAT_RX_ERROR_UNDERSIZE] = "in-error-undersize",
+	[HMS_STAT_RX_ERROR_OVERSIZE] = "in-error-oversize",
+	[HMS_STAT_RX_ERROR_FCS] = "in-error-fcs",
+	[HMS_STAT_RX_ERROR_FRAGMENT] = "in-error-fragment",
+	[HMS_STAT_RX_ERROR_JABBER] = "in-error-jabber",
+	[HMS_STAT_RX_ERROR_DISCARD] = "in-error-discard",
+	[HMS_STAT_RX_ERROR_NO_TRUNCATED] = "in-error-dicard-no-truncated",
+	[HMS_STAT_TX_ERROR_FCS] = "out-error-fcs",
+	[HMS_STAT_TX_ERROR_UNDERSIZE] = "out-error-undersize",
+
+	/* Discard stats */
+	[HMS_STAT_RX_DISCARD_COUNT] = "in-discard-count",
+	[HMS_STAT_RX_DISCARD_REASON0] = "in-discard-reason0",
+	[HMS_STAT_RX_DISCARD_TABLE_ID] = "in-discard-table-id",
+	[HMS_STAT_RX_DISCARD_ENTRY_ID] = "in-discard-entry-id",
+	[HMS_STAT_TX_DISCARD_COUNT] = "out-discard-count",
+	[HMS_STAT_TX_DISCARD_REASON0] = "out-discard-reason0",
+	[HMS_STAT_TX_DISCARD_TABLE_ID] = "out-discard-table-id",
+	[HMS_STAT_TX_DISCARD_ENTRY_ID] = "out-discard-entry-id",
+	[HMS_STAT_BRIDGE_DISCARD_COUNT] = "bridge-discard-count",
+	[HMS_STAT_BRIDGE_DISCARD_REASON0] = "bridge-discard-reason0",
+	[HMS_STAT_BRIDGE_DISCARD_TABLE_ID] = "bridge-discard-table-id",
+	[HMS_STAT_BRIDGE_DISCARD_ENTRY_ID] = "bridge-discard-entry-id",
+
+	/* Q0 stats */
+	[HMS_STAT_Q0_REJECTED_BYTES] = "q0-rejected-bytes",
+	[HMS_STAT_Q0_REJECTED_FRAMES] = "q0-rejected-frames",
+	[HMS_STAT_Q0_DEQUEUE_BYTES] = "q0-dequeue-bytes",
+	[HMS_STAT_Q0_DEQUEUE_FRAMES] = "q0-dequeue-frames",
+	[HMS_STAT_Q0_DROPPED_BYTES] = "q0-dropped-bytes",
+	[HMS_STAT_Q0_DROPPED_FRAMES] = "q0-dropped-frames",
+	[HMS_STAT_Q0_FRAMES] = "q0-frames",
+
+	/* Q1 stats */
+	[HMS_STAT_Q1_REJECTED_BYTES] = "q1-rejected-bytes",
+	[HMS_STAT_Q1_REJECTED_FRAMES] = "q1-rejected-frames",
+	[HMS_STAT_Q1_DEQUEUE_BYTES] = "q1-dequeue-bytes",
+	[HMS_STAT_Q1_DEQUEUE_FRAMES] = "q1-dequeue-frames",
+	[HMS_STAT_Q1_DROPPED_BYTES] = "q1-dropped-bytes",
+	[HMS_STAT_Q1_DROPPED_FRAMES] = "q1-dropped-frames",
+	[HMS_STAT_Q1_FRAMES] = "q1-frames",
+
+	/* Q2 stats */
+	[HMS_STAT_Q2_REJECTED_BYTES] = "q2-rejected-bytes",
+	[HMS_STAT_Q2_REJECTED_FRAMES] = "q2-rejected-frames",
+	[HMS_STAT_Q2_DEQUEUE_BYTES] = "q2-dequeue-bytes",
+	[HMS_STAT_Q2_DEQUEUE_FRAMES] = "q2-dequeue-frames",
+	[HMS_STAT_Q2_DROPPED_BYTES] = "q2-dropped-bytes",
+	[HMS_STAT_Q2_DROPPED_FRAMES] = "q2-dropped-frames",
+	[HMS_STAT_Q2_FRAMES] = "q2-frames",
+
+	/* Q3 stats */
+	[HMS_STAT_Q3_REJECTED_BYTES] = "q3-rejected-bytes",
+	[HMS_STAT_Q3_REJECTED_FRAMES] = "q3-rejected-frames",
+	[HMS_STAT_Q3_DEQUEUE_BYTES] = "q3-dequeue-bytes",
+	[HMS_STAT_Q3_DEQUEUE_FRAMES] = "q3-dequeue-frames",
+	[HMS_STAT_Q3_DROPPED_BYTES] = "q3-dropped-bytes",
+	[HMS_STAT_Q3_DROPPED_FRAMES] = "q3-dropped-frames",
+	[HMS_STAT_Q3_FRAMES] = "q3-frames",
+
+	/* Q4 stats */
+	[HMS_STAT_Q4_REJECTED_BYTES] = "q4-rejected-bytes",
+	[HMS_STAT_Q4_REJECTED_FRAMES] = "q4-rejected-frames",
+	[HMS_STAT_Q4_DEQUEUE_BYTES] = "q4-dequeue-bytes",
+	[HMS_STAT_Q4_DEQUEUE_FRAMES] = "q4-dequeue-frames",
+	[HMS_STAT_Q4_DROPPED_BYTES] = "q4-dropped-bytes",
+	[HMS_STAT_Q4_DROPPED_FRAMES] = "q4-dropped-frames",
+	[HMS_STAT_Q4_FRAMES] = "q4-frames",
+
+	/* Q5 stats */
+	[HMS_STAT_Q5_REJECTED_BYTES] = "q5-rejected-bytes",
+	[HMS_STAT_Q5_REJECTED_FRAMES] = "q5-rejected-frames",
+	[HMS_STAT_Q5_DEQUEUE_BYTES] = "q5-dequeue-bytes",
+	[HMS_STAT_Q5_DEQUEUE_FRAMES] = "q5-dequeue-frames",
+	[HMS_STAT_Q5_DROPPED_BYTES] = "q5-dropped-bytes",
+	[HMS_STAT_Q5_DROPPED_FRAMES] = "q5-dropped-frames",
+	[HMS_STAT_Q5_FRAMES] = "q5-frames",
+
+	/* Q6 stats */
+	[HMS_STAT_Q6_REJECTED_BYTES] = "q6-rejected-bytes",
+	[HMS_STAT_Q6_REJECTED_FRAMES] = "q6-rejected-frames",
+	[HMS_STAT_Q6_DEQUEUE_BYTES] = "q6-dequeue-bytes",
+	[HMS_STAT_Q6_DEQUEUE_FRAMES] = "q6-dequeue-frames",
+	[HMS_STAT_Q6_DROPPED_BYTES] = "q6-dropped-bytes",
+	[HMS_STAT_Q6_DROPPED_FRAMES] = "q6-dropped-frames",
+	[HMS_STAT_Q6_FRAMES] = "q6-frames",
+
+	/* Q7 stats */
+	[HMS_STAT_Q7_REJECTED_BYTES] = "q7-rejected-bytes",
+	[HMS_STAT_Q7_REJECTED_FRAMES] = "q7-rejected-frames",
+	[HMS_STAT_Q7_DEQUEUE_BYTES] = "q7-dequeue-bytes",
+	[HMS_STAT_Q7_DEQUEUE_FRAMES] = "q7-dequeue-frames",
+	[HMS_STAT_Q7_DROPPED_BYTES] = "q7-dropped-bytes",
+	[HMS_STAT_Q7_DROPPED_FRAMES] = "q7-dropped-frames",
+	[HMS_STAT_Q7_FRAMES] = "q7-frames",
+};
+
+void hms_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data)
+{
+	struct hms_private *priv = ds->priv;
+	struct hms_cmd_port_ethtool_stats stats;
+	int rc;
+	enum hms_stat_index i;
+
+	rc = hms_xfer_get_cmd(priv, HMS_CMD_PORT_ETHTOOL_STATS_GET,
+			      port, &stats, sizeof(stats));
+
+	if (rc) {
+		memset(data, 0, sizeof(u64) * HMS_STAT_NUM);
+		dev_err(ds->dev, "Failed to get port %d stats\n", port);
+		return;
+	}
+
+	for (i = 0; i < HMS_STAT_NUM; i++)
+		data[i] = stats.values[i];
+}
+
+void hms_get_strings(struct dsa_switch *ds, int port,
+		     u32 stringset, u8 *data)
+{
+	enum hms_stat_index i;
+	char *p = (char *)data;
+
+	if (stringset != ETH_SS_STATS)
+		return;
+
+	for (i = 0; i < HMS_STAT_NUM; i++) {
+		strscpy(p, hms_stat_name[i], ETH_GSTRING_LEN);
+		p += ETH_GSTRING_LEN;
+	}
+}
+
+int hms_get_sset_count(struct dsa_switch *ds, int port, int sset)
+{
+	if (sset != ETH_SS_STATS)
+		return -EOPNOTSUPP;
+
+	return HMS_STAT_NUM;
+}
diff --git a/drivers/net/dsa/hms/hms_main.c b/drivers/net/dsa/hms/hms_main.c
index b7f7c3a7d3667..cfe0095fcdb32 100644
--- a/drivers/net/dsa/hms/hms_main.c
+++ b/drivers/net/dsa/hms/hms_main.c
@@ -761,6 +761,10 @@ static const struct dsa_switch_ops hms_switch_ops = {
 	.port_vlan_add		= hms_bridge_vlan_add,
 	.port_vlan_del		= hms_bridge_vlan_del,
 
+	.get_strings		= hms_get_strings,
+	.get_ethtool_stats	= hms_get_ethtool_stats,
+	.get_sset_count		= hms_get_sset_count,
+
 	.tag_8021q_vlan_add	= hms_8021q_vlan_add,
 	.tag_8021q_vlan_del	= hms_8021q_vlan_del,
 	.port_prechangeupper	= hms_prechangeupper,
diff --git a/drivers/net/dsa/hms/hms_switch.h b/drivers/net/dsa/hms/hms_switch.h
index 8f9e3035374b1..eee0b822f769d 100644
--- a/drivers/net/dsa/hms/hms_switch.h
+++ b/drivers/net/dsa/hms/hms_switch.h
@@ -64,4 +64,10 @@ int hms_xfer_get_cmd(struct hms_private *priv,
 		     enum hms_cmd cmd, u32 id,
 		     void *resp, size_t resp_len);
 
+/* From hms_ethtool.c */
+void hms_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data);
+void hms_get_strings(struct dsa_switch *ds, int port,
+		     u32 stringset, u8 *data);
+int hms_get_sset_count(struct dsa_switch *ds, int port, int sset);
+
 #endif /* _HMS_SWITCH_H */
-- 
2.43.0


  parent reply	other threads:[~2026-05-09  9:06 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-09  9:06 [PATCH net-next 0/4] net: dsa: Add NXP i.MX RT1180 NETC switch support Minghuan Lian
2026-05-09  9:06 ` [PATCH net-next 1/4] dt-bindings: net: dsa: add NXP i.MX RT1180 NETC switch Minghuan Lian
2026-05-09  9:06 ` [PATCH net-next 2/4] net: dsa: tag_hms: Add HMS tag protocol Minghuan Lian
2026-05-10  9:10   ` sashiko-bot
2026-05-09  9:06 ` [PATCH net-next 3/4] net: dsa: hms: Add NXP i.MX RT1180 NETC switch driver Minghuan Lian
2026-05-10  9:10   ` sashiko-bot
2026-05-09  9:06 ` Minghuan Lian [this message]
2026-05-10  9:10   ` [PATCH net-next 4/4] net: dsa: hms: Add ethtool statistics support sashiko-bot

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=20260509090632.2959553-5-minghuan.lian@nxp.com \
    --to=minghuan.lian@nxp.com \
    --cc=andrew+netdev@lunn.ch \
    --cc=conor+dt@kernel.org \
    --cc=davem@davemloft.net \
    --cc=devicetree@vger.kernel.org \
    --cc=edumazet@google.com \
    --cc=krzk+dt@kernel.org \
    --cc=kuba@kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=olteanv@gmail.com \
    --cc=pabeni@redhat.com \
    --cc=robh@kernel.org \
    /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