On Thu, Feb 13, 2020 at 07:22:46PM +0100, Pavel Machek wrote: > Hi! > > > commit 277375b864e8147975b064b513f491e2a910e66a upstream > > > > In case the cable is not connected then the target gets into > > an infinite wait for tx empty. > > Add a timeout to the tx empty wait. > > Was this tested? Because it does not work... > > > Reported-by: Jean-Francois Dagenais <jeff.dagenais@xxxxxxxxx> > > Signed-off-by: Shubhrajyoti Datta <shubhrajyoti.datta@xxxxxxxxxx> > > Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > > Cc: stable <stable@xxxxxxxxxxxxxxx> # 4.19 > > Signed-off-by: Mathieu Poirier <mathieu.poirier@xxxxxxxxxx> > > Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx> > > > @@ -681,16 +683,20 @@ static void cdns_uart_set_termios(struct uart_port *port, > ... > > + int err; > > > > spin_lock_irqsave(&port->lock, flags); > > > > /* Wait for the transmit FIFO to empty before making changes */ > > if (!(readl(port->membase + CDNS_UART_CR) & > > CDNS_UART_CR_TX_DIS)) { > > - while (!(readl(port->membase + CDNS_UART_SR) & > > - CDNS_UART_SR_TXEMPTY)) { > > - cpu_relax(); > > + err = readl_poll_timeout(port->membase + CDNS_UART_SR, > > + val, (val & CDNS_UART_SR_TXEMPTY), > > + 1000, TX_TIMEOUT); > > + if (err) { > > + dev_err(port->dev, "timed out waiting for tx empty"); > > + return; > > } > > } > > > > It will return with lock held and interrupts disabled. Mainline takes > spinlock later, so it does not have a problem. > > Merging 107475685abfdee504bb0ef4824f15797f6d2d4d before this one > should fix the problem. Good catch, that's a mess. I'll go queue this up now. greg k-h