diff options
author | Bruce Allan <bruce.w.allan@intel.com> | 2011-05-13 03:19:48 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2011-06-09 23:31:49 -0400 |
commit | 99730e4c13c8344b02dd96108945b48d28c14c25 (patch) | |
tree | 36ae5f5c6bf0804f45dfb387931f88d11f7bc400 /drivers/net/e1000e/netdev.c | |
parent | d9b24135b972ccdd5f5174fba06c730e895e6daf (diff) |
e1000e: 82579 intermittently disabled during S0->Sx
When repeatedly cycling Sx->S0 states with the network cable unplugged,
the 82579 PHY may not initialize as expected and may require a full power
cycle to recover functionality to the device. Workaround this by testing
access of the PHY registers after resuming; if that returns unexpected
results toggle the LANPHYPC signal to power cycle the PHY.
This is implemented in the new function e1000_resume_workarounds_pchlan()
which calls another new function, e1000_toggle_lanphypc_value_ich8lan(),
which has been created to reduce code duplication (same functionality
required by a previous workaround). Also, e1000e_disable_gig_wol_ich8lan
is now e1000_suspend_workarounds_ich8lan to better reflect what it does.
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>
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
-rw-r--r-- | drivers/net/e1000e/netdev.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 888bd9cc2710..c4a23c7ac170 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c | |||
@@ -5278,7 +5278,7 @@ static int __e1000_shutdown(struct pci_dev *pdev, bool *enable_wake, | |||
5278 | } | 5278 | } |
5279 | 5279 | ||
5280 | if (adapter->flags & FLAG_IS_ICH) | 5280 | if (adapter->flags & FLAG_IS_ICH) |
5281 | e1000e_disable_gig_wol_ich8lan(&adapter->hw); | 5281 | e1000_suspend_workarounds_ich8lan(&adapter->hw); |
5282 | 5282 | ||
5283 | /* Allow time for pending master requests to run */ | 5283 | /* Allow time for pending master requests to run */ |
5284 | e1000e_disable_pcie_master(&adapter->hw); | 5284 | e1000e_disable_pcie_master(&adapter->hw); |
@@ -5429,6 +5429,9 @@ static int __e1000_resume(struct pci_dev *pdev) | |||
5429 | return err; | 5429 | return err; |
5430 | } | 5430 | } |
5431 | 5431 | ||
5432 | if (hw->mac.type == e1000_pch2lan) | ||
5433 | e1000_resume_workarounds_pchlan(&adapter->hw); | ||
5434 | |||
5432 | e1000e_power_up_phy(adapter); | 5435 | e1000e_power_up_phy(adapter); |
5433 | 5436 | ||
5434 | /* report the system wakeup cause from S3/S4 */ | 5437 | /* report the system wakeup cause from S3/S4 */ |