On 8/20/26 11:25, Padmarao Begari wrote:
The MRMAC Rx path drops frames when two arrive back to back. recv()
always starts at rx_bd[0] and clears the status of both descriptors,
and the status field is the only record that a frame arrived, so the
second frame is lost without any error being reported. This shows up
with multiple boards on a switch, where the extra traffic makes
back-to-back arrivals common and network transfers time out.

Fixing that needs an Rx ring the driver can index, so the series first
makes the ring scalable and then fixes the bug:

   1-3  Independent cleanups: check memalign() failures, give the
        driver its own Rx buffer pool instead of borrowing the shared
        net_rx_packets[], and read the link speed from the standard
        max-speed property.

   4-6  Make the descriptor ring scale: index the contiguous BD blocks
        directly, build the Rx chain in a loop over RX_DESC, and
        program CURDESC only once the ring is complete in memory.

   7    Track the descriptor to consume next in rx_bd_idx and take
        completion from the per-descriptor COMPLETE bit, so a
        descriptor goes back to hardware only after the network stack
        has read it.

   8    Size the Rx ring from ETH_PACKETS_BATCH_RECV, so a full
        eth_rx() call can be served without hardware running out of
        descriptors.

Padmarao Begari (8):
   net: mrmac: check memalign() return values
   net: mrmac: use a driver-owned RX buffer pool
   net: mrmac: switch to max-speed property
   net: mrmac: use contiguous BD arrays
   net: mrmac: initialize the Rx BD ring in a loop
   net: mrmac: write CURDESC after ring setup
   net: mrmac: fix Rx packet loss on back-to-back frames
   net: mrmac: increase the Rx BD ring

  drivers/net/xilinx_axi_mrmac.c | 235 +++++++++++++++++----------------
  drivers/net/xilinx_axi_mrmac.h |  20 ++-
  2 files changed, 137 insertions(+), 118 deletions(-)


Applied.
M

Reply via email to