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@gmail.com Signed-off-by: Shubhrajyoti Datta shubhrajyoti.datta@xilinx.com Signed-off-by: Greg Kroah-Hartman gregkh@linuxfoundation.org Cc: stable stable@vger.kernel.org # 4.19 Signed-off-by: Mathieu Poirier mathieu.poirier@linaro.org Signed-off-by: Sasha Levin sashal@kernel.org
@@ -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.
Best regards, Pavel