-
- Downloads
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>
Showing
- drivers/net/ethernet/freescale/gianfar.c 27 additions, 26 deletionsdrivers/net/ethernet/freescale/gianfar.c
- drivers/net/ethernet/freescale/gianfar.h 2 additions, 1 deletiondrivers/net/ethernet/freescale/gianfar.h
- drivers/net/ethernet/freescale/gianfar_ethtool.c 2 additions, 3 deletionsdrivers/net/ethernet/freescale/gianfar_ethtool.c
Loading
Please register or sign in to comment