Re: PROBLEM: Network hang: "eth0: Tx timed out (f0080), is buffer full?"

Jon Mason
2004-12-21T16:02:56Z

[-- Attachment #1: Type: text/plain, Size: 5290 bytes --]

Sorry, I was working off of the mm driver. I have verified that the
patch below will apply cleanly with the driver you provided (and the
previous patch applies cleanly to the 2.6.10-rc2-mm4 driver).

--- /root/dl2k.c,orig-save-2004.12.20 2004-12-21 09:46:56.877062552 -0600
+++ dl2k.c 2004-12-20 14:22:31.000000000 -0600
@@ -429,23 +431,14 @@ parse_eeprom (struct net_device *dev)
return 0;
}

-static int
-rio_open (struct net_device *dev)
+static void
+rio_up (struct net_device *dev)
{
- struct netdev_private *np = dev->priv;
+ struct netdev_private *np = netdev_priv(dev);
long ioaddr = dev->base_addr;
int i;
u16 macctrl;

- i = request_irq (dev->irq, &rio_interrupt, SA_SHIRQ, dev->name, dev);
- if (i)
- return i;
-
- /* Reset all logic functions */
- writew (GlobalReset | DMAReset | FIFOReset | NetworkReset | HostReset,
- ioaddr + ASICCtrl + 2);
- mdelay(10);
-
/* DebugCtrl bit 4, 5, 9 must set */
writel (readl (ioaddr + DebugCtrl) | 0x0230, ioaddr + DebugCtrl);

@@ -453,8 +446,6 @@ rio_open (struct net_device *dev)
if (np->jumbo != 0)
writew (MAX_JUMBO+14, ioaddr + MaxFrameSize);

- alloc_list (dev);
-
/* Get station address */
for (i = 0; i < 6; i++)
writeb (dev->dev_addr[i], ioaddr + StationAddr0 + i);
@@ -488,12 +479,6 @@ rio_open (struct net_device *dev)
ioaddr + MACCtrl);
}

- init_timer (&np->timer);
- np->timer.expires = jiffies + 1*HZ;
- np->timer.data = (unsigned long) dev;
- np->timer.function = &rio_timer;
- add_timer (&np->timer);
-
/* Start Tx/Rx */
writel (readl (ioaddr + MACCtrl) | StatsEnable | RxEnable | TxEnable,
ioaddr + MACCtrl);
@@ -505,10 +490,38 @@ rio_open (struct net_device *dev)
macctrl |= (np->rx_flow) ? RxFlowControlEnable : 0;
writew(macctrl, ioaddr + MACCtrl);

- netif_start_queue (dev);
-
/* Enable default interrupts */
EnableInt ();
+}
+
+static int
+rio_open (struct net_device *dev)
+{
+ struct netdev_private *np = netdev_priv(dev);
+ long ioaddr = dev->base_addr;
+ int i;
+
+ i = request_irq (dev->irq, &rio_interrupt, SA_SHIRQ, dev->name, dev);
+ if (i)
+ return i;
+
+ /* Reset all logic functions */
+ writew (GlobalReset | DMAReset | FIFOReset | NetworkReset | HostReset,
+ ioaddr + ASICCtrl + 2);
+ mdelay(10);
+
+ alloc_list (dev);
+
+ rio_up (dev);
+
+ init_timer (&np->timer);
+ np->timer.expires = jiffies + 1*HZ;
+ np->timer.data = (unsigned long) dev;
+ np->timer.function = &rio_timer;
+ add_timer (&np->timer);
+
+ netif_start_queue (dev);
+
return 0;
}

