Messages in this thread Patch in this message | | | Date | Mon, 27 Mar 2000 23:21:22 +0200 (CEST) | From | Urban Widmark <> | Subject | Re: [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>---
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/
| |