From 20f70ddd6558a39a89dba4af675686c5a8dbd7b3 Mon Sep 17 00:00:00 2001 From: Jonas Bonn Date: Thu, 25 Nov 2010 02:30:28 +0000 Subject: [PATCH] ethoc: Double check pending RX packet An interrupt may occur between checking bd.stat and clearing the interrupt source register which would result in the packet going totally unnoticed as the interrupt will be missed. Double check bd.stat after clearing the interrupt source register to guard against such an occurrence. Signed-off-by: Jonas Bonn Signed-off-by: David S. Miller --- drivers/net/ethoc.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c index db444a73e4b1..a12a07ea02b6 100644 --- a/drivers/net/ethoc.c +++ b/drivers/net/ethoc.c @@ -414,8 +414,19 @@ static int ethoc_rx(struct net_device *dev, int limit) entry = priv->num_tx + (priv->cur_rx % priv->num_rx); ethoc_read_bd(priv, entry, &bd); - if (bd.stat & RX_BD_EMPTY) - break; + if (bd.stat & RX_BD_EMPTY) { + ethoc_ack_irq(priv, INT_MASK_RX); + /* If packet (interrupt) came in between checking + * BD_EMTPY and clearing the interrupt source, then we + * risk missing the packet as the RX interrupt won't + * trigger right away when we reenable it; hence, check + * BD_EMTPY here again to make sure there isn't such a + * packet waiting for us... + */ + ethoc_read_bd(priv, entry, &bd); + if (bd.stat & RX_BD_EMPTY) + break; + } if (ethoc_update_rx_stats(priv, &bd) == 0) { int size = bd.stat >> 16; -- 2.45.2