@@ -562,9 +575,11 @@ static void
rio_tx_timeout (struct net_device *dev)
{
long ioaddr = dev->base_addr;
+ struct netdev_private *np = dev->priv;

- printk (KERN_INFO "%s: Tx timed out (%4.4x), is buffer full?\n",
- dev->name, readl (ioaddr + TxStatus));
+ printk (KERN_INFO "%s: Tx timed out (%4.4x) %d %d %x %x\n",
+ dev->name, readl (ioaddr + TxStatus), np->cur_tx, np->cur_rx,
+ readl (ioaddr + MACCtrl), readw(ioaddr + IntEnable));
rio_free_tx(dev, 0);
dev->if_port = 0;
dev->trans_start = jiffies;
@@ -1005,10 +1020,13 @@ rio_error (struct net_device *dev, int i
/* PCI Error, a catastronphic error related to the bus interface
occurs, set GlobalReset and HostReset to reset. */
if (int_status & HostError) {
- printk (KERN_ERR "%s: HostError! IntStatus %4.4x.\n",
- dev->name, int_status);
+ printk (KERN_ERR "%s: HostError! IntStatus %4.4x. %d
%d %x %x\n",
+ dev->name, int_status, np->cur_tx, np->cur_rx,
+ readl (ioaddr + MACCtrl), readw(ioaddr + IntEnable));
writew (GlobalReset | HostReset, ioaddr + ASICCtrl + 2);
mdelay (500);
+
+ rio_up(dev);
}
}

On Tue, 21 Dec 2004 10:51:00 +0100, Richard Ems
<richard.ems@mtg-marinetechnik.de> wrote:
> The patch fails:
>
> # patch -p0 < ~ems/dl2k.patch
> patching file dl2k.c
> Hunk #1 FAILED at 431.
> Hunk #2 succeeded at 444 (offset -2 lines).
> Hunk #3 succeeded at 477 (offset -2 lines).
> Hunk #4 succeeded at 488 (offset -2 lines).
> Hunk #5 succeeded at 573 (offset -2 lines).
> Hunk #6 succeeded at 1018 (offset -2 lines).
> 1 out of 6 hunks FAILED -- saving rejects to file dl2k.c.rej
>
> I tried with --fuzz 9 but it didn't help.
>
> I attached SuSE's original dl2k.c
>
> Thanks, Richard
>
> --
> Richard Ems
> Tel: +49 40 65803 312
> Fax: +49 40 65803 392
> Richard.Ems@mtg-marinetechnik.de
>
> MTG Marinetechnik GmbH - Wandsbeker Königstr. 62 - D 22041 Hamburg
>
> GF Dipl.-Ing. Ullrich Keil
> Handelsregister: Abt. B Nr. 11 500 - Amtsgericht Hamburg Abt. 66
> USt.-IdNr.: DE 1186 70571

[-- Attachment #2: dl2k.patch2 --]
[-- Type: application/octet-stream, Size: 3411 bytes --]

--- /root/dl2k.c,orig-save-2004.12.20 2004-12-21 09:46:56.877062552 -0600
+++ dl2k.c 2004-12-20 14:22:31.000000000 -0600
@@ -429,23 +431,14 @@ parse_eeprom (struct net_device *dev)
return 0;
}

-static int
-rio_open (struct net_device *dev)
+static void
+rio_up (struct net_device *dev)
{
- struct netdev_private *np = dev->priv;
+ struct netdev_private *np = netdev_priv(dev);
long ioaddr = dev->base_addr;
int i;
u16 macctrl;

- i = request_irq (dev->irq, &rio_interrupt, SA_SHIRQ, dev->name, dev);
- if (i)
- return i;
-
- /* Reset all logic functions */
- writew (GlobalReset | DMAReset | FIFOReset | NetworkReset | HostReset,
- ioaddr + ASICCtrl + 2);
- mdelay(10);
-
/* DebugCtrl bit 4, 5, 9 must set */
writel (readl (ioaddr + DebugCtrl) | 0x0230, ioaddr + DebugCtrl);

@@ -453,8 +446,6 @@ rio_open (struct net_device *dev)
if (np->jumbo != 0)
writew (MAX_JUMBO+14, ioaddr + MaxFrameSize);

- alloc_list (dev);
-
/* Get station address */
for (i = 0; i < 6; i++)
writeb (dev->dev_addr[i], ioaddr + StationAddr0 + i);
@@ -488,12 +479,6 @@ rio_open (struct net_device *dev)
ioaddr + MACCtrl);
}

- init_timer (&np->timer);
- np->timer.expires = jiffies + 1*HZ;
- np->timer.data = (unsigned long) dev;
- np->timer.function = &rio_timer;
- add_timer (&np->timer);
-
/* Start Tx/Rx */
writel (readl (ioaddr + MACCtrl) | StatsEnable | RxEnable | TxEnable,
ioaddr + MACCtrl);
@@ -505,10 +490,38 @@ rio_open (struct net_device *dev)
macctrl |= (np->rx_flow) ? RxFlowControlEnable : 0;
writew(macctrl, ioaddr + MACCtrl);

- netif_start_queue (dev);
-
/* Enable default interrupts */
EnableInt ();
+}
+
+static int
+rio_open (struct net_device *dev)
+{
+ struct netdev_private *np = netdev_priv(dev);
+ long ioaddr = dev->base_addr;
+ int i;
+
+ i = request_irq (dev->irq, &rio_interrupt, SA_SHIRQ, dev->name, dev);
+ if (i)
+ return i;
+
+ /* Reset all logic functions */
+ writew (GlobalReset | DMAReset | FIFOReset | NetworkReset | HostReset,
+ ioaddr + ASICCtrl + 2);
+ mdelay(10);
+
+ alloc_list (dev);
+
+ rio_up (dev);
+
+ init_timer (&np->timer);
+ np->timer.expires = jiffies + 1*HZ;
+ np->timer.data = (unsigned long) dev;
+ np->timer.function = &rio_timer;
+ add_timer (&np->timer);
+
+ netif_start_queue (dev);
+
return 0;
}

@@ -562,9 +575,11 @@ static void
rio_tx_timeout (struct net_device *dev)
{
long ioaddr = dev->base_addr;
+ struct netdev_private *np = dev->priv;

- printk (KERN_INFO "%s: Tx timed out (%4.4x), is buffer full?\n",
- dev->name, readl (ioaddr + TxStatus));
+ printk (KERN_INFO "%s: Tx timed out (%4.4x) %d %d %x %x\n",
+ dev->name, readl (ioaddr + TxStatus), np->cur_tx, np->cur_rx,
+ readl (ioaddr + MACCtrl), readw(ioaddr + IntEnable));
rio_free_tx(dev, 0);
dev->if_port = 0;
dev->trans_start = jiffies;
@@ -1005,10 +1020,13 @@ rio_error (struct net_device *dev, int i
/* PCI Error, a catastronphic error related to the bus interface
occurs, set GlobalReset and HostReset to reset. */
if (int_status & HostError) {
- printk (KERN_ERR "%s: HostError! IntStatus %4.4x.\n",
- dev->name, int_status);
+ printk (KERN_ERR "%s: HostError! IntStatus %4.4x. %d %d %x %x\n",
+ dev->name, int_status, np->cur_tx, np->cur_rx,
+ readl (ioaddr + MACCtrl), readw(ioaddr + IntEnable));
writew (GlobalReset | HostReset, ioaddr + ASICCtrl + 2);
mdelay (500);
+
+ rio_up(dev);
}
}