From 86e0899b43328221459cb023ab72be79a78cd550 Mon Sep 17 00:00:00 2001 From: Kerem Zorer Date: Fri, 28 Aug 2026 15:38:21 +0300 Subject: [PATCH] Fix STM32H7 multi-descriptor RX segment lengths RDES3.PL contains the total frame length only on the last RX descriptor. Using it for intermediate descriptors produces invalid linked-buffer lengths for frames spanning more than one DMA buffer. Use the configured RX buffer length for intermediate descriptors, and calculate the remaining frame length from PL only for the last descriptor. --- .../STM32/Drivers/H7/stm32h7xx_hal_eth.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/source/portable/NetworkInterface/STM32/Drivers/H7/stm32h7xx_hal_eth.c b/source/portable/NetworkInterface/STM32/Drivers/H7/stm32h7xx_hal_eth.c index a6682eb57e..0bec68fbb5 100644 --- a/source/portable/NetworkInterface/STM32/Drivers/H7/stm32h7xx_hal_eth.c +++ b/source/portable/NetworkInterface/STM32/Drivers/H7/stm32h7xx_hal_eth.c @@ -1101,18 +1101,23 @@ heth->RxDescList.RxDataLength = 0; } - /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */ - bufflength = READ_BIT( dmarxdesc->DESC3, ETH_DMARXNDESCWBF_PL ) - heth->RxDescList.RxDataLength; - /* Check if last descriptor */ if( READ_BIT( dmarxdesc->DESC3, ETH_DMARXNDESCWBF_LD ) != ( uint32_t ) RESET ) { + /* PL is valid on the last descriptor and contains the total frame length. */ + bufflength = READ_BIT( dmarxdesc->DESC3, ETH_DMARXNDESCWBF_PL ) - heth->RxDescList.RxDataLength; + /* Save Last descriptor index */ heth->RxDescList.pRxLastRxDesc = dmarxdesc->DESC3; /* Packet ready */ rxdataready = 1; } + else + { + /* PL is not a per-segment length on intermediate descriptors. */ + bufflength = heth->Init.RxBuffLen; + } /* Link data */ #if ( USE_HAL_ETH_REGISTER_CALLBACKS == 1 )