On Mon, Jun 24, 2019 at 02:35:40PM +0200, Geert Uytterhoeven wrote: [..] > diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c > index d4504daff99263f5..d18c680aa64b3427 100644 > --- a/drivers/tty/serial/sh-sci.c > +++ b/drivers/tty/serial/sh-sci.c > @@ -1656,11 +1656,18 @@ static void sci_free_dma(struct uart_port *port) > > static void sci_flush_buffer(struct uart_port *port) > { > + struct sci_port *s = to_sci_port(port); > + > /* > * In uart_flush_buffer(), the xmit circular buffer has just been > - * cleared, so we have to reset tx_dma_len accordingly. > + * cleared, so we have to reset tx_dma_len accordingly, and stop any > + * pending transfers > */ > - to_sci_port(port)->tx_dma_len = 0; > + s->tx_dma_len = 0; > + if (s->chan_tx) { > + dmaengine_terminate_async(s->chan_tx); > + s->cookie_tx = -EINVAL; > + } I am seeing a similar solution being employed by other tty/serial drivers [1]. One major difference is that those drivers make use of dmaengine_terminate_all(). Since the latter is deprecated starting with commit [2], the API choice looks reasonable to me. Reviewed-by: Eugeniu Rosca <erosca@xxxxxxxxxxxxxx> Tested-by: Eugeniu Rosca <erosca@xxxxxxxxxxxxxx> [1] git grep -W "static void.*flush_buffer" -- drivers/tty/serial/ | grep dmaengine_terminate drivers/tty/serial/fsl_lpuart.c- dmaengine_terminate_all(sport->dma_tx_chan); drivers/tty/serial/imx.c- dmaengine_terminate_all(sport->dma_chan_tx); drivers/tty/serial/serial-tegra.c- dmaengine_terminate_all(tup->tx_dma_chan); [2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=b36f09c3c441a6 ("dmaengine: Add transfer termination synchronization support") -- Best Regards, Eugeniu.