[lkml]   [2000]   [Mar]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
Patch in this message
SubjectRe: [2.3.99-pre3] via-rhine.o died again!
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>---


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.



--- 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));
+ }
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
Please read the FAQ at

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