diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/hotplug/Kconfig | 12 | ||||
-rw-r--r-- | drivers/pci/hotplug/acpiphp_core.c | 3 | ||||
-rw-r--r-- | drivers/pci/hotplug/acpiphp_glue.c | 2 | ||||
-rw-r--r-- | drivers/pci/hotplug/cpci_hotplug_pci.c | 54 | ||||
-rw-r--r-- | drivers/pci/hotplug/pciehp.h | 5 | ||||
-rw-r--r-- | drivers/pci/hotplug/pciehp_hpc.c | 4 | ||||
-rw-r--r-- | drivers/pci/msi.c | 4 | ||||
-rw-r--r-- | drivers/pci/pci-driver.c | 3 | ||||
-rw-r--r-- | drivers/pci/pci.c | 11 | ||||
-rw-r--r-- | drivers/pci/pci.h | 10 | ||||
-rw-r--r-- | drivers/pci/pcie/portdrv_pci.c | 38 | ||||
-rw-r--r-- | drivers/pci/probe.c | 1 | ||||
-rw-r--r-- | drivers/pci/quirks.c | 175 | ||||
-rw-r--r-- | drivers/pci/search.c | 48 |
14 files changed, 294 insertions, 76 deletions
diff --git a/drivers/pci/hotplug/Kconfig b/drivers/pci/hotplug/Kconfig index 222a1cc4aa28..8a60f391ffcf 100644 --- a/drivers/pci/hotplug/Kconfig +++ b/drivers/pci/hotplug/Kconfig | |||
@@ -6,8 +6,7 @@ menu "PCI Hotplug Support" | |||
6 | 6 | ||
7 | config HOTPLUG_PCI | 7 | config HOTPLUG_PCI |
8 | tristate "Support for PCI Hotplug (EXPERIMENTAL)" | 8 | tristate "Support for PCI Hotplug (EXPERIMENTAL)" |
9 | depends on PCI && EXPERIMENTAL | 9 | depends on PCI && EXPERIMENTAL && HOTPLUG |
10 | select HOTPLUG | ||
11 | ---help--- | 10 | ---help--- |
12 | Say Y here if you have a motherboard with a PCI Hotplug controller. | 11 | Say Y here if you have a motherboard with a PCI Hotplug controller. |
13 | This allows you to add and remove PCI cards while the machine is | 12 | This allows you to add and remove PCI cards while the machine is |
@@ -77,7 +76,7 @@ config HOTPLUG_PCI_IBM | |||
77 | 76 | ||
78 | config HOTPLUG_PCI_ACPI | 77 | config HOTPLUG_PCI_ACPI |
79 | tristate "ACPI PCI Hotplug driver" | 78 | tristate "ACPI PCI Hotplug driver" |
80 | depends on ACPI && HOTPLUG_PCI | 79 | depends on (!ACPI_DOCK && ACPI && HOTPLUG_PCI) || (ACPI_DOCK && HOTPLUG_PCI) |
81 | help | 80 | help |
82 | Say Y here if you have a system that supports PCI Hotplug using | 81 | Say Y here if you have a system that supports PCI Hotplug using |
83 | ACPI. | 82 | ACPI. |
@@ -154,13 +153,6 @@ config HOTPLUG_PCI_SHPC_POLL_EVENT_MODE | |||
154 | 153 | ||
155 | When in doubt, say N. | 154 | When in doubt, say N. |
156 | 155 | ||
157 | config HOTPLUG_PCI_SHPC_PHPRM_LEGACY | ||
158 | bool "For AMD SHPC only: Use $HRT for resource/configuration" | ||
159 | depends on HOTPLUG_PCI_SHPC && !ACPI | ||
160 | help | ||
161 | Say Y here for AMD SHPC. You have to select this option if you are | ||
162 | using this driver on platform with AMD SHPC. | ||
163 | |||
164 | config HOTPLUG_PCI_RPA | 156 | config HOTPLUG_PCI_RPA |
165 | tristate "RPA PCI Hotplug driver" | 157 | tristate "RPA PCI Hotplug driver" |
166 | depends on HOTPLUG_PCI && PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE | 158 | depends on HOTPLUG_PCI && PPC_PSERIES && PPC64 && !HOTPLUG_PCI_FAKE |
diff --git a/drivers/pci/hotplug/acpiphp_core.c b/drivers/pci/hotplug/acpiphp_core.c index 34de5697983d..e2fef60c2d06 100644 --- a/drivers/pci/hotplug/acpiphp_core.c +++ b/drivers/pci/hotplug/acpiphp_core.c | |||
@@ -27,8 +27,7 @@ | |||
27 | * along with this program; if not, write to the Free Software | 27 | * along with this program; if not, write to the Free Software |
28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 28 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
29 | * | 29 | * |
30 | * Send feedback to <gregkh@us.ibm.com>, | 30 | * Send feedback to <kristen.c.accardi@intel.com> |
31 | * <t-kochi@bq.jp.nec.com> | ||
32 | * | 31 | * |
33 | */ | 32 | */ |
34 | 33 | ||
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index ef95d12fb32c..ae67a8f55ba1 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
@@ -26,7 +26,7 @@ | |||
26 | * along with this program; if not, write to the Free Software | 26 | * along with this program; if not, write to the Free Software |
27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 27 | * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
28 | * | 28 | * |
29 | * Send feedback to <t-kochi@bq.jp.nec.com> | 29 | * Send feedback to <kristen.c.accardi@intel.com> |
30 | * | 30 | * |
31 | */ | 31 | */ |
32 | 32 | ||
diff --git a/drivers/pci/hotplug/cpci_hotplug_pci.c b/drivers/pci/hotplug/cpci_hotplug_pci.c index 02be74caa89f..4afcaffd031c 100644 --- a/drivers/pci/hotplug/cpci_hotplug_pci.c +++ b/drivers/pci/hotplug/cpci_hotplug_pci.c | |||
@@ -254,8 +254,8 @@ int cpci_led_off(struct slot* slot) | |||
254 | 254 | ||
255 | int cpci_configure_slot(struct slot* slot) | 255 | int cpci_configure_slot(struct slot* slot) |
256 | { | 256 | { |
257 | unsigned char busnr; | 257 | struct pci_bus *parent; |
258 | struct pci_bus *child; | 258 | int fn; |
259 | 259 | ||
260 | dbg("%s - enter", __FUNCTION__); | 260 | dbg("%s - enter", __FUNCTION__); |
261 | 261 | ||
@@ -276,23 +276,53 @@ int cpci_configure_slot(struct slot* slot) | |||
276 | */ | 276 | */ |
277 | n = pci_scan_slot(slot->bus, slot->devfn); | 277 | n = pci_scan_slot(slot->bus, slot->devfn); |
278 | dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n); | 278 | dbg("%s: pci_scan_slot returned %d", __FUNCTION__, n); |
279 | if (n > 0) | ||
280 | pci_bus_add_devices(slot->bus); | ||
281 | slot->dev = pci_get_slot(slot->bus, slot->devfn); | 279 | slot->dev = pci_get_slot(slot->bus, slot->devfn); |
282 | if (slot->dev == NULL) { | 280 | if (slot->dev == NULL) { |
283 | err("Could not find PCI device for slot %02x", slot->number); | 281 | err("Could not find PCI device for slot %02x", slot->number); |
284 | return 1; | 282 | return -ENODEV; |
285 | } | 283 | } |
286 | } | 284 | } |
287 | 285 | parent = slot->dev->bus; | |
288 | if (slot->dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) { | 286 | |
289 | pci_read_config_byte(slot->dev, PCI_SECONDARY_BUS, &busnr); | 287 | for (fn = 0; fn < 8; fn++) { |
290 | child = pci_add_new_bus(slot->dev->bus, slot->dev, busnr); | 288 | struct pci_dev *dev; |
291 | pci_do_scan_bus(child); | 289 | |
292 | pci_bus_size_bridges(child); | 290 | dev = pci_get_slot(parent, PCI_DEVFN(PCI_SLOT(slot->devfn), fn)); |
291 | if (!dev) | ||
292 | continue; | ||
293 | if ((dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) || | ||
294 | (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)) { | ||
295 | /* Find an unused bus number for the new bridge */ | ||
296 | struct pci_bus *child; | ||
297 | unsigned char busnr, start = parent->secondary; | ||
298 | unsigned char end = parent->subordinate; | ||
299 | |||
300 | for (busnr = start; busnr <= end; busnr++) { | ||
301 | if (!pci_find_bus(pci_domain_nr(parent), | ||
302 | busnr)) | ||
303 | break; | ||
304 | } | ||
305 | if (busnr >= end) { | ||
306 | err("No free bus for hot-added bridge\n"); | ||
307 | pci_dev_put(dev); | ||
308 | continue; | ||
309 | } | ||
310 | child = pci_add_new_bus(parent, dev, busnr); | ||
311 | if (!child) { | ||
312 | err("Cannot add new bus for %s\n", | ||
313 | pci_name(dev)); | ||
314 | pci_dev_put(dev); | ||
315 | continue; | ||
316 | } | ||
317 | child->subordinate = pci_do_scan_bus(child); | ||
318 | pci_bus_size_bridges(child); | ||
319 | } | ||
320 | pci_dev_put(dev); | ||
293 | } | 321 | } |
294 | 322 | ||
295 | pci_bus_assign_resources(slot->dev->bus); | 323 | pci_bus_assign_resources(parent); |
324 | pci_bus_add_devices(parent); | ||
325 | pci_enable_bridges(parent); | ||
296 | 326 | ||
297 | dbg("%s - exit", __FUNCTION__); | 327 | dbg("%s - exit", __FUNCTION__); |
298 | return 0; | 328 | return 0; |
diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h index ce89f5815861..eaea9d36a1bb 100644 --- a/drivers/pci/hotplug/pciehp.h +++ b/drivers/pci/hotplug/pciehp.h | |||
@@ -279,6 +279,11 @@ struct hpc_ops { | |||
279 | 279 | ||
280 | 280 | ||
281 | #ifdef CONFIG_ACPI | 281 | #ifdef CONFIG_ACPI |
282 | #include <acpi/acpi.h> | ||
283 | #include <acpi/acpi_bus.h> | ||
284 | #include <acpi/actypes.h> | ||
285 | #include <linux/pci-acpi.h> | ||
286 | |||
282 | #define pciehp_get_hp_hw_control_from_firmware(dev) \ | 287 | #define pciehp_get_hp_hw_control_from_firmware(dev) \ |
283 | pciehp_acpi_get_hp_hw_control_from_firmware(dev) | 288 | pciehp_acpi_get_hp_hw_control_from_firmware(dev) |
284 | static inline int pciehp_get_hp_params_from_firmware(struct pci_dev *dev, | 289 | static inline int pciehp_get_hp_params_from_firmware(struct pci_dev *dev, |
diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c index 0d8fb6e607a1..6ab3b6cd2b54 100644 --- a/drivers/pci/hotplug/pciehp_hpc.c +++ b/drivers/pci/hotplug/pciehp_hpc.c | |||
@@ -38,10 +38,6 @@ | |||
38 | 38 | ||
39 | #include "../pci.h" | 39 | #include "../pci.h" |
40 | #include "pciehp.h" | 40 | #include "pciehp.h" |
41 | #include <acpi/acpi.h> | ||
42 | #include <acpi/acpi_bus.h> | ||
43 | #include <acpi/actypes.h> | ||
44 | #include <linux/pci-acpi.h> | ||
45 | #ifdef DEBUG | 41 | #ifdef DEBUG |
46 | #define DBG_K_TRACE_ENTRY ((unsigned int)0x00000001) /* On function entry */ | 42 | #define DBG_K_TRACE_ENTRY ((unsigned int)0x00000001) /* On function entry */ |
47 | #define DBG_K_TRACE_EXIT ((unsigned int)0x00000002) /* On function exit */ | 43 | #define DBG_K_TRACE_EXIT ((unsigned int)0x00000002) /* On function exit */ |
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 36bc7c415af7..a83c1f5735d6 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -47,13 +47,13 @@ msi_register(struct msi_ops *ops) | |||
47 | 47 | ||
48 | static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags) | 48 | static void msi_cache_ctor(void *p, kmem_cache_t *cache, unsigned long flags) |
49 | { | 49 | { |
50 | memset(p, 0, NR_IRQS * sizeof(struct msi_desc)); | 50 | memset(p, 0, sizeof(struct msi_desc)); |
51 | } | 51 | } |
52 | 52 | ||
53 | static int msi_cache_init(void) | 53 | static int msi_cache_init(void) |
54 | { | 54 | { |
55 | msi_cachep = kmem_cache_create("msi_cache", | 55 | msi_cachep = kmem_cache_create("msi_cache", |
56 | NR_IRQS * sizeof(struct msi_desc), | 56 | sizeof(struct msi_desc), |
57 | 0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL); | 57 | 0, SLAB_HWCACHE_ALIGN, msi_cache_ctor, NULL); |
58 | if (!msi_cachep) | 58 | if (!msi_cachep) |
59 | return -ENOMEM; | 59 | return -ENOMEM; |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 10e1a905c144..474e9cd0e9e4 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -139,9 +139,8 @@ const struct pci_device_id *pci_match_id(const struct pci_device_id *ids, | |||
139 | /** | 139 | /** |
140 | * pci_match_device - Tell if a PCI device structure has a matching | 140 | * pci_match_device - Tell if a PCI device structure has a matching |
141 | * PCI device id structure | 141 | * PCI device id structure |
142 | * @ids: array of PCI device id structures to search in | ||
143 | * @dev: the PCI device structure to match against | ||
144 | * @drv: the PCI driver to match against | 142 | * @drv: the PCI driver to match against |
143 | * @dev: the PCI device structure to match against | ||
145 | * | 144 | * |
146 | * Used by a driver to check whether a PCI device present in the | 145 | * Used by a driver to check whether a PCI device present in the |
147 | * system is in its list of supported devices. Returns the matching | 146 | * system is in its list of supported devices. Returns the matching |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index cf57d7de3765..9f79dd6d51ab 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <asm/dma.h> /* isa_dma_bridge_buggy */ | 19 | #include <asm/dma.h> /* isa_dma_bridge_buggy */ |
20 | #include "pci.h" | 20 | #include "pci.h" |
21 | 21 | ||
22 | unsigned int pci_pm_d3_delay = 10; | ||
22 | 23 | ||
23 | /** | 24 | /** |
24 | * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children | 25 | * pci_bus_max_busnr - returns maximum PCI bus number of given bus' children |
@@ -313,6 +314,14 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
313 | } else if (dev->current_state == state) | 314 | } else if (dev->current_state == state) |
314 | return 0; /* we're already there */ | 315 | return 0; /* we're already there */ |
315 | 316 | ||
317 | /* | ||
318 | * If the device or the parent bridge can't support PCI PM, ignore | ||
319 | * the request if we're doing anything besides putting it into D0 | ||
320 | * (which would only happen on boot). | ||
321 | */ | ||
322 | if ((state == PCI_D1 || state == PCI_D2) && pci_no_d1d2(dev)) | ||
323 | return 0; | ||
324 | |||
316 | /* find PCI PM capability in list */ | 325 | /* find PCI PM capability in list */ |
317 | pm = pci_find_capability(dev, PCI_CAP_ID_PM); | 326 | pm = pci_find_capability(dev, PCI_CAP_ID_PM); |
318 | 327 | ||
@@ -363,7 +372,7 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) | |||
363 | /* Mandatory power management transition delays */ | 372 | /* Mandatory power management transition delays */ |
364 | /* see PCI PM 1.1 5.6.1 table 18 */ | 373 | /* see PCI PM 1.1 5.6.1 table 18 */ |
365 | if (state == PCI_D3hot || dev->current_state == PCI_D3hot) | 374 | if (state == PCI_D3hot || dev->current_state == PCI_D3hot) |
366 | msleep(10); | 375 | msleep(pci_pm_d3_delay); |
367 | else if (state == PCI_D2 || dev->current_state == PCI_D2) | 376 | else if (state == PCI_D2 || dev->current_state == PCI_D2) |
368 | udelay(200); | 377 | udelay(200); |
369 | 378 | ||
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index 9cc842b666eb..08d58fc78ee1 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -47,7 +47,7 @@ extern int pci_msi_quirk; | |||
47 | #else | 47 | #else |
48 | #define pci_msi_quirk 0 | 48 | #define pci_msi_quirk 0 |
49 | #endif | 49 | #endif |
50 | 50 | extern unsigned int pci_pm_d3_delay; | |
51 | #ifdef CONFIG_PCI_MSI | 51 | #ifdef CONFIG_PCI_MSI |
52 | void disable_msi_mode(struct pci_dev *dev, int pos, int type); | 52 | void disable_msi_mode(struct pci_dev *dev, int pos, int type); |
53 | void pci_no_msi(void); | 53 | void pci_no_msi(void); |
@@ -66,7 +66,15 @@ static inline int pci_save_msix_state(struct pci_dev *dev) { return 0; } | |||
66 | static inline void pci_restore_msi_state(struct pci_dev *dev) {} | 66 | static inline void pci_restore_msi_state(struct pci_dev *dev) {} |
67 | static inline void pci_restore_msix_state(struct pci_dev *dev) {} | 67 | static inline void pci_restore_msix_state(struct pci_dev *dev) {} |
68 | #endif | 68 | #endif |
69 | static inline int pci_no_d1d2(struct pci_dev *dev) | ||
70 | { | ||
71 | unsigned int parent_dstates = 0; | ||
69 | 72 | ||
73 | if (dev->bus->self) | ||
74 | parent_dstates = dev->bus->self->no_d1d2; | ||
75 | return (dev->no_d1d2 || parent_dstates); | ||
76 | |||
77 | } | ||
70 | extern int pcie_mch_quirk; | 78 | extern int pcie_mch_quirk; |
71 | extern struct device_attribute pci_dev_attrs[]; | 79 | extern struct device_attribute pci_dev_attrs[]; |
72 | extern struct class_device_attribute class_device_attr_cpuaffinity; | 80 | extern struct class_device_attribute class_device_attr_cpuaffinity; |
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index 50bfc1b2f3bf..478d0d28f7ad 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c | |||
@@ -30,23 +30,6 @@ MODULE_LICENSE("GPL"); | |||
30 | /* global data */ | 30 | /* global data */ |
31 | static const char device_name[] = "pcieport-driver"; | 31 | static const char device_name[] = "pcieport-driver"; |
32 | 32 | ||
33 | static int pcie_portdrv_save_config(struct pci_dev *dev) | ||
34 | { | ||
35 | return pci_save_state(dev); | ||
36 | } | ||
37 | |||
38 | static int pcie_portdrv_restore_config(struct pci_dev *dev) | ||
39 | { | ||
40 | int retval; | ||
41 | |||
42 | pci_restore_state(dev); | ||
43 | retval = pci_enable_device(dev); | ||
44 | if (retval) | ||
45 | return retval; | ||
46 | pci_set_master(dev); | ||
47 | return 0; | ||
48 | } | ||
49 | |||
50 | /* | 33 | /* |
51 | * pcie_portdrv_probe - Probe PCI-Express port devices | 34 | * pcie_portdrv_probe - Probe PCI-Express port devices |
52 | * @dev: PCI-Express port device being probed | 35 | * @dev: PCI-Express port device being probed |
@@ -73,8 +56,10 @@ static int __devinit pcie_portdrv_probe (struct pci_dev *dev, | |||
73 | "%s->Dev[%04x:%04x] has invalid IRQ. Check vendor BIOS\n", | 56 | "%s->Dev[%04x:%04x] has invalid IRQ. Check vendor BIOS\n", |
74 | __FUNCTION__, dev->device, dev->vendor); | 57 | __FUNCTION__, dev->device, dev->vendor); |
75 | } | 58 | } |
76 | if (pcie_port_device_register(dev)) | 59 | if (pcie_port_device_register(dev)) { |
60 | pci_disable_device(dev); | ||
77 | return -ENOMEM; | 61 | return -ENOMEM; |
62 | } | ||
78 | 63 | ||
79 | return 0; | 64 | return 0; |
80 | } | 65 | } |
@@ -86,6 +71,23 @@ static void pcie_portdrv_remove (struct pci_dev *dev) | |||
86 | } | 71 | } |
87 | 72 | ||
88 | #ifdef CONFIG_PM | 73 | #ifdef CONFIG_PM |
74 | static int pcie_portdrv_save_config(struct pci_dev *dev) | ||
75 | { | ||
76 | return pci_save_state(dev); | ||
77 | } | ||
78 | |||
79 | static int pcie_portdrv_restore_config(struct pci_dev *dev) | ||
80 | { | ||
81 | int retval; | ||
82 | |||
83 | pci_restore_state(dev); | ||
84 | retval = pci_enable_device(dev); | ||
85 | if (retval) | ||
86 | return retval; | ||
87 | pci_set_master(dev); | ||
88 | return 0; | ||
89 | } | ||
90 | |||
89 | static int pcie_portdrv_suspend (struct pci_dev *dev, pm_message_t state) | 91 | static int pcie_portdrv_suspend (struct pci_dev *dev, pm_message_t state) |
90 | { | 92 | { |
91 | int ret = pcie_port_device_suspend(dev, state); | 93 | int ret = pcie_port_device_suspend(dev, state); |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index f89dbc3738b7..c5a58d1c6c1c 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -815,6 +815,7 @@ pci_scan_device(struct pci_bus *bus, int devfn) | |||
815 | dev->vendor = l & 0xffff; | 815 | dev->vendor = l & 0xffff; |
816 | dev->device = (l >> 16) & 0xffff; | 816 | dev->device = (l >> 16) & 0xffff; |
817 | dev->cfg_size = pci_cfg_space_size(dev); | 817 | dev->cfg_size = pci_cfg_space_size(dev); |
818 | dev->error_state = pci_channel_io_normal; | ||
818 | 819 | ||
819 | /* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer) | 820 | /* Assume 32-bit PCI; let 64-bit PCI cards (which are far rarer) |
820 | set this higher, assuming the system even supports it. */ | 821 | set this higher, assuming the system even supports it. */ |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index d1d7333bb71b..17e709e7d72a 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -400,6 +400,7 @@ static void __devinit quirk_piix4_acpi(struct pci_dev *dev) | |||
400 | piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20); | 400 | piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20); |
401 | } | 401 | } |
402 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi ); | 402 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi ); |
403 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_3, quirk_piix4_acpi ); | ||
403 | 404 | ||
404 | /* | 405 | /* |
405 | * ICH4, ICH4-M, ICH5, ICH5-M ACPI: Three IO regions pointed to by longwords at | 406 | * ICH4, ICH4-M, ICH5, ICH5-M ACPI: Three IO regions pointed to by longwords at |
@@ -437,6 +438,7 @@ static void __devinit quirk_ich6_lpc_acpi(struct pci_dev *dev) | |||
437 | pci_read_config_dword(dev, 0x48, ®ion); | 438 | pci_read_config_dword(dev, 0x48, ®ion); |
438 | quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1, "ICH6 GPIO"); | 439 | quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1, "ICH6 GPIO"); |
439 | } | 440 | } |
441 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_0, quirk_ich6_lpc_acpi ); | ||
440 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, quirk_ich6_lpc_acpi ); | 442 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, quirk_ich6_lpc_acpi ); |
441 | 443 | ||
442 | /* | 444 | /* |
@@ -665,6 +667,7 @@ DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0, quirk_vi | |||
665 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, quirk_via_irq); | 667 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, quirk_via_irq); |
666 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, quirk_via_irq); | 668 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_2, quirk_via_irq); |
667 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_irq); | 669 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_irq); |
670 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235_USB_2, quirk_via_irq); | ||
668 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_irq); | 671 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_irq); |
669 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_irq); | 672 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_irq); |
670 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, quirk_via_irq); | 673 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_5, quirk_via_irq); |
@@ -682,6 +685,33 @@ static void __devinit quirk_vt82c598_id(struct pci_dev *dev) | |||
682 | } | 685 | } |
683 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id ); | 686 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id ); |
684 | 687 | ||
688 | #ifdef CONFIG_ACPI_SLEEP | ||
689 | |||
690 | /* | ||
691 | * Some VIA systems boot with the abnormal status flag set. This can cause | ||
692 | * the BIOS to re-POST the system on resume rather than passing control | ||
693 | * back to the OS. Clear the flag on boot | ||
694 | */ | ||
695 | static void __devinit quirk_via_abnormal_poweroff(struct pci_dev *dev) | ||
696 | { | ||
697 | u32 reg; | ||
698 | |||
699 | acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS, | ||
700 | ®); | ||
701 | |||
702 | if (reg & 0x800) { | ||
703 | printk("Clearing abnormal poweroff flag\n"); | ||
704 | acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK, | ||
705 | ACPI_REGISTER_PM1_STATUS, | ||
706 | (u16)0x800); | ||
707 | } | ||
708 | } | ||
709 | |||
710 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_via_abnormal_poweroff); | ||
711 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_abnormal_poweroff); | ||
712 | |||
713 | #endif | ||
714 | |||
685 | /* | 715 | /* |
686 | * CardBus controllers have a legacy base address that enables them | 716 | * CardBus controllers have a legacy base address that enables them |
687 | * to respond as i82365 pcmcia controllers. We don't want them to | 717 | * to respond as i82365 pcmcia controllers. We don't want them to |
@@ -962,6 +992,11 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) | |||
962 | case 0x8070: /* P4G8X Deluxe */ | 992 | case 0x8070: /* P4G8X Deluxe */ |
963 | asus_hides_smbus = 1; | 993 | asus_hides_smbus = 1; |
964 | } | 994 | } |
995 | if (dev->device == PCI_DEVICE_ID_INTEL_E7501_MCH) | ||
996 | switch (dev->subsystem_device) { | ||
997 | case 0x80c9: /* PU-DLS */ | ||
998 | asus_hides_smbus = 1; | ||
999 | } | ||
965 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) | 1000 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) |
966 | switch (dev->subsystem_device) { | 1001 | switch (dev->subsystem_device) { |
967 | case 0x1751: /* M2N notebook */ | 1002 | case 0x1751: /* M2N notebook */ |
@@ -1030,6 +1065,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845G_HB, asu | |||
1030 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge ); | 1065 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge ); |
1031 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82865_HB, asus_hides_smbus_hostbridge ); | 1066 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82865_HB, asus_hides_smbus_hostbridge ); |
1032 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge ); | 1067 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge ); |
1068 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_E7501_MCH, asus_hides_smbus_hostbridge ); | ||
1033 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855PM_HB, asus_hides_smbus_hostbridge ); | 1069 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855PM_HB, asus_hides_smbus_hostbridge ); |
1034 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); | 1070 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge ); |
1035 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); | 1071 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82915GM_HB, asus_hides_smbus_hostbridge ); |
@@ -1053,10 +1089,10 @@ static void __init asus_hides_smbus_lpc(struct pci_dev *dev) | |||
1053 | } | 1089 | } |
1054 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); | 1090 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc ); |
1055 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); | 1091 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc ); |
1092 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc ); | ||
1056 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); | 1093 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc ); |
1057 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); | 1094 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc ); |
1058 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); | 1095 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc ); |
1059 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, asus_hides_smbus_lpc ); | ||
1060 | 1096 | ||
1061 | static void __init asus_hides_smbus_lpc_ich6(struct pci_dev *dev) | 1097 | static void __init asus_hides_smbus_lpc_ich6(struct pci_dev *dev) |
1062 | { | 1098 | { |
@@ -1174,6 +1210,55 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_ | |||
1174 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); | 1210 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus ); |
1175 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); | 1211 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus ); |
1176 | 1212 | ||
1213 | #if defined(CONFIG_SCSI_SATA) || defined(CONFIG_SCSI_SATA_MODULE) | ||
1214 | |||
1215 | /* | ||
1216 | * If we are using libata we can drive this chip properly but must | ||
1217 | * do this early on to make the additional device appear during | ||
1218 | * the PCI scanning. | ||
1219 | */ | ||
1220 | |||
1221 | static void __devinit quirk_jmicron_dualfn(struct pci_dev *pdev) | ||
1222 | { | ||
1223 | u32 conf; | ||
1224 | u8 hdr; | ||
1225 | |||
1226 | /* Only poke fn 0 */ | ||
1227 | if (PCI_FUNC(pdev->devfn)) | ||
1228 | return; | ||
1229 | |||
1230 | switch(pdev->device) { | ||
1231 | case PCI_DEVICE_ID_JMICRON_JMB365: | ||
1232 | case PCI_DEVICE_ID_JMICRON_JMB366: | ||
1233 | /* Redirect IDE second PATA port to the right spot */ | ||
1234 | pci_read_config_dword(pdev, 0x80, &conf); | ||
1235 | conf |= (1 << 24); | ||
1236 | /* Fall through */ | ||
1237 | pci_write_config_dword(pdev, 0x80, conf); | ||
1238 | case PCI_DEVICE_ID_JMICRON_JMB361: | ||
1239 | case PCI_DEVICE_ID_JMICRON_JMB363: | ||
1240 | pci_read_config_dword(pdev, 0x40, &conf); | ||
1241 | /* Enable dual function mode, AHCI on fn 0, IDE fn1 */ | ||
1242 | /* Set the class codes correctly and then direct IDE 0 */ | ||
1243 | conf &= ~0x000F0200; /* Clear bit 9 and 16-19 */ | ||
1244 | conf |= 0x00C20002; /* Set bit 1, 17, 22, 23 */ | ||
1245 | pci_write_config_dword(pdev, 0x40, conf); | ||
1246 | |||
1247 | /* Reconfigure so that the PCI scanner discovers the | ||
1248 | device is now multifunction */ | ||
1249 | |||
1250 | pci_read_config_byte(pdev, PCI_HEADER_TYPE, &hdr); | ||
1251 | pdev->hdr_type = hdr & 0x7f; | ||
1252 | pdev->multifunction = !!(hdr & 0x80); | ||
1253 | |||
1254 | break; | ||
1255 | } | ||
1256 | } | ||
1257 | |||
1258 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, quirk_jmicron_dualfn); | ||
1259 | |||
1260 | #endif | ||
1261 | |||
1177 | #ifdef CONFIG_X86_IO_APIC | 1262 | #ifdef CONFIG_X86_IO_APIC |
1178 | static void __init quirk_alder_ioapic(struct pci_dev *pdev) | 1263 | static void __init quirk_alder_ioapic(struct pci_dev *pdev) |
1179 | { | 1264 | { |
@@ -1341,6 +1426,37 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_0, quirk_pc | |||
1341 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1, quirk_pcie_pxh); | 1426 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1, quirk_pcie_pxh); |
1342 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_pcie_pxh); | 1427 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_pcie_pxh); |
1343 | 1428 | ||
1429 | /* | ||
1430 | * Some Intel PCI Express chipsets have trouble with downstream | ||
1431 | * device power management. | ||
1432 | */ | ||
1433 | static void quirk_intel_pcie_pm(struct pci_dev * dev) | ||
1434 | { | ||
1435 | pci_pm_d3_delay = 120; | ||
1436 | dev->no_d1d2 = 1; | ||
1437 | } | ||
1438 | |||
1439 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e2, quirk_intel_pcie_pm); | ||
1440 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e3, quirk_intel_pcie_pm); | ||
1441 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e4, quirk_intel_pcie_pm); | ||
1442 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e5, quirk_intel_pcie_pm); | ||
1443 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e6, quirk_intel_pcie_pm); | ||
1444 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25e7, quirk_intel_pcie_pm); | ||
1445 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f7, quirk_intel_pcie_pm); | ||
1446 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f8, quirk_intel_pcie_pm); | ||
1447 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25f9, quirk_intel_pcie_pm); | ||
1448 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x25fa, quirk_intel_pcie_pm); | ||
1449 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2601, quirk_intel_pcie_pm); | ||
1450 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2602, quirk_intel_pcie_pm); | ||
1451 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2603, quirk_intel_pcie_pm); | ||
1452 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2604, quirk_intel_pcie_pm); | ||
1453 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2605, quirk_intel_pcie_pm); | ||
1454 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2606, quirk_intel_pcie_pm); | ||
1455 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2607, quirk_intel_pcie_pm); | ||
1456 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2608, quirk_intel_pcie_pm); | ||
1457 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x2609, quirk_intel_pcie_pm); | ||
1458 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260a, quirk_intel_pcie_pm); | ||
1459 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x260b, quirk_intel_pcie_pm); | ||
1344 | 1460 | ||
1345 | /* | 1461 | /* |
1346 | * Fixup the cardbus bridges on the IBM Dock II docking station | 1462 | * Fixup the cardbus bridges on the IBM Dock II docking station |
@@ -1403,6 +1519,63 @@ static void __devinit quirk_netmos(struct pci_dev *dev) | |||
1403 | } | 1519 | } |
1404 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, quirk_netmos); | 1520 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NETMOS, PCI_ANY_ID, quirk_netmos); |
1405 | 1521 | ||
1522 | static void __devinit quirk_e100_interrupt(struct pci_dev *dev) | ||
1523 | { | ||
1524 | u16 command; | ||
1525 | u32 bar; | ||
1526 | u8 __iomem *csr; | ||
1527 | u8 cmd_hi; | ||
1528 | |||
1529 | switch (dev->device) { | ||
1530 | /* PCI IDs taken from drivers/net/e100.c */ | ||
1531 | case 0x1029: | ||
1532 | case 0x1030 ... 0x1034: | ||
1533 | case 0x1038 ... 0x103E: | ||
1534 | case 0x1050 ... 0x1057: | ||
1535 | case 0x1059: | ||
1536 | case 0x1064 ... 0x106B: | ||
1537 | case 0x1091 ... 0x1095: | ||
1538 | case 0x1209: | ||
1539 | case 0x1229: | ||
1540 | case 0x2449: | ||
1541 | case 0x2459: | ||
1542 | case 0x245D: | ||
1543 | case 0x27DC: | ||
1544 | break; | ||
1545 | default: | ||
1546 | return; | ||
1547 | } | ||
1548 | |||
1549 | /* | ||
1550 | * Some firmware hands off the e100 with interrupts enabled, | ||
1551 | * which can cause a flood of interrupts if packets are | ||
1552 | * received before the driver attaches to the device. So | ||
1553 | * disable all e100 interrupts here. The driver will | ||
1554 | * re-enable them when it's ready. | ||
1555 | */ | ||
1556 | pci_read_config_word(dev, PCI_COMMAND, &command); | ||
1557 | pci_read_config_dword(dev, PCI_BASE_ADDRESS_0, &bar); | ||
1558 | |||
1559 | if (!(command & PCI_COMMAND_MEMORY) || !bar) | ||
1560 | return; | ||
1561 | |||
1562 | csr = ioremap(bar, 8); | ||
1563 | if (!csr) { | ||
1564 | printk(KERN_WARNING "PCI: Can't map %s e100 registers\n", | ||
1565 | pci_name(dev)); | ||
1566 | return; | ||
1567 | } | ||
1568 | |||
1569 | cmd_hi = readb(csr + 3); | ||
1570 | if (cmd_hi == 0) { | ||
1571 | printk(KERN_WARNING "PCI: Firmware left %s e100 interrupts " | ||
1572 | "enabled, disabling\n", pci_name(dev)); | ||
1573 | writeb(1, csr + 3); | ||
1574 | } | ||
1575 | |||
1576 | iounmap(csr); | ||
1577 | } | ||
1578 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt); | ||
1406 | 1579 | ||
1407 | static void __devinit fixup_rev1_53c810(struct pci_dev* dev) | 1580 | static void __devinit fixup_rev1_53c810(struct pci_dev* dev) |
1408 | { | 1581 | { |
diff --git a/drivers/pci/search.c b/drivers/pci/search.c index 622b3f8ba820..d529462d1b53 100644 --- a/drivers/pci/search.c +++ b/drivers/pci/search.c | |||
@@ -41,7 +41,7 @@ pci_do_find_bus(struct pci_bus* bus, unsigned char busnr) | |||
41 | * in the global list of PCI buses. If the bus is found, a pointer to its | 41 | * in the global list of PCI buses. If the bus is found, a pointer to its |
42 | * data structure is returned. If no bus is found, %NULL is returned. | 42 | * data structure is returned. If no bus is found, %NULL is returned. |
43 | */ | 43 | */ |
44 | struct pci_bus * __devinit pci_find_bus(int domain, int busnr) | 44 | struct pci_bus * pci_find_bus(int domain, int busnr) |
45 | { | 45 | { |
46 | struct pci_bus *bus = NULL; | 46 | struct pci_bus *bus = NULL; |
47 | struct pci_bus *tmp_bus; | 47 | struct pci_bus *tmp_bus; |
@@ -61,7 +61,7 @@ struct pci_bus * __devinit pci_find_bus(int domain, int busnr) | |||
61 | * @from: Previous PCI bus found, or %NULL for new search. | 61 | * @from: Previous PCI bus found, or %NULL for new search. |
62 | * | 62 | * |
63 | * Iterates through the list of known PCI busses. A new search is | 63 | * Iterates through the list of known PCI busses. A new search is |
64 | * initiated by passing %NULL to the @from argument. Otherwise if | 64 | * initiated by passing %NULL as the @from argument. Otherwise if |
65 | * @from is not %NULL, searches continue from next device on the | 65 | * @from is not %NULL, searches continue from next device on the |
66 | * global list. | 66 | * global list. |
67 | */ | 67 | */ |
@@ -148,13 +148,14 @@ struct pci_dev * pci_get_slot(struct pci_bus *bus, unsigned int devfn) | |||
148 | * @from: Previous PCI device found in search, or %NULL for new search. | 148 | * @from: Previous PCI device found in search, or %NULL for new search. |
149 | * | 149 | * |
150 | * Iterates through the list of known PCI devices. If a PCI device is | 150 | * Iterates through the list of known PCI devices. If a PCI device is |
151 | * found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its | 151 | * found with a matching @vendor, @device, @ss_vendor and @ss_device, a |
152 | * device structure is returned. Otherwise, %NULL is returned. | 152 | * pointer to its device structure is returned. Otherwise, %NULL is returned. |
153 | * A new search is initiated by passing %NULL to the @from argument. | 153 | * A new search is initiated by passing %NULL as the @from argument. |
154 | * Otherwise if @from is not %NULL, searches continue from next device on the global list. | 154 | * Otherwise if @from is not %NULL, searches continue from next device |
155 | * on the global list. | ||
155 | * | 156 | * |
156 | * NOTE: Do not use this function anymore, use pci_get_subsys() instead, as | 157 | * NOTE: Do not use this function any more; use pci_get_subsys() instead, as |
157 | * the pci device returned by this function can disappear at any moment in | 158 | * the PCI device returned by this function can disappear at any moment in |
158 | * time. | 159 | * time. |
159 | */ | 160 | */ |
160 | static struct pci_dev * pci_find_subsys(unsigned int vendor, | 161 | static struct pci_dev * pci_find_subsys(unsigned int vendor, |
@@ -191,14 +192,15 @@ exit: | |||
191 | * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids | 192 | * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids |
192 | * @from: Previous PCI device found in search, or %NULL for new search. | 193 | * @from: Previous PCI device found in search, or %NULL for new search. |
193 | * | 194 | * |
194 | * Iterates through the list of known PCI devices. If a PCI device is | 195 | * Iterates through the list of known PCI devices. If a PCI device is found |
195 | * found with a matching @vendor and @device, a pointer to its device structure is | 196 | * with a matching @vendor and @device, a pointer to its device structure is |
196 | * returned. Otherwise, %NULL is returned. | 197 | * returned. Otherwise, %NULL is returned. |
197 | * A new search is initiated by passing %NULL to the @from argument. | 198 | * A new search is initiated by passing %NULL as the @from argument. |
198 | * Otherwise if @from is not %NULL, searches continue from next device on the global list. | 199 | * Otherwise if @from is not %NULL, searches continue from next device |
200 | * on the global list. | ||
199 | * | 201 | * |
200 | * NOTE: Do not use this function anymore, use pci_get_device() instead, as | 202 | * NOTE: Do not use this function any more; use pci_get_device() instead, as |
201 | * the pci device returned by this function can disappear at any moment in | 203 | * the PCI device returned by this function can disappear at any moment in |
202 | * time. | 204 | * time. |
203 | */ | 205 | */ |
204 | struct pci_dev * | 206 | struct pci_dev * |
@@ -215,11 +217,11 @@ pci_find_device(unsigned int vendor, unsigned int device, const struct pci_dev * | |||
215 | * @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids | 217 | * @ss_device: PCI subsystem device id to match, or %PCI_ANY_ID to match all device ids |
216 | * @from: Previous PCI device found in search, or %NULL for new search. | 218 | * @from: Previous PCI device found in search, or %NULL for new search. |
217 | * | 219 | * |
218 | * Iterates through the list of known PCI devices. If a PCI device is | 220 | * Iterates through the list of known PCI devices. If a PCI device is found |
219 | * found with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its | 221 | * with a matching @vendor, @device, @ss_vendor and @ss_device, a pointer to its |
220 | * device structure is returned, and the reference count to the device is | 222 | * device structure is returned, and the reference count to the device is |
221 | * incremented. Otherwise, %NULL is returned. A new search is initiated by | 223 | * incremented. Otherwise, %NULL is returned. A new search is initiated by |
222 | * passing %NULL to the @from argument. Otherwise if @from is not %NULL, | 224 | * passing %NULL as the @from argument. Otherwise if @from is not %NULL, |
223 | * searches continue from next device on the global list. | 225 | * searches continue from next device on the global list. |
224 | * The reference count for @from is always decremented if it is not %NULL. | 226 | * The reference count for @from is always decremented if it is not %NULL. |
225 | */ | 227 | */ |
@@ -262,7 +264,7 @@ exit: | |||
262 | * found with a matching @vendor and @device, the reference count to the | 264 | * found with a matching @vendor and @device, the reference count to the |
263 | * device is incremented and a pointer to its device structure is returned. | 265 | * device is incremented and a pointer to its device structure is returned. |
264 | * Otherwise, %NULL is returned. A new search is initiated by passing %NULL | 266 | * Otherwise, %NULL is returned. A new search is initiated by passing %NULL |
265 | * to the @from argument. Otherwise if @from is not %NULL, searches continue | 267 | * as the @from argument. Otherwise if @from is not %NULL, searches continue |
266 | * from next device on the global list. The reference count for @from is | 268 | * from next device on the global list. The reference count for @from is |
267 | * always decremented if it is not %NULL. | 269 | * always decremented if it is not %NULL. |
268 | */ | 270 | */ |
@@ -279,11 +281,13 @@ pci_get_device(unsigned int vendor, unsigned int device, struct pci_dev *from) | |||
279 | * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids | 281 | * @device: PCI device id to match, or %PCI_ANY_ID to match all device ids |
280 | * @from: Previous PCI device found in search, or %NULL for new search. | 282 | * @from: Previous PCI device found in search, or %NULL for new search. |
281 | * | 283 | * |
282 | * Iterates through the list of known PCI devices in the reverse order of pci_find_device(). | 284 | * Iterates through the list of known PCI devices in the reverse order of |
285 | * pci_find_device(). | ||
283 | * If a PCI device is found with a matching @vendor and @device, a pointer to | 286 | * If a PCI device is found with a matching @vendor and @device, a pointer to |
284 | * its device structure is returned. Otherwise, %NULL is returned. | 287 | * its device structure is returned. Otherwise, %NULL is returned. |
285 | * A new search is initiated by passing %NULL to the @from argument. | 288 | * A new search is initiated by passing %NULL as the @from argument. |
286 | * Otherwise if @from is not %NULL, searches continue from previous device on the global list. | 289 | * Otherwise if @from is not %NULL, searches continue from previous device |
290 | * on the global list. | ||
287 | */ | 291 | */ |
288 | struct pci_dev * | 292 | struct pci_dev * |
289 | pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct pci_dev *from) | 293 | pci_find_device_reverse(unsigned int vendor, unsigned int device, const struct pci_dev *from) |
@@ -317,7 +321,7 @@ exit: | |||
317 | * found with a matching @class, the reference count to the device is | 321 | * found with a matching @class, the reference count to the device is |
318 | * incremented and a pointer to its device structure is returned. | 322 | * incremented and a pointer to its device structure is returned. |
319 | * Otherwise, %NULL is returned. | 323 | * Otherwise, %NULL is returned. |
320 | * A new search is initiated by passing %NULL to the @from argument. | 324 | * A new search is initiated by passing %NULL as the @from argument. |
321 | * Otherwise if @from is not %NULL, searches continue from next device | 325 | * Otherwise if @from is not %NULL, searches continue from next device |
322 | * on the global list. The reference count for @from is always decremented | 326 | * on the global list. The reference count for @from is always decremented |
323 | * if it is not %NULL. | 327 | * if it is not %NULL. |