• D
    dma: mmp_pdma: only complete one transaction from dma_do_tasklet() · b721f9e8
    Daniel Mack 提交于
    Currently, when an interrupt has occured for a channel, the tasklet
    worker code will only look at the very last entry in the running list
    and complete its cookie, and then dispose the entire running chain.
    Hence, the first transaction's cookie will never complete.
    
    In fact, the interrupt we should handle will be the one related to the
    first descriptor in the chain with the ENDIRQEN bit set, so complete
    the second transaction that is in fact still running.
    
    As a result, the driver can't currently handle multiple transactions on
    one chanel, and it's likely that no drivers exist that rely on this
    feature.
    
    Fix this by walking the running_chain and look for the first
    descriptor that has the interrupt-enable bit set. Only queue
    descriptors up to that point for completion handling, while leaving
    the rest intact. Also, only make the channel idle if the list is
    completely empty after such a cycle.
    Signed-off-by: NDaniel Mack <zonque@gmail.com>
    Signed-off-by: NVinod Koul <vinod.koul@intel.com>
    b721f9e8
mmp_pdma.c 24.6 KB