Subject: Re: ex0 wedges after long uptime?
To: Michael L. Hitch <mhitch@lightning.msu.montana.edu>
From: Matthias Drochner <M.Drochner@fz-juelich.de>
List: port-alpha
Date: 12/07/1999 14:14:13
mhitch@lightning.msu.montana.edu said:
>   It gets 0x2001, which would appear to be 'window 1', and
> S_INTR_LATCH. 
> [...]
>   It would appear that the EtherLinkXL gets into some state where it's
> got an interrupt without an indication in the status register, so the
> interrupt never gets cleared.

It seems that "S_INTR_LATCH" _is_ such an indication, and
other drivers for that hardware handle it that way.
The appended patch could help - can you try it?

Someone with documentation (hi Frank!) might want to comment on this...

best regards
Matthias


Index: elinkxl.c
===================================================================
RCS file: /cvsroot/syssrc/sys/dev/ic/elinkxl.c,v
retrieving revision 1.20
diff -c -r1.20 elinkxl.c
*** elinkxl.c	1999/11/19 10:42:48	1.20
--- elinkxl.c	1999/12/07 12:53:49
***************
*** 1109,1121 ****
  	}
  	for (;;) {
  		stat = bus_space_read_2(iot, ioh, ELINK_STATUS);
! 		if (!(stat & S_MASK))
  			break;
  		/*
  		 * Acknowledge interrupts.
  		 */
  		bus_space_write_2(iot, ioh, ELINK_COMMAND, ACK_INTR |
! 				      (stat & S_MASK));
  		if (sc->intr_ack)
  		    (*sc->intr_ack)(sc);
  		ret = 1;
--- 1109,1121 ----
  	}
  	for (;;) {
  		stat = bus_space_read_2(iot, ioh, ELINK_STATUS);
! 		if (!(stat & (S_MASK | S_INTR_LATCH)))
  			break;
  		/*
  		 * Acknowledge interrupts.
  		 */
  		bus_space_write_2(iot, ioh, ELINK_COMMAND, ACK_INTR |
! 				      (stat & (S_MASK | S_INTR_LATCH)));
  		if (sc->intr_ack)
  		    (*sc->intr_ack)(sc);
  		ret = 1;