On Fri, Apr 08, 2016 at 12:16:03PM +0000, Visa Hankala wrote:
> 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?
Any objections to this patch? The timing issue is generic, not specific
to octeon.
> 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;
>