From: Ajaykumar Hotchandani <ajaykumar.hotchandani@oracle.com>
To: Jesse Barnes <jbarnes@virtuousgeek.org>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: [PATCH] PCI: Set device power state to PCI_D0 for device without native PM support
Date: Wed, 05 Oct 2011 17:04:00 +0530 [thread overview]
Message-ID: <4E8C40A8.6080205@oracle.com> (raw)
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.
Signed-off-by: Ajaykumar Hotchandani<ajaykumar.hotchandani@oracle.com>
Signed-off-by: Yinghai Lu<yinghai.lu@oracle.com>
---
drivers/pci/pci.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index e9651f0..ca8c82d 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -664,6 +664,9 @@ static int pci_platform_power_transition(struct pci_dev *dev, pci_power_t state)
error = platform_pci_set_power_state(dev, state);
if (!error)
pci_update_current_state(dev, state);
+ /* Fall back to PCI_D0 if native PM is not supported */
+ else if (!dev->pm_cap)
+ dev->current_state = PCI_D0;
} else {
error = -ENODEV;
/* Fall back to PCI_D0 if native PM is not supported */
--
1.7.5.1
next reply other threads:[~2011-10-05 11:34 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-10-05 11:34 Ajaykumar Hotchandani [this message]
2011-10-05 19:41 ` [PATCH] PCI: Set device power state to PCI_D0 for device without native PM support Rafael J. Wysocki
2011-10-06 16:10 ` Yinghai Lu
2011-10-06 17:20 ` Rafael J. Wysocki
2011-10-06 10:39 ` Stefano Stabellini
2011-10-06 16:05 ` Yinghai Lu
2011-10-06 16:17 ` Stefano Stabellini
2011-10-10 12:02 ` Ajaykumar Hotchandani
2011-10-13 14:30 ` Stefano Stabellini
2011-10-18 13:52 ` Ajaykumar Hotchandani
2011-10-27 13:14 ` Stefano Stabellini
2011-10-27 14:34 ` Ajaykumar Hotchandani
2011-10-27 15:01 ` Stefano Stabellini
2011-10-28 12:06 ` Ajaykumar Hotchandani
[not found] <4EE5BAF8.4000303@oracle.com>
2011-12-13 18:53 ` Jesse Barnes
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4E8C40A8.6080205@oracle.com \
--to=ajaykumar.hotchandani@oracle.com \
--cc=jbarnes@virtuousgeek.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.