Every now and then I see "spurious interrupt 34" messages on octeon
serial console. The root cause seems to be in comstart() which enables
the TX holding register empty interrupt before writing data to the TX
register. If the register is empty initially, the early enabling can
trigger a premature interrupt.
The message does not appear when the enabling is done after the data
writing. The change has not caused ill effects on amd64, i386 and sgi
machines that I used for testing. OK?
Index: dev/ic/com.c
===================================================================
RCS file: src/sys/dev/ic/com.c,v
retrieving revision 1.158
diff -u -p -r1.158 com.c
--- dev/ic/com.c 14 Sep 2014 14:17:24 -0000 1.158
+++ dev/ic/com.c 8 Apr 2016 10:11:59 -0000
@@ -1013,12 +1013,6 @@ comstart(struct tty *tp)
bus_space_write_1(iot, ioh, com_isr, ISR_SEND);
#endif
- /* Enable transmit completion interrupts. */
- if (!ISSET(sc->sc_ier, IER_ETXRDY)) {
- SET(sc->sc_ier, IER_ETXRDY);
- bus_space_write_1(iot, ioh, com_ier, sc->sc_ier);
- }
-
if (ISSET(sc->sc_hwflags, COM_HW_FIFO)) {
u_char buffer[128]; /* largest fifo */
int i, n;
@@ -1031,6 +1025,12 @@ comstart(struct tty *tp)
bzero(buffer, n);
} else if (tp->t_outq.c_cc != 0)
bus_space_write_1(iot, ioh, com_data, getc(&tp->t_outq));
+
+ /* Enable transmit completion interrupts. */
+ if (!ISSET(sc->sc_ier, IER_ETXRDY)) {
+ SET(sc->sc_ier, IER_ETXRDY);
+ bus_space_write_1(iot, ioh, com_ier, sc->sc_ier);
+ }
out:
splx(s);
return;