diff options
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 6d3d41934503..1c6bcad5b910 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -3387,8 +3387,8 @@ e1000_intr(int irq, void *data, struct pt_regs *regs) | |||
3387 | E1000_WRITE_REG(hw, IMC, ~0); | 3387 | E1000_WRITE_REG(hw, IMC, ~0); |
3388 | E1000_WRITE_FLUSH(hw); | 3388 | E1000_WRITE_FLUSH(hw); |
3389 | } | 3389 | } |
3390 | if (likely(netif_rx_schedule_prep(&adapter->polling_netdev[0]))) | 3390 | if (likely(netif_rx_schedule_prep(netdev))) |
3391 | __netif_rx_schedule(&adapter->polling_netdev[0]); | 3391 | __netif_rx_schedule(netdev); |
3392 | else | 3392 | else |
3393 | e1000_irq_enable(adapter); | 3393 | e1000_irq_enable(adapter); |
3394 | #else | 3394 | #else |
@@ -3431,34 +3431,26 @@ e1000_clean(struct net_device *poll_dev, int *budget) | |||
3431 | { | 3431 | { |
3432 | struct e1000_adapter *adapter; | 3432 | struct e1000_adapter *adapter; |
3433 | int work_to_do = min(*budget, poll_dev->quota); | 3433 | int work_to_do = min(*budget, poll_dev->quota); |
3434 | int tx_cleaned = 0, i = 0, work_done = 0; | 3434 | int tx_cleaned = 0, work_done = 0; |
3435 | 3435 | ||
3436 | /* Must NOT use netdev_priv macro here. */ | 3436 | /* Must NOT use netdev_priv macro here. */ |
3437 | adapter = poll_dev->priv; | 3437 | adapter = poll_dev->priv; |
3438 | 3438 | ||
3439 | /* Keep link state information with original netdev */ | 3439 | /* Keep link state information with original netdev */ |
3440 | if (!netif_carrier_ok(adapter->netdev)) | 3440 | if (!netif_carrier_ok(poll_dev)) |
3441 | goto quit_polling; | 3441 | goto quit_polling; |
3442 | 3442 | ||
3443 | while (poll_dev != &adapter->polling_netdev[i]) { | 3443 | /* e1000_clean is called per-cpu. This lock protects |
3444 | i++; | 3444 | * tx_ring[0] from being cleaned by multiple cpus |
3445 | BUG_ON(i == adapter->num_rx_queues); | 3445 | * simultaneously. A failure obtaining the lock means |
3446 | * tx_ring[0] is currently being cleaned anyway. */ | ||
3447 | if (spin_trylock(&adapter->tx_queue_lock)) { | ||
3448 | tx_cleaned = e1000_clean_tx_irq(adapter, | ||
3449 | &adapter->tx_ring[0]); | ||
3450 | spin_unlock(&adapter->tx_queue_lock); | ||
3446 | } | 3451 | } |
3447 | 3452 | ||
3448 | if (likely(adapter->num_tx_queues == 1)) { | 3453 | adapter->clean_rx(adapter, &adapter->rx_ring[0], |
3449 | /* e1000_clean is called per-cpu. This lock protects | ||
3450 | * tx_ring[0] from being cleaned by multiple cpus | ||
3451 | * simultaneously. A failure obtaining the lock means | ||
3452 | * tx_ring[0] is currently being cleaned anyway. */ | ||
3453 | if (spin_trylock(&adapter->tx_queue_lock)) { | ||
3454 | tx_cleaned = e1000_clean_tx_irq(adapter, | ||
3455 | &adapter->tx_ring[0]); | ||
3456 | spin_unlock(&adapter->tx_queue_lock); | ||
3457 | } | ||
3458 | } else | ||
3459 | tx_cleaned = e1000_clean_tx_irq(adapter, &adapter->tx_ring[i]); | ||
3460 | |||
3461 | adapter->clean_rx(adapter, &adapter->rx_ring[i], | ||
3462 | &work_done, work_to_do); | 3454 | &work_done, work_to_do); |
3463 | 3455 | ||
3464 | *budget -= work_done; | 3456 | *budget -= work_done; |
@@ -3466,7 +3458,7 @@ e1000_clean(struct net_device *poll_dev, int *budget) | |||
3466 | 3458 | ||
3467 | /* If no Tx and not enough Rx work done, exit the polling mode */ | 3459 | /* If no Tx and not enough Rx work done, exit the polling mode */ |
3468 | if ((!tx_cleaned && (work_done == 0)) || | 3460 | if ((!tx_cleaned && (work_done == 0)) || |
3469 | !netif_running(adapter->netdev)) { | 3461 | !netif_running(poll_dev)) { |
3470 | quit_polling: | 3462 | quit_polling: |
3471 | netif_rx_complete(poll_dev); | 3463 | netif_rx_complete(poll_dev); |
3472 | e1000_irq_enable(adapter); | 3464 | e1000_irq_enable(adapter); |
@@ -4752,6 +4744,7 @@ static void | |||
4752 | e1000_netpoll(struct net_device *netdev) | 4744 | e1000_netpoll(struct net_device *netdev) |
4753 | { | 4745 | { |
4754 | struct e1000_adapter *adapter = netdev_priv(netdev); | 4746 | struct e1000_adapter *adapter = netdev_priv(netdev); |
4747 | |||
4755 | disable_irq(adapter->pdev->irq); | 4748 | disable_irq(adapter->pdev->irq); |
4756 | e1000_intr(adapter->pdev->irq, netdev, NULL); | 4749 | e1000_intr(adapter->pdev->irq, netdev, NULL); |
4757 | e1000_clean_tx_irq(adapter, adapter->tx_ring); | 4750 | e1000_clean_tx_irq(adapter, adapter->tx_ring); |