serial: zs: Fix a transmit lockup in console output

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>
This commit is contained in:
Maciej W. Rozycki 2016-01-30 09:11:46 +00:00 committed by Greg Kroah-Hartman
parent bdc5f30095
commit fff21fac75

View File

@ -1181,6 +1181,10 @@ static void zs_console_write(struct console *co, const char *s,
if (txint & TxINT_ENAB) { if (txint & TxINT_ENAB) {
zport->regs[1] |= TxINT_ENAB; zport->regs[1] |= TxINT_ENAB;
write_zsreg(zport, R1, zport->regs[1]); 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); spin_unlock_irqrestore(&scc->zlock, flags);
} }