alistair23-linux/drivers/pci/hotplug
Ajaykumar Hotchandani b51306c634 PCI: Set device power state to PCI_D0 for device without native PM support
During test of one IB card with guest VM, found that, msi is not
initialized properly.

It turns out __write_msi_msg will do nothing if device current_state is
not PCI_D0.  And, that pci device does not have pm_cap in guest VM.

There is an error in setting of power state to PCI_D0 in
pci_enable_device(), but error is not returned for this.  Following is
code flow:

pci_enable_device() -->   __pci_enable_device_flags() -->
do_pci_enable_device() -->   pci_set_power_state() -->
__pci_start_power_transition()

We have following condition inside __pci_start_power_transition():
         if (platform_pci_power_manageable(dev)) {
                 error = platform_pci_set_power_state(dev, state);
                 if (!error)
                         pci_update_current_state(dev, state);
         } else {
                 error = -ENODEV;
                 /* Fall back to PCI_D0 if native PM is not supported */
                 if (!dev->pm_cap)
                         dev->current_state = PCI_D0;
         }

Here, from platform_pci_set_power_state(), acpi_pci_set_power_state() is
getting called and that is failing with ENODEV because of following
condition:

         if (!handle || ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0",&tmp)))
                 return -ENODEV;

Because of that, pci_update_current_state() is not getting called.

With this patch, if device power state can not be set via
platform_pci_set_power_state and that device does not have native pm
support, then PCI device power state will be set to PCI_D0.

-v2: This also reverts 47e9037ac1, as it's
     not needed after this change.

Acked-by: "Rafael J. Wysocki" <rjw@sisk.pl>
Signed-off-by: Ajaykumar Hotchandani<ajaykumar.hotchandani@oracle.com>
Signed-off-by: Yinghai Lu<yinghai.lu@oracle.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
2011-12-14 08:26:42 -08:00
..
acpi_pcihp.c PCI hotplug: Rename is_ejectable which also exists in dock.c 2011-07-22 08:25:35 -07:00
acpiphp.h
acpiphp_core.c
acpiphp_glue.c PCI: Set device power state to PCI_D0 for device without native PM support 2011-12-14 08:26:42 -08:00
acpiphp_ibm.c
cpci_hotplug.h
cpci_hotplug_core.c atomic: use <linux/atomic.h> 2011-07-26 16:49:47 -07:00
cpci_hotplug_pci.c
cpcihp_generic.c
cpcihp_zt5550.c
cpcihp_zt5550.h
cpqphp.h
cpqphp_core.c PCI hotplug: cpqphp: use pci_dev->vendor 2011-07-22 08:25:43 -07:00
cpqphp_ctrl.c
cpqphp_nvram.c
cpqphp_nvram.h
cpqphp_pci.c
cpqphp_sysfs.c
fakephp.c
ibmphp.h
ibmphp_core.c
ibmphp_ebda.c
ibmphp_hpc.c
ibmphp_pci.c
ibmphp_res.c
Kconfig
Makefile
pci_hotplug_core.c
pciehp.h
pciehp_acpi.c pci: add module.h to files implicitly relying on its presence. 2011-10-31 19:31:23 -04:00
pciehp_core.c
pciehp_ctrl.c PCI: pciehp: wait 1000 ms before Link Training check 2011-11-11 09:31:34 -08:00
pciehp_hpc.c PCI: pciehp: wait 100 ms after Link Training check 2011-11-11 09:31:43 -08:00
pciehp_pci.c
pcihp_skeleton.c
pcihp_slot.c pci: Fix files needing export.h for EXPORT_SYMBOL/THIS_MODULE 2011-10-31 19:31:22 -04:00
rpadlpar.h
rpadlpar_core.c pci: add module.h to files implicitly relying on its presence. 2011-10-31 19:31:23 -04:00
rpadlpar_sysfs.c
rpaphp.h
rpaphp_core.c
rpaphp_pci.c
rpaphp_slot.c
sgi_hotplug.c
shpchp.h
shpchp_core.c PCI hotplug: shpchp: don't blindly claim non-AMD 0x7450 device IDs 2011-11-14 09:43:14 -08:00
shpchp_ctrl.c
shpchp_hpc.c PCI hotplug: shpchp: don't blindly claim non-AMD 0x7450 device IDs 2011-11-14 09:43:14 -08:00
shpchp_pci.c
shpchp_sysfs.c treewide: Convert uses of struct resource to resource_size(ptr) 2011-06-10 14:55:36 +02:00