• Andy Shevchenko's avatar
    dmaengine: idma64: improve residue estimation · 0b23a1ec
    Andy Shevchenko authored
    The residue calculation may provide a wrong estimation when the transfer is
    started. There are possible scenarios we have to separate:
    
    	1) the transfer is not started yet; residue is equal to the total
    	   length;
    
    	2) the transfer is just started (first chunk is ongoing); residue is
    	   equal to the total length without already transfered bytes;
    
    	3) the transfer is ongoing and we already sent few chunks of data;
    	   residue is equal to the total length without fully transfered chunks
    	   and already sent bytes.
    
    Mistakenly the calculation in cases 2) and 3) was done in the similar way and
    the result is equal to -bytes that have been transfered, i.e. quite big since
    size_t type can't keep negative values.
    
    Rewrite the calculation algorithm to be one pass and have a correct result.
    
    Besides above in case user asks for a status of the active DMA descriptor
    without pausing an ongoing transfer the residue will be estimated based on the
    register value, though it's still racy. Since the transfer is active the value
    is continuously being changed. Here we have to read two registers at a time. To
    minimize an error make those reads close to each other.
    Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
    0b23a1ec
idma64.c 17.9 KB