• Claudiu Manoil's avatar
    gianfar: Add missing graceful reset steps and fixes · c10650b6
    Claudiu Manoil authored
    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: default avatarClaudiu Manoil <claudiu.manoil@freescale.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    c10650b6
gianfar.h 39.3 KB