svn commit: r320656 - head/sys/compat/linuxkpi/common/src

Mark Johnston markj at FreeBSD.org
Tue Jul 4 18:44:16 UTC 2017


Author: markj
Date: Tue Jul  4 18:44:14 2017
New Revision: 320656
URL: https://svnweb.freebsd.org/changeset/base/320656

Log:
  Invoke suspend/resume methods from the driver pmops if available.
  
  Obtained from:	kmacy (original version)
  MFC after:	1 week

Modified:
  head/sys/compat/linuxkpi/common/src/linux_pci.c

Modified: head/sys/compat/linuxkpi/common/src/linux_pci.c
==============================================================================
--- head/sys/compat/linuxkpi/common/src/linux_pci.c	Tue Jul  4 18:38:34 2017	(r320655)
+++ head/sys/compat/linuxkpi/common/src/linux_pci.c	Tue Jul  4 18:44:14 2017	(r320656)
@@ -183,32 +183,47 @@ linux_pci_detach(device_t dev)
 static int
 linux_pci_suspend(device_t dev)
 {
+	const struct dev_pm_ops *pmops;
 	struct pm_message pm = { };
 	struct pci_dev *pdev;
-	int err;
+	int error;
 
+	error = 0;
 	linux_set_current(curthread);
 	pdev = device_get_softc(dev);
+	pmops = pdev->pdrv->driver.pm;
+
 	if (pdev->pdrv->suspend != NULL)
-		err = -pdev->pdrv->suspend(pdev, pm);
-	else
-		err = 0;
-	return (err);
+		error = -pdev->pdrv->suspend(pdev, pm);
+	else if (pmops != NULL && pmops->suspend != NULL) {
+		error = -pmops->suspend(&pdev->dev);
+		if (error == 0 && pmops->suspend_late != NULL)
+			error = -pmops->suspend_late(&pdev->dev);
+	}
+	return (error);
 }
 
 static int
 linux_pci_resume(device_t dev)
 {
+	const struct dev_pm_ops *pmops;
 	struct pci_dev *pdev;
-	int err;
+	int error;
 
+	error = 0;
 	linux_set_current(curthread);
 	pdev = device_get_softc(dev);
+	pmops = pdev->pdrv->driver.pm;
+
 	if (pdev->pdrv->resume != NULL)
-		err = -pdev->pdrv->resume(pdev);
-	else
-		err = 0;
-	return (err);
+		error = -pdev->pdrv->resume(pdev);
+	else if (pmops != NULL && pmops->resume != NULL) {
+		if (pmops->resume_early != NULL)
+			error = -pmops->resume_early(&pdev->dev);
+		if (error == 0 && pmops->resume != NULL)
+			error = -pmops->resume(&pdev->dev);
+	}
+	return (error);
 }
 
 static int
@@ -266,4 +281,3 @@ pci_unregister_driver(struct pci_driver *pdrv)
 		devclass_delete_driver(bus, &pdrv->bsddriver);
 	mtx_unlock(&Giant);
 }
-


More information about the svn-src-head mailing list