diff options
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r-- | drivers/pci/quirks.c | 41 |
1 files changed, 19 insertions, 22 deletions
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 |