Commit fff21fac authored by Maciej W. Rozycki's avatar Maciej W. Rozycki Committed by Greg Kroah-Hartman

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: default avatarMaciej W. Rozycki <macro@linux-mips.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent bdc5f300
...@@ -1181,6 +1181,10 @@ static void zs_console_write(struct console *co, const char *s, ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment