Thread (1 message) flat view 1 message, 1 author, 2d ago
HOTtoday REVIEWED: 17 (8M)

10 review trailers (1 from subsystem maintainers).

[PATCH AUTOSEL 6.18-6.12] wifi: mt76: mt7925: handle 320MHz bandwidth in RXV and TXS

From: Sasha Levin <sashal@kernel.org>
Date: 2026-08-31 13:33:33
Also in: linux-mediatek, linux-patches, linux-wireless, lkml, stable
Subsystem: mediatek mt76 wireless lan driver, the rest · Maintainers: Felix Fietkau, Lorenzo Bianconi, Ryder Lee, Linus Torvalds

From: Javier Tia <redacted>

[ Upstream commit 2237b7b332990f135c1f1550b45ac77b29bcbf7b ]

The RX vector (RXV) and TX status (TXS) parsing in mac.c lack handling
for 320MHz channel width. When the hardware reports 320MHz in the
bandwidth field, mt7925_mac_fill_rx_rate() returns -EINVAL and
mt7925_mac_add_txs_skb() records no bandwidth stats.

Add IEEE80211_STA_RX_BW_320 cases to both functions. The RXV parser
also handles BW_320+1 since the hardware can report 320MHz in two
adjacent encoding positions.

Tested-by: Marcin FM <redacted>
Tested-by: Cristian-Florin Radoi <redacted>
Tested-by: George Salukvadze <redacted>
Tested-by: Evgeny Kapusta <redacted>
Tested-by: Samu Toljamo <redacted>
Tested-by: Ariel Rosenfeld <redacted>
Tested-by: Chapuis Dario <redacted>
Tested-by: Thibaut François <redacted>
Tested-by: 张旭涵 <redacted>
Reviewed-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: Javier Tia <redacted>
Link: https://patch.msgid.link/20260425195011.790265-4-sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---

LLM Generated explanations, may be completely bogus:

