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;