Netboot Mailing List (by thread)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Patch for Tulip etherboot driver

Hello all,

I've had a problem with the Tulip driver on the Linksys LNE100TX.

Actually, there were 2 different problems.

I believe these problems may exist with other cards as well.

Problem #1:

   If the card receives a bad packet, the driver doesn't care, it
   goes ahead and accepts it anyway.

   We found that during the kernel download, we would get crc errors
   while uncompressing the kernel.

   We found the cause of the bad packet was a flakey patch cable.
   we could get it to fail every time.

   While I realize that the cable should be replaced, I also think
   that the driver should be robust enough to handle the bad packet.

Problem #2

   During our testing, we setup 6 workstations, all with LNE100TX's
   We would boot them all at the same time.  We saw random kernel
   panics during the boot sequence.  Talking with Ken Yap about this,
   he suggested that we uncommment the code in the tulip_disable
   routine, because the card was being left enabled, and it may have
   been interrupting the kernel when it shouldn't have been.

I've created a patch to fix both of the above problems.  The card
is now working very well for us.  We booted 6 workstations at
the same time over 40 times without a single problem.

The patch is against the 4.6.2 release.

Please go ahead and give it a try, and if you see a better way
to handle the problems, please let me know.

Jim McQuillan
--- src/tulip.c	Tue Jul  4 23:20:36 2000
+++ src/	Tue Jul  4 23:21:54 2000
@@ -40,6 +40,10 @@
+  04 Jul 2000	jam     ?
+     Added test of status after receiving a packet from the card.
+     Also uncommented the tulip_disable routine.  Stray packets
+     seemed to be causing problems.
   27 Apr 2000	njl	?
   29 Feb 2000   mdc     0.75b7
      Increased reset delay to 3 seconds because Macronix cards seem to
@@ -604,6 +608,13 @@
   nic->packetlen = (rxd[rxd_tail].status & 0x3FFF0000) >> 16;
+  if( rxd[rxd_tail].status & 0x00008000){
+      rxd[rxd_tail].status = 0x80000000;
+      rxd_tail++;
+      if (rxd_tail == NRXD) rxd_tail = 0;
+      return 0;
+  }
   /* copy packet to working buffer */
   /* XXX - this copy could be avoided with a little more work
      but for now we are content with it because the optimised
@@ -626,9 +637,6 @@
-  /* The other Etherboot drivers don't seem to do anything here,
-     so for now, we will not either */
-#if	0
   /* disable interrupts */
   outl(0x00000000, ioaddr + CSR7);
@@ -637,7 +645,6 @@
   /* Clear the missed-packet counter. */
   (volatile unsigned long)inl(ioaddr + CSR8);

For requests or suggestions regarding this mailing list archive please write to