On 5.7.2019 9.17, Vinod Koul wrote: >> @@ -1840,18 +1847,40 @@ static enum dma_status edma_tx_status(struct dma_chan *chan, >> { >> struct edma_chan *echan = to_edma_chan(chan); >> struct virt_dma_desc *vdesc; >> + struct dma_tx_state txstate_tmp; >> enum dma_status ret; >> unsigned long flags; >> >> ret = dma_cookie_status(chan, cookie, txstate); >> - if (ret == DMA_COMPLETE || !txstate) >> + >> + /* Provide a dummy dma_tx_state for completion checking */ >> + if (ret != DMA_COMPLETE && !txstate) >> + txstate = &txstate_tmp; >> + >> + if (ret == DMA_COMPLETE) >> return ret; > > why not do: > > if (ret == DMA_COMPLETE) > return ret; > > if (!txstate) > txstate = &txstate_tmp; > Indeed it is much cleaner this way. Will send an updated series next week. >> + txstate->residue = 0; >> spin_lock_irqsave(&echan->vchan.lock, flags); >> if (echan->edesc && echan->edesc->vdesc.tx.cookie == cookie) >> txstate->residue = edma_residue(echan->edesc); >> else if ((vdesc = vchan_find_desc(&echan->vchan, cookie))) >> txstate->residue = to_edma_desc(&vdesc->tx)->residue; >> + >> + /* >> + * Mark the cookie completed if the residue is 0 for non cyclic >> + * transfers >> + */ >> + if (ret != DMA_COMPLETE && !txstate->residue && >> + echan->edesc && echan->edesc->polled && >> + echan->edesc->vdesc.tx.cookie == cookie) { >> + edma_stop(echan); >> + vchan_cookie_complete(&echan->edesc->vdesc); >> + echan->edesc = NULL; >> + edma_execute(echan); >> + ret = DMA_COMPLETE; >> + } >> + >> spin_unlock_irqrestore(&echan->vchan.lock, flags); >> >> return ret; >> -- >> Peter >> >> Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. >> Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki > -- Peter Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki. Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki