[realtek] Oversize ethernet frame causes chip to hang?

Loh Kok Meng kokmeng@celestix.com
Thu, 17 May 2001 12:16:22 +0800


Hi,

I'm using version 1.13 of rtl8139.c and I've been getting oversized
ethernet frames very often in my system and it causes the network driver
to lock up. I believe my problems are what you (and many others in the
list) have experienced.

I've tried the reset code mentioned to no avail. However, I went back to
an older version of rtl8139.c - version 1.08 and the problems went away.
You might want to give it a try and see if it works for you.

Regards,
KokMeng Loh
Celestix Networks

Lynn Winebarger wrote:
> 
> On Tue, 15 May 2001, Donald Becker wrote:
> > On Mon, 14 May 2001, Lynn Winebarger wrote:
> >
> > >    I've been having problems with oversize ethernet frames, and noticed
> > > this code in the driver:
> >
> > What driver version are you using?
> >
>    1.13 with a patch suggested on the list (included at the end).
> 
> > Yes.  The code immediately below resets the receiver:
> >
> >       /* Reset the receiver, based on RealTek recommendation. (Bug?) */
> >       tp->cur_rx = 0;
> >       outb(CmdTxEnb, ioaddr + ChipCmd);
> >       /* A.C.: Reset the multicast list. */
> >       set_rx_mode(dev);
> >       outb(CmdRxEnb | CmdTxEnb, ioaddr + ChipCmd);
> >
> > The reason for the comment is that the documentation implies that the
> > chip should continue operation without a reset.
> 
>    I can report that the device stops responding (without going down), but
> an ifdown/ifup resumes operation.  With 2 cards in the machine, 1 of cards
> getting an oversize frame seems to cause the other card to experience a
> memory squeeze (and then it appears to go down for all intents and
> purposes).  We have about 10 machines with 2 of these cards in each,
> though only 2 or three get heavily used.
>    Does this code go right after A.C's comment?
>    Is there any way to track down what's putting in an oversize frame?
> 
> Lynn
> 
> diff -Naur linux-2.2.19/drivers/net/rtl8139.c
> linux-2.2.19-mod/drivers/net/rtl8139.c
> --- linux-2.2.19/drivers/net/rtl8139.c  Tue Jan  9 01:20:15 2001
> +++ linux-2.2.19-mod/drivers/net/rtl8139.c      Sat Apr 14 01:56:09 2001
> @@ -24,7 +24,7 @@
> 
>  /* These identify the driver base version and may not be removed. */
>  static const char versionA[] =
> -"rtl8139.c:v1.13 1/9/2001 Donald Becker, becker@scyld.com.\n";
> +"rtl8139.c:v1.13a 1/9/2001 Donald Becker, becker@scyld.com.\n";
>  static const char versionB[] =
>  " http://www.scyld.com/network/rtl8139.html\n";
> 
> @@ -1186,6 +1186,23 @@
>                                 printk(" %2.2x", rx_ring[ring_offset +
> i]);
>                         printk(".\n");
>                 }
> +
> +               /* E. Gill */
> +               /* Note from BSD driver:
> +                * Here's a totally undocumented fact for you. When the
> +                * RealTek chip is in the process of copying a packet into
> +                * RAM for you, the length will be 0xfff0. If you spot a
> +                * packet header with this value, you need to stop. The
> +                * datasheet makes absolutely no mention of this and
> +                * RealTek should be shot for this.
> +                */
> +               if (rx_size == 0xfff0)
> +                       {
> +                               if (debug > 1)
> +                                       printk(KERN_DEBUG"%s: Tried
> copying when chip was copying"
> +                                                  , dev->name);
> +                               break;
> +                       }
>                 if (rx_status &
> (RxBadSymbol|RxRunt|RxTooLong|RxCRCErr|RxBadAlign)) {
>                         if (debug > 1)
>                                 printk(KERN_DEBUG"%s: Ethernet frame had
> errors,"
> 
> _______________________________________________
> realtek mailing list
> realtek@scyld.com
> http://www.scyld.com/mailman/listinfo/realtek