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 <[email protected]>
Tested-by: Eugeniu Rosca <[email protected]>

[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.

Reply via email to