]> git.karo-electronics.de Git - linux-beck.git/commitdiff
serial: zs: Fix a transmit lockup in console output
authorMaciej W. Rozycki <macro@linux-mips.org>
Sat, 30 Jan 2016 09:11:46 +0000 (09:11 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 7 Feb 2016 07:13:30 +0000 (23:13 -0800)
Transmit interrupts are disabled and the transmit buffer drained in the
course of console output so that polled transmission is possible.  That
however causes a lost transmit interrupt as the TxIP bit in RR3 is only
set on a transmit buffer full-to-empty transition and then iff transmit
interrupts are enabled at the same time.  Consequently if console output
disturbs a regular transmission in progress, the TxIP bit is never set
again and the transmission locks up waiting for a transmit interrupt.

Fix the problem by restarting transmission manually rather than waiting
for a transmit interrupt that will never happen.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/tty/serial/zs.c

index 2b65bb7ffb8a47ba642864a4c9870a14b0fb5a89..eeefd76a30da9c0f42700267fdec035ac7fad494 100644 (file)
@@ -1181,6 +1181,10 @@ static void zs_console_write(struct console *co, const char *s,
        if (txint & TxINT_ENAB) {
                zport->regs[1] |= TxINT_ENAB;
                write_zsreg(zport, R1, zport->regs[1]);
+
+               /* Resume any transmission as the TxIP bit won't be set.  */
+               if (!zport->tx_stopped)
+                       zs_raw_transmit_chars(zport);
        }
        spin_unlock_irqrestore(&scc->zlock, flags);
 }