|
@@ -1181,6 +1181,8 @@ EXPORT_SYMBOL_GPL(pci_load_and_free_saved_state);
|
|
|
static int do_pci_enable_device(struct pci_dev *dev, int bars)
|
|
|
{
|
|
|
int err;
|
|
|
+ u16 cmd;
|
|
|
+ u8 pin;
|
|
|
|
|
|
err = pci_set_power_state(dev, PCI_D0);
|
|
|
if (err < 0 && err != -EIO)
|
|
@@ -1190,6 +1192,14 @@ static int do_pci_enable_device(struct pci_dev *dev, int bars)
|
|
|
return err;
|
|
|
pci_fixup_device(pci_fixup_enable, dev);
|
|
|
|
|
|
+ pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
|
|
|
+ if (pin) {
|
|
|
+ pci_read_config_word(dev, PCI_COMMAND, &cmd);
|
|
|
+ if (cmd & PCI_COMMAND_INTX_DISABLE)
|
|
|
+ pci_write_config_word(dev, PCI_COMMAND,
|
|
|
+ cmd & ~PCI_COMMAND_INTX_DISABLE);
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -1611,29 +1621,27 @@ static void pci_pme_list_scan(struct work_struct *work)
|
|
|
struct pci_pme_device *pme_dev, *n;
|
|
|
|
|
|
mutex_lock(&pci_pme_list_mutex);
|
|
|
- if (!list_empty(&pci_pme_list)) {
|
|
|
- list_for_each_entry_safe(pme_dev, n, &pci_pme_list, list) {
|
|
|
- if (pme_dev->dev->pme_poll) {
|
|
|
- struct pci_dev *bridge;
|
|
|
-
|
|
|
- bridge = pme_dev->dev->bus->self;
|
|
|
- /*
|
|
|
- * If bridge is in low power state, the
|
|
|
- * configuration space of subordinate devices
|
|
|
- * may be not accessible
|
|
|
- */
|
|
|
- if (bridge && bridge->current_state != PCI_D0)
|
|
|
- continue;
|
|
|
- pci_pme_wakeup(pme_dev->dev, NULL);
|
|
|
- } else {
|
|
|
- list_del(&pme_dev->list);
|
|
|
- kfree(pme_dev);
|
|
|
- }
|
|
|
+ list_for_each_entry_safe(pme_dev, n, &pci_pme_list, list) {
|
|
|
+ if (pme_dev->dev->pme_poll) {
|
|
|
+ struct pci_dev *bridge;
|
|
|
+
|
|
|
+ bridge = pme_dev->dev->bus->self;
|
|
|
+ /*
|
|
|
+ * If bridge is in low power state, the
|
|
|
+ * configuration space of subordinate devices
|
|
|
+ * may be not accessible
|
|
|
+ */
|
|
|
+ if (bridge && bridge->current_state != PCI_D0)
|
|
|
+ continue;
|
|
|
+ pci_pme_wakeup(pme_dev->dev, NULL);
|
|
|
+ } else {
|
|
|
+ list_del(&pme_dev->list);
|
|
|
+ kfree(pme_dev);
|
|
|
}
|
|
|
- if (!list_empty(&pci_pme_list))
|
|
|
- schedule_delayed_work(&pci_pme_work,
|
|
|
- msecs_to_jiffies(PME_TIMEOUT));
|
|
|
}
|
|
|
+ if (!list_empty(&pci_pme_list))
|
|
|
+ schedule_delayed_work(&pci_pme_work,
|
|
|
+ msecs_to_jiffies(PME_TIMEOUT));
|
|
|
mutex_unlock(&pci_pme_list_mutex);
|
|
|
}
|
|
|
|