[Bug 297064] em(4) 82541PI silent TX/RX wedge
[email protected] Sun, 26 Jul 2026 10:33:54 +0000
| Newsgroups | gmane.os.freebsd.bugs |
|---|---|
| Message-ID | <[email protected]/bugzilla/> |
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=297064
Bug ID: 297064
Summary: em(4) 82541PI silent TX/RX wedge
Product: Base System
Version: Unspecified
Hardware: amd64
OS: Any
Status: New
Severity: Affects Only Me
Priority: ---
Component: kern
Assignee: [email protected]
Reporter: [email protected]
This is an issue since 2017, see bug #220997.
Diagnosis behind the attached patch.
**Hardware.** em(4) 82541PI (a 32-bit PCI adapter) as the WAN NIC on an AMD
RS780 northbridge + SB700 southbridge board with 8 GB RAM. The adapter sits on
the legacy 33 MHz PCI bus behind the SB700 PCI-to-PCI bridge.
**Symptom.** After some uptime the interface silently stops passing traffic:
the transmit and receive engines freeze together (TDH/RDH stop advancing) with
no kernel message, and only a reset/reboot recovers it. Instrumentation showed
the wedge coincides exactly with a PCI **Received Master Abort** latching in
the
adapter's PCI status word, and it occurs only for DMA to buffers above the 4 GB
line. Constraining the adapter's DMA to below 4 GB stops the aborts completely.
In other words the adapter master-aborts its own bus-master DMA whenever a
descriptor or packet buffer is placed above 4 GB — the >4 GB dual-address-cycle
(DAC) path from this adapter to host memory does not work on this chipset.
**What was checked and ruled out as the cause:**
- **The adapter / 82541 errata.** The 82541PI Specification Update lists no
>4 GB / DAC / DMA-master-abort erratum, and the controller is specified as
64-bit-DMA (DAC) capable. Not the NIC.
- **Northbridge (RS780) `TOP_OF_DRAM2`.** Read live: enabled and sized to the
true top of RAM — the northbridge's >4 GB DMA window is correctly configured
(bit-for-bit what the Linux RS690 64-bit-DMA quirk would program). Not the
cause.
- **Southbridge (SB700) PCI-bridge "Upstream Dual Address Window"** (PCIB
config
`0x50` bit 0, per the AMD SB7xx Register Programming Requirements). Read
live:
enabled. Not the cause.
- **Remaining candidates.** With both documented >4 GB-DMA enables correctly
set, the only possibilities left are the SB700 A-Link 64-bit forwarding
settings (silicon-revision-specific, reachable only via indirect I/O) or an
undocumented chipset erratum — neither safely determinable on a production
machine, and both chip-specific.
**Conclusion.** On this RS780+SB700 board the >4 GB DMA path for a 32-bit PCI
bus-master does not work despite the documented enables being set. Rather than
chase an undocumented chipset defect, the robust and low-cost fix is to keep
the
adapter's DMA below 4 GB.
**Fix (attached patch).** Adds a read-only tunable `hw.em.dma_width` that caps
the DMA addressing width; set it to 32 and busdma bounces any buffer that would
land above the limit, so the adapter only ever sees addresses it can reach. The
default of 0 keeps current behaviour and imposes no limit, so the change is
inert unless enabled per machine. With `hw.em.dma_width=32` set, the master
aborts stop (busdma shows the expected bounce activity) and the interface stays
up.
--
You are receiving this mail because:
You are the assignee for the bug.