mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-27 20:07:09 +00:00
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
@ -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);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user