The jme driver uses the legacy PCI power management, so it has to do
some PCI-specific things in its ->suspend() and ->resume() callbacks,
which isn't necessary and should better be done by the PCI
sybsystem-level power management code. It also doesn't use device
wakeup flags correctly.
Convert jme to the new PCI power management framework and make it
let the PCI subsystem take care of all the PCI-specific aspects of
device handling during system power transitions.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
Merged-by: Guo-Fu Tseng <cooldavid@cooldavid.org>
{
jwrite32(jme, JME_PMCS, 0xFFFF0000 | jme->reg_pmcs);
pci_set_power_state(jme->pdev, PCI_D0);
{
jwrite32(jme, JME_PMCS, 0xFFFF0000 | jme->reg_pmcs);
pci_set_power_state(jme->pdev, PCI_D0);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26)
pci_enable_wake(jme->pdev, PCI_D0, false);
pci_enable_wake(jme->pdev, PCI_D0, false);
+#else
+ device_set_wakeup_enable(&jme->pdev->dev, false);
+#endif
jwrite32(jme, JME_PMCS, jme->reg_pmcs);
jwrite32(jme, JME_PMCS, jme->reg_pmcs);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
+ device_set_wakeup_enable(&jme->pdev->dev, jme->reg_pmcs);
+#endif
+
#ifdef CONFIG_PM
static int
#ifdef CONFIG_PM
static int
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,38)
jme_suspend(struct pci_dev *pdev, pm_message_t state)
jme_suspend(struct pci_dev *pdev, pm_message_t state)
+#else
+jme_suspend(struct device *dev)
+#endif
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38)
+ struct pci_dev *pdev = to_pci_dev(dev);
+#endif
struct net_device *netdev = pci_get_drvdata(pdev);
struct jme_adapter *jme = netdev_priv(netdev);
struct net_device *netdev = pci_get_drvdata(pdev);
struct jme_adapter *jme = netdev_priv(netdev);
tasklet_hi_enable(&jme->rxclean_task);
tasklet_hi_enable(&jme->rxempty_task);
tasklet_hi_enable(&jme->rxclean_task);
tasklet_hi_enable(&jme->rxempty_task);
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,38)
+ pci_save_state(pdev);
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)
pci_enable_wake(pdev, PCI_D3hot, true);
#else
pci_pme_active(pdev, true);
#endif
pci_set_power_state(pdev, PCI_D3hot);
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)
pci_enable_wake(pdev, PCI_D3hot, true);
#else
pci_pme_active(pdev, true);
#endif
pci_set_power_state(pdev, PCI_D3hot);
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,38)
jme_resume(struct pci_dev *pdev)
jme_resume(struct pci_dev *pdev)
+#else
+jme_resume(struct device *dev)
+#endif
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38)
+ struct pci_dev *pdev = to_pci_dev(dev);
+#endif
struct net_device *netdev = pci_get_drvdata(pdev);
struct jme_adapter *jme = netdev_priv(netdev);
jme_clear_pm(jme);
struct net_device *netdev = pci_get_drvdata(pdev);
struct jme_adapter *jme = netdev_priv(netdev);
jme_clear_pm(jme);
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,38)
jme_phy_on(jme);
if (test_bit(JME_FLAG_SSET, &jme->flags))
jme_phy_on(jme);
if (test_bit(JME_FLAG_SSET, &jme->flags))
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38)
+static SIMPLE_DEV_PM_OPS(jme_pm_ops, jme_suspend, jme_resume);
+#define JME_PM_OPS (&jme_pm_ops)
+#endif
+
+#else
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,38)
+#define JME_PM_OPS NULL
+#endif
#endif
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24)
#endif
#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,24)
.id_table = jme_pci_tbl,
.probe = jme_init_one,
.remove = __devexit_p(jme_remove_one),
.id_table = jme_pci_tbl,
.probe = jme_init_one,
.remove = __devexit_p(jme_remove_one),
-#ifdef CONFIG_PM
- .suspend = jme_suspend,
- .resume = jme_resume,
-#endif /* CONFIG_PM */
.shutdown = jme_shutdown,
.shutdown = jme_shutdown,
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,38)
+ .suspend = jme_suspend,
+ .resume = jme_resume
+#else
+ .driver.pm = JME_PM_OPS,
+#endif