diff options
author | Auke Kok <auke-jan.h.kok@intel.com> | 2006-11-06 08:57:12 -0800 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-11-07 04:27:51 -0500 |
commit | edd106fc8ac1826dbe231b70ce0762db24133e5c (patch) | |
tree | 214fcbdd2c27362a6d8888a0045b555e376d8611 /drivers/net | |
parent | e78181feb0b94fb6afeaef3b28d4f5df1b847c98 (diff) | |
download | linux-3.10-edd106fc8ac1826dbe231b70ce0762db24133e5c.tar.gz linux-3.10-edd106fc8ac1826dbe231b70ce0762db24133e5c.tar.bz2 linux-3.10-edd106fc8ac1826dbe231b70ce0762db24133e5c.zip |
[PATCH] e1000: Fix regression: garbled stats and irq allocation during swsusp
e1000: Fix suspend/resume powerup and irq allocation
From: Auke Kok <auke-jan.h.kok@intel.com>
After 7.0.33/2.6.16, e1000 suspend/resume left the user with an enabled
device showing garbled statistics and undetermined irq allocation state,
where `ifconfig eth0 down` would display `trying to free already freed irq`.
Explicitly free and allocate irq as well as powerup the PHY during resume
fixes when needed.
Signed-off-by: Auke Kok <auke-jan.h.kok@intel.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/e1000/e1000_main.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c index 8d04752777a..726ec5e88ab 100644 --- a/drivers/net/e1000/e1000_main.c +++ b/drivers/net/e1000/e1000_main.c @@ -4800,6 +4800,9 @@ e1000_suspend(struct pci_dev *pdev, pm_message_t state) if (adapter->hw.phy_type == e1000_phy_igp_3) e1000_phy_powerdown_workaround(&adapter->hw); + if (netif_running(netdev)) + e1000_free_irq(adapter); + /* Release control of h/w to f/w. If f/w is AMT enabled, this * would have already happened in close and is redundant. */ e1000_release_hw_control(adapter); @@ -4830,6 +4833,10 @@ e1000_resume(struct pci_dev *pdev) pci_enable_wake(pdev, PCI_D3hot, 0); pci_enable_wake(pdev, PCI_D3cold, 0); + if (netif_running(netdev) && (err = e1000_request_irq(adapter))) + return err; + + e1000_power_up_phy(adapter); e1000_reset(adapter); E1000_WRITE_REG(&adapter->hw, WUS, ~0); |