diff options
Diffstat (limited to 'drivers/net/e1000')
-rw-r--r-- | drivers/net/e1000/e1000_ethtool.c | 8 | ||||
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 18 | ||||
-rw-r--r-- | drivers/net/e1000/e1000_param.c | 10 |
3 files changed, 30 insertions, 6 deletions
diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c index d6931cabe421..2a3b2dccd06d 100644 --- a/drivers/net/e1000/e1000_ethtool.c +++ b/drivers/net/e1000/e1000_ethtool.c | |||
@@ -1808,7 +1808,7 @@ static int e1000_get_coalesce(struct net_device *netdev, | |||
1808 | if (adapter->hw.mac_type < e1000_82545) | 1808 | if (adapter->hw.mac_type < e1000_82545) |
1809 | return -EOPNOTSUPP; | 1809 | return -EOPNOTSUPP; |
1810 | 1810 | ||
1811 | if (adapter->itr_setting <= 3) | 1811 | if (adapter->itr_setting <= 4) |
1812 | ec->rx_coalesce_usecs = adapter->itr_setting; | 1812 | ec->rx_coalesce_usecs = adapter->itr_setting; |
1813 | else | 1813 | else |
1814 | ec->rx_coalesce_usecs = 1000000 / adapter->itr_setting; | 1814 | ec->rx_coalesce_usecs = 1000000 / adapter->itr_setting; |
@@ -1826,12 +1826,14 @@ static int e1000_set_coalesce(struct net_device *netdev, | |||
1826 | return -EOPNOTSUPP; | 1826 | return -EOPNOTSUPP; |
1827 | 1827 | ||
1828 | if ((ec->rx_coalesce_usecs > E1000_MAX_ITR_USECS) || | 1828 | if ((ec->rx_coalesce_usecs > E1000_MAX_ITR_USECS) || |
1829 | ((ec->rx_coalesce_usecs > 3) && | 1829 | ((ec->rx_coalesce_usecs > 4) && |
1830 | (ec->rx_coalesce_usecs < E1000_MIN_ITR_USECS)) || | 1830 | (ec->rx_coalesce_usecs < E1000_MIN_ITR_USECS)) || |
1831 | (ec->rx_coalesce_usecs == 2)) | 1831 | (ec->rx_coalesce_usecs == 2)) |
1832 | return -EINVAL; | 1832 | return -EINVAL; |
1833 | 1833 | ||
1834 | if (ec->rx_coalesce_usecs <= 3) { | 1834 | if (ec->rx_coalesce_usecs == 4) { |
1835 | adapter->itr = adapter->itr_setting = 4; | ||
1836 | } else if (ec->rx_coalesce_usecs <= 3) { | ||
1835 | adapter->itr = 20000; | 1837 | adapter->itr = 20000; |
1836 | adapter->itr_setting = ec->rx_coalesce_usecs; | 1838 | adapter->itr_setting = ec->rx_coalesce_usecs; |
1837 | } else { | 1839 | } else { |
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index e6ebc222459f..4dd2c23775cb 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c | |||
@@ -31,7 +31,7 @@ | |||
31 | 31 | ||
32 | char e1000_driver_name[] = "e1000"; | 32 | char e1000_driver_name[] = "e1000"; |
33 | static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; | 33 | static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver"; |
34 | #define DRV_VERSION "7.3.21-k5-NAPI" | 34 | #define DRV_VERSION "7.3.21-k6-NAPI" |
35 | const char e1000_driver_version[] = DRV_VERSION; | 35 | const char e1000_driver_version[] = DRV_VERSION; |
36 | static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; | 36 | static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation."; |
37 | 37 | ||
@@ -2386,6 +2386,22 @@ link_up: | |||
2386 | } | 2386 | } |
2387 | } | 2387 | } |
2388 | 2388 | ||
2389 | /* Simple mode for Interrupt Throttle Rate (ITR) */ | ||
2390 | if (hw->mac_type >= e1000_82540 && adapter->itr_setting == 4) { | ||
2391 | /* | ||
2392 | * Symmetric Tx/Rx gets a reduced ITR=2000; | ||
2393 | * Total asymmetrical Tx or Rx gets ITR=8000; | ||
2394 | * everyone else is between 2000-8000. | ||
2395 | */ | ||
2396 | u32 goc = (adapter->gotcl + adapter->gorcl) / 10000; | ||
2397 | u32 dif = (adapter->gotcl > adapter->gorcl ? | ||
2398 | adapter->gotcl - adapter->gorcl : | ||
2399 | adapter->gorcl - adapter->gotcl) / 10000; | ||
2400 | u32 itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000; | ||
2401 | |||
2402 | ew32(ITR, 1000000000 / (itr * 256)); | ||
2403 | } | ||
2404 | |||
2389 | /* Cause software interrupt to ensure rx ring is cleaned */ | 2405 | /* Cause software interrupt to ensure rx ring is cleaned */ |
2390 | ew32(ICS, E1000_ICS_RXDMT0); | 2406 | ew32(ICS, E1000_ICS_RXDMT0); |
2391 | 2407 | ||
diff --git a/drivers/net/e1000/e1000_param.c b/drivers/net/e1000/e1000_param.c index 543c6d1767bc..9fbb562dc964 100644 --- a/drivers/net/e1000/e1000_param.c +++ b/drivers/net/e1000/e1000_param.c | |||
@@ -484,11 +484,17 @@ void __devinit e1000_check_options(struct e1000_adapter *adapter) | |||
484 | adapter->itr_setting = adapter->itr; | 484 | adapter->itr_setting = adapter->itr; |
485 | adapter->itr = 20000; | 485 | adapter->itr = 20000; |
486 | break; | 486 | break; |
487 | case 4: | ||
488 | e_dev_info("%s set to simplified " | ||
489 | "(2000-8000) ints mode\n", opt.name); | ||
490 | adapter->itr_setting = adapter->itr; | ||
491 | break; | ||
487 | default: | 492 | default: |
488 | e1000_validate_option(&adapter->itr, &opt, | 493 | e1000_validate_option(&adapter->itr, &opt, |
489 | adapter); | 494 | adapter); |
490 | /* save the setting, because the dynamic bits change itr */ | 495 | /* save the setting, because the dynamic bits |
491 | /* clear the lower two bits because they are | 496 | * change itr. |
497 | * clear the lower two bits because they are | ||
492 | * used as control */ | 498 | * used as control */ |
493 | adapter->itr_setting = adapter->itr & ~3; | 499 | adapter->itr_setting = adapter->itr & ~3; |
494 | break; | 500 | break; |