diff options
-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 | ||||
-rw-r--r-- | drivers/net/e1000e/ethtool.c | 8 | ||||
-rw-r--r-- | drivers/net/e1000e/netdev.c | 18 | ||||
-rw-r--r-- | drivers/net/e1000e/param.c | 5 |
6 files changed, 57 insertions, 10 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; |
diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c index b72c1c0876fc..6ff376cfe139 100644 --- a/drivers/net/e1000e/ethtool.c +++ b/drivers/net/e1000e/ethtool.c | |||
@@ -1890,7 +1890,7 @@ static int e1000_get_coalesce(struct net_device *netdev, | |||
1890 | { | 1890 | { |
1891 | struct e1000_adapter *adapter = netdev_priv(netdev); | 1891 | struct e1000_adapter *adapter = netdev_priv(netdev); |
1892 | 1892 | ||
1893 | if (adapter->itr_setting <= 3) | 1893 | if (adapter->itr_setting <= 4) |
1894 | ec->rx_coalesce_usecs = adapter->itr_setting; | 1894 | ec->rx_coalesce_usecs = adapter->itr_setting; |
1895 | else | 1895 | else |
1896 | ec->rx_coalesce_usecs = 1000000 / adapter->itr_setting; | 1896 | ec->rx_coalesce_usecs = 1000000 / adapter->itr_setting; |
@@ -1905,12 +1905,14 @@ static int e1000_set_coalesce(struct net_device *netdev, | |||
1905 | struct e1000_hw *hw = &adapter->hw; | 1905 | struct e1000_hw *hw = &adapter->hw; |
1906 | 1906 | ||
1907 | if ((ec->rx_coalesce_usecs > E1000_MAX_ITR_USECS) || | 1907 | if ((ec->rx_coalesce_usecs > E1000_MAX_ITR_USECS) || |
1908 | ((ec->rx_coalesce_usecs > 3) && | 1908 | ((ec->rx_coalesce_usecs > 4) && |
1909 | (ec->rx_coalesce_usecs < E1000_MIN_ITR_USECS)) || | 1909 | (ec->rx_coalesce_usecs < E1000_MIN_ITR_USECS)) || |
1910 | (ec->rx_coalesce_usecs == 2)) | 1910 | (ec->rx_coalesce_usecs == 2)) |
1911 | return -EINVAL; | 1911 | return -EINVAL; |
1912 | 1912 | ||
1913 | if (ec->rx_coalesce_usecs <= 3) { | 1913 | if (ec->rx_coalesce_usecs == 4) { |
1914 | adapter->itr = adapter->itr_setting = 4; | ||
1915 | } else if (ec->rx_coalesce_usecs <= 3) { | ||
1914 | adapter->itr = 20000; | 1916 | adapter->itr = 20000; |
1915 | adapter->itr_setting = ec->rx_coalesce_usecs; | 1917 | adapter->itr_setting = ec->rx_coalesce_usecs; |
1916 | } else { | 1918 | } else { |
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 478c34a47d18..c5f65a29865a 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -52,7 +52,7 @@ | |||
52 | 52 | ||
53 | #include "e1000.h" | 53 | #include "e1000.h" |
54 | 54 | ||
55 | #define DRV_VERSION "1.0.2-k2" | 55 | #define DRV_VERSION "1.0.2-k4" |
56 | char e1000e_driver_name[] = "e1000e"; | 56 | char e1000e_driver_name[] = "e1000e"; |
57 | const char e1000e_driver_version[] = DRV_VERSION; | 57 | const char e1000e_driver_version[] = DRV_VERSION; |
58 | 58 | ||
@@ -4070,6 +4070,22 @@ link_up: | |||
4070 | } | 4070 | } |
4071 | } | 4071 | } |
4072 | 4072 | ||
4073 | /* Simple mode for Interrupt Throttle Rate (ITR) */ | ||
4074 | if (adapter->itr_setting == 4) { | ||
4075 | /* | ||
4076 | * Symmetric Tx/Rx gets a reduced ITR=2000; | ||
4077 | * Total asymmetrical Tx or Rx gets ITR=8000; | ||
4078 | * everyone else is between 2000-8000. | ||
4079 | */ | ||
4080 | u32 goc = (adapter->gotc + adapter->gorc) / 10000; | ||
4081 | u32 dif = (adapter->gotc > adapter->gorc ? | ||
4082 | adapter->gotc - adapter->gorc : | ||
4083 | adapter->gorc - adapter->gotc) / 10000; | ||
4084 | u32 itr = goc > 0 ? (dif * 6000 / goc + 2000) : 8000; | ||
4085 | |||
4086 | ew32(ITR, 1000000000 / (itr * 256)); | ||
4087 | } | ||
4088 | |||
4073 | /* Cause software interrupt to ensure Rx ring is cleaned */ | 4089 | /* Cause software interrupt to ensure Rx ring is cleaned */ |
4074 | if (adapter->msix_entries) | 4090 | if (adapter->msix_entries) |
4075 | ew32(ICS, adapter->rx_ring->ims_val); | 4091 | ew32(ICS, adapter->rx_ring->ims_val); |
diff --git a/drivers/net/e1000e/param.c b/drivers/net/e1000e/param.c index f775a481063d..0f4077c3d538 100644 --- a/drivers/net/e1000e/param.c +++ b/drivers/net/e1000e/param.c | |||
@@ -351,6 +351,11 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter) | |||
351 | adapter->itr_setting = adapter->itr; | 351 | adapter->itr_setting = adapter->itr; |
352 | adapter->itr = 20000; | 352 | adapter->itr = 20000; |
353 | break; | 353 | break; |
354 | case 4: | ||
355 | e_info("%s set to simplified (2000-8000 ints) " | ||
356 | "mode\n", opt.name); | ||
357 | adapter->itr_setting = 4; | ||
358 | break; | ||
354 | default: | 359 | default: |
355 | /* | 360 | /* |
356 | * Save the setting, because the dynamic bits | 361 | * Save the setting, because the dynamic bits |