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