diff options
author | jkim <jkim@FreeBSD.org> | 2010-10-20 16:47:09 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2010-10-20 16:47:09 +0000 |
commit | 0ed43ce056fe56ef364d95425406491085c93d7e (patch) | |
tree | 1860d37b19d1eea9c460d5dac009f292d17cd26f | |
parent | 995314da5fb054dcab0630293481767905c19a22 (diff) | |
download | FreeBSD-src-0ed43ce056fe56ef364d95425406491085c93d7e.zip FreeBSD-src-0ed43ce056fe56ef364d95425406491085c93d7e.tar.gz |
Introduce a new tunable 'hw.pci.do_power_suspend'. This tunable lets you
avoid PCI power state transition from D0 to D3 for suspending case. Default
is 1 or enabled.
-rw-r--r-- | sys/dev/acpica/acpi_pci.c | 2 | ||||
-rw-r--r-- | sys/dev/pci/pci.c | 10 | ||||
-rw-r--r-- | sys/dev/pci/pci_pci.c | 2 | ||||
-rw-r--r-- | sys/dev/pci/pci_private.h | 1 |
4 files changed, 12 insertions, 3 deletions
diff --git a/sys/dev/acpica/acpi_pci.c b/sys/dev/acpica/acpi_pci.c index bf7cf2e..a14e0ba 100644 --- a/sys/dev/acpica/acpi_pci.c +++ b/sys/dev/acpica/acpi_pci.c @@ -179,7 +179,7 @@ acpi_pci_set_powerstate_method(device_t dev, device_t child, int state) */ ACPI_SERIAL_BEGIN(pci_powerstate); old_state = pci_get_powerstate(child); - if (old_state < state) { + if (old_state < state && pci_do_power_suspend) { error = pci_set_powerstate_method(dev, child, state); if (error) goto out; diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c index d1b211a..21263b7 100644 --- a/sys/dev/pci/pci.c +++ b/sys/dev/pci/pci.c @@ -257,6 +257,12 @@ SYSCTL_INT(_hw_pci, OID_AUTO, do_power_resume, CTLFLAG_RW, &pci_do_power_resume, 1, "Transition from D3 -> D0 on resume."); +int pci_do_power_suspend = 1; +TUNABLE_INT("hw.pci.do_power_suspend", &pci_do_power_suspend); +SYSCTL_INT(_hw_pci, OID_AUTO, do_power_suspend, CTLFLAG_RW, + &pci_do_power_suspend, 1, + "Transition from D0 -> D3 on suspend."); + static int pci_do_msi = 1; TUNABLE_INT("hw.pci.enable_msi", &pci_do_msi); SYSCTL_INT(_hw_pci, OID_AUTO, enable_msi, CTLFLAG_RW, &pci_do_msi, 1, @@ -2954,7 +2960,9 @@ pci_suspend(device_t dev) free(devlist, M_TEMP); return (error); } - pci_set_power_children(dev, devlist, numdevs, PCI_POWERSTATE_D3); + if (pci_do_power_suspend) + pci_set_power_children(dev, devlist, numdevs, + PCI_POWERSTATE_D3); free(devlist, M_TEMP); return (0); } diff --git a/sys/dev/pci/pci_pci.c b/sys/dev/pci/pci_pci.c index 5dd8dbe..7915818 100644 --- a/sys/dev/pci/pci_pci.c +++ b/sys/dev/pci/pci_pci.c @@ -447,7 +447,7 @@ pcib_suspend(device_t dev) pcib_cfg_save(device_get_softc(dev)); error = bus_generic_suspend(dev); - if (error == 0) { + if (error == 0 && pci_do_power_suspend) { dstate = PCI_POWERSTATE_D3; pcib = device_get_parent(device_get_parent(dev)); if (PCIB_POWER_FOR_SLEEP(pcib, dev, &dstate) == 0) diff --git a/sys/dev/pci/pci_private.h b/sys/dev/pci/pci_private.h index 70d887b..90866ef 100644 --- a/sys/dev/pci/pci_private.h +++ b/sys/dev/pci/pci_private.h @@ -39,6 +39,7 @@ DECLARE_CLASS(pci_driver); extern int pci_do_power_resume; +extern int pci_do_power_suspend; void pci_add_children(device_t dev, int domain, int busno, size_t dinfo_size); |