This is an automated email from the ASF dual-hosted git repository.

xiaoxiang781216 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 2223e407d11 drivers/net: e1000, igb, igc: keep the RX ring in step 
when dropping.
2223e407d11 is described below

commit 2223e407d11711b6eafcef32580359f4bfedc34a
Author: raiden00pl <[email protected]>
AuthorDate: Thu Oct 15 16:06:42 2026 +0200

    drivers/net: e1000, igb, igc: keep the RX ring in step when dropping.
    
    On its last pass the RX drop loop moved rx_now past a received
    descriptor without returning it to the NIC.  The driver then ran one
    descriptor ahead of the hardware until RDT equalled RDH and RX stopped
    for good.  Stop the loop before consuming a descriptor it cannot clean.
    
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: raiden00pl <[email protected]>
---
 drivers/net/e1000.c | 3 ++-
 drivers/net/igb.c   | 3 ++-
 drivers/net/igc.c   | 3 ++-
 3 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/drivers/net/e1000.c b/drivers/net/e1000.c
index 2ce32ff36db..7f6c0276f23 100644
--- a/drivers/net/e1000.c
+++ b/drivers/net/e1000.c
@@ -709,7 +709,8 @@ static FAR netpkt_t *e1000_receive(FAR struct 
netdev_lowerhalf_s *dev)
 
           desc = priv->rx_now;
           rx   = &priv->rx[desc];
-          if (!(rx->status & E1000_RDESC_STATUS_DD))
+          if (!(rx->status & E1000_RDESC_STATUS_DD) ||
+              i == E1000_RX_DESC - 1)
             {
               break;
             }
diff --git a/drivers/net/igb.c b/drivers/net/igb.c
index e36d70496a3..0392abd317a 100644
--- a/drivers/net/igb.c
+++ b/drivers/net/igb.c
@@ -685,7 +685,8 @@ static FAR netpkt_t *igb_receive(FAR struct 
netdev_lowerhalf_s *dev)
 
           desc = priv->rx_now;
           rx   = &priv->rx[desc];
-          if (!(rx->status & IGB_RDESC_STATUS_DD))
+          if (!(rx->status & IGB_RDESC_STATUS_DD) ||
+              i == IGB_RX_DESC - 1)
             {
               break;
             }
diff --git a/drivers/net/igc.c b/drivers/net/igc.c
index 5fcc7c76fda..cf3bf9af0c2 100644
--- a/drivers/net/igc.c
+++ b/drivers/net/igc.c
@@ -661,7 +661,8 @@ static FAR netpkt_t *igc_receive(FAR struct 
netdev_lowerhalf_s *dev)
 
           desc = priv->rx_now;
           rx   = &priv->rx[desc];
-          if (!(rx->status & IGC_RDESC_STATUS_DD))
+          if (!(rx->status & IGC_RDESC_STATUS_DD) ||
+              i == IGC_RX_DESC - 1)
             {
               break;
             }

Reply via email to