gianfar: Move TxFIFO underrun handling to reset path
authorClaudiu Manoil <claudiu.manoil@freescale.com>
Wed, 6 May 2015 15:07:29 +0000 (18:07 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sat, 9 May 2015 21:37:46 +0000 (17:37 -0400)
commitbc602280871cdedc906f622b036f5799f16c13c2
tree4dd58bdadf78fc6036a4cd385f6582f3b750ea53
parent39d726b76c3981598b73790c4908bc290e2dc326
gianfar: Move TxFIFO underrun handling to reset path

Handle TxFIFO underrun exceptions outside the fast path.
A controller reset is more reliable in this exceptional
case, as opposed to re-enabling on-the-fly the Tx DMA.

As the controller reset is handled outside the fast path
by the reset_gfar() workqueue handler, the locking
scheme on the Tx path is significantly simplified.
Because the Tx processing (xmit queues and tx napi) is
disabled during controller reset, tstat access from xmit
does not require locking.  So the scope of the txlock on
the processing path is now reduced to num_txbdfree, which
is shared only between process context (xmit) and softirq
(clean_tx_ring).  As a result, the txlock must not guard
against interrupt context, and the spin_lock_irqsave()
from xmit can be replaced by spin_lock_bh().  Likewise,
the locking has been downgraded for clean_tx_ring().

Signed-off-by: Claudiu Manoil <claudiu.manoil@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/gianfar.c