diff --git a/[refs] b/[refs] index c92ed4816b16..cd8ff0afa428 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7438a5455734d109fdf18d97147dc57a6dbe5a44 +refs/heads/master: 20f70ddd6558a39a89dba4af675686c5a8dbd7b3 diff --git a/trunk/drivers/net/ethoc.c b/trunk/drivers/net/ethoc.c index db444a73e4b1..a12a07ea02b6 100644 --- a/trunk/drivers/net/ethoc.c +++ b/trunk/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;