Просмотр исходного кода

[PATCH] sky2: handle tx timeout

Put more logic in to try and handle transmit timeout recovery.

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Stephen Hemminger 19 лет назад
Родитель
Сommit
8cc048e338
1 измененных файлов с 14 добавлено и 3 удалено
  1. 14 3
      drivers/net/sky2.c

+ 14 - 3
drivers/net/sky2.c

@@ -661,7 +661,7 @@ static void sky2_qset(struct sky2_hw *hw, u16 q)
 /* Setup prefetch unit registers. This is the interface between
  * hardware and driver list elements
  */
-static inline void sky2_prefetch_init(struct sky2_hw *hw, u32 qaddr,
+static void sky2_prefetch_init(struct sky2_hw *hw, u32 qaddr,
 				      u64 addr, u32 last)
 {
 	sky2_write32(hw, Y2_QADDR(qaddr, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
@@ -1558,14 +1558,25 @@ out:
 static void sky2_tx_timeout(struct net_device *dev)
 {
 	struct sky2_port *sky2 = netdev_priv(dev);
+	struct sky2_hw *hw = sky2->hw;
+	unsigned txq = txqaddr[sky2->port];
 
 	if (netif_msg_timer(sky2))
 		printk(KERN_ERR PFX "%s: tx timeout\n", dev->name);
 
-	sky2_write32(sky2->hw, Q_ADDR(txqaddr[sky2->port], Q_CSR), BMU_STOP);
-	sky2_read32(sky2->hw, Q_ADDR(txqaddr[sky2->port], Q_CSR));
+	netif_stop_queue(dev);
+
+	sky2_write32(hw, Q_ADDR(txq, Q_CSR), BMU_STOP);
+	sky2_read32(hw, Q_ADDR(txq, Q_CSR));
+
+	sky2_write32(hw, Y2_QADDR(txq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET);
 
 	sky2_tx_clean(sky2);
+
+	sky2_qset(hw, txq);
+	sky2_prefetch_init(hw, txq, sky2->tx_le_map, TX_RING_SIZE - 1);
+
+	netif_wake_queue(dev);
 }