diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/hotplug/cpci_hotplug_core.c | 2 | ||||
-rw-r--r-- | drivers/pci/hotplug/cpci_hotplug_pci.c | 5 | ||||
-rw-r--r-- | drivers/pci/pci-driver.c | 5 | ||||
-rw-r--r-- | drivers/pci/pci.ids | 1 | ||||
-rw-r--r-- | drivers/pci/probe.c | 2 | ||||
-rw-r--r-- | drivers/pci/quirks.c | 41 |
6 files changed, 31 insertions, 25 deletions
diff --git a/drivers/pci/hotplug/cpci_hotplug_core.c b/drivers/pci/hotplug/cpci_hotplug_core.c index 8132d946c384..30af105271a2 100644 --- a/drivers/pci/hotplug/cpci_hotplug_core.c +++ b/drivers/pci/hotplug/cpci_hotplug_core.c | |||
@@ -217,6 +217,8 @@ static void release_slot(struct hotplug_slot *hotplug_slot) | |||
217 | kfree(slot->hotplug_slot->info); | 217 | kfree(slot->hotplug_slot->info); |
218 | kfree(slot->hotplug_slot->name); | 218 | kfree(slot->hotplug_slot->name); |
219 | kfree(slot->hotplug_slot); | 219 | kfree(slot->hotplug_slot); |
220 | if (slot->dev) | ||
221 | pci_dev_put(slot->dev); | ||
220 | kfree(slot); | 222 | kfree(slot); |
221 | } | 223 | } |
222 | 224 | ||
diff --git a/drivers/pci/hotplug/cpci_hotplug_pci.c b/drivers/pci/hotplug/cpci_hotplug_pci.c index c878028ad215..225b5e551dd6 100644 --- a/drivers/pci/hotplug/cpci_hotplug_pci.c +++ b/drivers/pci/hotplug/cpci_hotplug_pci.c | |||
@@ -315,9 +315,12 @@ int cpci_unconfigure_slot(struct slot* slot) | |||
315 | PCI_DEVFN(PCI_SLOT(slot->devfn), i)); | 315 | PCI_DEVFN(PCI_SLOT(slot->devfn), i)); |
316 | if (dev) { | 316 | if (dev) { |
317 | pci_remove_bus_device(dev); | 317 | pci_remove_bus_device(dev); |
318 | slot->dev = NULL; | 318 | pci_dev_put(dev); |
319 | } | 319 | } |
320 | } | 320 | } |
321 | pci_dev_put(slot->dev); | ||
322 | slot->dev = NULL; | ||
323 | |||
321 | dbg("%s - exit", __FUNCTION__); | 324 | dbg("%s - exit", __FUNCTION__); |
322 | return 0; | 325 | return 0; |
323 | } | 326 | } |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index fe98553c978f..f315df2005bc 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -393,7 +393,10 @@ int pci_register_driver(struct pci_driver *drv) | |||
393 | drv->driver.bus = &pci_bus_type; | 393 | drv->driver.bus = &pci_bus_type; |
394 | drv->driver.probe = pci_device_probe; | 394 | drv->driver.probe = pci_device_probe; |
395 | drv->driver.remove = pci_device_remove; | 395 | drv->driver.remove = pci_device_remove; |
396 | drv->driver.shutdown = pci_device_shutdown, | 396 | /* FIXME, once all of the existing PCI drivers have been fixed to set |
397 | * the pci shutdown function, this test can go away. */ | ||
398 | if (!drv->driver.shutdown) | ||
399 | drv->driver.shutdown = pci_device_shutdown, | ||
397 | drv->driver.owner = drv->owner; | 400 | drv->driver.owner = drv->owner; |
398 | drv->driver.kobj.ktype = &pci_driver_kobj_type; | 401 | drv->driver.kobj.ktype = &pci_driver_kobj_type; |
399 | pci_init_dynids(&drv->dynids); | 402 | pci_init_dynids(&drv->dynids); |
diff --git a/drivers/pci/pci.ids b/drivers/pci/pci.ids index 93481b41b613..1d2ef1e2ffc6 100644 --- a/drivers/pci/pci.ids +++ b/drivers/pci/pci.ids | |||
@@ -7173,6 +7173,7 @@ | |||
7173 | 080f Sentry5 DDR/SDR RAM Controller | 7173 | 080f Sentry5 DDR/SDR RAM Controller |
7174 | 0811 Sentry5 External Interface Core | 7174 | 0811 Sentry5 External Interface Core |
7175 | 0816 BCM3302 Sentry5 MIPS32 CPU | 7175 | 0816 BCM3302 Sentry5 MIPS32 CPU |
7176 | 1600 NetXtreme BCM5752 Gigabit Ethernet PCI Express | ||
7176 | 1644 NetXtreme BCM5700 Gigabit Ethernet | 7177 | 1644 NetXtreme BCM5700 Gigabit Ethernet |
7177 | 1014 0277 Broadcom Vigil B5700 1000Base-T | 7178 | 1014 0277 Broadcom Vigil B5700 1000Base-T |
7178 | 1028 00d1 Broadcom BCM5700 | 7179 | 1028 00d1 Broadcom BCM5700 |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index b7ae87823c69..fd48b201eb53 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -125,7 +125,7 @@ static inline unsigned int pci_calc_resource_flags(unsigned int flags) | |||
125 | /* | 125 | /* |
126 | * Find the extent of a PCI decode.. | 126 | * Find the extent of a PCI decode.. |
127 | */ | 127 | */ |
128 | static u32 pci_size(u32 base, u32 maxbase, unsigned long mask) | 128 | static u32 pci_size(u32 base, u32 maxbase, u32 mask) |
129 | { | 129 | { |
130 | u32 size = mask & maxbase; /* Find the significant bits */ | 130 | u32 size = mask & maxbase; /* Find the significant bits */ |
131 | if (!size) | 131 | if (!size) |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 637e9493034b..968033fd29f0 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -456,21 +456,16 @@ static void __init quirk_amd_8131_ioapic(struct pci_dev *dev) | |||
456 | } | 456 | } |
457 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_APIC, quirk_amd_8131_ioapic ); | 457 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_APIC, quirk_amd_8131_ioapic ); |
458 | 458 | ||
459 | static void __init quirk_svw_msi(struct pci_dev *dev) | ||
460 | { | ||
461 | pci_msi_quirk = 1; | ||
462 | printk(KERN_WARNING "PCI: MSI quirk detected. pci_msi_quirk set.\n"); | ||
463 | } | ||
464 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_GCNB_LE, quirk_svw_msi ); | ||
459 | #endif /* CONFIG_X86_IO_APIC */ | 465 | #endif /* CONFIG_X86_IO_APIC */ |
460 | 466 | ||
461 | 467 | ||
462 | /* | 468 | /* |
463 | * Via 686A/B: The PCI_INTERRUPT_LINE register for the on-chip | ||
464 | * devices, USB0/1, AC97, MC97, and ACPI, has an unusual feature: | ||
465 | * when written, it makes an internal connection to the PIC. | ||
466 | * For these devices, this register is defined to be 4 bits wide. | ||
467 | * Normally this is fine. However for IO-APIC motherboards, or | ||
468 | * non-x86 architectures (yes Via exists on PPC among other places), | ||
469 | * we must mask the PCI_INTERRUPT_LINE value versus 0xf to get | ||
470 | * interrupts delivered properly. | ||
471 | */ | ||
472 | |||
473 | /* | ||
474 | * FIXME: it is questionable that quirk_via_acpi | 469 | * FIXME: it is questionable that quirk_via_acpi |
475 | * is needed. It shows up as an ISA bridge, and does not | 470 | * is needed. It shows up as an ISA bridge, and does not |
476 | * support the PCI_INTERRUPT_LINE register at all. Therefore | 471 | * support the PCI_INTERRUPT_LINE register at all. Therefore |
@@ -492,28 +487,30 @@ static void __devinit quirk_via_acpi(struct pci_dev *d) | |||
492 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_acpi ); | 487 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_acpi ); |
493 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_acpi ); | 488 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_acpi ); |
494 | 489 | ||
495 | static void quirk_via_irqpic(struct pci_dev *dev) | 490 | /* |
491 | * Via 686A/B: The PCI_INTERRUPT_LINE register for the on-chip | ||
492 | * devices, USB0/1, AC97, MC97, and ACPI, has an unusual feature: | ||
493 | * when written, it makes an internal connection to the PIC. | ||
494 | * For these devices, this register is defined to be 4 bits wide. | ||
495 | * Normally this is fine. However for IO-APIC motherboards, or | ||
496 | * non-x86 architectures (yes Via exists on PPC among other places), | ||
497 | * we must mask the PCI_INTERRUPT_LINE value versus 0xf to get | ||
498 | * interrupts delivered properly. | ||
499 | */ | ||
500 | static void quirk_via_irq(struct pci_dev *dev) | ||
496 | { | 501 | { |
497 | u8 irq, new_irq; | 502 | u8 irq, new_irq; |
498 | 503 | ||
499 | #ifdef CONFIG_X86_IO_APIC | ||
500 | if (nr_ioapics && !skip_ioapic_setup) | ||
501 | return; | ||
502 | #endif | ||
503 | #ifdef CONFIG_ACPI | ||
504 | if (acpi_irq_model != ACPI_IRQ_MODEL_PIC) | ||
505 | return; | ||
506 | #endif | ||
507 | new_irq = dev->irq & 0xf; | 504 | new_irq = dev->irq & 0xf; |
508 | pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq); | 505 | pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq); |
509 | if (new_irq != irq) { | 506 | if (new_irq != irq) { |
510 | printk(KERN_INFO "PCI: Via PIC IRQ fixup for %s, from %d to %d\n", | 507 | printk(KERN_INFO "PCI: Via IRQ fixup for %s, from %d to %d\n", |
511 | pci_name(dev), irq, new_irq); | 508 | pci_name(dev), irq, new_irq); |
512 | udelay(15); /* unknown if delay really needed */ | 509 | udelay(15); /* unknown if delay really needed */ |
513 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq); | 510 | pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq); |
514 | } | 511 | } |
515 | } | 512 | } |
516 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_irqpic); | 513 | DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_irq); |
517 | 514 | ||
518 | /* | 515 | /* |
519 | * PIIX3 USB: We have to disable USB interrupts that are | 516 | * PIIX3 USB: We have to disable USB interrupts that are |