|
@@ -4042,53 +4042,40 @@ static void __devexit skge_remove(struct pci_dev *pdev)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
|
-static int skge_suspend(struct pci_dev *pdev, pm_message_t state)
|
|
|
+static int skge_suspend(struct device *dev)
|
|
|
{
|
|
|
+ struct pci_dev *pdev = to_pci_dev(dev);
|
|
|
struct skge_hw *hw = pci_get_drvdata(pdev);
|
|
|
- int i, err, wol = 0;
|
|
|
+ int i;
|
|
|
|
|
|
if (!hw)
|
|
|
return 0;
|
|
|
|
|
|
- err = pci_save_state(pdev);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
-
|
|
|
for (i = 0; i < hw->ports; i++) {
|
|
|
struct net_device *dev = hw->dev[i];
|
|
|
struct skge_port *skge = netdev_priv(dev);
|
|
|
|
|
|
if (netif_running(dev))
|
|
|
skge_down(dev);
|
|
|
+
|
|
|
if (skge->wol)
|
|
|
skge_wol_init(skge);
|
|
|
-
|
|
|
- wol |= skge->wol;
|
|
|
}
|
|
|
|
|
|
skge_write32(hw, B0_IMSK, 0);
|
|
|
|
|
|
- pci_prepare_to_sleep(pdev);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int skge_resume(struct pci_dev *pdev)
|
|
|
+static int skge_resume(struct device *dev)
|
|
|
{
|
|
|
+ struct pci_dev *pdev = to_pci_dev(dev);
|
|
|
struct skge_hw *hw = pci_get_drvdata(pdev);
|
|
|
int i, err;
|
|
|
|
|
|
if (!hw)
|
|
|
return 0;
|
|
|
|
|
|
- err = pci_back_from_sleep(pdev);
|
|
|
- if (err)
|
|
|
- goto out;
|
|
|
-
|
|
|
- err = pci_restore_state(pdev);
|
|
|
- if (err)
|
|
|
- goto out;
|
|
|
-
|
|
|
err = skge_reset(hw);
|
|
|
if (err)
|
|
|
goto out;
|
|
@@ -4109,12 +4096,19 @@ static int skge_resume(struct pci_dev *pdev)
|
|
|
out:
|
|
|
return err;
|
|
|
}
|
|
|
+
|
|
|
+static SIMPLE_DEV_PM_OPS(skge_pm_ops, skge_suspend, skge_resume);
|
|
|
+#define SKGE_PM_OPS (&skge_pm_ops)
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+#define SKGE_PM_OPS NULL
|
|
|
#endif
|
|
|
|
|
|
static void skge_shutdown(struct pci_dev *pdev)
|
|
|
{
|
|
|
struct skge_hw *hw = pci_get_drvdata(pdev);
|
|
|
- int i, wol = 0;
|
|
|
+ int i;
|
|
|
|
|
|
if (!hw)
|
|
|
return;
|
|
@@ -4125,15 +4119,10 @@ static void skge_shutdown(struct pci_dev *pdev)
|
|
|
|
|
|
if (skge->wol)
|
|
|
skge_wol_init(skge);
|
|
|
- wol |= skge->wol;
|
|
|
}
|
|
|
|
|
|
- if (pci_enable_wake(pdev, PCI_D3cold, wol))
|
|
|
- pci_enable_wake(pdev, PCI_D3hot, wol);
|
|
|
-
|
|
|
- pci_disable_device(pdev);
|
|
|
+ pci_wake_from_d3(pdev, device_may_wakeup(&pdev->dev));
|
|
|
pci_set_power_state(pdev, PCI_D3hot);
|
|
|
-
|
|
|
}
|
|
|
|
|
|
static struct pci_driver skge_driver = {
|
|
@@ -4141,11 +4130,8 @@ static struct pci_driver skge_driver = {
|
|
|
.id_table = skge_id_table,
|
|
|
.probe = skge_probe,
|
|
|
.remove = __devexit_p(skge_remove),
|
|
|
-#ifdef CONFIG_PM
|
|
|
- .suspend = skge_suspend,
|
|
|
- .resume = skge_resume,
|
|
|
-#endif
|
|
|
.shutdown = skge_shutdown,
|
|
|
+ .driver.pm = SKGE_PM_OPS,
|
|
|
};
|
|
|
|
|
|
static struct dmi_system_id skge_32bit_dma_boards[] = {
|