Skip to content

Commit

Permalink
ethoc: Double check pending RX packet
Browse files Browse the repository at this point in the history
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>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Jonas Bonn authored and David S. Miller committed Nov 28, 2010
1 parent 7438a54 commit 20f70dd
Showing 1 changed file with 13 additions and 2 deletions.
15 changes: 13 additions & 2 deletions drivers/net/ethoc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 20f70dd

Please sign in to comment.