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:
parent
bdc5f30095
commit
fff21fac75
1 changed files with 4 additions and 0 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue