Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Feb 2015 02:23:29 +0000 (UTC)
From:      Justin Hibbits <jhibbits@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r278123 - projects/pmac_pmu/sys/kern
Message-ID:  <201502030223.t132NTO7040302@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhibbits
Date: Tue Feb  3 02:23:29 2015
New Revision: 278123
URL: https://svnweb.freebsd.org/changeset/base/278123

Log:
  Bring back multipass suspend/resume in the bus_generic_{suspend,resume}
  functions.
  
  These were lost in the import.

Modified:
  projects/pmac_pmu/sys/kern/subr_bus.c

Modified: projects/pmac_pmu/sys/kern/subr_bus.c
==============================================================================
--- projects/pmac_pmu/sys/kern/subr_bus.c	Tue Feb  3 00:29:58 2015	(r278122)
+++ projects/pmac_pmu/sys/kern/subr_bus.c	Tue Feb  3 02:23:29 2015	(r278123)
@@ -3695,12 +3695,21 @@ bus_generic_suspend(device_t dev)
 		return (0);
 
 	TAILQ_FOREACH(child, &dev->children, link) {
-		error = BUS_SUSPEND_CHILD(dev, child);
+		/* First traverse the tree, then suspend this child. */
+		if (!(child->flags & DF_SUSPENDED))
+			error = bus_generic_suspend(child);
+		if (error == 0) {
+			if (child->pass >= bus_current_pass &&
+			    device_is_attached(child))
+				error = BUS_SUSPEND_CHILD(dev, child);
+		}
 		if (error) {
 			for (child2 = TAILQ_FIRST(&dev->children);
 			     child2 && child2 != child;
-			     child2 = TAILQ_NEXT(child2, link))
+			     child2 = TAILQ_NEXT(child2, link)) {
 				BUS_RESUME_CHILD(dev, child2);
+				bus_generic_resume(child2);
+			}
 			return (error);
 		}
 	}
@@ -3720,8 +3729,11 @@ bus_generic_resume(device_t dev)
 	device_t	child;
 
 	TAILQ_FOREACH(child, &dev->children, link) {
-		BUS_RESUME_CHILD(dev, child);
+		if (child->pass == bus_current_pass && (child->flags & DF_SUSPENDED))
+			BUS_RESUME_CHILD(dev, child);
 		/* if resume fails, there's nothing we can usefully do... */
+		if (child->pass <= bus_current_pass)
+			bus_generic_resume(child);
 	}
 	return (0);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201502030223.t132NTO7040302>