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