diff options
| -rw-r--r-- | drivers/net/ixgb/ixgb_main.c | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c index 13181c4f1d20..466cbe208ef2 100644 --- a/drivers/net/ixgb/ixgb_main.c +++ b/drivers/net/ixgb/ixgb_main.c | |||
| @@ -449,6 +449,9 @@ ixgb_probe(struct pci_dev *pdev, | |||
| 449 | #ifdef NETIF_F_TSO | 449 | #ifdef NETIF_F_TSO |
| 450 | netdev->features |= NETIF_F_TSO; | 450 | netdev->features |= NETIF_F_TSO; |
| 451 | #endif | 451 | #endif |
| 452 | #ifdef NETIF_F_LLTX | ||
| 453 | netdev->features |= NETIF_F_LLTX; | ||
| 454 | #endif | ||
| 452 | 455 | ||
| 453 | if(pci_using_dac) | 456 | if(pci_using_dac) |
| 454 | netdev->features |= NETIF_F_HIGHDMA; | 457 | netdev->features |= NETIF_F_HIGHDMA; |
| @@ -1408,13 +1411,26 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 1408 | return 0; | 1411 | return 0; |
| 1409 | } | 1412 | } |
| 1410 | 1413 | ||
| 1414 | #ifdef NETIF_F_LLTX | ||
| 1415 | local_irq_save(flags); | ||
| 1416 | if (!spin_trylock(&adapter->tx_lock)) { | ||
| 1417 | /* Collision - tell upper layer to requeue */ | ||
| 1418 | local_irq_restore(flags); | ||
| 1419 | return NETDEV_TX_LOCKED; | ||
| 1420 | } | ||
| 1421 | #else | ||
| 1411 | spin_lock_irqsave(&adapter->tx_lock, flags); | 1422 | spin_lock_irqsave(&adapter->tx_lock, flags); |
| 1423 | #endif | ||
| 1424 | |||
| 1412 | if(unlikely(IXGB_DESC_UNUSED(&adapter->tx_ring) < DESC_NEEDED)) { | 1425 | if(unlikely(IXGB_DESC_UNUSED(&adapter->tx_ring) < DESC_NEEDED)) { |
| 1413 | netif_stop_queue(netdev); | 1426 | netif_stop_queue(netdev); |
| 1414 | spin_unlock_irqrestore(&adapter->tx_lock, flags); | 1427 | spin_unlock_irqrestore(&adapter->tx_lock, flags); |
| 1415 | return 1; | 1428 | return NETDEV_TX_BUSY; |
| 1416 | } | 1429 | } |
| 1430 | |||
| 1431 | #ifndef NETIF_F_LLTX | ||
| 1417 | spin_unlock_irqrestore(&adapter->tx_lock, flags); | 1432 | spin_unlock_irqrestore(&adapter->tx_lock, flags); |
| 1433 | #endif | ||
| 1418 | 1434 | ||
| 1419 | if(adapter->vlgrp && vlan_tx_tag_present(skb)) { | 1435 | if(adapter->vlgrp && vlan_tx_tag_present(skb)) { |
| 1420 | tx_flags |= IXGB_TX_FLAGS_VLAN; | 1436 | tx_flags |= IXGB_TX_FLAGS_VLAN; |
| @@ -1426,6 +1442,9 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 1426 | tso = ixgb_tso(adapter, skb); | 1442 | tso = ixgb_tso(adapter, skb); |
| 1427 | if (tso < 0) { | 1443 | if (tso < 0) { |
| 1428 | dev_kfree_skb_any(skb); | 1444 | dev_kfree_skb_any(skb); |
| 1445 | #ifdef NETIF_F_LLTX | ||
| 1446 | spin_unlock_irqrestore(&adapter->tx_lock, flags); | ||
| 1447 | #endif | ||
| 1429 | return NETDEV_TX_OK; | 1448 | return NETDEV_TX_OK; |
| 1430 | } | 1449 | } |
| 1431 | 1450 | ||
| @@ -1439,7 +1458,15 @@ ixgb_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
| 1439 | 1458 | ||
| 1440 | netdev->trans_start = jiffies; | 1459 | netdev->trans_start = jiffies; |
| 1441 | 1460 | ||
| 1442 | return 0; | 1461 | #ifdef NETIF_F_LLTX |
| 1462 | /* Make sure there is space in the ring for the next send. */ | ||
| 1463 | if(unlikely(IXGB_DESC_UNUSED(&adapter->tx_ring) < DESC_NEEDED)) | ||
| 1464 | netif_stop_queue(netdev); | ||
| 1465 | |||
| 1466 | spin_unlock_irqrestore(&adapter->tx_lock, flags); | ||
| 1467 | |||
| 1468 | #endif | ||
| 1469 | return NETDEV_TX_OK; | ||
| 1443 | } | 1470 | } |
| 1444 | 1471 | ||
| 1445 | /** | 1472 | /** |
