Subject: Re: zs crazy interrupts
To: Charles M. Hannum <mycroft@mit.edu>
From: Chuck Silvers <chuq@chuq.com>
List: port-sparc
Date: 04/08/1998 11:43:33
I tried this patch, but it still gets the stray interrupts.

-Chuck


"Charles M. Hannum" writes:
> 
> Actually, what Matt said isn't quite right.  I didn't just think it
> was unneeded; I also tested it fairly heavily on a SPARCclassic and
> was unable to reproduce the problem.
> 
> What I *think* is happening is the following:
> 
> The zs chip in the SS1 (and possibly SS1+ and SS2) is latching the
> interrupt line.  There's a window between when zscnputc() is called
> and when the chip finishes sending the console character, where the
> interrupt may be delivered but there will be no TX bit set in RR3.
> This causes the `crazy interrupt'.
> 
> Assuming that this is the problem, the correct thing to do is to send
> a ZSRW0_RESET_TXINT in zscnputc() if we had to wait for the TX bit.
> 
> 
> I'd appreciate it if someone who has one of these machines, and who
> can reproduce the problem, would test this.
> 
> 
> *** zs.c.orig	Sun Mar 29 21:39:35 1998
> --- zs.c	Wed Apr  8 13:56:31 1998
> ***************
> *** 748,751 ****
> --- 748,761 ----
>   	s = splhigh();
>   
> + 	/*
> + 	 * If there was a transmission in process, and thus TIE is set, we
> + 	 * will get a TX interrupt after this character is sent (replacing any
> + 	 * that may have been pending when we entered this routine).  This
> + 	 * guarantees that the normal transmission will continue.
> + 	 *
> + 	 * If there was no transmission in process, TIE will not be set, and
> + 	 * we will not get a TX interrupt.
> + 	 */
> + 
>   	/* Wait for transmitter to become ready. */
>   	do {
> ***************
> *** 753,756 ****
> --- 763,770 ----
>   		ZS_DELAY();
>   	} while ((rr0 & ZSRR0_TX_READY) == 0);
> + 
> + 	/* Reset interrupt latch on some chips. */
> + 	zc->zc_csr = ZSWR0_RESET_TXINT;
> + 	ZS_DELAY();
>   
>   	zc->zc_data = c;
> 
>