--- ../kernel-2.4.20.orig/linux-2.4.20/drivers/pci/quirks.c 2003-01-27 16:58:29.000000000 -0500 +++ linux-2.4.20/drivers/pci/quirks.c 2003-01-27 17:13:22.000000000 -0500 @@ -615,6 +615,25 @@ } } + +static void __init quirk_serverworks_writeoverlap(struct pci_dev *dev) +{ + /* extended memory controller configuration register 0 */ + static const int emccr = 0xCD; + static const u8 wovl = (1 << 1); /* Write Overlap Enable bit */ + u8 tmp; + + /* this is multi-function PCI device, only apply fixup to function 0 */ + if (PCI_FUNC(dev->devfn)) + return; + + pci_read_config_byte(dev, emccr, &tmp); + if (tmp & wovl) { + tmp &= ~wovl; /* clear Write Overlap Enable */ + pci_write_config_byte(dev, emccr, tmp); + } +} + /* * The main table of quirks. */ @@ -661,6 +680,7 @@ { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_2, quirk_piix3_usb }, { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_2, quirk_piix3_usb }, { PCI_FIXUP_FINAL, PCI_ANY_ID, PCI_ANY_ID, quirk_cardbus_legacy }, + { PCI_FIXUP_FINAL, PCI_VENDOR_ID_SERVERWORKS, 0x0014, quirk_serverworks_writeoverlap }, #ifdef CONFIG_X86_IO_APIC { PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_ioapic },