aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/e1000e
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2010-06-08 15:23:51 -0400
committerJesse Barnes <jbarnes@virtuousgeek.org>2010-07-30 12:29:09 -0400
commitf3ec4f87d607f40497afdb5ac03f11e2ea253d52 (patch)
treeb485337aee10cb1c0fcb1593d8947b5370aa73ff /drivers/net/e1000e
parenta2dccdb2055abeb8a7ce8e45e5f83de9c980a00c (diff)
PCI: change device runtime PM settings for probe and remove
This patch (as1388) changes the way the PCI core handles runtime PM settings when probing or unbinding drivers. Now the core will make sure the device is enabled for runtime PM, with a usage count >= 1, when a driver is probed. It does the same when calling a driver's remove method. If the driver wants to use runtime PM, all it has to do is call pm_runtime_pu_noidle() near the end of its probe routine (to cancel the core's usage increment) and pm_runtime_get_noresume() near the start of its remove routine (to restore the usage count). It does not need to mess around with setting the runtime state to enabled, disabled, active, or suspended. The patch updates e1000e and r8169, the only PCI drivers that already use the existing runtime PM interface. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Acked-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/net/e1000e')
-rw-r--r--drivers/net/e1000e/netdev.c16
1 files changed, 4 insertions, 12 deletions
diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
index 57a7e41da69..4afc8dd9b93 100644
--- a/drivers/net/e1000e/netdev.c
+++ b/drivers/net/e1000e/netdev.c
@@ -5721,11 +5721,8 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
5721 5721
5722 e1000_print_device_info(adapter); 5722 e1000_print_device_info(adapter);
5723 5723
5724 if (pci_dev_run_wake(pdev)) { 5724 if (pci_dev_run_wake(pdev))
5725 pm_runtime_set_active(&pdev->dev); 5725 pm_runtime_put_noidle(&pdev->dev);
5726 pm_runtime_enable(&pdev->dev);
5727 }
5728 pm_schedule_suspend(&pdev->dev, MSEC_PER_SEC);
5729 5726
5730 return 0; 5727 return 0;
5731 5728
@@ -5771,8 +5768,6 @@ static void __devexit e1000_remove(struct pci_dev *pdev)
5771 struct e1000_adapter *adapter = netdev_priv(netdev); 5768 struct e1000_adapter *adapter = netdev_priv(netdev);
5772 bool down = test_bit(__E1000_DOWN, &adapter->state); 5769 bool down = test_bit(__E1000_DOWN, &adapter->state);
5773 5770
5774 pm_runtime_get_sync(&pdev->dev);
5775
5776 /* 5771 /*
5777 * flush_scheduled work may reschedule our watchdog task, so 5772 * flush_scheduled work may reschedule our watchdog task, so
5778 * explicitly disable watchdog tasks from being rescheduled 5773 * explicitly disable watchdog tasks from being rescheduled
@@ -5797,11 +5792,8 @@ static void __devexit e1000_remove(struct pci_dev *pdev)
5797 clear_bit(__E1000_DOWN, &adapter->state); 5792 clear_bit(__E1000_DOWN, &adapter->state);
5798 unregister_netdev(netdev); 5793 unregister_netdev(netdev);
5799 5794
5800 if (pci_dev_run_wake(pdev)) { 5795 if (pci_dev_run_wake(pdev))
5801 pm_runtime_disable(&pdev->dev); 5796 pm_runtime_get_noresume(&pdev->dev);
5802 pm_runtime_set_suspended(&pdev->dev);
5803 }
5804 pm_runtime_put_noidle(&pdev->dev);
5805 5797
5806 /* 5798 /*
5807 * Release control of h/w to f/w. If f/w is AMT enabled, this 5799 * Release control of h/w to f/w. If f/w is AMT enabled, this