* [PATCH net-next v2 0/3] net: dsa: motorcomm: MIB fixup
@ 2026-11-08 18:29 David Yang
2026-11-08 18:29 ` [PATCH net-next v2 1/3] net: dsa: motorcomm: Fix stats64 error counter mapping David Yang
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: David Yang @ 2026-11-08 18:29 UTC (permalink / raw)
To: netdev
Cc: David Yang, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-kernel
Various MIB defects, reported and verified against vendor doc by LLM.
Very low severity, target them to net-next.
v2:
- fix issues reported by sashiko
- drop patch 4
v1: https://lore.kernel.org/r/20261107132040.1066996-1-mmyangfl@gmail.com
David Yang (3):
net: dsa: motorcomm: Fix stats64 error counter mapping
net: dsa: motorcomm: Fix RMON fragments stat
net: dsa: motorcomm: Use safe 64-bit counter reader
drivers/net/dsa/motorcomm/mib.c | 43 +++++++++++++++++----------------
drivers/net/dsa/motorcomm/smi.c | 35 +++++++++++++++++++++++++++
drivers/net/dsa/motorcomm/smi.h | 2 ++
3 files changed, 59 insertions(+), 21 deletions(-)
--
2.53.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH net-next v2 1/3] net: dsa: motorcomm: Fix stats64 error counter mapping
2026-11-08 18:29 [PATCH net-next v2 0/3] net: dsa: motorcomm: MIB fixup David Yang
@ 2026-11-08 18:29 ` David Yang
2026-11-08 18:29 ` [PATCH net-next v2 2/3] net: dsa: motorcomm: Fix RMON fragments stat David Yang
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: David Yang @ 2026-11-08 18:29 UTC (permalink / raw)
To: netdev
Cc: David Yang, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-kernel
rtnl_link_stats64 wants aFrameTooLongErrors in rx_length_errors, and the
eth-mac stats already report the oversize counter there as
FrameTooLongErrors; move it from rx_over_errors, which is a RX FIFO
overflow counter.
Drop the tx_undersize to tx_fifo_errors mapping as well; a runt frame is
not a FIFO underrun. Report it as a TxUndersize ethtool stat instead; it
remains in tx_errors as an error not otherwise counted.
Fixes: 186623f4aa72 ("net: dsa: yt921x: Add support for Motorcomm YT921x")
Signed-off-by: David Yang <mmyangfl@gmail.com>
---
drivers/net/dsa/motorcomm/mib.c | 20 ++++++++++++--------
1 file changed, 12 insertions(+), 8 deletions(-)
diff --git a/drivers/net/dsa/motorcomm/mib.c b/drivers/net/dsa/motorcomm/mib.c
index 6b170fc6e187..b8fe2c407c32 100644
--- a/drivers/net/dsa/motorcomm/mib.c
+++ b/drivers/net/dsa/motorcomm/mib.c
@@ -50,7 +50,7 @@ static const struct yt921x_mib_desc yt921x_mib_descs[] = {
MIB_DESC(1, YT921X_MIB_DATA_TX_PAUSE, NULL),
MIB_DESC(1, YT921X_MIB_DATA_TX_MULTICAST, NULL),
- MIB_DESC(1, YT921X_MIB_DATA_TX_UNDERSIZE_ERR, NULL),
+ MIB_DESC(1, YT921X_MIB_DATA_TX_UNDERSIZE_ERR, "TxUndersize"),
MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_64, NULL),
MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_65_TO_127, NULL),
MIB_DESC(1, YT921X_MIB_DATA_TX_PKT_SZ_128_TO_255, NULL),
@@ -366,6 +366,7 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int port,
struct yt921x_port *pp = &priv->ports[port];
struct yt921x_mib *pm = pp->mib;
struct yt921x_mib_stats *mib;
+ u64 tx_undersize_errors;
unsigned int start;
if (!pm)
@@ -376,8 +377,9 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int port,
start = u64_stats_fetch_begin(&pm->syncp);
stats->rx_length_errors = u64_stats_read(&mib->rx_undersize_errors) +
- u64_stats_read(&mib->rx_fragment_errors);
- stats->rx_over_errors = u64_stats_read(&mib->rx_oversize_errors);
+ u64_stats_read(&mib->rx_fragment_errors) +
+ u64_stats_read(&mib->rx_oversize_errors);
+ /* stats->rx_over_errors */
stats->rx_crc_errors = u64_stats_read(&mib->rx_crc_errors);
stats->rx_frame_errors = u64_stats_read(&mib->rx_alignment_errors);
/* stats->rx_fifo_errors */
@@ -385,7 +387,7 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int port,
stats->tx_aborted_errors = u64_stats_read(&mib->tx_aborted_errors);
/* stats->tx_carrier_errors */
- stats->tx_fifo_errors = u64_stats_read(&mib->tx_undersize_errors);
+ /* stats->tx_fifo_errors */
/* stats->tx_heartbeat_errors */
stats->tx_window_errors = u64_stats_read(&mib->tx_late_collisions);
@@ -399,12 +401,14 @@ yt921x_dsa_get_stats64(struct dsa_switch *ds, int port,
/* stats->tx_dropped */
stats->multicast = u64_stats_read(&mib->rx_multicast);
stats->collisions = u64_stats_read(&mib->tx_collisions);
+
+ tx_undersize_errors = u64_stats_read(&mib->tx_undersize_errors);
} while (u64_stats_fetch_retry(&pm->syncp, start));
- stats->rx_errors = stats->rx_length_errors + stats->rx_over_errors +
- stats->rx_crc_errors + stats->rx_frame_errors;
- stats->tx_errors = stats->tx_aborted_errors + stats->tx_fifo_errors +
- stats->tx_window_errors;
+ stats->rx_errors = stats->rx_length_errors + stats->rx_crc_errors +
+ stats->rx_frame_errors;
+ stats->tx_errors = stats->tx_aborted_errors + stats->tx_window_errors +
+ tx_undersize_errors;
}
void
--
2.53.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH net-next v2 2/3] net: dsa: motorcomm: Fix RMON fragments stat
2026-11-08 18:29 [PATCH net-next v2 0/3] net: dsa: motorcomm: MIB fixup David Yang
2026-11-08 18:29 ` [PATCH net-next v2 1/3] net: dsa: motorcomm: Fix stats64 error counter mapping David Yang
@ 2026-11-08 18:29 ` David Yang
2026-11-08 18:29 ` [PATCH net-next v2 3/3] net: dsa: motorcomm: Use safe 64-bit counter reader David Yang
2026-11-08 18:36 ` [PATCH net-next v2 0/3] net: dsa: motorcomm: MIB fixup netdev-bot+sinfo
3 siblings, 0 replies; 5+ messages in thread
From: David Yang @ 2026-11-08 18:29 UTC (permalink / raw)
To: netdev
Cc: David Yang, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-kernel
etherStatsFragments counts frames with a bad FCS due to fragmentation;
report the dedicated RX fragment error counter instead of the alignment
error one, which is already exported as AlignmentErrors and
rx_frame_errors.
Fixes: 186623f4aa72 ("net: dsa: yt921x: Add support for Motorcomm YT921x")
Signed-off-by: David Yang <mmyangfl@gmail.com>
---
drivers/net/dsa/motorcomm/mib.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/dsa/motorcomm/mib.c b/drivers/net/dsa/motorcomm/mib.c
index b8fe2c407c32..e9f28d446251 100644
--- a/drivers/net/dsa/motorcomm/mib.c
+++ b/drivers/net/dsa/motorcomm/mib.c
@@ -336,7 +336,7 @@ yt921x_dsa_get_rmon_stats(struct dsa_switch *ds, int port,
rmon_stats->undersize_pkts = u64_stats_read(&mib->rx_undersize_errors);
rmon_stats->oversize_pkts = u64_stats_read(&mib->rx_oversize_errors);
- rmon_stats->fragments = u64_stats_read(&mib->rx_alignment_errors);
+ rmon_stats->fragments = u64_stats_read(&mib->rx_fragment_errors);
/* rmon_stats->jabbers */
rmon_stats->hist[0] = u64_stats_read(&mib->rx_64byte);
--
2.53.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH net-next v2 3/3] net: dsa: motorcomm: Use safe 64-bit counter reader
2026-11-08 18:29 [PATCH net-next v2 0/3] net: dsa: motorcomm: MIB fixup David Yang
2026-11-08 18:29 ` [PATCH net-next v2 1/3] net: dsa: motorcomm: Fix stats64 error counter mapping David Yang
2026-11-08 18:29 ` [PATCH net-next v2 2/3] net: dsa: motorcomm: Fix RMON fragments stat David Yang
@ 2026-11-08 18:29 ` David Yang
2026-11-08 18:36 ` [PATCH net-next v2 0/3] net: dsa: motorcomm: MIB fixup netdev-bot+sinfo
3 siblings, 0 replies; 5+ messages in thread
From: David Yang @ 2026-11-08 18:29 UTC (permalink / raw)
To: netdev
Cc: David Yang, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-kernel
64-bit counter registers are read as two separate 32-bit transactions.
If the low word wraps from about 0xffffffff to a small value while the
high word increments between the two transactions, the recombined value
becomes ((new_high << 32) | old_low), producing a spurious ~4 GiB jump.
Use a safe counter reader for this.
Fixes: 186623f4aa72 ("net: dsa: yt921x: Add support for Motorcomm YT921x")
Signed-off-by: David Yang <mmyangfl@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
---
drivers/net/dsa/motorcomm/mib.c | 21 +++++++++-----------
drivers/net/dsa/motorcomm/smi.c | 35 +++++++++++++++++++++++++++++++++
drivers/net/dsa/motorcomm/smi.h | 2 ++
3 files changed, 46 insertions(+), 12 deletions(-)
diff --git a/drivers/net/dsa/motorcomm/mib.c b/drivers/net/dsa/motorcomm/mib.c
index e9f28d446251..6df31753cbbc 100644
--- a/drivers/net/dsa/motorcomm/mib.c
+++ b/drivers/net/dsa/motorcomm/mib.c
@@ -102,29 +102,26 @@ static int yt921x_mib_read(struct yt921x_priv *priv, int port)
for (size_t i = 0; i < ARRAY_SIZE(yt921x_mib_descs); i++) {
const struct yt921x_mib_desc *desc = &yt921x_mib_descs[i];
u32 reg = YT921X_MIBn_DATA0(port) + desc->offset;
- u32 val0;
- u64 val;
-
- res = yt921x_reg_read(priv, reg, &val0);
- if (res)
- break;
if (desc->size <= 1) {
u64 old_val = buf[i];
+ u32 val0;
+ u64 val;
+
+ res = yt921x_reg_read(priv, reg, &val0);
+ if (res)
+ break;
val = (old_val & ~(u64)U32_MAX) | val0;
if (val < old_val)
val += 1ull << 32;
- } else {
- u32 val1;
- res = yt921x_reg_read(priv, reg + 4, &val1);
+ buf[i] = val;
+ } else {
+ res = yt921x_counter_read(priv, reg, &buf[i]);
if (res)
break;
- val = ((u64)val1 << 32) | val0;
}
-
- buf[i] = val;
}
flags = u64_stats_update_begin_irqsave(&pm->syncp);
diff --git a/drivers/net/dsa/motorcomm/smi.c b/drivers/net/dsa/motorcomm/smi.c
index bf3adfd64165..dff576271446 100644
--- a/drivers/net/dsa/motorcomm/smi.c
+++ b/drivers/net/dsa/motorcomm/smi.c
@@ -63,6 +63,41 @@ int yt921x_reg_update_bits(struct yt921x_priv *priv, u32 reg, u32 mask, u32 val)
return yt921x_reg_write(priv, reg, u);
}
+/* Reliably read a 64-bit counter, assuming the counter isn't that "fast" */
+int yt921x_counter_read(struct yt921x_priv *priv, u32 reg, u64 *valp)
+{
+ u32 old_lo;
+ int res;
+ u32 hi;
+ u32 lo;
+
+ res = yt921x_reg_read(priv, reg, &old_lo);
+ if (res)
+ return res;
+
+ res = yt921x_reg_read(priv, reg + 4, &hi);
+ if (res)
+ return res;
+
+ res = yt921x_reg_read(priv, reg, &lo);
+ if (res)
+ return res;
+
+ if (lo < old_lo) {
+ u32 new_hi;
+
+ res = yt921x_reg_read(priv, reg + 4, &new_hi);
+ if (res)
+ return res;
+ if (new_hi != hi && new_hi != hi + 1)
+ return -EIO;
+ hi = new_hi;
+ }
+
+ *valp = ((u64)hi << 32) | lo;
+ return 0;
+}
+
static int
yt921x_regs_read(struct yt921x_priv *priv, u32 reg, u32 *vals,
unsigned int num_regs)
diff --git a/drivers/net/dsa/motorcomm/smi.h b/drivers/net/dsa/motorcomm/smi.h
index 212e20f71d80..d34240548af7 100644
--- a/drivers/net/dsa/motorcomm/smi.h
+++ b/drivers/net/dsa/motorcomm/smi.h
@@ -35,6 +35,8 @@ yt921x_reg_toggle_bits(struct yt921x_priv *priv, u32 reg, u32 mask, bool set)
return yt921x_reg_update_bits(priv, reg, mask, !set ? 0 : mask);
}
+int yt921x_counter_read(struct yt921x_priv *priv, u32 reg, u64 *valp);
+
/* Some multi-word registers, like VLANn_CTRL, should be treated as a single
* long register. More specifically, writes to parts of its words won't become
* visible, until the last word is written.
--
2.53.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH net-next v2 0/3] net: dsa: motorcomm: MIB fixup
2026-11-08 18:29 [PATCH net-next v2 0/3] net: dsa: motorcomm: MIB fixup David Yang
` (2 preceding siblings ...)
2026-11-08 18:29 ` [PATCH net-next v2 3/3] net: dsa: motorcomm: Use safe 64-bit counter reader David Yang
@ 2026-11-08 18:36 ` netdev-bot+sinfo
3 siblings, 0 replies; 5+ messages in thread
From: netdev-bot+sinfo @ 2026-11-08 18:36 UTC (permalink / raw)
To: David Yang
Cc: netdev, Andrew Lunn, Vladimir Oltean, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, linux-kernel
Hi!
This is an automated message. This series looks like a fix, but its
commit messages seem to be missing some information:
- Whether the issue was actually triggered, or is only theoretical
(e.g. found by code inspection). If it was triggered please include
the symptoms, like the stack trace or error messages.
Please do not repost the series just to address the above. Instead,
reply to this email with the missing information, so that reviewers
can take it into account. If the series needs another revision for
other reasons, please include the information in the commit messages
then.
The evaluation is done by an LLM so it may be wrong, if you think
that is the case please reply and explain.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2026-11-08 18:36 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-11-08 18:29 [PATCH net-next v2 0/3] net: dsa: motorcomm: MIB fixup David Yang
2026-11-08 18:29 ` [PATCH net-next v2 1/3] net: dsa: motorcomm: Fix stats64 error counter mapping David Yang
2026-11-08 18:29 ` [PATCH net-next v2 2/3] net: dsa: motorcomm: Fix RMON fragments stat David Yang
2026-11-08 18:29 ` [PATCH net-next v2 3/3] net: dsa: motorcomm: Use safe 64-bit counter reader David Yang
2026-11-08 18:36 ` [PATCH net-next v2 0/3] net: dsa: motorcomm: MIB fixup netdev-bot+sinfo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®