wierd lockups on KNE100TX (DEC DC21142 (rev 65))
Donald Becker
becker@cesdis1.gsfc.nasa.gov
Sat Oct 2 20:33:09 1999
On Sat, 2 Oct 1999, Leslie Kuczynski wrote:
> We are also have DEC 21142/3 in Adaptec's 6911A/TX boards. We are using
> tulip version 91g. I am always able to hang the card by flooding it with
> packets using a ping -f.
> Sep 20 02:37:09 snms0251 kernel: eth2: Too much work during an interrupt,
> csr5=0xf06988c0.
> Finally, as a work around, I made the following modification to the source
> and it no longer hangs.
>
> --- tulip.c Wed Sep 22 09:25:37 1999
> +++ tulip.c.fix Sat Oct 2 18:22:35 1999
> @@ -2721,11 +2721,13 @@
> if (tulip_debug > 1)
> printk(KERN_WARNING "%s: Too much work during an
> interrupt, "
> "csr5=0x%8.8x.\n", dev->name, csr5);
> +#ifdef 0
> /* Acknowledge all interrupt sources. */
> outl(0x8001ffff, ioaddr + CSR5);
Ackkk! You just disabled the work limit!
If you want to do that just set max_work_limit to a large number.
The latest version of the driver has some special code for the 21143.
(It's actually slightly more complex -- see below.)
/* Acknowledge all interrupt sources. */
outl(0x8001ffff, ioaddr + CSR5);
+ outl(0x45240000, ioaddr + CSR11);
/* Acknowledge all interrupt sources. */
outl(0x8001ffff, ioaddr + CSR5);
The full code depends on a new flag named HAS_INTR_MITIGATION that's only
set for the 21143.
/* Acknowledge all interrupt sources. */
outl(0x8001ffff, ioaddr + CSR5);
if (tp->flags & HAS_INTR_MITIGATION)
outl(0x45240000, ioaddr + CSR11);
else {
/* Mask all interrupting sources, set timer to re-enable. */
outl(((~csr5) & 0x0001ebef) | AbnormalIntr | TimerInt,
ioaddr + CSR7);
outl(12, ioaddr + CSR11);
}
Donald Becker
At Scyld Computing Corporation, becker@tidalwave.net
At USRA-CESDIS, becker@cesdis.gsfc.nasa.gov