From 3b1735fba3aa3e2c0da1a59ed8636b37240d8635 Mon Sep 17 00:00:00 2001 From: Dale Farnsworth Date: Tue, 11 Apr 2006 18:24:26 -0700 Subject: [PATCH] --- yaml --- r: 25687 b: refs/heads/master c: 94843566d7119e049a72618a3c939d5c2be022c7 h: refs/heads/master i: 25685: 39b9203be408ec309373221354f833b3dffdc46f 25683: 713b7dbc2f38c03604a45b4a8a1024dbc701fb34 25679: 8904daae6daa72dfbe3fea3284fe5afddc2ced65 v: v3 --- [refs] | 2 +- trunk/drivers/net/mv643xx_eth.c | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 3a795e271a21..60801690a242 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5c5374087707d7848cb13f15e7c175daf346301c +refs/heads/master: 94843566d7119e049a72618a3c939d5c2be022c7 diff --git a/trunk/drivers/net/mv643xx_eth.c b/trunk/drivers/net/mv643xx_eth.c index 85ac42c85aa9..ea62a3e7d586 100644 --- a/trunk/drivers/net/mv643xx_eth.c +++ b/trunk/drivers/net/mv643xx_eth.c @@ -281,10 +281,16 @@ static void mv643xx_eth_tx_timeout_task(struct net_device *dev) { struct mv643xx_private *mp = netdev_priv(dev); - netif_device_detach(dev); + if (!netif_running(dev)) + return; + + netif_stop_queue(dev); + eth_port_reset(mp->port_num); eth_port_start(dev); - netif_device_attach(dev); + + if (mp->tx_ring_size - mp->tx_desc_count >= MAX_DESCS_PER_SKB) + netif_wake_queue(dev); } /** @@ -1186,7 +1192,12 @@ static int mv643xx_eth_start_xmit(struct sk_buff *skb, struct net_device *dev) BUG_ON(netif_queue_stopped(dev)); BUG_ON(skb == NULL); - BUG_ON(mp->tx_ring_size - mp->tx_desc_count < MAX_DESCS_PER_SKB); + + if (mp->tx_ring_size - mp->tx_desc_count < MAX_DESCS_PER_SKB) { + printk(KERN_ERR "%s: transmit with queue full\n", dev->name); + netif_stop_queue(dev); + return 1; + } if (has_tiny_unaligned_frags(skb)) { if ((skb_linearize(skb, GFP_ATOMIC) != 0)) {