Hi, On Wed, Jan 29, 2020 at 02:40:06PM +0100, Martin Fuzzey wrote: > There is a DMA problem with the serial ports on i.MX6. > > When the following sequence is performed: > > 1) Open a port > 2) Write some data > 3) Close the port > 4) Open a *different* port > 5) Write some data > 6) Close the port > > The second write sends nothing and the second close hangs. > If the first close() is omitted it works. > > Adding logs to the the UART driver shows that the DMA is being setup but > the callback is never invoked for the second write. > > This used to work in 4.19. > > Git bisect leads to: > ad0d92d: "dmaengine: imx-sdma: refine to load context only once" > > This commit adds a "context_loaded" flag used to avoid unnecessary context > setups. > However the flag is only reset in sdma_channel_terminate_work(), > which is only invoked in a worker triggered by sdma_terminate_all() IF > there is an active descriptor. > > So, if no active descriptor remains when the channel is terminated, the > flag is not reset and, when the channel is later reused the old context > is used. > > Fix the problem by always resetting the flag in sdma_free_chan_resources(). > > Fixes: ad0d92d: "dmaengine: imx-sdma: refine to load context only once" > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Martin Fuzzey <martin.fuzzey@flowbird.group> > Thanks for the patch! We were chasing this issue for days and just found your patch as we were preparing our (quite similar) solution for submission ;-) I've successfully tested your patch on a custom i.MX6Solo board. Therefore feel free to add Tested-by: Richard Leitner <richard.leitner@xxxxxxxxxxx> regards;rl