Skip to content

Commit 2800209

Browse files
David ErtmanJeff Kirsher
authored andcommitted
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 <[email protected]> Acked-by: Bruce Allan <[email protected]> Tested-by: Jeff Pieper <[email protected]> Signed-off-by: Jeff Kirsher <[email protected]>
1 parent 3b70d4f commit 2800209

File tree

3 files changed

+78
-55
lines changed

3 files changed

+78
-55
lines changed

drivers/net/ethernet/intel/e1000e/e1000.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ void e1000e_check_options(struct e1000_adapter *adapter);
469469
void e1000e_set_ethtool_ops(struct net_device *netdev);
470470

471471
int e1000e_up(struct e1000_adapter *adapter);
472-
void e1000e_down(struct e1000_adapter *adapter);
472+
void e1000e_down(struct e1000_adapter *adapter, bool reset);
473473
void e1000e_reinit_locked(struct e1000_adapter *adapter);
474474
void e1000e_reset(struct e1000_adapter *adapter);
475475
void e1000e_power_up_phy(struct e1000_adapter *adapter);

drivers/net/ethernet/intel/e1000e/ethtool.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ static int e1000_set_settings(struct net_device *netdev,
325325

326326
/* reset the link */
327327
if (netif_running(adapter->netdev)) {
328-
e1000e_down(adapter);
328+
e1000e_down(adapter, true);
329329
e1000e_up(adapter);
330330
} else {
331331
e1000e_reset(adapter);
@@ -373,7 +373,7 @@ static int e1000_set_pauseparam(struct net_device *netdev,
373373
if (adapter->fc_autoneg == AUTONEG_ENABLE) {
374374
hw->fc.requested_mode = e1000_fc_default;
375375
if (netif_running(adapter->netdev)) {
376-
e1000e_down(adapter);
376+
e1000e_down(adapter, true);
377377
e1000e_up(adapter);
378378
} else {
379379
e1000e_reset(adapter);
@@ -719,7 +719,7 @@ static int e1000_set_ringparam(struct net_device *netdev,
719719

720720
pm_runtime_get_sync(netdev->dev.parent);
721721

722-
e1000e_down(adapter);
722+
e1000e_down(adapter, true);
723723

724724
/* We can't just free everything and then setup again, because the
725725
* ISRs in MSI-X mode get passed pointers to the Tx and Rx ring

drivers/net/ethernet/intel/e1000e/netdev.c

Lines changed: 74 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3687,10 +3687,6 @@ void e1000e_power_up_phy(struct e1000_adapter *adapter)
36873687
*/
36883688
static void e1000_power_down_phy(struct e1000_adapter *adapter)
36893689
{
3690-
/* WoL is enabled */
3691-
if (adapter->wol)
3692-
return;
3693-
36943690
if (adapter->hw.phy.ops.power_down)
36953691
adapter->hw.phy.ops.power_down(&adapter->hw);
36963692
}
@@ -3907,10 +3903,8 @@ void e1000e_reset(struct e1000_adapter *adapter)
39073903
}
39083904

39093905
if (!netif_running(adapter->netdev) &&
3910-
!test_bit(__E1000_TESTING, &adapter->state)) {
3906+
!test_bit(__E1000_TESTING, &adapter->state))
39113907
e1000_power_down_phy(adapter);
3912-
return;
3913-
}
39143908

39153909
e1000_get_phy_info(hw);
39163910

@@ -3977,7 +3971,12 @@ static void e1000e_flush_descriptors(struct e1000_adapter *adapter)
39773971

39783972
static void e1000e_update_stats(struct e1000_adapter *adapter);
39793973

3980-
void e1000e_down(struct e1000_adapter *adapter)
3974+
/**
3975+
* e1000e_down - quiesce the device and optionally reset the hardware
3976+
* @adapter: board private structure
3977+
* @reset: boolean flag to reset the hardware or not
3978+
*/
3979+
void e1000e_down(struct e1000_adapter *adapter, bool reset)
39813980
{
39823981
struct net_device *netdev = adapter->netdev;
39833982
struct e1000_hw *hw = &adapter->hw;
@@ -4031,20 +4030,16 @@ void e1000e_down(struct e1000_adapter *adapter)
40314030
e1000_lv_jumbo_workaround_ich8lan(hw, false))
40324031
e_dbg("failed to disable jumbo frame workaround mode\n");
40334032

4034-
if (!pci_channel_offline(adapter->pdev))
4033+
if (reset && !pci_channel_offline(adapter->pdev))
40354034
e1000e_reset(adapter);
4036-
4037-
/* TODO: for power management, we could drop the link and
4038-
* pci_disable_device here.
4039-
*/
40404035
}
40414036

40424037
void e1000e_reinit_locked(struct e1000_adapter *adapter)
40434038
{
40444039
might_sleep();
40454040
while (test_and_set_bit(__E1000_RESETTING, &adapter->state))
40464041
usleep_range(1000, 2000);
4047-
e1000e_down(adapter);
4042+
e1000e_down(adapter, true);
40484043
e1000e_up(adapter);
40494044
clear_bit(__E1000_RESETTING, &adapter->state);
40504045
}
@@ -4372,14 +4367,12 @@ static int e1000_close(struct net_device *netdev)
43724367
pm_runtime_get_sync(&pdev->dev);
43734368

43744369
if (!test_bit(__E1000_DOWN, &adapter->state)) {
4375-
e1000e_down(adapter);
4370+
e1000e_down(adapter, true);
43764371
e1000_free_irq(adapter);
43774372
}
43784373

43794374
napi_disable(&adapter->napi);
43804375

4381-
e1000_power_down_phy(adapter);
4382-
43834376
e1000e_free_tx_resources(adapter->tx_ring);
43844377
e1000e_free_rx_resources(adapter->rx_ring);
43854378

@@ -5686,7 +5679,7 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)
56865679
e_info("changing MTU from %d to %d\n", netdev->mtu, new_mtu);
56875680
netdev->mtu = new_mtu;
56885681
if (netif_running(netdev))
5689-
e1000e_down(adapter);
5682+
e1000e_down(adapter, true);
56905683

56915684
/* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN
56925685
* means we reserve 2 more, this pushes us to allocate from the next
@@ -5919,15 +5912,10 @@ static int e1000_init_phy_wakeup(struct e1000_adapter *adapter, u32 wufc)
59195912
return retval;
59205913
}
59215914

5922-
static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
5915+
static int e1000e_pm_freeze(struct device *dev)
59235916
{
5924-
struct net_device *netdev = pci_get_drvdata(pdev);
5917+
struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev));
59255918
struct e1000_adapter *adapter = netdev_priv(netdev);
5926-
struct e1000_hw *hw = &adapter->hw;
5927-
u32 ctrl, ctrl_ext, rctl, status;
5928-
/* Runtime suspend should only enable wakeup for link changes */
5929-
u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol;
5930-
int retval = 0;
59315919

59325920
netif_device_detach(netdev);
59335921

@@ -5938,11 +5926,29 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
59385926
usleep_range(10000, 20000);
59395927

59405928
WARN_ON(test_bit(__E1000_RESETTING, &adapter->state));
5941-
e1000e_down(adapter);
5929+
5930+
/* Quiesce the device without resetting the hardware */
5931+
e1000e_down(adapter, false);
59425932
e1000_free_irq(adapter);
59435933
}
59445934
e1000e_reset_interrupt_capability(adapter);
59455935

5936+
/* Allow time for pending master requests to run */
5937+
e1000e_disable_pcie_master(&adapter->hw);
5938+
5939+
return 0;
5940+
}
5941+
5942+
static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
5943+
{
5944+
struct net_device *netdev = pci_get_drvdata(pdev);
5945+
struct e1000_adapter *adapter = netdev_priv(netdev);
5946+
struct e1000_hw *hw = &adapter->hw;
5947+
u32 ctrl, ctrl_ext, rctl, status;
5948+
/* Runtime suspend should only enable wakeup for link changes */
5949+
u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol;
5950+
int retval = 0;
5951+
59465952
status = er32(STATUS);
59475953
if (status & E1000_STATUS_LU)
59485954
wufc &= ~E1000_WUFC_LNKC;
@@ -5976,9 +5982,6 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
59765982
if (adapter->flags & FLAG_IS_ICH)
59775983
e1000_suspend_workarounds_ich8lan(&adapter->hw);
59785984

5979-
/* Allow time for pending master requests to run */
5980-
e1000e_disable_pcie_master(&adapter->hw);
5981-
59825985
if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) {
59835986
/* enable wakeup by the PHY */
59845987
retval = e1000_init_phy_wakeup(adapter, wufc);
@@ -5992,6 +5995,8 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool runtime)
59925995
} else {
59935996
ew32(WUC, 0);
59945997
ew32(WUFC, 0);
5998+
5999+
e1000_power_down_phy(adapter);
59956000
}
59966001

59976002
if (adapter->hw.phy.type == e1000_phy_igp_3)
@@ -6114,7 +6119,6 @@ static int __e1000_resume(struct pci_dev *pdev)
61146119
struct e1000_adapter *adapter = netdev_priv(netdev);
61156120
struct e1000_hw *hw = &adapter->hw;
61166121
u16 aspm_disable_flag = 0;
6117-
u32 err;
61186122

61196123
if (adapter->flags2 & FLAG2_DISABLE_ASPM_L0S)
61206124
aspm_disable_flag = PCIE_LINK_STATE_L0S;
@@ -6125,13 +6129,6 @@ static int __e1000_resume(struct pci_dev *pdev)
61256129

61266130
pci_set_master(pdev);
61276131

6128-
e1000e_set_interrupt_capability(adapter);
6129-
if (netif_running(netdev)) {
6130-
err = e1000_request_irq(adapter);
6131-
if (err)
6132-
return err;
6133-
}
6134-
61356132
if (hw->mac.type >= e1000_pch2lan)
61366133
e1000_resume_workarounds_pchlan(&adapter->hw);
61376134

@@ -6185,24 +6182,46 @@ static int __e1000_resume(struct pci_dev *pdev)
61856182
return 0;
61866183
}
61876184

6185+
static int e1000e_pm_thaw(struct device *dev)
6186+
{
6187+
struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev));
6188+
struct e1000_adapter *adapter = netdev_priv(netdev);
6189+
6190+
e1000e_set_interrupt_capability(adapter);
6191+
if (netif_running(netdev)) {
6192+
u32 err = e1000_request_irq(adapter);
6193+
6194+
if (err)
6195+
return err;
6196+
6197+
e1000e_up(adapter);
6198+
}
6199+
6200+
netif_device_attach(netdev);
6201+
6202+
return 0;
6203+
}
6204+
61886205
#ifdef CONFIG_PM_SLEEP
6189-
static int e1000_suspend(struct device *dev)
6206+
static int e1000e_pm_suspend(struct device *dev)
61906207
{
61916208
struct pci_dev *pdev = to_pci_dev(dev);
61926209

6210+
e1000e_pm_freeze(dev);
6211+
61936212
return __e1000_shutdown(pdev, false);
61946213
}
61956214

6196-
static int e1000_resume(struct device *dev)
6215+
static int e1000e_pm_resume(struct device *dev)
61976216
{
61986217
struct pci_dev *pdev = to_pci_dev(dev);
6199-
struct net_device *netdev = pci_get_drvdata(pdev);
6200-
struct e1000_adapter *adapter = netdev_priv(netdev);
6218+
int rc;
62016219

6202-
if (e1000e_pm_ready(adapter))
6203-
adapter->idle_check = true;
6220+
rc = __e1000_resume(pdev);
6221+
if (rc)
6222+
return rc;
62046223

6205-
return __e1000_resume(pdev);
6224+
return e1000e_pm_thaw(dev);
62066225
}
62076226
#endif /* CONFIG_PM_SLEEP */
62086227

@@ -6254,6 +6273,8 @@ static int e1000_runtime_resume(struct device *dev)
62546273

62556274
static void e1000_shutdown(struct pci_dev *pdev)
62566275
{
6276+
e1000e_pm_freeze(&pdev->dev);
6277+
62576278
__e1000_shutdown(pdev, false);
62586279
}
62596280

@@ -6339,7 +6360,7 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
63396360
return PCI_ERS_RESULT_DISCONNECT;
63406361

63416362
if (netif_running(netdev))
6342-
e1000e_down(adapter);
6363+
e1000e_down(adapter, true);
63436364
pci_disable_device(pdev);
63446365

63456366
/* Request a slot slot reset. */
@@ -6351,7 +6372,7 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
63516372
* @pdev: Pointer to PCI device
63526373
*
63536374
* Restart the card from scratch, as if from a cold-boot. Implementation
6354-
* resembles the first-half of the e1000_resume routine.
6375+
* resembles the first-half of the e1000e_pm_resume routine.
63556376
*/
63566377
static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
63576378
{
@@ -6398,7 +6419,7 @@ static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev)
63986419
*
63996420
* This callback is called when the error recovery driver tells us that
64006421
* its OK to resume normal operation. Implementation resembles the
6401-
* second-half of the e1000_resume routine.
6422+
* second-half of the e1000e_pm_resume routine.
64026423
*/
64036424
static void e1000_io_resume(struct pci_dev *pdev)
64046425
{
@@ -6903,9 +6924,6 @@ static void e1000_remove(struct pci_dev *pdev)
69036924
}
69046925
}
69056926

6906-
if (!(netdev->flags & IFF_UP))
6907-
e1000_power_down_phy(adapter);
6908-
69096927
/* Don't lie to e1000_close() down the road. */
69106928
if (!down)
69116929
clear_bit(__E1000_DOWN, &adapter->state);
@@ -7027,7 +7045,12 @@ static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = {
70277045
MODULE_DEVICE_TABLE(pci, e1000_pci_tbl);
70287046

70297047
static const struct dev_pm_ops e1000_pm_ops = {
7030-
SET_SYSTEM_SLEEP_PM_OPS(e1000_suspend, e1000_resume)
7048+
.suspend = e1000e_pm_suspend,
7049+
.resume = e1000e_pm_resume,
7050+
.freeze = e1000e_pm_freeze,
7051+
.thaw = e1000e_pm_thaw,
7052+
.poweroff = e1000e_pm_suspend,
7053+
.restore = e1000e_pm_resume,
70317054
SET_RUNTIME_PM_OPS(e1000_runtime_suspend, e1000_runtime_resume,
70327055
e1000_idle)
70337056
};

0 commit comments

Comments
 (0)