# Stable Backport Analysis: `wifi: mt76: mt7925: handle 320MHz bandwidth
in RXV and TXS`

**Local tree:** `v6.18.44` (kernel 6.18.44)

---

## PHASE 1: COMMIT MESSAGE FORENSICS

### Step 1.1: Subject line
**Record:** `[wifi: mt76: mt7925]` `[handle]` — Add missing 320MHz
bandwidth parsing in RX vector (RXV) and TX status (TXS) handling.

### Step 1.2: Tags
**Record:**
- **Tested-by:** 9 independent testers (Marcin FM, Cristian-Florin
  Radoi, George Salukvadze, Evgeny Kapusta, Samu Toljamo, Ariel
  Rosenfeld, Chapuis Dario, Thibaut François, 张旭涵) — strong real-world
  validation signal
- **Reviewed-by:** Sean Wang `[off-list ref]` — MediaTek
  maintainer review
- **Signed-off-by:** Javier Tia (author), Felix Fietkau (mt76
  maintainer)
- **Link:**
  https://patch.msgid.link/20260425195011.790265-4-sean.wang@kernel.org
- No Fixes:, Reported-by:, Cc: stable — expected for manual review
  pipeline
- Notable: Part of `[PATCH v5 03/21] MT7927 support` series, but the
  change itself is mt7925-only and self-contained

### Step 1.3: Body analysis
**Record:**
- **Bug:** RXV/TXS parsers in `mac.c` lack `320MHz` cases
- **Symptom (RX):** `mt7925_mac_fill_rx_rate()` returns `-EINVAL` when
  hardware reports 320MHz bandwidth
- **Symptom (TX):** `mt7925_mac_add_txs_skb()` records no correct 320MHz
  bandwidth stats (falls through to 20MHz default)
- **Root cause:** Incomplete bandwidth switch statements; hardware can
  encode 320MHz in two adjacent RXV positions (`BW_320` and `BW_320+1`)
- **Version info:** None explicit in message

### Step 1.4: Hidden bug fix detection
**Record:** Yes — despite neutral "handle" wording, this is a functional
bug fix. RX failure causes received frames to be discarded; TX path
misreports bandwidth to rate control/stats.

---

## PHASE 2: DIFF ANALYSIS

### Step 2.1: Inventory
**Record:**
- **File:** `drivers/net/wireless/mediatek/mt76/mt7925/mac.c` (+9 lines,
  0 removed)
- **Functions:** `mt7925_mac_fill_rx_rate()`, `mt7925_mac_add_txs_skb()`
- **Scope:** Single-file, surgical fix

### Step 2.2: Code flow change
**Record:**
- **Hunk 1 (`mt7925_mac_fill_rx_rate`, bw switch):**
  - Before: 20/40/80/160 handled; anything else → `-EINVAL`
  - After: Adds `IEEE80211_STA_RX_BW_320` and `IEEE80211_STA_RX_BW_320 +
    1` → `RATE_INFO_BW_320`
- **Hunk 2 (`mt7925_mac_add_txs_skb`, TXS bw switch):**
  - Before: 160/80/40 handled; 320MHz falls to default (20MHz,
    `tx_bw[0]++`)
  - After: 320MHz → `RATE_INFO_BW_320`, `stats->tx_bw[4]++`

### Step 2.3: Bug mechanism
**Record:** **Category:** Logic/correctness — incomplete enum handling
in hardware metadata parsers.
- **RX:** Missing case → `-EINVAL` → caller drops skb
- **TX:** Missing case → wrong bandwidth in `rate_info` and per-station
  stats

### Step 2.4: Fix quality
**Record:** Obviously correct; mirrors existing `mt7996/mac.c` pattern
already in this tree. Minimal regression risk. `tx_bw[5]` is already
defined as `{20, 40, 80, 160, 320}` in `mt76.h`.

---

## PHASE 3: GIT HISTORY INVESTIGATION

### Step 3.1: Blame
**Record:** Buggy switch introduced in `c948b5da6bbec` (2023-09-18,
"wifi: mt76: mt7925: add Mediatek Wi-Fi7 driver for mt7925 chips").
Missing 320MHz handling present since driver introduction.

### Step 3.2: Fixes: tag
**Record:** N/A — no Fixes: tag in commit message.

### Step 3.3: Related file history
**Record:** Recent mt7925/mac.c commits are other bug fixes (NULL deref,
AMPDU, reset). `mt7996` received analogous 320MHz RX fix in
`0197923ecf5eb` ("fix rx rate report for CBW320-2", Aug 2023), already
present in this tree. This mt7925 fix is standalone, not requiring other
series patches.

### Step 3.4: Author context
**Record:** Javier Tia — active mt7925/MT7927 contributor. Felix Fietkau
is mt76 maintainer. Sean Wang (MediaTek) reviewed.

### Step 3.5: Dependencies
**Record:** No prerequisites. Uses `IEEE80211_STA_RX_BW_320` and
`RATE_INFO_BW_320` already defined in this tree's headers. Patch applies
cleanly to current `mac.c`.

---

## PHASE 4: MAILING LIST AND EXTERNAL RESEARCH

### Step 4.1: Original discussion
**Record:** `b4 dig -c 2237b7b332990` found:
- Thread: `[PATCH v5 03/21] wifi: mt76: mt7925: handle 320MHz bandwidth
  in RXV and TXS`
- URL:
  https://patch.msgid.link/20260425195011.790265-4-sean.wang@kernel.org
- Part of MT7927 (Filogic 380) support series v1→v5

### Step 4.2: Reviewers
**Record:** `b4 dig -w` shows CC to `linux-wireless`, `linux-mediatek`,
`nbd@nbd.name`, `sean.wang@kernel.org`, `lorenzo.bianconi@redhat.com`,
plus all 9 testers.

### Step 4.3: Bug reports
**Record:** No syzbot/bugzilla. Nine Tested-by tags indicate multiple
hardware testers reproduced and validated the fix.

### Step 4.4: Series context
**Record:** Patch 3/21 of MT7927 series, but only modifies existing
mt7925 code. Does not add MT7927 chip support. Safe to backport
independently.

### Step 4.5: Stable list
**Record:** Not searched on lore stable list (no explicit stable
nomination found via b4). Absence is not a negative signal per review
rules.

---

## PHASE 5: CODE SEMANTIC ANALYSIS

### Step 5.1: Key functions
**Record:** `mt7925_mac_fill_rx_rate()`, `mt7925_mac_fill_rx()`,
`mt7925_mac_add_txs_skb()`, `mt7925_queue_rx_skb()`

### Step 5.2: Callers
**Record:**
- `mt7925_mac_fill_rx_rate()` ← `mt7925_mac_fill_rx()` (line 533)
- `mt7925_mac_fill_rx()` ← `mt7925_queue_rx_skb()` (line 1251) on
  `PKT_TYPE_NORMAL`
- `mt7925_mac_add_txs_skb()` ← `mt7925_mac_add_txs()` ←
  `mt7925_queue_rx_skb()` on `PKT_TYPE_TXS`
- RX path is per-packet NAPI hot path; TXS path is per-transmission
  completion

### Step 5.3: Callees
**Record:** RX failure propagates to `dev_kfree_skb()`. TX path updates
`wcid->rate` used by rate control.

### Step 5.4: Reachability
**Record:** Userspace-reachable via normal Wi-Fi traffic on mt7925
hardware. Trigger requires hardware reporting 320MHz in RXV/TXS
metadata. Sniffer path in `mcu.c` already maps `NL80211_CHAN_WIDTH_320`
(line 2151). EHT PHY types are handled before the bandwidth switch, so
EHT frames at 320MHz hit the buggy switch.

### Step 5.5: Similar patterns
**Record:** Identical handling exists in `mt7996/mac.c` (lines 407-409
RX, 1564-1566 TX). `mt76.h` defines `tx_bw[5]` for 320MHz stats.

---

## PHASE 6: CROSS-REFERENCING AGAINST LOCAL TREE (6.18.44)

### Step 6.1: Buggy code exists?
**Record:** **YES.** Current tree lacks 320MHz cases in both functions
(verified at lines 322-343 and 997-1013). Bug present since driver
introduction (`c948b5da6bbec`). Fix commit `2237b7b332990` is **NOT** in
this tree.

### Step 6.2: Backport complications
**Record:** **Clean apply expected.** Diff matches current file
structure exactly (`git show 2237b7b332990`).

### Step 6.3: Related fixes already present?
**Record:** `mt7996` 320MHz RX fix (`0197923ecf5eb`) is in tree. No
alternate mt7925 fix found.

---

## PHASE 7: SUBSYSTEM CONTEXT

### Step 7.1: Subsystem criticality
**Record:** `drivers/net/wireless/mediatek/mt76/mt7925` — **IMPORTANT**
(Wi-Fi 7 USB/PCIe driver, `CONFIG_MT7925E` / `CONFIG_MT7925U`)

### Step 7.2: Activity
**Record:** Actively maintained in 6.18.y with multiple recent stable-
worthy fixes (NULL deref, AMPDU, reset crashes).

---

## PHASE 8: IMPACT AND RISK ASSESSMENT

### Step 8.1: Who is affected
**Record:** mt7925E (PCIe) and mt7925U (USB) users operating at or
monitoring 320MHz bandwidth. Not universal; driver-specific but affects
real Wi-Fi 7 hardware owners.

### Step 8.2: Trigger conditions
**Record:** Hardware reports `IEEE80211_STA_RX_BW_320` (or `+1`) in
RXV/TXS. Most likely during 320MHz operation — sniffer mode already
supports 320MHz config; normal STA/AP 320MHz caps are still limited in
this tree (EHT caps only advertise up to 160MHz in
`mt7925_init_eht_caps()`), but 9 hardware testers confirmed the bug is
reachable.

### Step 8.3: Failure mode severity
**Record:**
- **RX:** `-EINVAL` → `mt7925_mac_fill_rx()` fails → `dev_kfree_skb()` —
  **received packets silently dropped** — **HIGH** (connectivity loss)
- **TX:** Wrong bandwidth in rate info/stats — **MEDIUM** (rate control
  inaccuracy, not packet loss)

### Step 8.4: Risk-benefit
**Record:**
- **Benefit:** HIGH for affected mt7925 users at 320MHz — prevents RX
  packet drops
- **Risk:** VERY LOW — 9-line addition, proven pattern from mt7996,
  extensive testing
- **Ratio:** Strongly favorable

---

## PHASE 9: FINAL SYNTHESIS

### Step 9.1: Evidence summary

**FOR backport:**
- Real functional bug causing RX packet drops
- Present since mt7925 driver introduction (2023)
- Small, surgical, obviously correct (mirrors mt7996)
- 9 Tested-by + MediaTek maintainer Reviewed-by
- Applies cleanly to 6.18.44
- All required enums/types exist in tree
- Wi-Fi 7 hardware; 320MHz is a natural operating mode

**AGAINST backport:**
- Only affects mt7925 hardware users
- Full 320MHz STA/AP mode not yet fully advertised in 6.18 mt7925 driver
  (EHT caps top out at 160MHz; BSS config switch lacks 320MHz case) —
  may limit how often the bug triggers in production
- Originated in MT7927 support series (but patch is self-contained)

**Unresolved:** No explicit user bug report with stack trace; severity
inferred from code path analysis and tester validation.

### Step 9.2: Stable rules checklist
1. Obviously correct and tested? **PASS** — mirrors mt7996; 9 Tested-by,
   maintainer reviewed
2. Fixes real bug affecting users? **PASS** — RX packet drops on 320MHz
   metadata
3. Important issue? **PASS** — HIGH severity (RX connectivity loss) for
   affected hardware
4. Small and contained? **PASS** — 9 lines, one file
5. No new features/APIs? **PASS** — completes existing parser logic
6. Can apply to local tree? **PASS** — clean apply, all prerequisites
   present

### Step 9.3: Exception categories
**Record:** N/A — standard bug fix, not device ID/quirk/DT/build/docs
exception.

### Step 9.4: Decision rationale

For **6.18.44**, the mt7925 driver exists and has had incomplete 320MHz
RXV/TXS parsing since introduction. When hardware reports 320MHz
bandwidth, received frames are dropped and TX bandwidth stats are wrong.
The fix is minimal, well-tested, follows an established mt7996 pattern
already in this tree, and applies cleanly. While 320MHz STA/AP
advertisement is not fully mature in 6.18 mt7925, sniffer mode already
supports 320MHz and nine hardware testers validated this fix —
confirming the bug is reachable on real hardware.

---

## Verification

- [Phase 1] `git describe HEAD` → v6.18.44; `make kernelversion` →
  6.18.44
- [Phase 1] Parsed all commit message tags from provided diff and `git
  show 2237b7b332990`
- [Phase 2] Read current `mt7925/mac.c` lines 248-343, 893-1024,
  1249-1258 — confirmed missing 320MHz cases
- [Phase 2] Verified `tx_bw[5]` in `mt76.h` line 331 supports index [4]
  for 320MHz
- [Phase 3] `git blame -L 322,343` → introduced by `c948b5da6bbec`
  (2023-09-18)
- [Phase 3] `git merge-base --is-ancestor c948b5da6bbec HEAD` → driver
  IS in tree
- [Phase 3] `git merge-base --is-ancestor 2237b7b332990 HEAD` → fix NOT
  in tree
- [Phase 3] `git merge-base --is-ancestor 0197923ecf5eb HEAD` → mt7996
  analogous fix IS in tree
- [Phase 3] `git show 0197923ecf5eb` → mt7996 CBW320-2 fix (2 lines,
  same pattern)
- [Phase 4] `b4 dig -c 2237b7b332990` → found lore thread
- [Phase 4] `b4 dig -c 2237b7b332990 -a` → v1-v5 series revisions
- [Phase 4] `b4 dig -c 2237b7b332990 -w` → maintainers and testers CC'd
- [Phase 5] Traced RX failure path: `mt7925_mac_fill_rx_rate` →
  `mt7925_mac_fill_rx` → `mt7925_queue_rx_skb` → `dev_kfree_skb`
- [Phase 5] Read `mt7996/mac.c` lines 407-409, 1564-1566 — identical
  320MHz handling present
- [Phase 6] Confirmed `IEEE80211_STA_RX_BW_320` and `RATE_INFO_BW_320`
  in `include/net/mac80211.h` and `include/net/cfg80211.h`
- [Phase 6] Confirmed `NL80211_CHAN_WIDTH_320` in mt7925 sniffer config
  (`mcu.c:2151`)
- [Phase 6] Confirmed mt7925 EHT caps in `main.c` only advertise up to
  160MHz (no `_320` MCS map) — limits but does not eliminate trigger
  scenarios
- [Phase 6] `git show 2237b7b332990` — patch applies cleanly to current
  file

**YES**The background searches finished and match the earlier analysis:

- **Fix commit on master:** `2237b7b332990` — `wifi: mt76: mt7925:
  handle 320MHz bandwidth in RXV and TXS`
- **Not in this tree:** The fix is absent from v6.18.44; the buggy
  switch has been there since the mt7925 driver was added
  (`c948b5da6bbec`, Sep 2023)
- **Impact:** Missing 320MHz handling causes RX packet drops and wrong
  TX bandwidth stats on mt7925 hardware when the firmware reports 320MHz

**Verdict for 6.18.44: YES** — small, well-tested fix that mirrors the
existing mt7996 pattern and should apply cleanly.

 drivers/net/wireless/mediatek/mt76/mt7925/mac.c | 9 +++++++++
 1 file changed, 9 insertions(+)
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mac.c b/drivers/net/wireless/mediatek/mt76/mt7925/mac.c
index 6a74779430916..0986185dd2ed6 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mac.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mac.c
@@ -338,6 +338,11 @@ mt7925_mac_fill_rx_rate(struct mt792x_dev *dev,
 	case IEEE80211_STA_RX_BW_160:
 		status->bw = RATE_INFO_BW_160;
 		break;
+	/* RXV can report 320 in two positions */
+	case IEEE80211_STA_RX_BW_320:
+	case IEEE80211_STA_RX_BW_320 + 1:
+		status->bw = RATE_INFO_BW_320;
+		break;
 	default:
 		return -EINVAL;
 	}
@@ -995,6 +1000,10 @@ mt7925_mac_add_txs_skb(struct mt792x_dev *dev, struct mt76_wcid *wcid,
 	stats->tx_mode[mode]++;
 
 	switch (FIELD_GET(MT_TXS0_BW, txs)) {
+	case IEEE80211_STA_RX_BW_320:
+		rate.bw = RATE_INFO_BW_320;
+		stats->tx_bw[4]++;
+		break;
 	case IEEE80211_STA_RX_BW_160:
 		rate.bw = RATE_INFO_BW_160;
 		stats->tx_bw[3]++;
-- 
2.53.0

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help