[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