[PATCH net-next v2 0/4] net: dsa: qca8k: fix the MIB autocast and management frame handlers

From: Stanislaw Pal

Date: Wed Nov 04 2026 - 17:42:03 EST


The netdev AI review of the MIB statistics series [1] found bugs in
the qca8k handlers of the Ethernet management and MIB autocast frames,
and its review of v1 of this series [2] found two more. None of them
has been seen in production, so as Andrew asked for the related MTU
series [3], this goes to net-next rather than net. All four keep their
Fixes tags.

1. qca8k_bulk_read() falls back to MDIO when the management path is
not available, but stores register i at val_buf + i with val_buf a
void pointer, so every multi-register read is garbage: the FDB dump
and the MDB add/del write the wrong port mask back into the ATU.

2. An ethtool MIB request over Ethernet (autocast) that times out
leaves the caller's buffer published; late frames write into it
after ethtool has freed it, and extra frames underflow the frame
counter. v2 also handles the frames of an earlier autocast arriving
during the next request.

3. The autocast handler reads up to 164 bytes of counters without
checking the frame length.

4. The management ack handler trusts the frame for both the length and
the layout: up to 32 bytes into a 16-byte buffer, read from
skb->data without checking that the frame has them.

Changes in v2:
- Drop "let regmap serialize register access" (v1 1/3): Yongzhao Chen
carries it, unchanged, as 1/2 of his net-next v8 "preserve port state
across MTU changes" [4]; this series does not depend on it.
- New 1/4: the MDIO fallback of qca8k_bulk_read() (review of v1 1/3).
- 2/4: poll MIB_BUSY before the next autocast, as qca8k_mib_init()
does after a flush, and track the ports seen as a bitmap instead of
a countdown (review of v1 2/3). The description now says that a
frame of the previous autocast still queued on the host can serve the
next request, with counters one autocast old, instead of claiming
that every late frame is dropped.
- 3/4 unchanged (v1 3/3).
- New 4/4: bound the data of a management ack frame (review of v1
3/3).
- Target net-next; describe the LLM assistance here and in the commit
messages instead of an Assisted-by tag.

Testing: the affected objects build with W=1 on arm64. On a QCA8337
behind an IPQ5018 (GL.iNet GL-B3000), kernel 6.18.60 with these four
patches, under tag_qca with the management conduit on port 0, counted
on the conduit: one ethtool -S costs 3 management frames up and 10
down (the MIB_BUSY poll, the cast, the 7 autocast frames and acks);
with the request timeout forced to 0 by a test-only module parameter
it costs 50 up and 57 down, i.e. the register fallback over management
frames plus the 7 late autocast frames, which the handler drops. The
counters stayed monotonic over 2000 such reads and over 5x200 reads
under iperf3 in both directions while toggling the timeout, with no
memory growth and no splat. Under a tagger without management frames
(qca-8021q, OpenWrt) the MDIO fallback of 1/4 was checked by the FDB
dump.

LLM assistance: Claude Code (Claude Opus 5.5 for v1, Claude Fable 5.1
for v2) drafted the code and the descriptions from my analysis and the
review findings, and helped work out the race in 2/4. I reviewed every
line, built the series and ran the tests above. The review findings
themselves came from Sashiko, the netdev AI review bot.

[1] https://lore.kernel.org/netdev/20261019191137.307514-1-kuncy7@xxxxxxxxx/
[2] https://lore.kernel.org/netdev/179304303832.3134.328719975361344250@xxxxxxxxxx/
[3] https://lore.kernel.org/netdev/47e9713f-815e-4caf-8928-a7ec12d0087b@xxxxxxx/
[4] https://lore.kernel.org/netdev/20261104120130.48455-1-yongzhao.derek@xxxxxxxxx/

v1: https://lore.kernel.org/netdev/20261022192933.384898-1-kuncy7@xxxxxxxxx/

Stanislaw Pal (4):
net: dsa: qca8k: read each register into its own word over MDIO
net: dsa: qca8k: drop MIB autocast frames once the request is over
net: dsa: qca8k: check the length of MIB autocast frames
net: dsa: qca8k: bound the data of a management ack frame

drivers/net/dsa/qca/qca8k-8xxx.c | 81 ++++++++++++++++++++++++++----
drivers/net/dsa/qca/qca8k-common.c | 2 +-
drivers/net/dsa/qca/qca8k.h | 9 ++--
3 files changed, 77 insertions(+), 15 deletions(-)

--
2.43.0