[prev in list] [next in list] [prev in thread] [next in thread] 

List:       linux-vortex
Subject:    Re: 3com vortex on dell crashing with Linux
From:       Richard Black <rjb () dcs ! gla ! ac ! uk>
Date:       1999-12-10 11:08:27
[Download RAW message or body]

This is a multipart MIME message.


kjd@duda.org said:

> Hi there,
> I have a bunch of Dells (Dimension XPS T500) with 3com vortex running
> RedHat-6.1 (kernel 2.2.12) experiencing the same symptoms you
> described last August in
>
>       http://www.tux.org/hypermail/linux-vortex-bug/1999-Aug/0028.html
>
> (I've included the full text you wrote below).
>
> I get a crash every few days.  The current solution I'm considering is
> to throw away all my 3com nics.
>
> Did you ever track this one down?  Do you have any suggestions?

Yes. I did track it down, and I also provided a fix to the vortex bug list, 
but the fix has not been incorporated.  My fix works.  Before it each machine 
had a crash every one or two days.  Since I wrote the patch below I have not 
had a single crash -- 106 days uptime.

> Thanks very much for any help you can provide, 

Patches to version 3c59x.c:v0.99L 5/28/99 below.

Enjoy.

Richard.


["foo" (text/plain)]

--- 3c59x.c	1999/08/25 19:38:21	1.2
+++ 3c59x.c	1999/08/26 09:00:11	1.4
@@ -116,11 +116,11 @@
 #else
 #define PCI_SUPPORT_VER2
 #endif
 #if LINUX_VERSION_CODE < 0x20159
-#define DEV_FREE_SKB(skb) dev_kfree_skb (skb, FREE_WRITE);
+#define DEV_FREE_SKB(skb) dev_kfree_skb (skb, FREE_WRITE)
 #else  /* Grrr, incompatible changes should change the name. */
-#define DEV_FREE_SKB(skb) dev_kfree_skb(skb);
+#define DEV_FREE_SKB(skb) dev_kfree_skb(skb)
 #endif
 #if ! defined(CAP_NET_ADMIN)
 #define capable(CAP_XXX) (suser())
 #endif
@@ -1655,9 +1655,13 @@
 		}
 		if (status & DMADone) {
 			if (inw(ioaddr + Wn7_MasterStatus) & 0x1000) {
 				outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */
-				DEV_FREE_SKB(vp->tx_skb); /* Release the transfered buffer */
+				if (vp->tx_skb) {
+					DEV_FREE_SKB(vp->tx_skb); /* Release the transfered buffer */
+					vp->tx_skb = NULL;
+				} else
+					printk(KERN_WARNING "vortex would have crashed here (RJB)\n");
 				if (inw(ioaddr + TxFree) > 1536) {
 					clear_bit(0, (void*)&dev->tbusy);
 					mark_bh(NET_BH);
 				} else /* Interrupt when FIFO has room for max-sized packet. */
@@ -1669,9 +1673,9 @@
 			if (status == 0xffff)
 				break;
 			vortex_error(dev, status);
 		}
-
+#if 0
 		if (--work_done < 0) {
 			if ((status & (0x7fe - (UpComplete | DownComplete))) == 0) {
 				/* Just ack these and return. */
 				outw(AckIntr | UpComplete | DownComplete, ioaddr + EL3_CMD);
@@ -1685,8 +1689,14 @@
 				/* The timer will reenable interrupts. */
 				break;
 			}
 		}
+#else
+		if (--work_done < 0)
+			if (((status & (0x7fe - (UpComplete | DownComplete))) != 0))
+				printk(KERN_WARNING "vortex would have locked up here (RJB)\n");
+#endif
+
 		/* Acknowledge the IRQ. */
 		outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD);
 		if (vp->cb_fn_base)			/* The PCMCIA people are idiots.  */
 			writel(0x8000, vp->cb_fn_base + 4);


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic