e1000e: Refactor PM flows
Refactor the system power management flows to prevent the suspend path from being executed twice when hibernating since both the freeze and poweroff callbacks were set to e1000_suspend() via SET_SYSTEM_SLEEP_PM_OPS. There are HW workarounds that are performed during this flow and calling them twice was causing erroneous behavior. Re-arrange the code to take advantage of common code paths and explicitly set the individual dev_pm_ops callbacks for suspend, resume, freeze, thaw, poweroff and restore. Add a boolean parameter (reset) to the e1000e_down function to allow for cases when the HW should not be reset when downed during a PM event. Now that all suspend/shutdown paths result in a call to __e1000_shutdown() that checks Wake on Lan status, removing redundant check for WoL in e1000_power_down_phy(). Signed-off-by: Dave Ertman <davidx.m.ertman@intel.com> Acked-by: Bruce Allan <bruce.w.allan@intel.com> Tested-by: Jeff Pieper <jeffrey.e.pieper@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
3b70d4f848
commit
2800209994
3 changed files with 78 additions and 55 deletions
|
@ -325,7 +325,7 @@ static int e1000_set_settings(struct net_device *netdev,
|
|||
|
||||
/* reset the link */
|
||||
if (netif_running(adapter->netdev)) {
|
||||
e1000e_down(adapter);
|
||||
e1000e_down(adapter, true);
|
||||
e1000e_up(adapter);
|
||||
} else {
|
||||
e1000e_reset(adapter);
|
||||
|
@ -373,7 +373,7 @@ static int e1000_set_pauseparam(struct net_device *netdev,
|
|||
if (adapter->fc_autoneg == AUTONEG_ENABLE) {
|
||||
hw->fc.requested_mode = e1000_fc_default;
|
||||
if (netif_running(adapter->netdev)) {
|
||||
e1000e_down(adapter);
|
||||
e1000e_down(adapter, true);
|
||||
e1000e_up(adapter);
|
||||
} else {
|
||||
e1000e_reset(adapter);
|
||||
|
@ -719,7 +719,7 @@ static int e1000_set_ringparam(struct net_device *netdev,
|
|||
|
||||
pm_runtime_get_sync(netdev->dev.parent);
|
||||
|
||||
e1000e_down(adapter);
|
||||
e1000e_down(adapter, true);
|
||||
|
||||
/* We can't just free everything and then setup again, because the
|
||||
* ISRs in MSI-X mode get passed pointers to the Tx and Rx ring
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue