Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

David Ertman and committed by
Jeff Kirsher
28002099 3b70d4f8

+78 -55
+1 -1
drivers/net/ethernet/intel/e1000e/e1000.h
··· 469 469 void e1000e_set_ethtool_ops(struct net_device *netdev); 470 470 471 471 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); 473 473 void e1000e_reinit_locked(struct e1000_adapter *adapter); 474 474 void e1000e_reset(struct e1000_adapter *adapter); 475 475 void e1000e_power_up_phy(struct e1000_adapter *adapter);
+3 -3
drivers/net/ethernet/intel/e1000e/ethtool.c
··· 325 325 326 326 /* reset the link */ 327 327 if (netif_running(adapter->netdev)) { 328 - e1000e_down(adapter); 328 + e1000e_down(adapter, true); 329 329 e1000e_up(adapter); 330 330 } else { 331 331 e1000e_reset(adapter); ··· 373 373 if (adapter->fc_autoneg == AUTONEG_ENABLE) { 374 374 hw->fc.requested_mode = e1000_fc_default; 375 375 if (netif_running(adapter->netdev)) { 376 - e1000e_down(adapter); 376 + e1000e_down(adapter, true); 377 377 e1000e_up(adapter); 378 378 } else { 379 379 e1000e_reset(adapter); ··· 719 719 720 720 pm_runtime_get_sync(netdev->dev.parent); 721 721 722 - e1000e_down(adapter); 722 + e1000e_down(adapter, true); 723 723 724 724 /* We can't just free everything and then setup again, because the 725 725 * ISRs in MSI-X mode get passed pointers to the Tx and Rx ring
+74 -51
drivers/net/ethernet/intel/e1000e/netdev.c
··· 3687 3687 */ 3688 3688 static void e1000_power_down_phy(struct e1000_adapter *adapter) 3689 3689 { 3690 - /* WoL is enabled */ 3691 - if (adapter->wol) 3692 - return; 3693 - 3694 3690 if (adapter->hw.phy.ops.power_down) 3695 3691 adapter->hw.phy.ops.power_down(&adapter->hw); 3696 3692 } ··· 3903 3907 } 3904 3908 3905 3909 if (!netif_running(adapter->netdev) && 3906 - !test_bit(__E1000_TESTING, &adapter->state)) { 3910 + !test_bit(__E1000_TESTING, &adapter->state)) 3907 3911 e1000_power_down_phy(adapter); 3908 - return; 3909 - } 3910 3912 3911 3913 e1000_get_phy_info(hw); 3912 3914 ··· 3971 3977 3972 3978 static void e1000e_update_stats(struct e1000_adapter *adapter); 3973 3979 3974 - void e1000e_down(struct e1000_adapter *adapter) 3980 + /** 3981 + * e1000e_down - quiesce the device and optionally reset the hardware 3982 + * @adapter: board private structure 3983 + * @reset: boolean flag to reset the hardware or not 3984 + */ 3985 + void e1000e_down(struct e1000_adapter *adapter, bool reset) 3975 3986 { 3976 3987 struct net_device *netdev = adapter->netdev; 3977 3988 struct e1000_hw *hw = &adapter->hw; ··· 4030 4031 e1000_lv_jumbo_workaround_ich8lan(hw, false)) 4031 4032 e_dbg("failed to disable jumbo frame workaround mode\n"); 4032 4033 4033 - if (!pci_channel_offline(adapter->pdev)) 4034 + if (reset && !pci_channel_offline(adapter->pdev)) 4034 4035 e1000e_reset(adapter); 4035 - 4036 - /* TODO: for power management, we could drop the link and 4037 - * pci_disable_device here. 4038 - */ 4039 4036 } 4040 4037 4041 4038 void e1000e_reinit_locked(struct e1000_adapter *adapter) ··· 4039 4044 might_sleep(); 4040 4045 while (test_and_set_bit(__E1000_RESETTING, &adapter->state)) 4041 4046 usleep_range(1000, 2000); 4042 - e1000e_down(adapter); 4047 + e1000e_down(adapter, true); 4043 4048 e1000e_up(adapter); 4044 4049 clear_bit(__E1000_RESETTING, &adapter->state); 4045 4050 } ··· 4367 4372 pm_runtime_get_sync(&pdev->dev); 4368 4373 4369 4374 if (!test_bit(__E1000_DOWN, &adapter->state)) { 4370 - e1000e_down(adapter); 4375 + e1000e_down(adapter, true); 4371 4376 e1000_free_irq(adapter); 4372 4377 } 4373 4378 4374 4379 napi_disable(&adapter->napi); 4375 - 4376 - e1000_power_down_phy(adapter); 4377 4380 4378 4381 e1000e_free_tx_resources(adapter->tx_ring); 4379 4382 e1000e_free_rx_resources(adapter->rx_ring); ··· 5679 5686 e_info("changing MTU from %d to %d\n", netdev->mtu, new_mtu); 5680 5687 netdev->mtu = new_mtu; 5681 5688 if (netif_running(netdev)) 5682 - e1000e_down(adapter); 5689 + e1000e_down(adapter, true); 5683 5690 5684 5691 /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN 5685 5692 * means we reserve 2 more, this pushes us to allocate from the next ··· 5912 5919 return retval; 5913 5920 } 5914 5921 5915 - static int __e1000_shutdown(struct pci_dev *pdev, bool runtime) 5922 + static int e1000e_pm_freeze(struct device *dev) 5916 5923 { 5917 - struct net_device *netdev = pci_get_drvdata(pdev); 5924 + struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev)); 5918 5925 struct e1000_adapter *adapter = netdev_priv(netdev); 5919 - struct e1000_hw *hw = &adapter->hw; 5920 - u32 ctrl, ctrl_ext, rctl, status; 5921 - /* Runtime suspend should only enable wakeup for link changes */ 5922 - u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol; 5923 - int retval = 0; 5924 5926 5925 5927 netif_device_detach(netdev); 5926 5928 ··· 5926 5938 usleep_range(10000, 20000); 5927 5939 5928 5940 WARN_ON(test_bit(__E1000_RESETTING, &adapter->state)); 5929 - e1000e_down(adapter); 5941 + 5942 + /* Quiesce the device without resetting the hardware */ 5943 + e1000e_down(adapter, false); 5930 5944 e1000_free_irq(adapter); 5931 5945 } 5932 5946 e1000e_reset_interrupt_capability(adapter); 5947 + 5948 + /* Allow time for pending master requests to run */ 5949 + e1000e_disable_pcie_master(&adapter->hw); 5950 + 5951 + return 0; 5952 + } 5953 + 5954 + static int __e1000_shutdown(struct pci_dev *pdev, bool runtime) 5955 + { 5956 + struct net_device *netdev = pci_get_drvdata(pdev); 5957 + struct e1000_adapter *adapter = netdev_priv(netdev); 5958 + struct e1000_hw *hw = &adapter->hw; 5959 + u32 ctrl, ctrl_ext, rctl, status; 5960 + /* Runtime suspend should only enable wakeup for link changes */ 5961 + u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol; 5962 + int retval = 0; 5933 5963 5934 5964 status = er32(STATUS); 5935 5965 if (status & E1000_STATUS_LU) ··· 5982 5976 if (adapter->flags & FLAG_IS_ICH) 5983 5977 e1000_suspend_workarounds_ich8lan(&adapter->hw); 5984 5978 5985 - /* Allow time for pending master requests to run */ 5986 - e1000e_disable_pcie_master(&adapter->hw); 5987 - 5988 5979 if (adapter->flags2 & FLAG2_HAS_PHY_WAKEUP) { 5989 5980 /* enable wakeup by the PHY */ 5990 5981 retval = e1000_init_phy_wakeup(adapter, wufc); ··· 5995 5992 } else { 5996 5993 ew32(WUC, 0); 5997 5994 ew32(WUFC, 0); 5995 + 5996 + e1000_power_down_phy(adapter); 5998 5997 } 5999 5998 6000 5999 if (adapter->hw.phy.type == e1000_phy_igp_3) ··· 6119 6114 struct e1000_adapter *adapter = netdev_priv(netdev); 6120 6115 struct e1000_hw *hw = &adapter->hw; 6121 6116 u16 aspm_disable_flag = 0; 6122 - u32 err; 6123 6117 6124 6118 if (adapter->flags2 & FLAG2_DISABLE_ASPM_L0S) 6125 6119 aspm_disable_flag = PCIE_LINK_STATE_L0S; ··· 6128 6124 e1000e_disable_aspm(pdev, aspm_disable_flag); 6129 6125 6130 6126 pci_set_master(pdev); 6131 - 6132 - e1000e_set_interrupt_capability(adapter); 6133 - if (netif_running(netdev)) { 6134 - err = e1000_request_irq(adapter); 6135 - if (err) 6136 - return err; 6137 - } 6138 6127 6139 6128 if (hw->mac.type >= e1000_pch2lan) 6140 6129 e1000_resume_workarounds_pchlan(&adapter->hw); ··· 6182 6185 return 0; 6183 6186 } 6184 6187 6188 + static int e1000e_pm_thaw(struct device *dev) 6189 + { 6190 + struct net_device *netdev = pci_get_drvdata(to_pci_dev(dev)); 6191 + struct e1000_adapter *adapter = netdev_priv(netdev); 6192 + 6193 + e1000e_set_interrupt_capability(adapter); 6194 + if (netif_running(netdev)) { 6195 + u32 err = e1000_request_irq(adapter); 6196 + 6197 + if (err) 6198 + return err; 6199 + 6200 + e1000e_up(adapter); 6201 + } 6202 + 6203 + netif_device_attach(netdev); 6204 + 6205 + return 0; 6206 + } 6207 + 6185 6208 #ifdef CONFIG_PM_SLEEP 6186 - static int e1000_suspend(struct device *dev) 6209 + static int e1000e_pm_suspend(struct device *dev) 6187 6210 { 6188 6211 struct pci_dev *pdev = to_pci_dev(dev); 6212 + 6213 + e1000e_pm_freeze(dev); 6189 6214 6190 6215 return __e1000_shutdown(pdev, false); 6191 6216 } 6192 6217 6193 - static int e1000_resume(struct device *dev) 6218 + static int e1000e_pm_resume(struct device *dev) 6194 6219 { 6195 6220 struct pci_dev *pdev = to_pci_dev(dev); 6196 - struct net_device *netdev = pci_get_drvdata(pdev); 6197 - struct e1000_adapter *adapter = netdev_priv(netdev); 6221 + int rc; 6198 6222 6199 - if (e1000e_pm_ready(adapter)) 6200 - adapter->idle_check = true; 6223 + rc = __e1000_resume(pdev); 6224 + if (rc) 6225 + return rc; 6201 6226 6202 - return __e1000_resume(pdev); 6227 + return e1000e_pm_thaw(dev); 6203 6228 } 6204 6229 #endif /* CONFIG_PM_SLEEP */ 6205 6230 ··· 6273 6254 6274 6255 static void e1000_shutdown(struct pci_dev *pdev) 6275 6256 { 6257 + e1000e_pm_freeze(&pdev->dev); 6258 + 6276 6259 __e1000_shutdown(pdev, false); 6277 6260 } 6278 6261 ··· 6360 6339 return PCI_ERS_RESULT_DISCONNECT; 6361 6340 6362 6341 if (netif_running(netdev)) 6363 - e1000e_down(adapter); 6342 + e1000e_down(adapter, true); 6364 6343 pci_disable_device(pdev); 6365 6344 6366 6345 /* Request a slot slot reset. */ ··· 6372 6351 * @pdev: Pointer to PCI device 6373 6352 * 6374 6353 * Restart the card from scratch, as if from a cold-boot. Implementation 6375 - * resembles the first-half of the e1000_resume routine. 6354 + * resembles the first-half of the e1000e_pm_resume routine. 6376 6355 */ 6377 6356 static pci_ers_result_t e1000_io_slot_reset(struct pci_dev *pdev) 6378 6357 { ··· 6419 6398 * 6420 6399 * This callback is called when the error recovery driver tells us that 6421 6400 * its OK to resume normal operation. Implementation resembles the 6422 - * second-half of the e1000_resume routine. 6401 + * second-half of the e1000e_pm_resume routine. 6423 6402 */ 6424 6403 static void e1000_io_resume(struct pci_dev *pdev) 6425 6404 { ··· 6924 6903 } 6925 6904 } 6926 6905 6927 - if (!(netdev->flags & IFF_UP)) 6928 - e1000_power_down_phy(adapter); 6929 - 6930 6906 /* Don't lie to e1000_close() down the road. */ 6931 6907 if (!down) 6932 6908 clear_bit(__E1000_DOWN, &adapter->state); ··· 7045 7027 MODULE_DEVICE_TABLE(pci, e1000_pci_tbl); 7046 7028 7047 7029 static const struct dev_pm_ops e1000_pm_ops = { 7048 - SET_SYSTEM_SLEEP_PM_OPS(e1000_suspend, e1000_resume) 7030 + .suspend = e1000e_pm_suspend, 7031 + .resume = e1000e_pm_resume, 7032 + .freeze = e1000e_pm_freeze, 7033 + .thaw = e1000e_pm_thaw, 7034 + .poweroff = e1000e_pm_suspend, 7035 + .restore = e1000e_pm_resume, 7049 7036 SET_RUNTIME_PM_OPS(e1000_runtime_suspend, e1000_runtime_resume, 7050 7037 e1000_idle) 7051 7038 };