Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 11 Nov 2014 17:14:12 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r274386 - in head/sys/dev: acpica pci
Message-ID:  <201411111714.sABHECKp000854@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Tue Nov 11 17:14:11 2014
New Revision: 274386
URL: https://svnweb.freebsd.org/changeset/base/274386

Log:
  Use the correct device (child) when asking the bus layer about which power
  state said device should go into.
  
  This was a snafu introduced in the ACPI/PCI awareness separation.
  
  When putting a device into a power state, the bus (and thus firmware,
  eg ACPI) should be asked before hand to check whether the device
  can indeed go into that power state.
  
  There's a set of nodes in ACPI under each device - the _SxD nodes - which
  state which ACPI power state to put the device into when the system is
  going into power save state 'x'.  So when going into S3, the existence
  of an _S3D node would override whatever the system was trying to do.
  
  By default the PCI code wants to put devices into D3 before suspending.
  
  I have a laptop here (Asus Zenbook - check the PR) whose EHCI controller
  really wants to be in D2 during suspend, not D3.  So if we put it into
  D3 and then try to enter S3, everything hangs.  The device itself
  can go into D3 - it just can't be there when the call to ACPI to enter
  S3 occurs.  The PCI patch fixes this.
  
  jkim@ noticed that the same is needed for the ACPI child device
  enumeration.
  
  Thankyou to Matt Dillon (the programmer, not the actor) for buying me
  this particular laptop so I could debug the issues with the Atheros
  AR9485 that is in it.  It's his fault that I ended up with this
  laptop and was sufficiently annoyed by the lack of USB suspend
  to go down this rabbit hole.
  
  Tested:
  
  * Thinkpad T400
  * Thinkpad X230
  * Thinkpad T42
  * Thinkpad T60
  * Asus Zenbook (see PR)
  * Asus EEEPC 701
  * Asus EEEPC 1001PX
  
  TODO:
  
  * Figure out what we should do about devices we unload drivers for
    that want to be in a specific state when entering S3 / S4 -
    the "put devices into D3 if they're not bound to a driver" option
    may also mess with things.
  
  PR:		kern/194884
  Reviewed by:	jhb, jkim
  MFC after:	1 week
  Relnotes:	yes
  Sponsored by:	Matt Dillon <dillon@apollo.backplane.com> (hardware)

Modified:
  head/sys/dev/acpica/acpi.c
  head/sys/dev/pci/pci.c

Modified: head/sys/dev/acpica/acpi.c
==============================================================================
--- head/sys/dev/acpica/acpi.c	Tue Nov 11 17:13:03 2014	(r274385)
+++ head/sys/dev/acpica/acpi.c	Tue Nov 11 17:14:11 2014	(r274386)
@@ -710,7 +710,7 @@ acpi_set_power_children(device_t dev, in
 		child = devlist[i];
 		dstate = state;
 		if (device_is_attached(child) &&
-		    acpi_device_pwr_for_sleep(parent, dev, &dstate) == 0)
+		    acpi_device_pwr_for_sleep(parent, child, &dstate) == 0)
 			acpi_set_powerstate(child, dstate);
 	}
 	free(devlist, M_TEMP);

Modified: head/sys/dev/pci/pci.c
==============================================================================
--- head/sys/dev/pci/pci.c	Tue Nov 11 17:13:03 2014	(r274385)
+++ head/sys/dev/pci/pci.c	Tue Nov 11 17:14:11 2014	(r274386)
@@ -3651,7 +3651,7 @@ pci_set_power_child(device_t dev, device
 	dinfo = device_get_ivars(child);
 	dstate = state;
 	if (device_is_attached(child) &&
-	    PCIB_POWER_FOR_SLEEP(pcib, dev, &dstate) == 0)
+	    PCIB_POWER_FOR_SLEEP(pcib, child, &dstate) == 0)
 		pci_set_powerstate(child, dstate);
 }
 



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