mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
gianfar: Fix race between gfar_error() and gfar_start_xmit()
gfar_error() can arrive at the middle of gfar_start_xmit() processing, and so it can trigger transfers of BDs that we don't yet expect to be transmitted. Fix this by locking the tx queues in gfar_error(). Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> Acked-by: Kumar Gala <galak@kernel.crashing.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
499428ed28
commit
836cf7faf8
1 changed files with 8 additions and 0 deletions
|
@ -2943,14 +2943,22 @@ static irqreturn_t gfar_error(int irq, void *grp_id)
|
|||
if (events & IEVENT_CRL)
|
||||
dev->stats.tx_aborted_errors++;
|
||||
if (events & IEVENT_XFUN) {
|
||||
unsigned long flags;
|
||||
|
||||
if (netif_msg_tx_err(priv))
|
||||
printk(KERN_DEBUG "%s: TX FIFO underrun, "
|
||||
"packet dropped.\n", dev->name);
|
||||
dev->stats.tx_dropped++;
|
||||
priv->extra_stats.tx_underrun++;
|
||||
|
||||
local_irq_save(flags);
|
||||
lock_tx_qs(priv);
|
||||
|
||||
/* Reactivate the Tx Queues */
|
||||
gfar_write(®s->tstat, gfargrp->tstat);
|
||||
|
||||
unlock_tx_qs(priv);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
if (netif_msg_tx_err(priv))
|
||||
printk(KERN_DEBUG "%s: Transmit Error\n", dev->name);
|
||||
|
|
Loading…
Reference in a new issue