Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -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);
}
}