aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorfrançois romieu <romieu@fr.zoreil.com>2012-03-05 20:14:12 -0500
committerDavid S. Miller <davem@davemloft.net>2012-03-06 14:43:49 -0500
commit2a15cd2ff488a9fdb55e5e34060f499853b27c77 (patch)
tree3acdd8d691569378de250f7bff6b71d8335c8002 /drivers
parent4648dc97af9d496218a05353b0e442b3dfa6aaab (diff)
r8169: runtime resume before shutdown.
With runtime PM, if the ethernet cable is disconnected, the device is transitioned to D3 state to conserve energy. If the system is shutdown in this state, any register accesses in rtl_shutdown are dropped on the floor. As the device was programmed by .runtime_suspend() to wake on link changes, it is thus brought back up as soon as the link recovers. Resuming every suspended device through the driver core would slow things down and it is not clear how many devices really need it now. Original report and D0 transition patch by Sameer Nanda. Patch has been changed to comply with advices by Rafael J. Wysocki and the PM folks. Reported-by: Sameer Nanda <snanda@chromium.org> Signed-off-by: Francois Romieu <romieu@fr.zoreil.com> Cc: Rafael J. Wysocki <rjw@sisk.pl> Cc: Hayes Wang <hayeswang@realtek.com> Cc: Alan Stern <stern@rowland.harvard.edu> Acked-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/realtek/r8169.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
index 1adf17757cea..bbacb3741ec0 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -6194,6 +6194,9 @@ static void rtl_shutdown(struct pci_dev *pdev)
6194{ 6194{
6195 struct net_device *dev = pci_get_drvdata(pdev); 6195 struct net_device *dev = pci_get_drvdata(pdev);
6196 struct rtl8169_private *tp = netdev_priv(dev); 6196 struct rtl8169_private *tp = netdev_priv(dev);
6197 struct device *d = &pdev->dev;
6198
6199 pm_runtime_get_sync(d);
6197 6200
6198 rtl8169_net_suspend(dev); 6201 rtl8169_net_suspend(dev);
6199 6202
@@ -6215,6 +6218,8 @@ static void rtl_shutdown(struct pci_dev *pdev)
6215 pci_wake_from_d3(pdev, true); 6218 pci_wake_from_d3(pdev, true);
6216 pci_set_power_state(pdev, PCI_D3hot); 6219 pci_set_power_state(pdev, PCI_D3hot);
6217 } 6220 }
6221
6222 pm_runtime_put_noidle(d);
6218} 6223}
6219 6224
6220static struct pci_driver rtl8169_pci_driver = { 6225static struct pci_driver rtl8169_pci_driver = {