|
@@ -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 */
|
|
|
|