diff options
Diffstat (limited to 'drivers/net/e1000e')
-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 |
3 files changed, 27 insertions, 4 deletions
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 |