diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/irq.c | 10 | ||||
-rw-r--r-- | drivers/pci/pci-driver.c | 6 | ||||
-rw-r--r-- | drivers/pci/pci-stub.c | 2 | ||||
-rw-r--r-- | drivers/pci/pci.c | 33 | ||||
-rw-r--r-- | drivers/pci/pcie/aspm.c | 7 | ||||
-rw-r--r-- | drivers/pci/probe.c | 22 | ||||
-rw-r--r-- | drivers/pci/quirks.c | 39 | ||||
-rw-r--r-- | drivers/pci/remove.c | 36 | ||||
-rw-r--r-- | drivers/pci/setup-bus.c | 22 |
9 files changed, 130 insertions, 47 deletions
diff --git a/drivers/pci/irq.c b/drivers/pci/irq.c index e5f69a43b1b1..b008cf86b9c3 100644 --- a/drivers/pci/irq.c +++ b/drivers/pci/irq.c | |||
@@ -14,11 +14,11 @@ static void pci_note_irq_problem(struct pci_dev *pdev, const char *reason) | |||
14 | { | 14 | { |
15 | struct pci_dev *parent = to_pci_dev(pdev->dev.parent); | 15 | struct pci_dev *parent = to_pci_dev(pdev->dev.parent); |
16 | 16 | ||
17 | dev_printk(KERN_ERR, &pdev->dev, | 17 | dev_err(&pdev->dev, |
18 | "Potentially misrouted IRQ (Bridge %s %04x:%04x)\n", | 18 | "Potentially misrouted IRQ (Bridge %s %04x:%04x)\n", |
19 | dev_name(&parent->dev), parent->vendor, parent->device); | 19 | dev_name(&parent->dev), parent->vendor, parent->device); |
20 | dev_printk(KERN_ERR, &pdev->dev, "%s\n", reason); | 20 | dev_err(&pdev->dev, "%s\n", reason); |
21 | dev_printk(KERN_ERR, &pdev->dev, "Please report to linux-kernel@vger.kernel.org\n"); | 21 | dev_err(&pdev->dev, "Please report to linux-kernel@vger.kernel.org\n"); |
22 | WARN_ON(1); | 22 | WARN_ON(1); |
23 | } | 23 | } |
24 | 24 | ||
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 94c6e2aa03d6..11d9c8a9d0d0 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -1023,10 +1023,10 @@ static int pci_pm_runtime_suspend(struct device *dev) | |||
1023 | return 0; | 1023 | return 0; |
1024 | } | 1024 | } |
1025 | 1025 | ||
1026 | if (!pci_dev->state_saved) | 1026 | if (!pci_dev->state_saved) { |
1027 | pci_save_state(pci_dev); | 1027 | pci_save_state(pci_dev); |
1028 | 1028 | pci_finish_runtime_suspend(pci_dev); | |
1029 | pci_finish_runtime_suspend(pci_dev); | 1029 | } |
1030 | 1030 | ||
1031 | return 0; | 1031 | return 0; |
1032 | } | 1032 | } |
diff --git a/drivers/pci/pci-stub.c b/drivers/pci/pci-stub.c index 775e933c2225..6e47c519c510 100644 --- a/drivers/pci/pci-stub.c +++ b/drivers/pci/pci-stub.c | |||
@@ -28,7 +28,7 @@ MODULE_PARM_DESC(ids, "Initial PCI IDs to add to the stub driver, format is " | |||
28 | 28 | ||
29 | static int pci_stub_probe(struct pci_dev *dev, const struct pci_device_id *id) | 29 | static int pci_stub_probe(struct pci_dev *dev, const struct pci_device_id *id) |
30 | { | 30 | { |
31 | dev_printk(KERN_INFO, &dev->dev, "claimed by stub\n"); | 31 | dev_info(&dev->dev, "claimed by stub\n"); |
32 | return 0; | 32 | return 0; |
33 | } | 33 | } |
34 | 34 | ||
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 54858838f098..05a510d1bb30 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -1578,15 +1578,25 @@ void pci_pme_active(struct pci_dev *dev, bool enable) | |||
1578 | 1578 | ||
1579 | pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pmcsr); | 1579 | pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pmcsr); |
1580 | 1580 | ||
1581 | /* PCI (as opposed to PCIe) PME requires that the device have | 1581 | /* |
1582 | its PME# line hooked up correctly. Not all hardware vendors | 1582 | * PCI (as opposed to PCIe) PME requires that the device have |
1583 | do this, so the PME never gets delivered and the device | 1583 | * its PME# line hooked up correctly. Not all hardware vendors |
1584 | remains asleep. The easiest way around this is to | 1584 | * do this, so the PME never gets delivered and the device |
1585 | periodically walk the list of suspended devices and check | 1585 | * remains asleep. The easiest way around this is to |
1586 | whether any have their PME flag set. The assumption is that | 1586 | * periodically walk the list of suspended devices and check |
1587 | we'll wake up often enough anyway that this won't be a huge | 1587 | * whether any have their PME flag set. The assumption is that |
1588 | hit, and the power savings from the devices will still be a | 1588 | * we'll wake up often enough anyway that this won't be a huge |
1589 | win. */ | 1589 | * hit, and the power savings from the devices will still be a |
1590 | * win. | ||
1591 | * | ||
1592 | * Although PCIe uses in-band PME message instead of PME# line | ||
1593 | * to report PME, PME does not work for some PCIe devices in | ||
1594 | * reality. For example, there are devices that set their PME | ||
1595 | * status bits, but don't really bother to send a PME message; | ||
1596 | * there are PCI Express Root Ports that don't bother to | ||
1597 | * trigger interrupts when they receive PME messages from the | ||
1598 | * devices below. So PME poll is used for PCIe devices too. | ||
1599 | */ | ||
1590 | 1600 | ||
1591 | if (dev->pme_poll) { | 1601 | if (dev->pme_poll) { |
1592 | struct pci_pme_device *pme_dev; | 1602 | struct pci_pme_device *pme_dev; |
@@ -3833,14 +3843,13 @@ static void __devinit pci_no_domains(void) | |||
3833 | } | 3843 | } |
3834 | 3844 | ||
3835 | /** | 3845 | /** |
3836 | * pci_ext_cfg_enabled - can we access extended PCI config space? | 3846 | * pci_ext_cfg_avail - can we access extended PCI config space? |
3837 | * @dev: The PCI device of the root bridge. | ||
3838 | * | 3847 | * |
3839 | * Returns 1 if we can access PCI extended config space (offsets | 3848 | * Returns 1 if we can access PCI extended config space (offsets |
3840 | * greater than 0xff). This is the default implementation. Architecture | 3849 | * greater than 0xff). This is the default implementation. Architecture |
3841 | * implementations can override this. | 3850 | * implementations can override this. |
3842 | */ | 3851 | */ |
3843 | int __weak pci_ext_cfg_avail(struct pci_dev *dev) | 3852 | int __weak pci_ext_cfg_avail(void) |
3844 | { | 3853 | { |
3845 | return 1; | 3854 | return 1; |
3846 | } | 3855 | } |
diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 213753b283a6..3da9ecc9ab84 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c | |||
@@ -242,8 +242,7 @@ static void pcie_aspm_configure_common_clock(struct pcie_link_state *link) | |||
242 | return; | 242 | return; |
243 | 243 | ||
244 | /* Training failed. Restore common clock configurations */ | 244 | /* Training failed. Restore common clock configurations */ |
245 | dev_printk(KERN_ERR, &parent->dev, | 245 | dev_err(&parent->dev, "ASPM: Could not configure common clock\n"); |
246 | "ASPM: Could not configure common clock\n"); | ||
247 | list_for_each_entry(child, &linkbus->devices, bus_list) | 246 | list_for_each_entry(child, &linkbus->devices, bus_list) |
248 | pcie_capability_write_word(child, PCI_EXP_LNKCTL, | 247 | pcie_capability_write_word(child, PCI_EXP_LNKCTL, |
249 | child_reg[PCI_FUNC(child->devfn)]); | 248 | child_reg[PCI_FUNC(child->devfn)]); |
@@ -507,9 +506,7 @@ static int pcie_aspm_sanity_check(struct pci_dev *pdev) | |||
507 | */ | 506 | */ |
508 | pcie_capability_read_dword(child, PCI_EXP_DEVCAP, ®32); | 507 | pcie_capability_read_dword(child, PCI_EXP_DEVCAP, ®32); |
509 | if (!(reg32 & PCI_EXP_DEVCAP_RBER) && !aspm_force) { | 508 | if (!(reg32 & PCI_EXP_DEVCAP_RBER) && !aspm_force) { |
510 | dev_printk(KERN_INFO, &child->dev, "disabling ASPM" | 509 | dev_info(&child->dev, "disabling ASPM on pre-1.1 PCIe device. You can enable it with 'pcie_aspm=force'\n"); |
511 | " on pre-1.1 PCIe device. You can enable it" | ||
512 | " with 'pcie_aspm=force'\n"); | ||
513 | return -EINVAL; | 510 | return -EINVAL; |
514 | } | 511 | } |
515 | } | 512 | } |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index ec909afa90b6..59cf1ba34936 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -1890,6 +1890,28 @@ unsigned int __ref pci_rescan_bus_bridge_resize(struct pci_dev *bridge) | |||
1890 | return max; | 1890 | return max; |
1891 | } | 1891 | } |
1892 | 1892 | ||
1893 | /** | ||
1894 | * pci_rescan_bus - scan a PCI bus for devices. | ||
1895 | * @bus: PCI bus to scan | ||
1896 | * | ||
1897 | * Scan a PCI bus and child buses for new devices, adds them, | ||
1898 | * and enables them. | ||
1899 | * | ||
1900 | * Returns the max number of subordinate bus discovered. | ||
1901 | */ | ||
1902 | unsigned int __ref pci_rescan_bus(struct pci_bus *bus) | ||
1903 | { | ||
1904 | unsigned int max; | ||
1905 | |||
1906 | max = pci_scan_child_bus(bus); | ||
1907 | pci_assign_unassigned_bus_resources(bus); | ||
1908 | pci_enable_bridges(bus); | ||
1909 | pci_bus_add_devices(bus); | ||
1910 | |||
1911 | return max; | ||
1912 | } | ||
1913 | EXPORT_SYMBOL_GPL(pci_rescan_bus); | ||
1914 | |||
1893 | EXPORT_SYMBOL(pci_add_new_bus); | 1915 | EXPORT_SYMBOL(pci_add_new_bus); |
1894 | EXPORT_SYMBOL(pci_scan_slot); | 1916 | EXPORT_SYMBOL(pci_scan_slot); |
1895 | EXPORT_SYMBOL(pci_scan_bridge); | 1917 | EXPORT_SYMBOL(pci_scan_bridge); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 7a451ff56ecc..0c59f7aba12b 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -1790,6 +1790,45 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TOSHIBA_2, | |||
1790 | PCI_DEVICE_ID_TOSHIBA_TC86C001_IDE, | 1790 | PCI_DEVICE_ID_TOSHIBA_TC86C001_IDE, |
1791 | quirk_tc86c001_ide); | 1791 | quirk_tc86c001_ide); |
1792 | 1792 | ||
1793 | /* | ||
1794 | * PLX PCI 9050 PCI Target bridge controller has an errata that prevents the | ||
1795 | * local configuration registers accessible via BAR0 (memory) or BAR1 (i/o) | ||
1796 | * being read correctly if bit 7 of the base address is set. | ||
1797 | * The BAR0 or BAR1 region may be disabled (size 0) or enabled (size 128). | ||
1798 | * Re-allocate the regions to a 256-byte boundary if necessary. | ||
1799 | */ | ||
1800 | static void __devinit quirk_plx_pci9050(struct pci_dev *dev) | ||
1801 | { | ||
1802 | unsigned int bar; | ||
1803 | |||
1804 | /* Fixed in revision 2 (PCI 9052). */ | ||
1805 | if (dev->revision >= 2) | ||
1806 | return; | ||
1807 | for (bar = 0; bar <= 1; bar++) | ||
1808 | if (pci_resource_len(dev, bar) == 0x80 && | ||
1809 | (pci_resource_start(dev, bar) & 0x80)) { | ||
1810 | struct resource *r = &dev->resource[bar]; | ||
1811 | dev_info(&dev->dev, | ||
1812 | "Re-allocating PLX PCI 9050 BAR %u to length 256 to avoid bit 7 bug\n", | ||
1813 | bar); | ||
1814 | r->start = 0; | ||
1815 | r->end = 0xff; | ||
1816 | } | ||
1817 | } | ||
1818 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050, | ||
1819 | quirk_plx_pci9050); | ||
1820 | /* | ||
1821 | * The following Meilhaus (vendor ID 0x1402) device IDs (amongst others) | ||
1822 | * may be using the PLX PCI 9050: 0x0630, 0x0940, 0x0950, 0x0960, 0x100b, | ||
1823 | * 0x1400, 0x140a, 0x140b, 0x14e0, 0x14ea, 0x14eb, 0x1604, 0x1608, 0x160c, | ||
1824 | * 0x168f, 0x2000, 0x2600, 0x3000, 0x810a, 0x810b. | ||
1825 | * | ||
1826 | * Currently, device IDs 0x2000 and 0x2600 are used by the Comedi "me_daq" | ||
1827 | * driver. | ||
1828 | */ | ||
1829 | DECLARE_PCI_FIXUP_HEADER(0x1402, 0x2000, quirk_plx_pci9050); | ||
1830 | DECLARE_PCI_FIXUP_HEADER(0x1402, 0x2600, quirk_plx_pci9050); | ||
1831 | |||
1793 | static void __devinit quirk_netmos(struct pci_dev *dev) | 1832 | static void __devinit quirk_netmos(struct pci_dev *dev) |
1794 | { | 1833 | { |
1795 | unsigned int num_parallel = (dev->subsystem_device & 0xf0) >> 4; | 1834 | unsigned int num_parallel = (dev->subsystem_device & 0xf0) >> 4; |
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index 513972f3ed13..7c0fd9252e6f 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c | |||
@@ -111,3 +111,39 @@ void pci_stop_and_remove_bus_device(struct pci_dev *dev) | |||
111 | pci_remove_bus_device(dev); | 111 | pci_remove_bus_device(dev); |
112 | } | 112 | } |
113 | EXPORT_SYMBOL(pci_stop_and_remove_bus_device); | 113 | EXPORT_SYMBOL(pci_stop_and_remove_bus_device); |
114 | |||
115 | void pci_stop_root_bus(struct pci_bus *bus) | ||
116 | { | ||
117 | struct pci_dev *child, *tmp; | ||
118 | struct pci_host_bridge *host_bridge; | ||
119 | |||
120 | if (!pci_is_root_bus(bus)) | ||
121 | return; | ||
122 | |||
123 | host_bridge = to_pci_host_bridge(bus->bridge); | ||
124 | list_for_each_entry_safe_reverse(child, tmp, | ||
125 | &bus->devices, bus_list) | ||
126 | pci_stop_bus_device(child); | ||
127 | |||
128 | /* stop the host bridge */ | ||
129 | device_del(&host_bridge->dev); | ||
130 | } | ||
131 | |||
132 | void pci_remove_root_bus(struct pci_bus *bus) | ||
133 | { | ||
134 | struct pci_dev *child, *tmp; | ||
135 | struct pci_host_bridge *host_bridge; | ||
136 | |||
137 | if (!pci_is_root_bus(bus)) | ||
138 | return; | ||
139 | |||
140 | host_bridge = to_pci_host_bridge(bus->bridge); | ||
141 | list_for_each_entry_safe(child, tmp, | ||
142 | &bus->devices, bus_list) | ||
143 | pci_remove_bus_device(child); | ||
144 | pci_remove_bus(bus); | ||
145 | host_bridge->bus = NULL; | ||
146 | |||
147 | /* remove the host bridge */ | ||
148 | put_device(&host_bridge->dev); | ||
149 | } | ||
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 1e808ca338f8..6d3591d57ea0 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c | |||
@@ -1550,25 +1550,12 @@ enable_all: | |||
1550 | } | 1550 | } |
1551 | EXPORT_SYMBOL_GPL(pci_assign_unassigned_bridge_resources); | 1551 | EXPORT_SYMBOL_GPL(pci_assign_unassigned_bridge_resources); |
1552 | 1552 | ||
1553 | #ifdef CONFIG_HOTPLUG | 1553 | void pci_assign_unassigned_bus_resources(struct pci_bus *bus) |
1554 | /** | ||
1555 | * pci_rescan_bus - scan a PCI bus for devices. | ||
1556 | * @bus: PCI bus to scan | ||
1557 | * | ||
1558 | * Scan a PCI bus and child buses for new devices, adds them, | ||
1559 | * and enables them. | ||
1560 | * | ||
1561 | * Returns the max number of subordinate bus discovered. | ||
1562 | */ | ||
1563 | unsigned int __ref pci_rescan_bus(struct pci_bus *bus) | ||
1564 | { | 1554 | { |
1565 | unsigned int max; | ||
1566 | struct pci_dev *dev; | 1555 | struct pci_dev *dev; |
1567 | LIST_HEAD(add_list); /* list of resources that | 1556 | LIST_HEAD(add_list); /* list of resources that |
1568 | want additional resources */ | 1557 | want additional resources */ |
1569 | 1558 | ||
1570 | max = pci_scan_child_bus(bus); | ||
1571 | |||
1572 | down_read(&pci_bus_sem); | 1559 | down_read(&pci_bus_sem); |
1573 | list_for_each_entry(dev, &bus->devices, bus_list) | 1560 | list_for_each_entry(dev, &bus->devices, bus_list) |
1574 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE || | 1561 | if (dev->hdr_type == PCI_HEADER_TYPE_BRIDGE || |
@@ -1579,11 +1566,4 @@ unsigned int __ref pci_rescan_bus(struct pci_bus *bus) | |||
1579 | up_read(&pci_bus_sem); | 1566 | up_read(&pci_bus_sem); |
1580 | __pci_bus_assign_resources(bus, &add_list, NULL); | 1567 | __pci_bus_assign_resources(bus, &add_list, NULL); |
1581 | BUG_ON(!list_empty(&add_list)); | 1568 | BUG_ON(!list_empty(&add_list)); |
1582 | |||
1583 | pci_enable_bridges(bus); | ||
1584 | pci_bus_add_devices(bus); | ||
1585 | |||
1586 | return max; | ||
1587 | } | 1569 | } |
1588 | EXPORT_SYMBOL_GPL(pci_rescan_bus); | ||
1589 | #endif | ||