From 70afc39992c5f2ec07ce949a4f6ccf09d94dedc6 Mon Sep 17 00:00:00 2001 From: Jesse Barnes Date: Fri, 5 Nov 2010 15:16:36 -0400 Subject: [PATCH] --- yaml --- r: 222124 b: refs/heads/master c: 97c145f7c87453cec90e91238fba5fe2c1561b32 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/pci/pci.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 9b48c0572585..a102ed65a3d4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 3b519e4ea618b6943a82931630872907f9ac2c2b +refs/heads/master: 97c145f7c87453cec90e91238fba5fe2c1561b32 diff --git a/trunk/drivers/pci/pci.c b/trunk/drivers/pci/pci.c index e98c8104297b..710c8a29be0d 100644 --- a/trunk/drivers/pci/pci.c +++ b/trunk/drivers/pci/pci.c @@ -1007,6 +1007,18 @@ static int __pci_enable_device_flags(struct pci_dev *dev, int err; int i, bars = 0; + /* + * Power state could be unknown at this point, either due to a fresh + * boot or a device removal call. So get the current power state + * so that things like MSI message writing will behave as expected + * (e.g. if the device really is in D0 at enable time). + */ + if (dev->pm_cap) { + u16 pmcsr; + pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr); + dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK); + } + if (atomic_add_return(1, &dev->enable_cnt) > 1) return 0; /* already enabled */