aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruce Allan <bruce.w.allan@intel.com>2013-01-12 02:25:22 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2013-01-28 02:27:41 -0500
commit3e35d9918cbbc224f88da4dd19cd90b2cd4f765e (patch)
tree81baa95ae359030814558a35ffd3c359ebe4ece1
parentc3d2dbf403367eb5c17f044aa74b772508d745c1 (diff)
e1000e: adjust PM QoS request
It has been found that devices other than 82579 (a.k.a. e1000_pch2lan) suffer from dropped transactions on platforms with deep C-states when jumbo frames are enabled. For example, LOMs on ICH9- and ICH10-based platforms which recently had early-receive de-featured (for stability reasons) suffer from this. To resolve this for all devices, when jumbo frames are enabled set the PM QoS DMA latency request based on the size of the receive packet buffer less one full frame. Signed-off-by: Bruce Allan <bruce.w.allan@intel.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/e1000e/defines.h2
-rw-r--r--drivers/net/ethernet/intel/e1000e/netdev.c32
2 files changed, 19 insertions, 15 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/defines.h b/drivers/net/ethernet/intel/e1000e/defines.h
index 3b997194ac3b..c4587671dc73 100644
--- a/drivers/net/ethernet/intel/e1000e/defines.h
+++ b/drivers/net/ethernet/intel/e1000e/defines.h
@@ -393,6 +393,8 @@
393#define E1000_PBA_8K 0x0008 /* 8KB */ 393#define E1000_PBA_8K 0x0008 /* 8KB */
394#define E1000_PBA_16K 0x0010 /* 16KB */ 394#define E1000_PBA_16K 0x0010 /* 16KB */
395 395
396#define E1000_PBA_RXA_MASK 0xFFFF
397
396#define E1000_PBS_16K E1000_PBA_16K 398#define E1000_PBS_16K E1000_PBA_16K
397 399
398/* Uncorrectable/correctable ECC Error counts and enable bits */ 400/* Uncorrectable/correctable ECC Error counts and enable bits */
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
index e386e95102f4..46a38a4d8da5 100644
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
@@ -3242,18 +3242,23 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
3242 rxcsum &= ~E1000_RXCSUM_TUOFL; 3242 rxcsum &= ~E1000_RXCSUM_TUOFL;
3243 ew32(RXCSUM, rxcsum); 3243 ew32(RXCSUM, rxcsum);
3244 3244
3245 if (adapter->hw.mac.type == e1000_pch2lan) { 3245 /* With jumbo frames, excessive C-state transition latencies result
3246 /* With jumbo frames, excessive C-state transition 3246 * in dropped transactions.
3247 * latencies result in dropped transactions. 3247 */
3248 */ 3248 if (adapter->netdev->mtu > ETH_DATA_LEN) {
3249 if (adapter->netdev->mtu > ETH_DATA_LEN) { 3249 u32 lat =
3250 ((er32(PBA) & E1000_PBA_RXA_MASK) * 1024 -
3251 adapter->max_frame_size) * 8 / 1000;
3252
3253 if (adapter->flags & FLAG_IS_ICH) {
3250 u32 rxdctl = er32(RXDCTL(0)); 3254 u32 rxdctl = er32(RXDCTL(0));
3251 ew32(RXDCTL(0), rxdctl | 0x3); 3255 ew32(RXDCTL(0), rxdctl | 0x3);
3252 pm_qos_update_request(&adapter->netdev->pm_qos_req, 55);
3253 } else {
3254 pm_qos_update_request(&adapter->netdev->pm_qos_req,
3255 PM_QOS_DEFAULT_VALUE);
3256 } 3256 }
3257
3258 pm_qos_update_request(&adapter->netdev->pm_qos_req, lat);
3259 } else {
3260 pm_qos_update_request(&adapter->netdev->pm_qos_req,
3261 PM_QOS_DEFAULT_VALUE);
3257 } 3262 }
3258 3263
3259 /* Enable Receives */ 3264 /* Enable Receives */
@@ -4281,10 +4286,8 @@ static int e1000_open(struct net_device *netdev)
4281 e1000_update_mng_vlan(adapter); 4286 e1000_update_mng_vlan(adapter);
4282 4287
4283 /* DMA latency requirement to workaround jumbo issue */ 4288 /* DMA latency requirement to workaround jumbo issue */
4284 if (adapter->hw.mac.type == e1000_pch2lan) 4289 pm_qos_add_request(&adapter->netdev->pm_qos_req, PM_QOS_CPU_DMA_LATENCY,
4285 pm_qos_add_request(&adapter->netdev->pm_qos_req, 4290 PM_QOS_DEFAULT_VALUE);
4286 PM_QOS_CPU_DMA_LATENCY,
4287 PM_QOS_DEFAULT_VALUE);
4288 4291
4289 /* before we allocate an interrupt, we must be ready to handle it. 4292 /* before we allocate an interrupt, we must be ready to handle it.
4290 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt 4293 * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt
@@ -4392,8 +4395,7 @@ static int e1000_close(struct net_device *netdev)
4392 !test_bit(__E1000_TESTING, &adapter->state)) 4395 !test_bit(__E1000_TESTING, &adapter->state))
4393 e1000e_release_hw_control(adapter); 4396 e1000e_release_hw_control(adapter);
4394 4397
4395 if (adapter->hw.mac.type == e1000_pch2lan) 4398 pm_qos_remove_request(&adapter->netdev->pm_qos_req);
4396 pm_qos_remove_request(&adapter->netdev->pm_qos_req);
4397 4399
4398 pm_runtime_put_sync(&pdev->dev); 4400 pm_runtime_put_sync(&pdev->dev);
4399 4401