dmaengine: pxa_dma: fix residue corner case
authorRobert Jarzmik <robert.jarzmik@free.fr>
Wed, 30 Sep 2015 17:42:15 +0000 (19:42 +0200)
committerVinod Koul <vinod.koul@intel.com>
Thu, 1 Oct 2015 02:14:31 +0000 (07:44 +0530)
commit7b09a1bba4091a9d208481d7831682a1f3061ab9
treef9681f78e175c16b76ffcab80daac533aa6b5be6
parente87ffbdf06971a80ad2a11217200bdd936195af1
dmaengine: pxa_dma: fix residue corner case

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: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
drivers/dma/pxa_dma.c