Commit 20f70ddd authored by Jonas Bonn's avatar Jonas Bonn Committed by David S. Miller

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: default avatarJonas Bonn <jonas@southpole.se>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7438a545
...@@ -414,8 +414,19 @@ static int ethoc_rx(struct net_device *dev, int limit) ...@@ -414,8 +414,19 @@ static int ethoc_rx(struct net_device *dev, int limit)
entry = priv->num_tx + (priv->cur_rx % priv->num_rx); entry = priv->num_tx + (priv->cur_rx % priv->num_rx);
ethoc_read_bd(priv, entry, &bd); ethoc_read_bd(priv, entry, &bd);
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) if (bd.stat & RX_BD_EMPTY)
break; break;
}
if (ethoc_update_rx_stats(priv, &bd) == 0) { if (ethoc_update_rx_stats(priv, &bd) == 0) {
int size = bd.stat >> 16; int size = bd.stat >> 16;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment