• Torsten Fleischer's avatar
    dmaengine: at_hdmac: Fix calculation of the residual bytes · bdf6c792
    Torsten Fleischer authored
    This patch fixes the following issues regarding to the calculation of the
    residue:
    
    1. The residue is always calculated for the current transfer even if the
    cookie is associated to a pending transfer.
    
    2. For scatter/gather DMA the calculation of the residue for the current
    transfer doesn't include the bytes of the child descriptors that are already
    transferred.
    It only calculates the difference between the transfer's total length minus
    the number of bytes that are already transferred for the current child
    descriptor.
    For example: There is a scatter/gather DMA transfer with a total length of
    1 MByte. Getting the residue several times while the transfer is running shows
    something like that:
    
    1: residue = 975584
    2: residue = 1002766
    3: residue = 992627
    4: residue = 983767
    5: residue = 985694
    6: residue = 1008094
    7: residue = 1009741
    8: residue = 1011195
    
    3. The driver stores the residue but never resets it when starting a new
    transfer.
    For example: If there are two subsequent DMA transfers. The first one with
    a total length of 1 MByte and the second one with a total length of 1 kByte.
    Getting the residue for both transfers shows something like that:
    
    transfer 1: residue = 975584
    transfer 2: residue = 1048380
    
    Changes from V1:
       * Fixed coding style of the multi-line comments.
       * Improved accuracy of the residue calculation when the transfer for the
         first descriptor is active.
    
    Changes from V2:
       * Member 'tx_width' of 'struct at_desc' restored, because the transfer width
         can't be derived from the source width when using "slave_sg".
         The transfer width is needed for the calculation of the residue if either
         the transfer of the first or the last descriptor is in progress.
         In the case of a "memory_to_memory_sg" transfer (part of this patch
         series) the transfer width of both descriptors may differ. Thus it is
         required to additionally set 'tx_width' of the last descriptor.
       * Added functions for multiply used calculations.
    Signed-off-by: default avatarTorsten Fleischer <torfl6749@gmail.com>
    Acked-by: default avatarNicolas Ferre <nicolas.ferre@atmel.com>
    Signed-off-by: default avatarVinod Koul <vinod.koul@intel.com>
    bdf6c792
at_hdmac.c 48.3 KB