diff options
Diffstat (limited to 'drivers/net/skge.c')
-rw-r--r-- | drivers/net/skge.c | 46 |
1 files changed, 16 insertions, 30 deletions
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index c149e48a0f57..42daf98ba736 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -4042,53 +4042,40 @@ static void __devexit skge_remove(struct pci_dev *pdev) | |||
4042 | } | 4042 | } |
4043 | 4043 | ||
4044 | #ifdef CONFIG_PM | 4044 | #ifdef CONFIG_PM |
4045 | static int skge_suspend(struct pci_dev *pdev, pm_message_t state) | 4045 | static int skge_suspend(struct device *dev) |
4046 | { | 4046 | { |
4047 | struct pci_dev *pdev = to_pci_dev(dev); | ||
4047 | struct skge_hw *hw = pci_get_drvdata(pdev); | 4048 | struct skge_hw *hw = pci_get_drvdata(pdev); |
4048 | int i, err, wol = 0; | 4049 | int i; |
4049 | 4050 | ||
4050 | if (!hw) | 4051 | if (!hw) |
4051 | return 0; | 4052 | return 0; |
4052 | 4053 | ||
4053 | err = pci_save_state(pdev); | ||
4054 | if (err) | ||
4055 | return err; | ||
4056 | |||
4057 | for (i = 0; i < hw->ports; i++) { | 4054 | for (i = 0; i < hw->ports; i++) { |
4058 | struct net_device *dev = hw->dev[i]; | 4055 | struct net_device *dev = hw->dev[i]; |
4059 | struct skge_port *skge = netdev_priv(dev); | 4056 | struct skge_port *skge = netdev_priv(dev); |
4060 | 4057 | ||
4061 | if (netif_running(dev)) | 4058 | if (netif_running(dev)) |
4062 | skge_down(dev); | 4059 | skge_down(dev); |
4060 | |||
4063 | if (skge->wol) | 4061 | if (skge->wol) |
4064 | skge_wol_init(skge); | 4062 | skge_wol_init(skge); |
4065 | |||
4066 | wol |= skge->wol; | ||
4067 | } | 4063 | } |
4068 | 4064 | ||
4069 | skge_write32(hw, B0_IMSK, 0); | 4065 | skge_write32(hw, B0_IMSK, 0); |
4070 | 4066 | ||
4071 | pci_prepare_to_sleep(pdev); | ||
4072 | |||
4073 | return 0; | 4067 | return 0; |
4074 | } | 4068 | } |
4075 | 4069 | ||
4076 | static int skge_resume(struct pci_dev *pdev) | 4070 | static int skge_resume(struct device *dev) |
4077 | { | 4071 | { |
4072 | struct pci_dev *pdev = to_pci_dev(dev); | ||
4078 | struct skge_hw *hw = pci_get_drvdata(pdev); | 4073 | struct skge_hw *hw = pci_get_drvdata(pdev); |
4079 | int i, err; | 4074 | int i, err; |
4080 | 4075 | ||
4081 | if (!hw) | 4076 | if (!hw) |
4082 | return 0; | 4077 | return 0; |
4083 | 4078 | ||
4084 | err = pci_back_from_sleep(pdev); | ||
4085 | if (err) | ||
4086 | goto out; | ||
4087 | |||
4088 | err = pci_restore_state(pdev); | ||
4089 | if (err) | ||
4090 | goto out; | ||
4091 | |||
4092 | err = skge_reset(hw); | 4079 | err = skge_reset(hw); |
4093 | if (err) | 4080 | if (err) |
4094 | goto out; | 4081 | goto out; |
@@ -4109,12 +4096,19 @@ static int skge_resume(struct pci_dev *pdev) | |||
4109 | out: | 4096 | out: |
4110 | return err; | 4097 | return err; |
4111 | } | 4098 | } |
4099 | |||
4100 | static SIMPLE_DEV_PM_OPS(skge_pm_ops, skge_suspend, skge_resume); | ||
4101 | #define SKGE_PM_OPS (&skge_pm_ops) | ||
4102 | |||
4103 | #else | ||
4104 | |||
4105 | #define SKGE_PM_OPS NULL | ||
4112 | #endif | 4106 | #endif |
4113 | 4107 | ||
4114 | static void skge_shutdown(struct pci_dev *pdev) | 4108 | static void skge_shutdown(struct pci_dev *pdev) |
4115 | { | 4109 | { |
4116 | struct skge_hw *hw = pci_get_drvdata(pdev); | 4110 | struct skge_hw *hw = pci_get_drvdata(pdev); |
4117 | int i, wol = 0; | 4111 | int i; |
4118 | 4112 | ||
4119 | if (!hw) | 4113 | if (!hw) |
4120 | return; | 4114 | return; |
@@ -4125,15 +4119,10 @@ static void skge_shutdown(struct pci_dev *pdev) | |||
4125 | 4119 | ||
4126 | if (skge->wol) | 4120 | if (skge->wol) |
4127 | skge_wol_init(skge); | 4121 | skge_wol_init(skge); |
4128 | wol |= skge->wol; | ||
4129 | } | 4122 | } |
4130 | 4123 | ||
4131 | if (pci_enable_wake(pdev, PCI_D3cold, wol)) | 4124 | pci_wake_from_d3(pdev, device_may_wakeup(&pdev->dev)); |
4132 | pci_enable_wake(pdev, PCI_D3hot, wol); | ||
4133 | |||
4134 | pci_disable_device(pdev); | ||
4135 | pci_set_power_state(pdev, PCI_D3hot); | 4125 | pci_set_power_state(pdev, PCI_D3hot); |
4136 | |||
4137 | } | 4126 | } |
4138 | 4127 | ||
4139 | static struct pci_driver skge_driver = { | 4128 | static struct pci_driver skge_driver = { |
@@ -4141,11 +4130,8 @@ static struct pci_driver skge_driver = { | |||
4141 | .id_table = skge_id_table, | 4130 | .id_table = skge_id_table, |
4142 | .probe = skge_probe, | 4131 | .probe = skge_probe, |
4143 | .remove = __devexit_p(skge_remove), | 4132 | .remove = __devexit_p(skge_remove), |
4144 | #ifdef CONFIG_PM | ||
4145 | .suspend = skge_suspend, | ||
4146 | .resume = skge_resume, | ||
4147 | #endif | ||
4148 | .shutdown = skge_shutdown, | 4133 | .shutdown = skge_shutdown, |
4134 | .driver.pm = SKGE_PM_OPS, | ||
4149 | }; | 4135 | }; |
4150 | 4136 | ||
4151 | static struct dmi_system_id skge_32bit_dma_boards[] = { | 4137 | static struct dmi_system_id skge_32bit_dma_boards[] = { |