aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2010-10-25 16:12:37 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-11-15 13:24:40 -0500
commitf60dc0138aa19769bf8bab9f93b043235428b66f (patch)
tree91e71125d93ddb22a2f7241c27b74de1460303ee /drivers/net
parentb9237578f8d685bb86901ba9ff0d379218e5a3c5 (diff)
iwlwifi: Convert to new PCI PM framework
Use the new PCI PM and let the PCI core code handle the PCI-specific details of power transitions. Based on similarly titled ath9k patch posted by Rafael J. Wysocki. Signed-off-by: John W. Linville <linville@tuxdriver.com> Acked-by: Rafael J. Wysocki <rjw@sisk.pl> Acked-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c26
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h14
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c5
4 files changed, 27 insertions, 23 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 0ba8083ee4cd..0027bb8299a8 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -4838,10 +4838,7 @@ static struct pci_driver iwl_driver = {
4838 .id_table = iwl_hw_card_ids, 4838 .id_table = iwl_hw_card_ids,
4839 .probe = iwl_pci_probe, 4839 .probe = iwl_pci_probe,
4840 .remove = __devexit_p(iwl_pci_remove), 4840 .remove = __devexit_p(iwl_pci_remove),
4841#ifdef CONFIG_PM 4841 .driver.pm = IWL_PM_OPS,
4842 .suspend = iwl_pci_suspend,
4843 .resume = iwl_pci_resume,
4844#endif
4845}; 4842};
4846 4843
4847static int __init iwl_init(void) 4844static int __init iwl_init(void)
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index 87c18001d2c0..2a4d40e5b9f4 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -2592,8 +2592,9 @@ EXPORT_SYMBOL(iwl_add_beacon_time);
2592 2592
2593#ifdef CONFIG_PM 2593#ifdef CONFIG_PM
2594 2594
2595int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state) 2595int iwl_pci_suspend(struct device *device)
2596{ 2596{
2597 struct pci_dev *pdev = to_pci_dev(device);
2597 struct iwl_priv *priv = pci_get_drvdata(pdev); 2598 struct iwl_priv *priv = pci_get_drvdata(pdev);
2598 2599
2599 /* 2600 /*
@@ -2605,18 +2606,14 @@ int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state)
2605 */ 2606 */
2606 iwl_apm_stop(priv); 2607 iwl_apm_stop(priv);
2607 2608
2608 pci_save_state(pdev);
2609 pci_disable_device(pdev);
2610 pci_set_power_state(pdev, PCI_D3hot);
2611
2612 return 0; 2609 return 0;
2613} 2610}
2614EXPORT_SYMBOL(iwl_pci_suspend); 2611EXPORT_SYMBOL(iwl_pci_suspend);
2615 2612
2616int iwl_pci_resume(struct pci_dev *pdev) 2613int iwl_pci_resume(struct device *device)
2617{ 2614{
2615 struct pci_dev *pdev = to_pci_dev(device);
2618 struct iwl_priv *priv = pci_get_drvdata(pdev); 2616 struct iwl_priv *priv = pci_get_drvdata(pdev);
2619 int ret;
2620 bool hw_rfkill = false; 2617 bool hw_rfkill = false;
2621 2618
2622 /* 2619 /*
@@ -2625,11 +2622,6 @@ int iwl_pci_resume(struct pci_dev *pdev)
2625 */ 2622 */
2626 pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00); 2623 pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
2627 2624
2628 pci_set_power_state(pdev, PCI_D0);
2629 ret = pci_enable_device(pdev);
2630 if (ret)
2631 return ret;
2632 pci_restore_state(pdev);
2633 iwl_enable_interrupts(priv); 2625 iwl_enable_interrupts(priv);
2634 2626
2635 if (!(iwl_read32(priv, CSR_GP_CNTRL) & 2627 if (!(iwl_read32(priv, CSR_GP_CNTRL) &
@@ -2647,4 +2639,14 @@ int iwl_pci_resume(struct pci_dev *pdev)
2647} 2639}
2648EXPORT_SYMBOL(iwl_pci_resume); 2640EXPORT_SYMBOL(iwl_pci_resume);
2649 2641
2642const struct dev_pm_ops iwl_pm_ops = {
2643 .suspend = iwl_pci_suspend,
2644 .resume = iwl_pci_resume,
2645 .freeze = iwl_pci_suspend,
2646 .thaw = iwl_pci_resume,
2647 .poweroff = iwl_pci_suspend,
2648 .restore = iwl_pci_resume,
2649};
2650EXPORT_SYMBOL(iwl_pm_ops);
2651
2650#endif /* CONFIG_PM */ 2652#endif /* CONFIG_PM */
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index 64527def059f..b17de8214eb5 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -615,9 +615,17 @@ __le32 iwl_add_beacon_time(struct iwl_priv *priv, u32 base,
615 u32 addon, u32 beacon_interval); 615 u32 addon, u32 beacon_interval);
616 616
617#ifdef CONFIG_PM 617#ifdef CONFIG_PM
618int iwl_pci_suspend(struct pci_dev *pdev, pm_message_t state); 618int iwl_pci_suspend(struct device *device);
619int iwl_pci_resume(struct pci_dev *pdev); 619int iwl_pci_resume(struct device *device);
620#endif /* CONFIG_PM */ 620extern const struct dev_pm_ops iwl_pm_ops;
621
622#define IWL_PM_OPS (&iwl_pm_ops)
623
624#else /* !CONFIG_PM */
625
626#define IWL_PM_OPS NULL
627
628#endif /* !CONFIG_PM */
621 629
622/***************************************************** 630/*****************************************************
623* Error Handling Debugging 631* Error Handling Debugging
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
index 3b8bf8686276..9b71921dc2b6 100644
--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
@@ -4275,10 +4275,7 @@ static struct pci_driver iwl3945_driver = {
4275 .id_table = iwl3945_hw_card_ids, 4275 .id_table = iwl3945_hw_card_ids,
4276 .probe = iwl3945_pci_probe, 4276 .probe = iwl3945_pci_probe,
4277 .remove = __devexit_p(iwl3945_pci_remove), 4277 .remove = __devexit_p(iwl3945_pci_remove),
4278#ifdef CONFIG_PM 4278 .driver.pm = IWL_PM_OPS,
4279 .suspend = iwl_pci_suspend,
4280 .resume = iwl_pci_resume,
4281#endif
4282}; 4279};
4283 4280
4284static int __init iwl3945_init(void) 4281static int __init iwl3945_init(void)