linux/drivers/pci/pcie
Naga Chumbalkar 1a680b7c32 PCI: PCIe links may not get configured for ASPM under POWERSAVE mode
v3 -> v2: Moved ASPM enabling logic to pci_set_power_state()
v2 -> v1: Preserved the logic in pci_raw_set_power_state()
	: Added ASPM enabling logic after scanning Root Bridge
	: http://marc.info/?l=linux-pci&m=130046996216391&w=2
v1	: http://marc.info/?l=linux-pci&m=130013164703283&w=2

The assumption made in commit 41cd766b06
(PCI: Don't enable aspm before drivers have had a chance to veto it) that
pci_enable_device() will result in re-configuring ASPM when aspm_policy is
POWERSAVE is no longer valid.  This is due to commit
97c145f7c8 (PCI: read current power state
at enable time) which resets dev->current_state to D0. Due to this the
call to pcie_aspm_pm_state_change() is never made. Note the equality check
(below) that returns early:
./drivers/pci/pci.c: pci_raw_set_pci_power_state()
546         /* Check if we're already there */
547         if (dev->current_state == state)
548                 return 0;

Therefore OSPM never configures the PCIe links for ASPM to turn them "on".

Fix it by configuring ASPM from the pci_enable_device() code path. This
also allows a driver such as the e1000e networking driver a chance to
disable ASPM (L0s, L1), if need be, prior to enabling the device. A
driver may perform this action if the device is known to mis-behave
wrt ASPM.

Signed-off-by: Naga Chumbalkar <nagananda.chumbalkar@hp.com>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
Cc: Matthew Garrett <mjg59@srcf.ucam.org>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
2011-03-21 09:40:43 -07:00
..
aer PCI: aer-inject: Override PCIe AER Mask Registers 2011-03-04 10:41:02 -08:00
aspm.c PCI: PCIe links may not get configured for ASPM under POWERSAVE mode 2011-03-21 09:40:43 -07:00
Kconfig kconfig: rename CONFIG_EMBEDDED to CONFIG_EXPERT 2011-01-20 17:02:05 -08:00
Makefile PCI: PCIe: Move PCIe PME code to the pcie directory 2010-08-24 13:47:48 -07:00
pme.c PCI/PM: Report wakeup events before resuming devices 2011-01-14 08:55:43 -08:00
portdrv_acpi.c PCI/ACPI: Request _OSC control once for each root bridge (v3) 2011-01-14 08:55:41 -08:00
portdrv_bus.c PCI: portdrv: remove unnecessary struct pcie_port_data 2009-12-04 15:56:19 -08:00
portdrv_core.c PCI/PCIe: Clear Root PME Status bits early during system resume 2010-12-23 12:54:03 -08:00
portdrv_pci.c PCI/PCIe: Clear Root PME Status bits early during system resume 2010-12-23 12:54:03 -08:00
portdrv.h PCI/ACPI: Request _OSC control once for each root bridge (v3) 2011-01-14 08:55:41 -08:00