diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2014-02-18 19:02:04 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2014-02-18 19:02:04 -0500 |
commit | 94a5f850aead02f02f350d401a43c4bf9a9fbf3a (patch) | |
tree | 14796e071834fc90e45000de3937c7ea96b054bd /drivers/pci/pci.c | |
parent | ec5130ba7907a2ad30a595c7d64fd629c69d3a66 (diff) | |
parent | 1e2571a78138361f74afeb4c5df859b9536b2d8e (diff) |
Merge branch 'pci/misc' into next
* pci/misc:
PCI: Enable INTx if BIOS left them disabled
ia64/PCI: Set IORESOURCE_ROM_SHADOW only for the default VGA device
x86/PCI: Set IORESOURCE_ROM_SHADOW only for the default VGA device
PCI: Update outdated comment for pcibios_bus_report_status()
PCI: Cleanup per-arch list of object files
PCI: cpqphp: Fix hex vs decimal typo in cpqhpc_probe()
x86/PCI: Fix function definition whitespace
x86/PCI: Reword comments
x86/PCI: Remove unnecessary local variable initialization
PCI: Remove unnecessary list_empty(&pci_pme_list) check
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r-- | drivers/pci/pci.c | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index e4d45d27f288..b6ddde1d04ca 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -1181,6 +1181,8 @@ EXPORT_SYMBOL_GPL(pci_load_and_free_saved_state); | |||
1181 | static int do_pci_enable_device(struct pci_dev *dev, int bars) | 1181 | static int do_pci_enable_device(struct pci_dev *dev, int bars) |
1182 | { | 1182 | { |
1183 | int err; | 1183 | int err; |
1184 | u16 cmd; | ||
1185 | u8 pin; | ||
1184 | 1186 | ||
1185 | err = pci_set_power_state(dev, PCI_D0); | 1187 | err = pci_set_power_state(dev, PCI_D0); |
1186 | if (err < 0 && err != -EIO) | 1188 | if (err < 0 && err != -EIO) |
@@ -1190,6 +1192,14 @@ static int do_pci_enable_device(struct pci_dev *dev, int bars) | |||
1190 | return err; | 1192 | return err; |
1191 | pci_fixup_device(pci_fixup_enable, dev); | 1193 | pci_fixup_device(pci_fixup_enable, dev); |
1192 | 1194 | ||
1195 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); | ||
1196 | if (pin) { | ||
1197 | pci_read_config_word(dev, PCI_COMMAND, &cmd); | ||
1198 | if (cmd & PCI_COMMAND_INTX_DISABLE) | ||
1199 | pci_write_config_word(dev, PCI_COMMAND, | ||
1200 | cmd & ~PCI_COMMAND_INTX_DISABLE); | ||
1201 | } | ||
1202 | |||
1193 | return 0; | 1203 | return 0; |
1194 | } | 1204 | } |
1195 | 1205 | ||
@@ -1611,29 +1621,27 @@ static void pci_pme_list_scan(struct work_struct *work) | |||
1611 | struct pci_pme_device *pme_dev, *n; | 1621 | struct pci_pme_device *pme_dev, *n; |
1612 | 1622 | ||
1613 | mutex_lock(&pci_pme_list_mutex); | 1623 | mutex_lock(&pci_pme_list_mutex); |
1614 | if (!list_empty(&pci_pme_list)) { | 1624 | list_for_each_entry_safe(pme_dev, n, &pci_pme_list, list) { |
1615 | list_for_each_entry_safe(pme_dev, n, &pci_pme_list, list) { | 1625 | if (pme_dev->dev->pme_poll) { |
1616 | if (pme_dev->dev->pme_poll) { | 1626 | struct pci_dev *bridge; |
1617 | struct pci_dev *bridge; | 1627 | |
1618 | 1628 | bridge = pme_dev->dev->bus->self; | |
1619 | bridge = pme_dev->dev->bus->self; | 1629 | /* |
1620 | /* | 1630 | * If bridge is in low power state, the |
1621 | * If bridge is in low power state, the | 1631 | * configuration space of subordinate devices |
1622 | * configuration space of subordinate devices | 1632 | * may be not accessible |
1623 | * may be not accessible | 1633 | */ |
1624 | */ | 1634 | if (bridge && bridge->current_state != PCI_D0) |
1625 | if (bridge && bridge->current_state != PCI_D0) | 1635 | continue; |
1626 | continue; | 1636 | pci_pme_wakeup(pme_dev->dev, NULL); |
1627 | pci_pme_wakeup(pme_dev->dev, NULL); | 1637 | } else { |
1628 | } else { | 1638 | list_del(&pme_dev->list); |
1629 | list_del(&pme_dev->list); | 1639 | kfree(pme_dev); |
1630 | kfree(pme_dev); | ||
1631 | } | ||
1632 | } | 1640 | } |
1633 | if (!list_empty(&pci_pme_list)) | ||
1634 | schedule_delayed_work(&pci_pme_work, | ||
1635 | msecs_to_jiffies(PME_TIMEOUT)); | ||
1636 | } | 1641 | } |
1642 | if (!list_empty(&pci_pme_list)) | ||
1643 | schedule_delayed_work(&pci_pme_work, | ||
1644 | msecs_to_jiffies(PME_TIMEOUT)); | ||
1637 | mutex_unlock(&pci_pme_list_mutex); | 1645 | mutex_unlock(&pci_pme_list_mutex); |
1638 | } | 1646 | } |
1639 | 1647 | ||