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;
}