Browse Source

8139cp: implement the missing dev->tx_timeout

Signed-off-by: Mika Lansirinne <mika.lansirinne@stonesoft.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Francois Romieu 18 years ago
parent
commit
9030c0d24d
1 changed files with 24 additions and 3 deletions
  1. 24 3
      drivers/net/8139cp.c

+ 24 - 3
drivers/net/8139cp.c

@@ -26,7 +26,6 @@
 
 
 	TODO:
 	TODO:
 	* Test Tx checksumming thoroughly
 	* Test Tx checksumming thoroughly
-	* Implement dev->tx_timeout
 
 
 	Low priority TODO:
 	Low priority TODO:
 	* Complete reset on PciErr
 	* Complete reset on PciErr
@@ -1218,6 +1217,30 @@ static int cp_close (struct net_device *dev)
 	return 0;
 	return 0;
 }
 }
 
 
+static void cp_tx_timeout(struct net_device *dev)
+{
+	struct cp_private *cp = netdev_priv(dev);
+	unsigned long flags;
+	int rc;
+
+	printk(KERN_WARNING "%s: Transmit timeout, status %2x %4x %4x %4x\n",
+	       dev->name, cpr8(Cmd), cpr16(CpCmd),
+	       cpr16(IntrStatus), cpr16(IntrMask));
+
+	spin_lock_irqsave(&cp->lock, flags);
+
+	cp_stop_hw(cp);
+	cp_clean_rings(cp);
+	rc = cp_init_rings(cp);
+	cp_start_hw(cp);
+
+	netif_wake_queue(dev);
+
+	spin_unlock_irqrestore(&cp->lock, flags);
+
+	return;
+}
+
 #ifdef BROKEN
 #ifdef BROKEN
 static int cp_change_mtu(struct net_device *dev, int new_mtu)
 static int cp_change_mtu(struct net_device *dev, int new_mtu)
 {
 {
@@ -1923,10 +1946,8 @@ static int cp_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
 	dev->change_mtu = cp_change_mtu;
 	dev->change_mtu = cp_change_mtu;
 #endif
 #endif
 	dev->ethtool_ops = &cp_ethtool_ops;
 	dev->ethtool_ops = &cp_ethtool_ops;
-#if 0
 	dev->tx_timeout = cp_tx_timeout;
 	dev->tx_timeout = cp_tx_timeout;
 	dev->watchdog_timeo = TX_TIMEOUT;
 	dev->watchdog_timeo = TX_TIMEOUT;
-#endif
 
 
 #if CP_VLAN_TAG_USED
 #if CP_VLAN_TAG_USED
 	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
 	dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;