diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-09 11:05:12 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-01-09 11:05:12 -0500 |
| commit | fd0b45dfd1858c6b49d06355a460bcf36d654c06 (patch) | |
| tree | 85386a76355b398b7f452b737af4ab48f116677a /drivers/net/e1000e/netdev.c | |
| parent | fcfd50afb6e94c8cf121ca4e7e3e7166bae7c6aa (diff) | |
| parent | 1c9b7aa1eb40ab708ef3242f74b9a61487623168 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (36 commits)
[ATM]: Check IP header validity in mpc_send_packet
[IPV6]: IPV6_MULTICAST_IF setting is ignored on link-local connect()
[CONNECTOR]: Don't touch queue dev after decrement of ref count.
[SOCK]: Adds a rcu_dereference() in sk_filter
[XFRM]: xfrm_algo_clone() allocates too much memory
[FORCEDETH]: Fix reversing the MAC address on suspend.
[NET]: mcs7830 passes msecs instead of jiffies to usb_control_msg
[LRO] Fix lro_mgr->features checks
[NET]: Clone the sk_buff 'iif' field in __skb_clone()
[IPV4] ROUTE: ip_rt_dump() is unecessary slow
[NET]: kaweth was forgotten in msec switchover of usb_start_wait_urb
[NET] Intel ethernet drivers: update MAINTAINERS
[NET]: Make ->poll() breakout consistent in Intel ethernet drivers.
[NET]: Stop polling when napi_disable() is pending.
[NET]: Fix drivers to handle napi_disable() disabling interrupts.
[NETXEN]: Fix ->poll() done logic.
mac80211: return an error when SIWRATE doesn't match any rate
ssb: Fix probing of PCI cores if PCI and PCIE core is available
[NET]: Do not check netif_running() and carrier state in ->poll()
[NET]: Add NAPI_STATE_DISABLE.
...
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
| -rw-r--r-- | drivers/net/e1000e/netdev.c | 14 |
1 files changed, 4 insertions, 10 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 4fd2e23720b6..4a6fc7453776 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
| @@ -1384,30 +1384,24 @@ static int e1000_clean(struct napi_struct *napi, int budget) | |||
| 1384 | { | 1384 | { |
| 1385 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); | 1385 | struct e1000_adapter *adapter = container_of(napi, struct e1000_adapter, napi); |
| 1386 | struct net_device *poll_dev = adapter->netdev; | 1386 | struct net_device *poll_dev = adapter->netdev; |
| 1387 | int tx_cleaned = 0, work_done = 0; | 1387 | int work_done = 0; |
| 1388 | 1388 | ||
| 1389 | /* Must NOT use netdev_priv macro here. */ | 1389 | /* Must NOT use netdev_priv macro here. */ |
| 1390 | adapter = poll_dev->priv; | 1390 | adapter = poll_dev->priv; |
| 1391 | 1391 | ||
| 1392 | /* Keep link state information with original netdev */ | ||
| 1393 | if (!netif_carrier_ok(poll_dev)) | ||
| 1394 | goto quit_polling; | ||
| 1395 | |||
| 1396 | /* e1000_clean is called per-cpu. This lock protects | 1392 | /* e1000_clean is called per-cpu. This lock protects |
| 1397 | * tx_ring from being cleaned by multiple cpus | 1393 | * tx_ring from being cleaned by multiple cpus |
| 1398 | * simultaneously. A failure obtaining the lock means | 1394 | * simultaneously. A failure obtaining the lock means |
| 1399 | * tx_ring is currently being cleaned anyway. */ | 1395 | * tx_ring is currently being cleaned anyway. */ |
| 1400 | if (spin_trylock(&adapter->tx_queue_lock)) { | 1396 | if (spin_trylock(&adapter->tx_queue_lock)) { |
| 1401 | tx_cleaned = e1000_clean_tx_irq(adapter); | 1397 | e1000_clean_tx_irq(adapter); |
| 1402 | spin_unlock(&adapter->tx_queue_lock); | 1398 | spin_unlock(&adapter->tx_queue_lock); |
| 1403 | } | 1399 | } |
| 1404 | 1400 | ||
| 1405 | adapter->clean_rx(adapter, &work_done, budget); | 1401 | adapter->clean_rx(adapter, &work_done, budget); |
| 1406 | 1402 | ||
| 1407 | /* If no Tx and not enough Rx work done, exit the polling mode */ | 1403 | /* If budget not fully consumed, exit the polling mode */ |
| 1408 | if ((!tx_cleaned && (work_done < budget)) || | 1404 | if (work_done < budget) { |
| 1409 | !netif_running(poll_dev)) { | ||
| 1410 | quit_polling: | ||
| 1411 | if (adapter->itr_setting & 3) | 1405 | if (adapter->itr_setting & 3) |
| 1412 | e1000_set_itr(adapter); | 1406 | e1000_set_itr(adapter); |
| 1413 | netif_rx_complete(poll_dev, napi); | 1407 | netif_rx_complete(poll_dev, napi); |
