docs: record netboot throughput at 6.4 s and what txto=0 does and does not say

300908 bytes in 6.4 s (0.38 Mbit/s) with txto=0, down from 40.1 s and 16.9 s.
The whole cost was round-trip, not bandwidth: stop-and-wait is one block per
round trip.

The counter-intuitive result is recorded deliberately: raising the host timeout
0.1 -> 0.3 barely changed the retry count (110 -> 95) but tripled the cost of
each, making the transfer 2.4x SLOWER.  Short is correct here because the GC
re-ACKs a duplicate immediately, so a premature retry costs one timeout and
nothing else.  Anyone tuning this later will reach for a longer timeout first;
the note says not to.

Also corrects my own earlier claim.  I concluded from the 0.3 s result that the
misses were LOST ACKs rather than late ones.  txto=0 shows every ACK reached
the W5100 with TI set, so the drain and EXI side are clean -- but TI is not
proof of transmission, and a 6.4 s total is hard to reconcile with ~95 genuine
losses.  The honest state is that it is not established either way, and the
retry COUNT at 0.05 s is the measurement that would settle it.  Recorded as
open rather than fixed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-10-09 19:56:13 +02:00
parent ada9378628
commit 8691b09676
+25
View File
@@ -237,6 +237,31 @@ directly, so a broken test build costs nothing. Proven end to end on console:
300076 bytes in 294 blocks, verify OK, Swiss boots, and new builds are now 300076 bytes in 294 blocks, verify OK, Swiss boots, and new builds are now
delivered this way instead of by SD card. delivered this way instead of by SD card.
**Measured 2026-10-09: 300908 bytes in 6.4 s (0.38 Mbit/s), `txto=0`.**
Getting there was all round-trip cost, not bandwidth — stop-and-wait means one
block per round trip. Three things mattered, in order of effect:
| change | result |
|---|---|
| host `--timeout` 0.3 → **0.05 s** | 40.1 s → 6.4 s |
| `send_ack` TI poll 200 → **8** | 200 EXI transactions ≈ 12 ms, spent only when TI was slow — i.e. exactly when the host was closest to timing out |
| block 256 → **1024** | 1166 blocks → 294 |
⚠️ **The timeout result is counter-intuitive and worth remembering:** raising it
0.1 → 0.3 barely changed the retry count (110 → 95) but tripled the cost of
each, so it made the transfer 2.4× SLOWER. Short is right here, because the GC
re-ACKs a duplicate block immediately — a premature retry costs one timeout
and nothing else.
⚠️ `txto=0` means every ACK was handed to the W5100 with TI set, so the drain
and the EXI side are clean. **TI is not proof of transmission**, so a residual
retry rate points past the hand-off (the chip, or the wire). Whether the
remaining misses are lost or merely late is NOT established — the retry count
is roughly timeout-independent, which suggests loss, but the 6.4 s result is
hard to reconcile with ~95 genuine losses. Get the retry count alongside
`txto` before theorising.
Details and the recovery ladder are in `gc_bba_test/README.md`. Key points: Details and the recovery ladder are in `gc_bba_test/README.md`. Key points:
- **Raw ethertype `0x88B5`, not IP** — no ARP, no IP stack, no libogc network - **Raw ethertype `0x88B5`, not IP** — no ARP, no IP stack, no libogc network
driver competing for the EXI channel. It reuses only `bba_tx_bytes()` and the driver competing for the EXI channel. It reuses only `bba_tx_bytes()` and the