<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dtype.org/index.php?action=history&amp;feed=atom&amp;title=Cm5_macb_network_hang</id>
	<title>Cm5 macb network hang - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://dtype.org/index.php?action=history&amp;feed=atom&amp;title=Cm5_macb_network_hang"/>
	<link rel="alternate" type="text/html" href="https://dtype.org/index.php?title=Cm5_macb_network_hang&amp;action=history"/>
	<updated>2026-06-29T19:01:34Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.5</generator>
	<entry>
		<id>https://dtype.org/index.php?title=Cm5_macb_network_hang&amp;diff=2358&amp;oldid=prev</id>
		<title>Drew: first long form summary, claude produced from notes</title>
		<link rel="alternate" type="text/html" href="https://dtype.org/index.php?title=Cm5_macb_network_hang&amp;diff=2358&amp;oldid=prev"/>
		<updated>2026-06-29T14:58:22Z</updated>

		<summary type="html">&lt;p&gt;first long form summary, claude produced from notes&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
= Silent network hang on Raspberry Pi CM5 / Pi 5 (macb / RP1 ethernet) =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;A technical writeup of a silent ethernet TX stall on the Raspberry Pi Compute&lt;br /&gt;
Module 5, what it looks like, how to tell it apart from superficially similar bugs,&lt;br /&gt;
and which mitigations did and did not work in our testing. Written for others hitting&lt;br /&gt;
the same failure. Claims here are limited to what we directly observed or can cite;&lt;br /&gt;
inference and open questions are marked as such.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
On Raspberry Pi 5 / CM5 hardware (Cadence GEM MAC, &amp;lt;code&amp;gt;macb&amp;lt;/code&amp;gt; driver, RP1&lt;br /&gt;
southbridge), the on-board gigabit ethernet can &amp;#039;&amp;#039;&amp;#039;stop transmitting while the link&lt;br /&gt;
layer continues to report the link as up&amp;#039;&amp;#039;&amp;#039;. The receive path keeps working, the&lt;br /&gt;
driver logs nothing, all &amp;lt;code&amp;gt;ethtool&amp;lt;/code&amp;gt; error counters stay at zero, and the&lt;br /&gt;
kernel&amp;#039;s own TX watchdog never fires. The host remains fully alive locally; it is&lt;br /&gt;
simply unreachable on the network until the NIC is reset (a link down/up sometimes&lt;br /&gt;
suffices; a reboot always does).&lt;br /&gt;
&lt;br /&gt;
We observed this on &amp;#039;&amp;#039;&amp;#039;three CM5 nodes&amp;#039;&amp;#039;&amp;#039; running &amp;#039;&amp;#039;&amp;#039;Ubuntu 26.04&amp;#039;&amp;#039;&amp;#039; with the&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;linux-raspi&amp;lt;/code&amp;gt; 7.0.0-1011&amp;#039;&amp;#039;&amp;#039; kernel. Based on a captured counter&lt;br /&gt;
time-series (below), we attribute it to the &amp;#039;&amp;#039;&amp;#039;silent TX-ring stall&amp;#039;&amp;#039;&amp;#039; described and&lt;br /&gt;
fixed upstream in the Raspberry Pi Foundation kernel&lt;br /&gt;
([https://github.com/raspberrypi/linux/issues/7339 raspberrypi/linux #7339] /&lt;br /&gt;
[https://github.com/raspberrypi/linux/pull/7340 PR #7340]). That fix is &amp;#039;&amp;#039;&amp;#039;not yet in&lt;br /&gt;
Ubuntu&amp;#039;s &amp;lt;code&amp;gt;linux-raspi&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; ([https://bugs.launchpad.net/ubuntu/+source/linux-raspi/+bug/2133877&lt;br /&gt;
Launchpad #2133877], still &amp;quot;Confirmed&amp;quot; as of 2026-06-29).&lt;br /&gt;
&lt;br /&gt;
== Environment where we observed it ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Item !! Value&lt;br /&gt;
|-&lt;br /&gt;
| Board || Raspberry Pi Compute Module 5 (CM5), arm64&lt;br /&gt;
|-&lt;br /&gt;
| OS / kernel || Ubuntu 26.04 LTS, &amp;lt;code&amp;gt;linux-raspi&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;7.0.0-1011-raspi&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| NIC (from &amp;lt;code&amp;gt;dmesg&amp;lt;/code&amp;gt;) || &amp;lt;code&amp;gt;macb 1f00100000.ethernet eth0: Cadence GEM rev 0x00070109&amp;lt;/code&amp;gt;, PHY &amp;lt;code&amp;gt;Broadcom BCM54213PE&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Topology || On Pi 5 / CM5 the ethernet MAC is reached over PCIe via the &amp;#039;&amp;#039;&amp;#039;RP1&amp;#039;&amp;#039;&amp;#039; southbridge (unlike Pi 4, where the MAC is on the SoC). The RP1↔SoC DMA path is relevant to the root cause.&lt;br /&gt;
|-&lt;br /&gt;
| Root filesystem || NVMe (not SD). Relevant only because it makes the driver swap below low-risk.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
We did &amp;#039;&amp;#039;&amp;#039;not&amp;#039;&amp;#039;&amp;#039; observe the failure on an x86-64 node with a different NIC in the&lt;br /&gt;
same cluster, consistent with this being specific to the &amp;lt;code&amp;gt;macb&amp;lt;/code&amp;gt;/RP1 path&lt;br /&gt;
rather than anything in the surrounding software.&lt;br /&gt;
&lt;br /&gt;
== Symptom and signature ==&lt;br /&gt;
&lt;br /&gt;
The defining property is that &amp;#039;&amp;#039;&amp;#039;carrier never drops&amp;#039;&amp;#039;&amp;#039;. A cable, switch, or PHY&lt;br /&gt;
fault produces a &amp;lt;code&amp;gt;Link is Down&amp;lt;/code&amp;gt; event; this failure does not.&lt;br /&gt;
&lt;br /&gt;
Observed, every time:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;ip link&amp;lt;/code&amp;gt; shows the interface &amp;lt;code&amp;gt;LOWER_UP&amp;lt;/code&amp;gt;; the last carrier event in the log is the &amp;lt;code&amp;gt;Link is Up - 1Gbps/Full&amp;lt;/code&amp;gt; from boot. No carrier loss is ever logged.&lt;br /&gt;
* All off-host traffic stops &amp;#039;&amp;#039;&amp;#039;simultaneously&amp;#039;&amp;#039;&amp;#039; — gateway, peers, NFS, DNS. ARP for the gateway goes &amp;lt;code&amp;gt;INCOMPLETE&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The &amp;lt;code&amp;gt;macb&amp;lt;/code&amp;gt; driver emits &amp;#039;&amp;#039;&amp;#039;nothing&amp;#039;&amp;#039;&amp;#039; — no TX-timeout, no DMA/IRQ error. &amp;lt;code&amp;gt;ethtool -S eth0&amp;lt;/code&amp;gt; shows &amp;#039;&amp;#039;&amp;#039;zero&amp;#039;&amp;#039;&amp;#039; on every error and drop counter.&lt;br /&gt;
* The kernel netdev TX watchdog (&amp;lt;code&amp;gt;dev_watchdog&amp;lt;/code&amp;gt;) &amp;#039;&amp;#039;&amp;#039;does not fire&amp;#039;&amp;#039;&amp;#039;, because &amp;lt;code&amp;gt;trans_start&amp;lt;/code&amp;gt; keeps being updated — this is why the stall is &amp;quot;silent.&amp;quot;&lt;br /&gt;
* The host is otherwise healthy: the kernel is responsive on the local console, journald keeps writing, no panic, no OOM, no thermal event.&lt;br /&gt;
* No self-recovery. The interface stays in this state indefinitely until reset.&lt;br /&gt;
&lt;br /&gt;
If you see &amp;#039;&amp;#039;&amp;#039;link-up + all-egress-dead + no carrier event + driver silent + zero&lt;br /&gt;
error counters&amp;#039;&amp;#039;&amp;#039;, you are very likely looking at this bug rather than a cable, PHY,&lt;br /&gt;
congestion, or buffer-exhaustion problem.&lt;br /&gt;
&lt;br /&gt;
=== Why it is easy to miss, and why we caught it quickly ===&lt;br /&gt;
&lt;br /&gt;
This failure &amp;#039;&amp;#039;&amp;#039;self-erases on reboot&amp;#039;&amp;#039;&amp;#039;: the only evidence is in the previous boot&amp;#039;s&lt;br /&gt;
log, and that log shows nothing wrong with the link. On a desktop or a stateless&lt;br /&gt;
worker it tends to read as a one-off &amp;quot;the machine dropped off the network,&amp;quot; and a&lt;br /&gt;
reboot makes it disappear. (Our first encounter, on an uninstrumented node, was&lt;br /&gt;
exactly this — unreachable, no captured logs, reboot fixed it, cause unknown at the&lt;br /&gt;
time.)&lt;br /&gt;
&lt;br /&gt;
It became unmissable because the affected hosts were &amp;#039;&amp;#039;&amp;#039;etcd voting members&amp;#039;&amp;#039;&amp;#039; of a&lt;br /&gt;
k3s control plane. When the NIC stalls on such a node, the local etcd is partitioned,&lt;br /&gt;
the local API server can no longer serve quorum reads, the controller-manager loses&lt;br /&gt;
its lease, and the k3s process exits and is restarted — a loud, logged, repeating&lt;br /&gt;
failure rather than a silent drop. That is an artifact of our test setup, not of the&lt;br /&gt;
bug, but it is a useful detail: &amp;#039;&amp;#039;&amp;#039;if you run any quorum service (etcd, Consul, etc.)&lt;br /&gt;
on CM5 hardware, this bug will surface as a control-plane meltdown, not as a quiet&lt;br /&gt;
link blip.&amp;#039;&amp;#039;&amp;#039; The underlying event is still just one stalled TX ring.&lt;br /&gt;
&lt;br /&gt;
== Diagnostic evidence we collected ==&lt;br /&gt;
&lt;br /&gt;
Because none of the standard mechanisms detect this (carrier stays up, so&lt;br /&gt;
&amp;lt;code&amp;gt;systemd-networkd&amp;lt;/code&amp;gt; sees nothing; &amp;lt;code&amp;gt;dev_watchdog&amp;lt;/code&amp;gt; never fires; the&lt;br /&gt;
hardware watchdog keeps being petted because the host is alive), we ran a&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;reachability&amp;#039;&amp;#039;&amp;#039; probe that, on N consecutive failures, captured a read-only&lt;br /&gt;
forensic snapshot &amp;#039;&amp;#039;before&amp;#039;&amp;#039; resetting the interface. The snapshots are what let us&lt;br /&gt;
classify the failure rather than guess at it.&lt;br /&gt;
&lt;br /&gt;
What the snapshots showed, consistently:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Link up, 1000/Full, &amp;lt;code&amp;gt;Link detected: yes&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; at the moment of the hang.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Every error and drop counter at 0&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;rx_resource_errors&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rx_overruns&amp;lt;/code&amp;gt;, FCS errors, &amp;lt;code&amp;gt;tx_carrier_sense_errors&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;q0_{tx,rx}_dropped&amp;lt;/code&amp;gt;). Rules out cable, congestion, buffer exhaustion, and PHY faults.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;All four EEE/LPI counters (&amp;lt;code&amp;gt;{rx,tx}_lpi_{transitions,time}&amp;lt;/code&amp;gt;) at 0&amp;#039;&amp;#039;&amp;#039; — the PHY had not entered Low Power Idle.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;No RCU stalls&amp;#039;&amp;#039;&amp;#039; in the kernel log preceding any hang.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A single TX queue&amp;#039;&amp;#039;&amp;#039; (only &amp;lt;code&amp;gt;q0_*&amp;lt;/code&amp;gt; counters exist) with the eth0 IRQ servicing entirely on CPU0.&lt;br /&gt;
&lt;br /&gt;
The decisive capture was a &amp;#039;&amp;#039;&amp;#039;3-sample, ~1-second-apart time-series&amp;#039;&amp;#039;&amp;#039; of the tx/rx&lt;br /&gt;
frame counters taken at the moment of one hang:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Sample !! &amp;lt;code&amp;gt;tx_frames&amp;lt;/code&amp;gt; !! &amp;lt;code&amp;gt;rx_frames&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| t0 || 23553102 || 26633386&lt;br /&gt;
|-&lt;br /&gt;
| t1 || 23553102 || 26633400&lt;br /&gt;
|-&lt;br /&gt;
| t2 || 23553102 || 26633423&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;tx_frames&amp;lt;/code&amp;gt; is frozen across all three samples while &amp;lt;code&amp;gt;rx_frames&amp;lt;/code&amp;gt;&lt;br /&gt;
continues to climb&amp;#039;&amp;#039;&amp;#039;, and the eth0 IRQ count keeps advancing. This is a direct&lt;br /&gt;
observation of the TX path being stalled while RX and interrupts are still live — not&lt;br /&gt;
an inference from symptoms. It is this datapoint, more than the symptom description,&lt;br /&gt;
that drives the root-cause attribution below.&lt;br /&gt;
&lt;br /&gt;
== Root-cause analysis: which bug is this? ==&lt;br /&gt;
&lt;br /&gt;
There are several public reports that look alike at the symptom level. They are &amp;#039;&amp;#039;&amp;#039;not&lt;br /&gt;
all the same bug&amp;#039;&amp;#039;&amp;#039;, and getting the mechanism right determines which mitigation is&lt;br /&gt;
worth applying. This section lays out the candidates and the evidence for our&lt;br /&gt;
attribution.&lt;br /&gt;
&lt;br /&gt;
=== The candidate reports ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Report !! Proposed mechanism !! Same silicon?&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Ubuntu Launchpad #2133877&amp;#039;&amp;#039;&amp;#039; — &amp;quot;Complete network hang on Raspberry Pi 5 … possibly related to CPU frequency scaling&amp;quot; || CPU &amp;#039;&amp;#039;&amp;#039;frequency-scaling transitions&amp;#039;&amp;#039;&amp;#039; corrupting the RP1/macb DMA path; the report notes RCU stalls as a precursor and that the &amp;lt;code&amp;gt;performance&amp;lt;/code&amp;gt; governor stopped those RCU stalls. || &amp;#039;&amp;#039;&amp;#039;Yes&amp;#039;&amp;#039;&amp;#039; (Pi 5, &amp;lt;code&amp;gt;linux-raspi&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;raspberrypi/linux #7339 / PR #7340&amp;#039;&amp;#039;&amp;#039; — &amp;quot;candidate fixes for silent TX stall on BCM2712/RP1&amp;quot; || A &amp;#039;&amp;#039;&amp;#039;silent TX stall in the &amp;lt;code&amp;gt;macb&amp;lt;/code&amp;gt; driver&amp;#039;&amp;#039;&amp;#039;: tx stops advancing, RX keeps working, link stays up. Three driver patches. || &amp;#039;&amp;#039;&amp;#039;Yes&amp;#039;&amp;#039;&amp;#039; (BCM2712/RP1, &amp;lt;code&amp;gt;macb&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;siderolabs/sbc-raspberrypi #91&amp;#039;&amp;#039;&amp;#039; — &amp;quot;silent network death on Talos&amp;quot; || Decomposes the failure into an &amp;#039;&amp;#039;&amp;#039;EEE LPI-wake race&amp;#039;&amp;#039;&amp;#039;, a &amp;#039;&amp;#039;&amp;#039;macb TSO/GSO TX-ring hang&amp;#039;&amp;#039;&amp;#039; (single TX queue, softirqs on CPU0, small rings), and a Talos-specific socket issue. Prevention bundle: EEE off + TSO/GSO off + larger rings. || &amp;#039;&amp;#039;&amp;#039;Yes&amp;#039;&amp;#039;&amp;#039; (Pi 5, BCM2712 + Cadence GEM + BCM54213PE)&lt;br /&gt;
|-&lt;br /&gt;
| Various &amp;quot;&amp;lt;code&amp;gt;ethtool -K eth0 tso off gso off&amp;lt;/code&amp;gt; fixes it&amp;quot; posts || Trace originally to Intel &amp;#039;&amp;#039;&amp;#039;e1000e&amp;#039;&amp;#039;&amp;#039; &amp;quot;Detected Hardware Unit Hang&amp;quot; — a &amp;#039;&amp;#039;&amp;#039;different NIC and driver&amp;#039;&amp;#039;&amp;#039;. || &amp;#039;&amp;#039;&amp;#039;No&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== What our evidence supports, and what it argues against ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The symptom matches #2133877 essentially line-for-line&amp;#039;&amp;#039;&amp;#039; — same NIC, complete&lt;br /&gt;
network hang, host alive locally, clean &amp;lt;code&amp;gt;ethtool&amp;lt;/code&amp;gt; stats, no &amp;lt;code&amp;gt;macb&amp;lt;/code&amp;gt;&lt;br /&gt;
log lines, recovers only on reset. So at the &amp;#039;&amp;#039;symptom&amp;#039;&amp;#039; level we are clearly in the&lt;br /&gt;
#2133877 family.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;But #2133877&amp;#039;s proposed mechanism (frequency scaling) does not fit our&lt;br /&gt;
observations,&amp;#039;&amp;#039;&amp;#039; on three independent points:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;No RCU stalls.&amp;#039;&amp;#039;&amp;#039; #2133877&amp;#039;s headline precursor is RCU stalls (the reporter saw them at a steady rate, and pinning the governor stopped them). We logged &amp;#039;&amp;#039;&amp;#039;zero&amp;#039;&amp;#039;&amp;#039; RCU stalls before any hang, across every event. The precursor that report hangs its causal story on is absent on our hardware.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;The hang occurred at maximum, pinned frequency.&amp;#039;&amp;#039;&amp;#039; We trialed the &amp;lt;code&amp;gt;performance&amp;lt;/code&amp;gt; governor (which holds the cores at a fixed maximum frequency and therefore eliminates frequency &amp;#039;&amp;#039;transitions&amp;#039;&amp;#039;) on the worst-affected node. It &amp;#039;&amp;#039;&amp;#039;hung again ~30 minutes later&amp;#039;&amp;#039;&amp;#039;, and our counter capture from a separate hang shows the cores already at the maximum 2400 MHz at the time of the stall. If frequency transitions were necessary to trigger the hang, pinning the frequency should have prevented it. It did not. (This is a single negative trial, n=1, but it is a direct one.)&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;The captured time-series matches #7340&amp;#039;s description exactly.&amp;#039;&amp;#039;&amp;#039; #7340 describes the failure as &amp;quot;tx_packets stops incrementing, RX still works, link stays up.&amp;quot; Our capture shows precisely that — frozen &amp;lt;code&amp;gt;tx_frames&amp;lt;/code&amp;gt;, climbing &amp;lt;code&amp;gt;rx_frames&amp;lt;/code&amp;gt;, live IRQ. #2133877 does not characterize the failure at the ring-counter level; #7340 does, and our data fits it.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Our interpretation:&amp;#039;&amp;#039;&amp;#039; #2133877 and #7339 are most likely the &amp;#039;&amp;#039;&amp;#039;same underlying&lt;br /&gt;
defect&amp;#039;&amp;#039;&amp;#039;, and the &amp;quot;frequency scaling&amp;quot; wording in #2133877&amp;#039;s title is a hypothesis&lt;br /&gt;
from before the TX-ring stall was isolated, not an established mechanism. The&lt;br /&gt;
root-cause work that produced an actual fix is #7340, whose described signature is the&lt;br /&gt;
one we captured. We treat the frequency-scaling angle as &amp;#039;&amp;#039;&amp;#039;not supported on our&lt;br /&gt;
hardware&amp;#039;&amp;#039;&amp;#039;: we cannot rule out a frequency &amp;#039;&amp;#039;transition&amp;#039;&amp;#039; acting as one possible&lt;br /&gt;
trigger, but our evidence shows transitions are &amp;#039;&amp;#039;&amp;#039;not necessary&amp;#039;&amp;#039;&amp;#039; (the hang happens&lt;br /&gt;
at pinned max frequency) and that the RCU-stall precursor central to that report is&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;absent&amp;#039;&amp;#039;&amp;#039; for us.&lt;br /&gt;
&lt;br /&gt;
=== On the EEE and TSO/GSO theories (siderolabs #91) ===&lt;br /&gt;
&lt;br /&gt;
siderolabs #91 is the closest same-silicon analysis and is the source of the popular&lt;br /&gt;
prevention bundle (EEE off, TSO/GSO off, larger rings). Two of its three triggers are&lt;br /&gt;
worth separating against our data:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;EEE / LPI-wake race&amp;#039;&amp;#039;&amp;#039; — &amp;#039;&amp;#039;&amp;#039;not our mechanism.&amp;#039;&amp;#039;&amp;#039; All four LPI counters read zero at every hang; the PHY never entered Low Power Idle. Disabling EEE addresses a state our hardware was never in. (On our setup EEE was advertised but inactive because the switch did not negotiate it, so disabling it also had no measurable power cost — but that is incidental.)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;macb TSO/GSO TX-ring hang&amp;#039;&amp;#039;&amp;#039; — this is the trigger that &amp;#039;&amp;#039;&amp;#039;does&amp;#039;&amp;#039;&amp;#039; line up structurally with what we see: a single TX queue, all NET softirqs on CPU0, and the silent-because-&amp;lt;code&amp;gt;trans_start&amp;lt;/code&amp;gt;-still-ticks behavior. This is the same family as #7340. However — see the mitigations section — disabling TSO/GSO and enlarging the rings &amp;#039;&amp;#039;&amp;#039;did not prevent the hang on our kernel&amp;#039;&amp;#039;&amp;#039;, so while the structural description fits, the offload-disable &amp;#039;&amp;#039;remedy&amp;#039;&amp;#039; did not hold for us.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;The e1000e-derived &amp;quot;just turn off TSO&amp;quot; advice does not transfer&amp;#039;&amp;#039;&amp;#039; — it originates&lt;br /&gt;
from a different NIC and driver, and a lone TSO-off was tried and walked back in the&lt;br /&gt;
#7340 discussion. We mention it only because it is widely repeated.&lt;br /&gt;
&lt;br /&gt;
=== What we are NOT claiming ===&lt;br /&gt;
&lt;br /&gt;
* We have not bisected the kernel or independently proven the PCIe-posted-write mechanism that PR #7340&amp;#039;s patches address; we are relying on the upstream commits for the mechanism and on our counter capture for the match.&lt;br /&gt;
* We have not (yet) demonstrated that the backported fix &amp;#039;&amp;#039;&amp;#039;eliminates&amp;#039;&amp;#039;&amp;#039; the hang — that trial is in progress and its result is pending (see Status).&lt;br /&gt;
* We cannot speak to whether other Pi 5 / CM5 configurations (different PHY link speeds, RPiOS vs Ubuntu, SD vs NVMe) behave identically.&lt;br /&gt;
&lt;br /&gt;
== The upstream fix ==&lt;br /&gt;
&lt;br /&gt;
[https://github.com/raspberrypi/linux/pull/7340 raspberrypi/linux PR #7340] was merged&lt;br /&gt;
into the Raspberry Pi Foundation kernel branch &amp;lt;code&amp;gt;rpi-6.18.y&amp;lt;/code&amp;gt; on 2026-05-08,&lt;br /&gt;
and the series subsequently went to mainline netdev (v2, 2026-05-14). It is three&lt;br /&gt;
patches to the Cadence/&amp;lt;code&amp;gt;macb&amp;lt;/code&amp;gt; driver:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! upstream commit !! Change (per the commit) !! Role&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &amp;lt;code&amp;gt;63d230184da3&amp;lt;/code&amp;gt; || Flush the PCIe posted write after the TSTART doorbell, so the doorbell that tells the MAC to begin transmission is not left sitting in the PCIe fabric. || Identified as the core fix&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &amp;lt;code&amp;gt;3ccf780ce058&amp;lt;/code&amp;gt; || Re-check the interrupt status register after re-enabling interrupts in &amp;lt;code&amp;gt;macb_tx_poll&amp;lt;/code&amp;gt;. || Closes a lost-interrupt race&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &amp;lt;code&amp;gt;8ea87c96f1a6&amp;lt;/code&amp;gt; || Add a TX-stall watchdog inside the driver. || Defence-in-depth&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The mechanism implied by patch 1 — a &amp;#039;&amp;#039;&amp;#039;posted MMIO write that can be reordered/delayed&lt;br /&gt;
in the PCIe fabric so the MAC never sees the &amp;quot;start TX&amp;quot; doorbell&amp;#039;&amp;#039;&amp;#039; — is consistent&lt;br /&gt;
with everything we observed: TX stops, RX and interrupts continue, no error is raised,&lt;br /&gt;
and the link is unaffected. We present this as the upstream-identified mechanism, not&lt;br /&gt;
as something we independently verified at the silicon level.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Caveats from the upstream discussion&amp;#039;&amp;#039;&amp;#039; (worth knowing if you deploy the fix):&lt;br /&gt;
&lt;br /&gt;
* Upstream labels them &amp;#039;&amp;#039;&amp;#039;&amp;quot;candidate fixes.&amp;quot;&amp;#039;&amp;#039;&amp;#039; Contributors reported that a software watchdog could still occasionally trigger even with the patches applied, and that &amp;quot;both patches + watchdog are necessary to keep things stable.&amp;quot;&lt;br /&gt;
* Recovery experience varied: a &amp;lt;code&amp;gt;ip link down/up&amp;lt;/code&amp;gt; recovered the interface for some reporters but &amp;#039;&amp;#039;&amp;#039;not all&amp;#039;&amp;#039;&amp;#039; — at least one needed a driver bind/unbind. This matches our finding that a link bounce usually but not always clears it.&lt;br /&gt;
&lt;br /&gt;
== State of the fix in Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
As of &amp;#039;&amp;#039;&amp;#039;2026-06-29&amp;#039;&amp;#039;&amp;#039;, the fix is &amp;#039;&amp;#039;&amp;#039;not in Ubuntu&amp;#039;s &amp;lt;code&amp;gt;linux-raspi&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;. Our&lt;br /&gt;
nodes are on the newest available build (&amp;lt;code&amp;gt;7.0.0-1011&amp;lt;/code&amp;gt;) and its changelog&lt;br /&gt;
contains no trace of the patches. Launchpad bug&lt;br /&gt;
[https://bugs.launchpad.net/ubuntu/+source/linux-raspi/+bug/2133877 #2133877] remains&lt;br /&gt;
in state &amp;#039;&amp;#039;&amp;#039;&amp;quot;Confirmed&amp;quot;&amp;#039;&amp;#039;&amp;#039; (it has not advanced to Fix Committed / Fix Released). A&lt;br /&gt;
Canonical kernel engineer on that bug indicated a 7.0-based &amp;lt;code&amp;gt;linux-raspi&amp;lt;/code&amp;gt;&lt;br /&gt;
would &amp;quot;take some time&amp;quot; and gave no committed date. So the realistic horizon for an&lt;br /&gt;
Ubuntu kernel that fixes this at the source is &amp;#039;&amp;#039;&amp;#039;indeterminate (weeks to months)&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
A way to check for the fix landing without external web access (the package archive is&lt;br /&gt;
reachable even when Launchpad may not be):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update &amp;amp;&amp;amp; apt-get changelog linux-image-raspi | grep -iE &amp;#039;TX stall|2133877|TSTART&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
An empty result means it has not shipped; a match means the SRU is in and you can fix&lt;br /&gt;
this by simply updating the kernel.&lt;br /&gt;
&lt;br /&gt;
== Mitigations and their measured results ==&lt;br /&gt;
&lt;br /&gt;
We tried four things. Only two are worth the effort, and the only &amp;#039;&amp;#039;confirmed&amp;#039;&amp;#039;&lt;br /&gt;
recovery is the watchdog; the only plausible &amp;#039;&amp;#039;cure&amp;#039;&amp;#039; is the backported driver (result&lt;br /&gt;
pending). We report what each one actually did, including the ones that failed.&lt;br /&gt;
&lt;br /&gt;
=== 1. Reachability watchdog (recovery) — works; this is the load-bearing mitigation ===&lt;br /&gt;
&lt;br /&gt;
A small periodic probe that pings &amp;#039;&amp;#039;&amp;#039;two&amp;#039;&amp;#039;&amp;#039; independent off-host targets (we use the&lt;br /&gt;
gateway and a NAS). Requiring &amp;#039;&amp;#039;&amp;#039;both&amp;#039;&amp;#039;&amp;#039; to fail in a cycle, and requiring &amp;#039;&amp;#039;&amp;#039;N&lt;br /&gt;
consecutive&amp;#039;&amp;#039;&amp;#039; failed cycles, avoids false positives from ordinary blips. On trip it:&lt;br /&gt;
&lt;br /&gt;
# Captures a read-only forensic snapshot (the data that made this writeup possible).&lt;br /&gt;
# Resets the interface: &amp;lt;code&amp;gt;ip link set eth0 down &amp;amp;&amp;amp; ip link set eth0 up&amp;lt;/code&amp;gt;. This re-initialises the MAC and, in our experience, usually clears the stall without a reboot.&lt;br /&gt;
# If still dead after the bounce, &amp;#039;&amp;#039;&amp;#039;reboots&amp;#039;&amp;#039;&amp;#039; as a last resort.&lt;br /&gt;
&lt;br /&gt;
Notes that matter:&lt;br /&gt;
&lt;br /&gt;
* It must test &amp;#039;&amp;#039;&amp;#039;reachability&amp;#039;&amp;#039;&amp;#039;, not link/carrier state — carrier stays up, so a link-state monitor will never fire.&lt;br /&gt;
* The recovery script and its logs must live on &amp;#039;&amp;#039;&amp;#039;local disk&amp;#039;&amp;#039;&amp;#039;, not on any network filesystem — the network is exactly what is gone when it runs.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Timing has to beat whatever your stack&amp;#039;s failure threshold is.&amp;#039;&amp;#039;&amp;#039; In our case a slow bounce let the node stay partitioned long enough for the k3s control plane to give up on etcd and restart. We tightened detection (5 s probe cadence, bounce after 2 failed cycles ≈ ~10–15 s to first reset) while keeping the reboot a patient last resort (~75 s). If you run quorum services, tune the bounce to land inside their lease/election timeout.&lt;br /&gt;
* A reboot is an acceptable recovery for a node that is one member of a fault-tolerant quorum; it is more disruptive for a singleton. The bounce-first ordering exists to avoid rebooting when a link reset would do.&lt;br /&gt;
&lt;br /&gt;
The kernel&amp;#039;s &amp;lt;code&amp;gt;dev_watchdog&amp;lt;/code&amp;gt; and the on-board hardware watchdog &amp;#039;&amp;#039;&amp;#039;cannot&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
substitute for this — the former never fires (the stall is silent by definition) and&lt;br /&gt;
the latter is happy because the host itself is not hung.&lt;br /&gt;
&lt;br /&gt;
=== 2. &amp;lt;code&amp;gt;performance&amp;lt;/code&amp;gt; CPU governor — did NOT prevent it ===&lt;br /&gt;
&lt;br /&gt;
Tested specifically to evaluate the frequency-scaling hypothesis. Pinning the cores to&lt;br /&gt;
maximum frequency eliminates frequency transitions. The node &amp;#039;&amp;#039;&amp;#039;hung again ~30 minutes&lt;br /&gt;
after pinning&amp;#039;&amp;#039;&amp;#039;. We reverted it. Besides being ineffective here, it carries a small&lt;br /&gt;
but continuous idle power cost (we measured roughly +0.5–0.75 W on a fanless ~3 W-class&lt;br /&gt;
node). &amp;#039;&amp;#039;&amp;#039;Recommendation: do not rely on this&amp;#039;&amp;#039;&amp;#039;, and treat it as evidence against the&lt;br /&gt;
frequency-transition mechanism rather than a mitigation.&lt;br /&gt;
&lt;br /&gt;
=== 3. EEE / TSO / GSO off + larger rings — did NOT prevent it on our kernel ===&lt;br /&gt;
&lt;br /&gt;
This is the siderolabs #91 prevention bundle:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ethtool --set-eee eth0 eee off ; ethtool --set-eee eth0 advertise 0x0&lt;br /&gt;
ethtool -K eth0 tso off gso off&lt;br /&gt;
ethtool -G eth0 rx 4096 tx 2048&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We applied and verified all of it (confirmed active at the time of a subsequent hang:&lt;br /&gt;
EEE disabled, both offloads off, rings 4096/2048). &amp;#039;&amp;#039;&amp;#039;The node hung anyway.&amp;#039;&amp;#039;&amp;#039; On our&lt;br /&gt;
kernel this bundle did not prevent the stall. We left it applied (it is close to free&lt;br /&gt;
on our hardware — see the EEE note above) but we &amp;#039;&amp;#039;&amp;#039;cannot report it as effective&lt;br /&gt;
prevention&amp;#039;&amp;#039;&amp;#039;. Reporters on other kernels (notably pre-#7340 builds) found it stable on&lt;br /&gt;
a fleet, so results appear to be kernel-dependent; do not assume it will hold on&lt;br /&gt;
&amp;lt;code&amp;gt;linux-raspi&amp;lt;/code&amp;gt; 7.0.&lt;br /&gt;
&lt;br /&gt;
If you do apply it, note that a link down/up &amp;#039;&amp;#039;&amp;#039;resets&amp;#039;&amp;#039;&amp;#039; these settings, so any&lt;br /&gt;
watchdog that bounces the interface must re-assert them afterward.&lt;br /&gt;
&lt;br /&gt;
=== 4. Backported &amp;lt;code&amp;gt;macb.ko&amp;lt;/code&amp;gt; (the actual fix) — deployed, result pending ===&lt;br /&gt;
&lt;br /&gt;
Because the upstream fix is a driver change and &amp;lt;code&amp;gt;macb&amp;lt;/code&amp;gt; is a loadable module&lt;br /&gt;
(&amp;lt;code&amp;gt;CONFIG_MACB=m&amp;lt;/code&amp;gt;) on the Ubuntu kernel, the three #7340 patches can be&lt;br /&gt;
backported and the driver rebuilt &amp;#039;&amp;#039;&amp;#039;without replacing the kernel&amp;#039;&amp;#039;&amp;#039;. The patches&lt;br /&gt;
applied cleanly to the &amp;lt;code&amp;gt;linux-raspi&amp;lt;/code&amp;gt; 7.0 source. This is the only mitigation&lt;br /&gt;
that targets the root cause rather than recovering from or trying to avoid it.&lt;br /&gt;
&lt;br /&gt;
We load it &amp;#039;&amp;#039;&amp;#039;live and non-persistently&amp;#039;&amp;#039;&amp;#039;: the rebuilt module lives outside&lt;br /&gt;
&amp;lt;code&amp;gt;/lib/modules&amp;lt;/code&amp;gt; and the initramfs and is inserted at runtime, so &amp;#039;&amp;#039;&amp;#039;every&lt;br /&gt;
reboot returns to the stock driver automatically&amp;#039;&amp;#039;&amp;#039;. With root on NVMe (so the NIC&lt;br /&gt;
driver is not boot-critical) this is low-risk — a bad module cannot wedge boot, because&lt;br /&gt;
boot never loads it. A loader script does the swap (verify the module&amp;#039;s vermagic&lt;br /&gt;
matches the running kernel, &amp;lt;code&amp;gt;rmmod&amp;lt;/code&amp;gt; stock → &amp;lt;code&amp;gt;insmod&amp;lt;/code&amp;gt; patched →&lt;br /&gt;
bring the link up → wait for a real off-host ping → roll back to stock on any failure),&lt;br /&gt;
with the watchdog as the final backstop.&lt;br /&gt;
&lt;br /&gt;
Two operational warnings if you try this:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A live &amp;lt;code&amp;gt;macb&amp;lt;/code&amp;gt; reload destroys and recreates &amp;lt;code&amp;gt;eth0&amp;lt;/code&amp;gt;.&amp;#039;&amp;#039;&amp;#039; If you run an overlay network (we run flannel/VXLAN), the overlay device is bound to the old interface and may &amp;#039;&amp;#039;&amp;#039;not rebuild itself&amp;#039;&amp;#039;&amp;#039; — leaving the host with full LAN connectivity but no overlay (cross-node traffic silently fails). The fix is to restart the networking layer that owns the overlay after the swap. This bites both the swap and a manual &amp;lt;code&amp;gt;rmmod; modprobe&amp;lt;/code&amp;gt; revert.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The module is bound to one exact kernel version&amp;#039;&amp;#039;&amp;#039; (vermagic). Any kernel upgrade obsoletes it and it must be rebuilt and re-swapped. A reboot after a kernel upgrade but before a re-swap simply runs the stock driver — safe, just unprotected. If you make this permanent, &amp;#039;&amp;#039;&amp;#039;DKMS&amp;#039;&amp;#039;&amp;#039; is the right vehicle because it auto-rebuilds the module on each kernel bump. We have not done this yet — it is gated on the soak result below.&lt;br /&gt;
&lt;br /&gt;
The module loads tainted (out-of-tree + unsigned, taint mask &amp;lt;code&amp;gt;12288&amp;lt;/code&amp;gt;), as&lt;br /&gt;
expected.&lt;br /&gt;
&lt;br /&gt;
==== Early result (preliminary, not a conclusion) ====&lt;br /&gt;
&lt;br /&gt;
We deployed the patched driver to two nodes first and left a third on the stock driver&lt;br /&gt;
as a control. In the following window the &amp;#039;&amp;#039;&amp;#039;stock node hung twice&amp;#039;&amp;#039;&amp;#039; overnight while&lt;br /&gt;
the &amp;#039;&amp;#039;&amp;#039;two patched nodes accumulated roughly 25 node-hours with no hang&amp;#039;&amp;#039;&amp;#039;. That is a&lt;br /&gt;
real differential and is encouraging, but it is a &amp;#039;&amp;#039;&amp;#039;small sample&amp;#039;&amp;#039;&amp;#039; and the control&lt;br /&gt;
node was subsequently patched as well (it had started hanging, removing its value as a&lt;br /&gt;
&amp;quot;never-hung&amp;quot; control). &amp;#039;&amp;#039;&amp;#039;We are not yet claiming the patch works.&amp;#039;&amp;#039;&amp;#039; The standing&lt;br /&gt;
test is a multi-week soak across all nodes against the pre-patch hang rate.&lt;br /&gt;
&lt;br /&gt;
== How to confirm you have this specific bug ==&lt;br /&gt;
&lt;br /&gt;
After a recovery, examine the boot that failed (e.g. &amp;lt;code&amp;gt;journalctl -b -1&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ethtool -i eth0                                        # driver should be &amp;#039;macb&amp;#039;&lt;br /&gt;
journalctl -b -1 | grep -iE &amp;#039;Link is Down|carrier&amp;#039;    # expect NOTHING for eth0 (link never dropped)&lt;br /&gt;
journalctl -b -1 | grep -iE &amp;#039;i/o timeout|not responding, timed out&amp;#039;  # all egress dead at once&lt;br /&gt;
journalctl -b -1 | grep -icE &amp;#039;oom-kill|killed process&amp;#039;               # expect 0 (rules out memory)&lt;br /&gt;
journalctl -b -1 | grep -icE &amp;#039;rcu.*stall&amp;#039;                            # we saw 0 (the #2133877 precursor)&lt;br /&gt;
ethtool -S eth0 | grep -vE &amp;#039;: 0$&amp;#039;                      # at hang time, error/drop counters are 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you can catch it &amp;#039;&amp;#039;&amp;#039;live&amp;#039;&amp;#039;&amp;#039; (before resetting the interface), the conclusive check&lt;br /&gt;
is to sample the frame counters a second apart and confirm TX is frozen while RX moves:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
for i in 1 2 3; do&lt;br /&gt;
  ethtool -S eth0 | grep -E &amp;#039;tx_frames|rx_frames&amp;#039;; echo ---; sleep 1&lt;br /&gt;
done&lt;br /&gt;
# tx_frames identical across samples + rx_frames increasing = the silent TX stall&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Status and open questions (2026-06-29) ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Confirmed:&amp;#039;&amp;#039;&amp;#039; the failure is a silent TX stall (captured: TX frozen, RX live), it is not memory/thermal/PHY/cable, and it recovers on interface reset.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Confirmed not the cause for us:&amp;#039;&amp;#039;&amp;#039; EEE/LPI (counters zero); frequency transitions as a &amp;#039;&amp;#039;necessary&amp;#039;&amp;#039; trigger (hang occurs at pinned max frequency); the RCU-stall precursor from #2133877 (never observed).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Did not prevent it (our kernel):&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;performance&amp;lt;/code&amp;gt; governor; EEE/TSO/GSO-off + larger rings.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Works:&amp;#039;&amp;#039;&amp;#039; the reachability watchdog (recovery, not prevention).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Pending:&amp;#039;&amp;#039;&amp;#039; whether the backported #7340 driver eliminates the hang — multi-week soak in progress; persistence via DKMS deferred until that passes.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;The real fix&amp;#039;&amp;#039;&amp;#039; remains an Ubuntu SRU of #7340 into &amp;lt;code&amp;gt;linux-raspi&amp;lt;/code&amp;gt;; track Launchpad #2133877 for &amp;#039;&amp;#039;Fix Released&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* raspberrypi/linux #7339 — silent TX stall on Pi 5 / CM5 (root-cause issue): [https://github.com/raspberrypi/linux/issues/7339 github.com/raspberrypi/linux/issues/7339]&lt;br /&gt;
* raspberrypi/linux PR #7340 — &amp;lt;code&amp;gt;net: macb: candidate fixes for silent TX stall on BCM2712/RP1&amp;lt;/code&amp;gt; (merged to &amp;lt;code&amp;gt;rpi-6.18.y&amp;lt;/code&amp;gt; 2026-05-08): [https://github.com/raspberrypi/linux/pull/7340 github.com/raspberrypi/linux/pull/7340] · netdev series: [https://lore.kernel.org/netdev/cover.1777064117.git.lukasz@raczylo.com/ lore.kernel.org]&lt;br /&gt;
* Ubuntu &amp;lt;code&amp;gt;linux-raspi&amp;lt;/code&amp;gt; bug #2133877 — Complete network hang on Pi 5 (watch for &amp;#039;&amp;#039;Fix Released&amp;#039;&amp;#039;): [https://bugs.launchpad.net/ubuntu/+source/linux-raspi/+bug/2133877 bugs.launchpad.net/…/2133877]&lt;br /&gt;
* siderolabs/sbc-raspberrypi #91 — silent network death on Pi 5 (Talos): 3-trigger decomposition + the EEE/TSO/GSO/rings bundle: [https://github.com/siderolabs/sbc-raspberrypi/issues/91 github.com/siderolabs/sbc-raspberrypi/issues/91]&lt;br /&gt;
* raspberrypi/linux #6420 — Pi 5 sometimes has no LAN after boot (a &amp;#039;&amp;#039;different&amp;#039;&amp;#039;, boot-time variant): [https://github.com/raspberrypi/linux/issues/6420 github.com/raspberrypi/linux/issues/6420]&lt;br /&gt;
* Intel e1000e &amp;quot;Detected Hardware Unit Hang&amp;quot; — origin of the unrelated &amp;quot;disable TSO&amp;quot; advice (different NIC/driver, does not transfer): [https://forum.proxmox.com/threads/e1000-driver-hang.58284/ forum.proxmox.com/…/e1000-driver-hang]&lt;/div&gt;</summary>
		<author><name>Drew</name></author>
	</entry>
</feed>