aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/irq.c10
-rw-r--r--drivers/pci/pci-driver.c6
-rw-r--r--drivers/pci/pci-stub.c2
-rw-r--r--drivers/pci/pci.c33
-rw-r--r--drivers/pci/pcie/aspm.c7
-rw-r--r--drivers/pci/probe.c22
-rw-r--r--drivers/pci/quirks.c39
-rw-r--r--drivers/pci/remove.c36
-rw-r--r--drivers/pci/setup-bus.c22
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
29static int pci_stub_probe(struct pci_dev *dev, const struct pci_device_id *id) 29static 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 */
3843int __weak pci_ext_cfg_avail(struct pci_dev *dev) 3852int __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, &reg32); 507 pcie_capability_read_dword(child, PCI_EXP_DEVCAP, &reg32);
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 */
1902unsigned 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}
1913EXPORT_SYMBOL_GPL(pci_rescan_bus);
1914
1893EXPORT_SYMBOL(pci_add_new_bus); 1915EXPORT_SYMBOL(pci_add_new_bus);
1894EXPORT_SYMBOL(pci_scan_slot); 1916EXPORT_SYMBOL(pci_scan_slot);
1895EXPORT_SYMBOL(pci_scan_bridge); 1917EXPORT_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 */
1800static 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}
1818DECLARE_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 */
1829DECLARE_PCI_FIXUP_HEADER(0x1402, 0x2000, quirk_plx_pci9050);
1830DECLARE_PCI_FIXUP_HEADER(0x1402, 0x2600, quirk_plx_pci9050);
1831
1793static void __devinit quirk_netmos(struct pci_dev *dev) 1832static 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}
113EXPORT_SYMBOL(pci_stop_and_remove_bus_device); 113EXPORT_SYMBOL(pci_stop_and_remove_bus_device);
114
115void 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
132void 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}
1551EXPORT_SYMBOL_GPL(pci_assign_unassigned_bridge_resources); 1551EXPORT_SYMBOL_GPL(pci_assign_unassigned_bridge_resources);
1552 1552
1553#ifdef CONFIG_HOTPLUG 1553void 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 */
1563unsigned 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}
1588EXPORT_SYMBOL_GPL(pci_rescan_bus);
1589#endif