Re: [PATCH] serial: pl011: UPSTAT_AUTORTS requires .throttle/unthrottle

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jun 8, 2022 at 11:04 AM Ilpo Järvinen
<ilpo.jarvinen@xxxxxxxxxxxxxxx> wrote:
> Hi Nuno,
>
> It seems I managed to put the .throttle and .unthrottle into the wrong
> ops within amba-pl011.c. I'm sorry about the extra trouble. This patch has
> a bit higher likelihood of doing something useful to the problem:
>
> From: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
> [PATCH v3] serial: pl011: UPSTAT_AUTORTS requires .throttle/unthrottle
>
> The driver must provide throttle and unthrottle in uart_ops when it
> sets UPSTAT_AUTORTS. Add them using existing stop_rx &
> enable_interrupts functions.
>
> Reported-by: Nuno Gonçalves <nunojpg@xxxxxxxxx>
> Fixes: 2a76fa283098 (serial: pl011: Adopt generic flag to store auto RTS status)
> Cc: Lukas Wunner <lukas@xxxxxxxxx>
> Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>
>
> ---
>  drivers/tty/serial/amba-pl011.c | 23 +++++++++++++++++++++--
>  1 file changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c
> index 97ef41cb2721..16a21422ddce 100644
> --- a/drivers/tty/serial/amba-pl011.c
> +++ b/drivers/tty/serial/amba-pl011.c
> @@ -1367,6 +1367,15 @@ static void pl011_stop_rx(struct uart_port *port)
>         pl011_dma_rx_stop(uap);
>  }
>
> +static void pl011_throttle_rx(struct uart_port *port)
> +{
> +       unsigned long flags;
> +
> +       spin_lock_irqsave(&port->lock, flags);
> +       pl011_stop_rx(port);
> +       spin_unlock_irqrestore(&port->lock, flags);
> +}
> +
>  static void pl011_enable_ms(struct uart_port *port)
>  {
>         struct uart_amba_port *uap =
> @@ -1788,9 +1797,10 @@ static int pl011_allocate_irq(struct uart_amba_port *uap)
>   */
>  static void pl011_enable_interrupts(struct uart_amba_port *uap)
>  {
> +       unsigned long flags;
>         unsigned int i;
>
> -       spin_lock_irq(&uap->port.lock);
> +       spin_lock_irqsave(&uap->port.lock, flags);
>
>         /* Clear out any spuriously appearing RX interrupts */
>         pl011_write(UART011_RTIS | UART011_RXIS, uap, REG_ICR);
> @@ -1812,7 +1822,14 @@ static void pl011_enable_interrupts(struct uart_amba_port *uap)
>         if (!pl011_dma_rx_running(uap))
>                 uap->im |= UART011_RXIM;
>         pl011_write(uap->im, uap, REG_IMSC);
> -       spin_unlock_irq(&uap->port.lock);
> +       spin_unlock_irqrestore(&uap->port.lock, flags);
> +}
> +
> +static void pl011_unthrottle_rx(struct uart_port *port)
> +{
> +       struct uart_amba_port *uap = container_of(port, struct uart_amba_port, port);
> +
> +       pl011_enable_interrupts(uap);
>  }
>
>  static int pl011_startup(struct uart_port *port)
> @@ -2225,6 +2242,8 @@ static const struct uart_ops amba_pl011_pops = {
>         .stop_tx        = pl011_stop_tx,
>         .start_tx       = pl011_start_tx,
>         .stop_rx        = pl011_stop_rx,
> +       .throttle       = pl011_throttle_rx,
> +       .unthrottle     = pl011_unthrottle_rx,
>         .enable_ms      = pl011_enable_ms,
>         .break_ctl      = pl011_break_ctl,
>         .startup        = pl011_startup,
>
> --
> tg: (f2906aa86338..) pl011/add-throttle (depends on: tty-next)

Works great, thanks.

Tested-by: Nuno Gonçalves <nunojpg@xxxxxxxxx>

Thanks,
Nuno




[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux PPP]     [Linux FS]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Linmodem]     [Device Mapper]     [Linux Kernel for ARM]

  Powered by Linux