提交 fff21fac 编写于 作者: M Maciej W. Rozycki 提交者: 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: NMaciej W. Rozycki <macro@linux-mips.org>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册