From 8c05eddbd12c6a78a7247763d98f2e2a8ac77e1e Mon Sep 17 00:00:00 2001 From: Luke Hoersten Date: Wed, 15 Jul 2026 18:38:26 -0500 Subject: eth: size EMAC RX DMA pool above the TCP window (1600B x 24) WND=23040 alone regressed: sender fps 20 -> 14, drop-oldest 3x, recv bimodal (min 20ms but 200-450ms stalls; firmware wire_min 6.2Mbps / wire_max 75Mbps, recv_max 253ms). The stalls are RTO recovery: the default EMAC RX pool (20 x 512B = 10KB) is smaller than the 23KB the window now invites in flight, so a full-window burst overruns the RX descriptors, the burst tail is dropped with no dup-ACKs behind it, and the sender waits out a ~200ms min-RTO. 1600B buffers fit one MSS frame per buffer (1 descriptor/packet instead of 3); 24 of them = 38.4KB >= window + slack. ~44KB more internal RAM (491KB free). --- sdkconfig.defaults | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sdkconfig.defaults b/sdkconfig.defaults index 1a71f91..b7bb0ed 100644 --- a/sdkconfig.defaults +++ b/sdkconfig.defaults @@ -23,6 +23,15 @@ CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=16384 # Ethernet (Waveshare ESP32-P4-ETH-POE: internal EMAC + external PHY) CONFIG_ETH_ENABLED=y CONFIG_ETH_USE_ESP32_EMAC=y +# EMAC RX DMA pool must exceed TCP_WND or a full-window burst overruns +# the RX descriptors and the silent tail-drop puts the sender into a +# ~200-400ms RTO stall (measured: WND=23040 with the default 20x512B +# = 10KB pool made recv bimodal — wire_max 75Mbps on clean frames, +# 200-450ms stalls on lossy ones, sender fps 20 -> 14). 1600B = one +# full MSS frame per buffer (also 1 descriptor/packet instead of 3); +# 24 x 1600 = 38.4KB >= 23040 + slack. ~44KB extra internal RAM. +CONFIG_ETH_DMA_BUFFER_SIZE=1600 +CONFIG_ETH_DMA_RX_BUFFER_NUM=24 # LWIP / mDNS CONFIG_LWIP_IPV4=y -- cgit v1.2.3