• Robert Jarzmik's avatar
    dmaengine: pxa_dma: fix residue corner case · 7b09a1bb
    Robert Jarzmik authored
    A very tiny temporal window exists in the residue calculation where :
     - upon entering residue calculation, the transfer is ongoing
     - when reading the current transfer pointer, it just changed to
       the "finisher/linker" descriptor
    
    In this case, the residue returned is the whole transfer length instead
    of 0. Fix it.
    
    This appears almost in one extreme case, where the driver is used
    by older clients which inquire for residue in interrupt context, such
    as the smsc91x ethernet driver, in a tight loop :
      interrupt_handler()
        dmaengine_submit()
        do {
          dmaengine_tx_status()
        } while (residue > 0 || status != DMA_ERROR)
    Signed-off-by: default avatarRobert Jarzmik <robert.jarzmik@free.fr>
    Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
    7b09a1bb
pxa_dma.c 39.9 KB