lkml.org 
[lkml]   [2000]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [2.3.99-pre3] via-rhine.o died again!
Hello,

I tried your patch, and I also compiled pre2 with pre3/7 prepatch. You
know, your case is pretty interesting :)

pre3/7 works perfectly, as it is the latest patch with the LDK1.1.2 code.

After adding the code between #if 1 and #endif, and also the single line a
bit farther, everything started to work. But after investigating that it
should display some descriptor %i errors, I don't see any! I don't seem to
get any message in /var/log/dmesg, so I tried putting a single
printk(KERN_ERR "blah"); just after the if loop (to check where it's
written), and I saw a lot of "blah"'s on screen. (I'm testing this with
via-rhine compiled as a module; much faster to test changes).

dmesg | grep Descriptor says nothing too.

Result: Like you said, it seems that by doing the "if" instruction, the
old value doesn't get wiped. The inside loop doesn't ever get run!! It's
weird, because it may suggest that the system runs too fast or
something.. like if the value wasn't written in memory.. but it's weird
since cpu_to_le32, after investigation, is only a way to swap between the
higher and lower 16-bits (I don't have much experience in kernel
coding/debugging).. or we'd have to wait after a timeout, but what
timeout?

It could be a bug in GCC 2.95.2, a bug that does an optimization
wrongly. I'm using this compiler. I haven't tested with egcs-1.1.2 yet
(and I don't have GCC 2.7.2.3 compiled at all)

My K6-2/450 isn't overclocked, runs at 100MHz bus speed at 4.5x.

--
[TWD]insomnia



On Mon, 27 Mar 2000, Urban Widmark wrote:

> On Fri, 24 Mar 2000, Jean-Luc Pedneault wrote:
>
> > After shutting down the eth0 interface many times, removed the driver,
> > reloaded the driver, reactivated the eth0 interface, the very same error
> > keeps getting back every time I send the first packet:
> >
> > ---<snip>---
> > eth0: Oversized Ethernet frame spanned multiple buffers, entry 0x1 length
> > 0 status 00000000!
> > eth0: Oversized Ethernet frame c73ec010 vs c73ec010.
> > ---<snip>---
>
> Hello
>
> Still having this problem? I think you got dropped from our
> off-list-silly-ideas discussion (most of them mine :)
>
> Below is a patch vs pre3 that have removed the problem for Justin Guyett,
> but it is kind of wierd ... (sorry Justin, but it is :)
>
> If you could try this vs 2.3.99-pre3, with and without the #if 1 and let
> me know if it helps you too. And check your dmesg if you get the
> "Descriptor %i's next_desc is 0!" message.
>
> Also, you said K6-2/450. Any overclocking of the bus or cpu?
> (Just checking ...)
>
> And if anyone else are reading this and ...
> ... has the same problem with 2.3.99-pre3 please test&report.
> ... have good ideas on why a value that was just written is no longer
> there, except if you add an if or printk then the value written
> "stays" written.
> The card doesn't yet know the address of np->rx_ring, nor does it have
> any interrupts enabled. The data was allocated using
> pci_alloc_consistent (__get_free_pages).
>
> The np->dirty_rx should be there (I forgot to put it back when putting
> some other things back as they were), but shouldn't affect this problem.
>
> If the patch below doesn't work, try removing the "np->rx_ring[i].next_desc ="
> inside the if statement, leaving just the printk.
>
> Thanks.
>
> /Urban
>
> --- linux-2.3.99-pre3-patchup/drivers/net/via-rhine.c Sat Mar 25 12:28:13 2000
> +++ linux/drivers/net/via-rhine.c Mon Mar 27 22:26:55 2000
> @@ -786,6 +786,16 @@
> np->rx_ring[i].desc_length = cpu_to_le32(np->rx_buf_sz);
> np->rx_ring[i].next_desc =
> cpu_to_le32(np->rx_ring_dma + sizeof(struct rx_desc)*(i+1));
> +#if 1
> + if(np->rx_ring[i].next_desc == 0) {
> + /* XXX This is wierd ... we just set it, but it is back to 0!
> + This is a dirty fix to get around a real problem. But
> + what is the real problem? */
> + printk(KERN_ERR "Descriptor %i's next_desc is 0!\n", i);
> + np->rx_ring[i].next_desc =
> + cpu_to_le32(np->rx_ring_dma + sizeof(struct rx_desc)*(i+1));
> + }
> +#endif
> np->rx_skbuff[i] = 0;
> }
> /* Mark the last entry as wrapping the ring. */
> @@ -806,6 +816,7 @@
> np->rx_ring[i].addr = cpu_to_le32(np->rx_skbuff_dma[i]);
> np->rx_ring[i].rx_status = cpu_to_le32(DescOwn);
> }
> + np->dirty_rx = (unsigned int)(i - RX_RING_SIZE);
>
> for (i = 0; i < TX_RING_SIZE; i++) {
> np->tx_skbuff[i] = 0;
>


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:57    [W:0.058 / U:0.776 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site