Skip to content
  • Geoff Levand's avatar
    net/ps3: Fix gelic RX DMA restart · ecae42d3
    Geoff Levand authored
    
    
    Fix the condition where PS3 network RX hangs when no network
    TX is occurring by calling gelic_card_enable_rxdmac() during
    RX_DMA_CHAIN_END event processing.
    
    The gelic hardware automatically clears its RX_DMA_EN flag when
    it detects an RX_DMA_CHAIN_END event.  In its processing of
    RX_DMA_CHAIN_END the gelic driver is required to set RX_DMA_EN
    (with a call to gelic_card_enable_rxdmac()) to restart RX DMA
    transfers.  The existing gelic driver code does not set
    RX_DMA_EN directly in its processing of the RX_DMA_CHAIN_END
    event, but uses a flag variable card->rx_dma_restart_required
    to schedule the setting of RX_DMA_EN until next inside the
    interrupt handler.
    
    It seems this delayed setting of RX_DMA_EN causes the hang since
    the next RX interrupt after the RX_DMA_CHAIN_END event where
    RX_DMA_EN is scheduled to be set will not occur since RX_DMA_EN
    was not set.  In the case were network TX is occuring, RX_DMA_EN
    is set in the next TX interrupt and RX processing continues.
    
    Signed-off-by: default avatarGeoff Levand <geoff@infradead.org>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ecae42d3