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. Thanks, Jim McQuillan jam@ltsp.org
--- src/tulip.c Tue Jul 4 23:20:36 2000 +++ src/tulip.c.new 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 @@ { whereami("tulip_disable\n"); - /* 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); -#endif } /*********************************************************************/
For requests or suggestions regarding this mailing list archive please write to netboot@gkminix.han.de.