Message ID | 1290606058-26703-6-git-send-email-jonas@southpole.se |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
From: Jonas Bonn <jonas@southpole.se> Date: Wed, 24 Nov 2010 14:40:55 +0100 > 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 <jonas@southpole.se> ... > + if (bd.stat & RX_BD_EMPTY) Trailing whitespace. > + break; > + > + } Unnecessary empty line. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c index 7d1b5d8..5afa934 100644 --- a/drivers/net/ethoc.c +++ b/drivers/net/ethoc.c @@ -417,8 +417,20 @@ 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;
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 <jonas@southpole.se> --- drivers/net/ethoc.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-)