docs: correct the TX diagnosis - it IS tx_bytes depth

A captured frame proves the full EXI->FPGA->W5100->wire path works: the first
16 bytes are byte-perfect (broadcast dst, PAR0-5 source MAC, ARP ethertype).
It truncates at exactly 16 = the tx_bytes FIFO depth, because TXFrameDrain
waits for a length that only arrives at the ST trigger, after the whole frame
has been streamed.

Supersedes the previous note, which concluded it was NOT depth-related; that
came from a clean-reset run whose result was invalid because the W5100 was
already wedged, so nothing transmitted regardless of length.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-30 18:45:08 +00:00
parent 2b210dc5e3
commit d669917cfe
+31 -11
View File
@@ -277,17 +277,37 @@ Pi over J4 with the board on 12 V — device ID `04 02 02 00`, NCRA reset
self-clearing, PAR0–5, MAR0–7, ANALOG, NWAYC, IMR `0x86` readback, NCRA SR, self-clearing, PAR0–5, MAR0–7, ANALOG, NWAYC, IMR `0x86` readback, NCRA SR,
and NWAYS `0x17`. See `hardware/re-bba-rb/exi_fullpath_rpi.py`. and NWAYS `0x17`. See `hardware/re-bba-rb/exi_fullpath_rpi.py`.
⚠️ **OPEN: GC→wire TX does not complete, and the W5100 is unresponsive.** ✅ **GC→wire TX REACHES THE WIRE — the full path is proven.** A frame written
Setting the NCRA ST bits never produces TI, and NCRA keeps reading back `0x0a` over EXI to TXDATA and triggered via the NCRA ST bits was captured on a PC:
(ST never clears), for EVERY frame length 8…60 with a full NCRA reset between `ff ff ff ff ff ff | 00 09 bf 00 00 01 | 08 06 | 00 01` — broadcast dst, our
attempts. The cause is NOT the EXI side and NOT `tx_bytes` depth (8-byte frames PAR0–5 source MAC and the ARP ethertype, all byte-perfect. So
fail too): the **UART shell's own socket-3 `udp unicast` also hangs** — it EXI → BBARegisterFile → tx_bytes → TXFrameDrain → W5100 → PHY works.
echoes the command and never prints `sent` — so the W5100 bus master is stuck
and `TXFrameDrain` is simply waiting on it. Check the ETH_3V3 rail / GC_ON ⚠️ **OPEN BUG: TX truncates at exactly 16 bytes = the `tx_bytes` FIFO depth.**
(U12 gates the W5100 rail off GC_ON) before suspecting gateware. Note an Past byte 16 the captured frame restarts from its own beginning and mixes in
earlier contaminated run appeared to transmit at one specific length; that was stale bytes from earlier attempts. Cause: `TXFrameDrain` sits in IDLE until it
leftover state from a previous failed attempt feeding a still-pending drain has a LENGTH, and the length only reaches `tx_ctrl` when the NCRA ST bits are
request — always NCRA-reset between TX attempts when probing. written — i.e. *after* the GC has streamed the whole frame. So the entire frame
has to fit in a 16-deep FIFO, and `BBARegisterFile` silently drops bytes when
`tx_bytes.w_rdy` is low (SPI cannot back-pressure). Simulation never caught it:
`TXFrameDrain`'s own tests drive the FIFO signals directly, and the `BBATop`
test only exercises the W5100→SPRAM→GC **RX** loop.
Fix direction (needs design + sim, NOT done): make the drain start as soon as
data is available rather than waiting for the length — e.g. push the length into
`tx_ctrl` when TWD_HI (0x35) is written, which the GC sets before streaming, so
the drain consumes concurrently with the EXI writes and the 16-deep FIFO becomes
a rate-matching buffer instead of whole-frame storage. Alternatively give TX an
SPRAM ring like RX.
When probing this, **NCRA-reset between every TX attempt**: a failed attempt
leaves the drain waiting on a stale length, and later writes feed that pending
request, which makes an unrelated frame length appear to succeed.
⚠️ **The W5100 can wedge and does NOT recover on FPGA reconfigure.** Symptom:
the UART shell's own socket-3 `udp unicast` echoes the command and never prints
`sent`, and any EXI TX then hangs waiting on the bus master. `iceprog -t` does
not clear it (RST_N floats to its pull-up while the FPGA is unconfigured). A
12 V power cycle is required. Check ETH_3V3 and GC_ON (U12 gates the W5100 rail
off GC_ON) before suspecting gateware.
**`id_phase` is a ONE-SHOT.** The device ID is returned for reads of address 0 **`id_phase` is a ONE-SHOT.** The device ID is returned for reads of address 0
only until the first NCRA write with the reset bit, which clears `id_phase` only until the first NCRA write with the reset bit, which clears `id_phase`