aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/mv643xx_eth.c40
1 files changed, 18 insertions, 22 deletions
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
index e592fac87068..1ceed8798618 100644
--- a/drivers/net/mv643xx_eth.c
+++ b/drivers/net/mv643xx_eth.c
@@ -449,15 +449,10 @@ static void txq_disable(struct tx_queue *txq)
449static void __txq_maybe_wake(struct tx_queue *txq) 449static void __txq_maybe_wake(struct tx_queue *txq)
450{ 450{
451 struct mv643xx_eth_private *mp = txq_to_mp(txq); 451 struct mv643xx_eth_private *mp = txq_to_mp(txq);
452 452 struct netdev_queue *nq = netdev_get_tx_queue(mp->dev, txq->index);
453 /*
454 * netif_{stop,wake}_queue() flow control only applies to
455 * the primary queue.
456 */
457 BUG_ON(txq->index != 0);
458 453
459 if (txq->tx_ring_size - txq->tx_desc_count >= MAX_SKB_FRAGS + 1) 454 if (txq->tx_ring_size - txq->tx_desc_count >= MAX_SKB_FRAGS + 1)
460 netif_wake_queue(mp->dev); 455 netif_tx_wake_queue(nq);
461} 456}
462 457
463 458
@@ -827,8 +822,11 @@ static int mv643xx_eth_xmit(struct sk_buff *skb, struct net_device *dev)
827{ 822{
828 struct mv643xx_eth_private *mp = netdev_priv(dev); 823 struct mv643xx_eth_private *mp = netdev_priv(dev);
829 struct net_device_stats *stats = &dev->stats; 824 struct net_device_stats *stats = &dev->stats;
825 int queue;
830 struct tx_queue *txq; 826 struct tx_queue *txq;
827 struct netdev_queue *nq;
831 unsigned long flags; 828 unsigned long flags;
829 int entries_left;
832 830
833 if (has_tiny_unaligned_frags(skb) && __skb_linearize(skb)) { 831 if (has_tiny_unaligned_frags(skb) && __skb_linearize(skb)) {
834 stats->tx_dropped++; 832 stats->tx_dropped++;
@@ -838,15 +836,16 @@ static int mv643xx_eth_xmit(struct sk_buff *skb, struct net_device *dev)
838 return NETDEV_TX_BUSY; 836 return NETDEV_TX_BUSY;
839 } 837 }
840 838
841 spin_lock_irqsave(&mp->lock, flags); 839 queue = skb_get_queue_mapping(skb);
840 txq = mp->txq + queue;
841 nq = netdev_get_tx_queue(dev, queue);
842 842
843 txq = mp->txq; 843 spin_lock_irqsave(&mp->lock, flags);
844 844
845 if (txq->tx_ring_size - txq->tx_desc_count < MAX_SKB_FRAGS + 1) { 845 if (txq->tx_ring_size - txq->tx_desc_count < MAX_SKB_FRAGS + 1) {
846 spin_unlock_irqrestore(&mp->lock, flags); 846 spin_unlock_irqrestore(&mp->lock, flags);
847 if (txq->index == 0 && net_ratelimit()) 847 if (net_ratelimit())
848 dev_printk(KERN_ERR, &dev->dev, 848 dev_printk(KERN_ERR, &dev->dev, "tx queue full?!\n");
849 "primary tx queue full?!\n");
850 kfree_skb(skb); 849 kfree_skb(skb);
851 return NETDEV_TX_OK; 850 return NETDEV_TX_OK;
852 } 851 }
@@ -856,13 +855,9 @@ static int mv643xx_eth_xmit(struct sk_buff *skb, struct net_device *dev)
856 stats->tx_packets++; 855 stats->tx_packets++;
857 dev->trans_start = jiffies; 856 dev->trans_start = jiffies;
858 857
859 if (txq->index == 0) { 858 entries_left = txq->tx_ring_size - txq->tx_desc_count;
860 int entries_left; 859 if (entries_left < MAX_SKB_FRAGS + 1)
861 860 netif_tx_stop_queue(nq);
862 entries_left = txq->tx_ring_size - txq->tx_desc_count;
863 if (entries_left < MAX_SKB_FRAGS + 1)
864 netif_stop_queue(dev);
865 }
866 861
867 spin_unlock_irqrestore(&mp->lock, flags); 862 spin_unlock_irqrestore(&mp->lock, flags);
868 863
@@ -2169,10 +2164,10 @@ static void tx_timeout_task(struct work_struct *ugly)
2169 2164
2170 mp = container_of(ugly, struct mv643xx_eth_private, tx_timeout_task); 2165 mp = container_of(ugly, struct mv643xx_eth_private, tx_timeout_task);
2171 if (netif_running(mp->dev)) { 2166 if (netif_running(mp->dev)) {
2172 netif_stop_queue(mp->dev); 2167 netif_tx_stop_all_queues(mp->dev);
2173 port_reset(mp); 2168 port_reset(mp);
2174 port_start(mp); 2169 port_start(mp);
2175 netif_wake_queue(mp->dev); 2170 netif_tx_wake_all_queues(mp->dev);
2176 } 2171 }
2177} 2172}
2178 2173
@@ -2546,7 +2541,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
2546 return -ENODEV; 2541 return -ENODEV;
2547 } 2542 }
2548 2543
2549 dev = alloc_etherdev(sizeof(struct mv643xx_eth_private)); 2544 dev = alloc_etherdev_mq(sizeof(struct mv643xx_eth_private), 8);
2550 if (!dev) 2545 if (!dev)
2551 return -ENOMEM; 2546 return -ENOMEM;
2552 2547
@@ -2559,6 +2554,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev)
2559 mp->dev = dev; 2554 mp->dev = dev;
2560 2555
2561 set_params(mp, pd); 2556 set_params(mp, pd);
2557 dev->real_num_tx_queues = mp->txq_count;
2562 2558
2563 spin_lock_init(&mp->lock); 2559 spin_lock_init(&mp->lock);
2564 2560