Commit 53ec5498 authored by Bruce Allan's avatar Bruce Allan Committed by David S. Miller

e1000e: set pm_qos DMA latency requirement per interface when needed

It was pointed out a pm_qos DMA latency requirement set when the driver is
loaded when parts that support early receive of jumbo frames are probed
could have that requirement overidden if another part supported by the
driver (one that does not support early receive of jumbo frames) is probed
later.  Change the DMA latency requirement to be per-interface if needed
instead of per driver.
Signed-off-by: default avatarBruce Allan <bruce.w.allan@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 99673d9b
...@@ -2472,21 +2472,23 @@ static void e1000_configure_rx(struct e1000_adapter *adapter) ...@@ -2472,21 +2472,23 @@ static void e1000_configure_rx(struct e1000_adapter *adapter)
* packet size is equal or larger than the specified value (in 8 byte * packet size is equal or larger than the specified value (in 8 byte
* units), e.g. using jumbo frames when setting to E1000_ERT_2048 * units), e.g. using jumbo frames when setting to E1000_ERT_2048
*/ */
if ((adapter->flags & FLAG_HAS_ERT) && if (adapter->flags & FLAG_HAS_ERT) {
(adapter->netdev->mtu > ETH_DATA_LEN)) { if (adapter->netdev->mtu > ETH_DATA_LEN) {
u32 rxdctl = er32(RXDCTL(0)); u32 rxdctl = er32(RXDCTL(0));
ew32(RXDCTL(0), rxdctl | 0x3); ew32(RXDCTL(0), rxdctl | 0x3);
ew32(ERT, E1000_ERT_2048 | (1 << 13)); ew32(ERT, E1000_ERT_2048 | (1 << 13));
/* /*
* With jumbo frames and early-receive enabled, excessive * With jumbo frames and early-receive enabled,
* C4->C2 latencies result in dropped transactions. * excessive C-state transition latencies result in
*/ * dropped transactions.
pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, */
e1000e_driver_name, 55); pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY,
} else { adapter->netdev->name, 55);
pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY, } else {
e1000e_driver_name, pm_qos_update_requirement(PM_QOS_CPU_DMA_LATENCY,
PM_QOS_DEFAULT_VALUE); adapter->netdev->name,
PM_QOS_DEFAULT_VALUE);
}
} }
/* Enable Receives */ /* Enable Receives */
...@@ -2804,6 +2806,12 @@ int e1000e_up(struct e1000_adapter *adapter) ...@@ -2804,6 +2806,12 @@ int e1000e_up(struct e1000_adapter *adapter)
{ {
struct e1000_hw *hw = &adapter->hw; struct e1000_hw *hw = &adapter->hw;
/* DMA latency requirement to workaround early-receive/jumbo issue */
if (adapter->flags & FLAG_HAS_ERT)
pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY,
adapter->netdev->name,
PM_QOS_DEFAULT_VALUE);
/* hardware has been reset, we need to reload some things */ /* hardware has been reset, we need to reload some things */
e1000_configure(adapter); e1000_configure(adapter);
...@@ -2864,6 +2872,10 @@ void e1000e_down(struct e1000_adapter *adapter) ...@@ -2864,6 +2872,10 @@ void e1000e_down(struct e1000_adapter *adapter)
e1000_clean_tx_ring(adapter); e1000_clean_tx_ring(adapter);
e1000_clean_rx_ring(adapter); e1000_clean_rx_ring(adapter);
if (adapter->flags & FLAG_HAS_ERT)
pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY,
adapter->netdev->name);
/* /*
* TODO: for power management, we could drop the link and * TODO: for power management, we could drop the link and
* pci_disable_device here. * pci_disable_device here.
...@@ -5363,9 +5375,7 @@ static int __init e1000_init_module(void) ...@@ -5363,9 +5375,7 @@ static int __init e1000_init_module(void)
printk(KERN_INFO "%s: Copyright (c) 1999 - 2009 Intel Corporation.\n", printk(KERN_INFO "%s: Copyright (c) 1999 - 2009 Intel Corporation.\n",
e1000e_driver_name); e1000e_driver_name);
ret = pci_register_driver(&e1000_driver); ret = pci_register_driver(&e1000_driver);
pm_qos_add_requirement(PM_QOS_CPU_DMA_LATENCY, e1000e_driver_name,
PM_QOS_DEFAULT_VALUE);
return ret; return ret;
} }
module_init(e1000_init_module); module_init(e1000_init_module);
...@@ -5379,7 +5389,6 @@ module_init(e1000_init_module); ...@@ -5379,7 +5389,6 @@ module_init(e1000_init_module);
static void __exit e1000_exit_module(void) static void __exit e1000_exit_module(void)
{ {
pci_unregister_driver(&e1000_driver); pci_unregister_driver(&e1000_driver);
pm_qos_remove_requirement(PM_QOS_CPU_DMA_LATENCY, e1000e_driver_name);
} }
module_exit(e1000_exit_module); module_exit(e1000_exit_module);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment