diff options
author | Claudiu Manoil <claudiu.manoil@freescale.com> | 2014-02-17 12:53:18 +0200 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-18 15:03:02 -0500 |
commit | c10650b661b6c43c82c8e91b1d0b9b6adcf7f7dc (patch) | |
tree | 7b245d214fd20ccd0e16ea1a586c1a2168744633 /drivers/bcma | |
parent | efeddce7ea7c75a53b3084d71db15657a00e94dc (diff) | |
download | linux-c10650b661b6c43c82c8e91b1d0b9b6adcf7f7dc.tar.bz2 |
gianfar: Add missing graceful reset steps and fixes
gfar_halt() and gfar_start() are responsible for stopping
and starting the DMA and the Rx/Tx hw rings. They implement
the support for the "graceful Rx/Tx stop/start" hw procedure,
and also disable/enable eTSEC's hw interrupts in the process.
The GRS/GTS procedure requires however to have the RQUEUE/TQUEUE
registers cleared first and to wait for a period of time for the
current frame to pass through the interface (around ~10ms for a
jumbo frame). Only then may the GTS and GRS bits from DMACTRL be
set to shut down the DMA, and finally the Tx_EN and Rx_EN bits in
MACCFG1 may be cleared to disable the Tx/Rx blocks.
The same register programming order applies to start the Rx/Tx:
enabling the RQUEUE/TQUEUE *before* clearing the GRS/GTS bits.
This is a HW recommendation in order to avoid a possible
controller "lock up" during graceful reset.
Cleanup the gfar_halt()/start() prototypes, to take priv instead
of ndev as their purpose is to operate on HW. Enabling the
RQUEUE/TQUEUE in the hw_init() is not needed anymore since
that's the job of gfar_start().
Signed-off-by: Claudiu Manoil <claudiu.manoil@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/bcma')
0 files changed, 0 insertions, 0 deletions