• Codrin Ciubotariu's avatar
    dmaengine: at_xdmac: Fix wrongfull report of a channel as in use · dc3f595b
    Codrin Ciubotariu authored
    atchan->status variable is used to store two different information:
     - pass channel interrupts status from interrupt handler to tasklet;
     - channel information like whether it is cyclic or paused;
    
    This causes a bug when device_terminate_all() is called,
    (AT_XDMAC_CHAN_IS_CYCLIC cleared on atchan->status) and then a late End
    of Block interrupt arrives (AT_XDMAC_CIS_BIS), which sets bit 0 of
    atchan->status. Bit 0 is also used for AT_XDMAC_CHAN_IS_CYCLIC, so when
    a new descriptor for a cyclic transfer is created, the driver reports
    the channel as in use:
    
    if (test_and_set_bit(AT_XDMAC_CHAN_IS_CYCLIC, &atchan->status)) {
    	dev_err(chan2dev(chan), "channel currently used\n");
    	return NULL;
    }
    
    This patch fixes the bug by adding a different struct member to keep
    the interrupts status separated from the channel status bits.
    
    Fixes: e1f7c9ee ("dmaengine: at_xdmac: creation of the atmel eXtended DMA Controller driver")
    Signed-off-by: default avatarCodrin Ciubotariu <codrin.ciubotariu@microchip.com>
    Acked-by: default avatarLudovic Desroches <ludovic.desroches@microchip.com>
    Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
    dc3f595b
at_xdmac.c 65.8 KB