Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e92b9b3b authored by Francois Romieu's avatar Francois Romieu
Browse files

via-rhine: rework suspend and resume.



Cover of 861ab440.

Signed-off-by: default avatarFrancois Romieu <romieu@fr.zoreil.com>
parent fc3e0f8a
Loading
Loading
Loading
Loading
+20 −21
Original line number Diff line number Diff line
@@ -2291,17 +2291,18 @@ static void rhine_shutdown (struct pci_dev *pdev)

	spin_unlock(&rp->lock);

	/* Hit power state D3 (sleep) */
	if (!avoid_D3)
	if (system_state == SYSTEM_POWER_OFF && !avoid_D3) {
		iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW);

	/* TODO: Check use of pci_enable_wake() */

		pci_wake_from_d3(pdev, true);
		pci_set_power_state(pdev, PCI_D3hot);
	}
}

#ifdef CONFIG_PM
static int rhine_suspend(struct pci_dev *pdev, pm_message_t state)
#ifdef CONFIG_PM_SLEEP
static int rhine_suspend(struct device *device)
{
	struct pci_dev *pdev = to_pci_dev(device);
	struct net_device *dev = pci_get_drvdata(pdev);
	struct rhine_private *rp = netdev_priv(dev);

@@ -2313,28 +2314,21 @@ static int rhine_suspend(struct pci_dev *pdev, pm_message_t state)
	napi_disable(&rp->napi);

	netif_device_detach(dev);
	pci_save_state(pdev);

	rhine_shutdown(pdev);

	return 0;
}

static int rhine_resume(struct pci_dev *pdev)
static int rhine_resume(struct device *device)
{
	struct pci_dev *pdev = to_pci_dev(device);
	struct net_device *dev = pci_get_drvdata(pdev);
	struct rhine_private *rp = netdev_priv(dev);
	int ret;

	if (!netif_running(dev))
		return 0;

	ret = pci_set_power_state(pdev, PCI_D0);
	netif_info(rp, drv, dev, "Entering power state D0 %s (%d)\n",
		   ret ? "failed" : "succeeded", ret);

	pci_restore_state(pdev);

#ifdef USE_MMIO
	enable_mmio(rp->pioaddr, rp->quirks);
#endif
@@ -2352,18 +2346,23 @@ static int rhine_resume(struct pci_dev *pdev)

	return 0;
}
#endif /* CONFIG_PM */

static SIMPLE_DEV_PM_OPS(rhine_pm_ops, rhine_suspend, rhine_resume);
#define RHINE_PM_OPS	(&rhine_pm_ops)

#else

#define RHINE_PM_OPS	NULL

#endif /* !CONFIG_PM_SLEEP */

static struct pci_driver rhine_driver = {
	.name		= DRV_NAME,
	.id_table	= rhine_pci_tbl,
	.probe		= rhine_init_one,
	.remove		= __devexit_p(rhine_remove_one),
#ifdef CONFIG_PM
	.suspend	= rhine_suspend,
	.resume		= rhine_resume,
#endif /* CONFIG_PM */
	.shutdown	= rhine_shutdown,
	.driver.pm	= RHINE_PM_OPS,
};

static struct dmi_system_id __initdata rhine_dmi_table[] = {