diff -c --recursive linux.org/drivers/pci/quirks.c linux/drivers/pci/quirks.c *** linux.org/drivers/pci/quirks.c Sun Oct 15 01:13:23 2000 --- linux/drivers/pci/quirks.c Sun Oct 15 01:13:37 2000 *************** *** 144,149 **** --- 144,189 ---- } } + #define TRITON_PCON 0x50 + #define TRITON_BUS_CONCURRENCY (1<<0) + #define TRITON_STREAMING (1<<1) + #define TRITON_WRITE_BURST (1<<2) + #define TRITON_PEER_CONCURRENCY (1<<3) + + __initfunc(static void quirk_triton_1_pcon(struct pci_dev *dev, int arg)) + { + while ((dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437, dev)) || + (dev = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82430, dev))) + { + unsigned char b; + unsigned char bo; + printk(KERN_INFO "Host bridge 82430FX/82437FX Triton PIIX\n"); + /* 430FX and 437FX(Triton I) freeze with bus concurrency on, so switch it off */ + pci_read_config_byte(dev, TRITON_PCON, &b); + bo=b; + if(!(b & TRITON_BUS_CONCURRENCY)) + { + printk(KERN_WARNING "82430FX: disabling bus concurrency\n"); + b |= TRITON_BUS_CONCURRENCY; + } + if(b & TRITON_PEER_CONCURRENCY) + { + printk(KERN_WARNING "82430FX: disabling peer concurrency\n"); + b &= ~TRITON_PEER_CONCURRENCY; + } + if(!(b & TRITON_STREAMING)) + { + printk(KERN_WARNING "82430FX: disabling streaming\n"); + b |= TRITON_STREAMING; + } + if (b!=bo) + { + pci_write_config_byte(dev, TRITON_PCON, b); + printk(KERN_INFO "8243xFX: PCON changed to: 0x%x\n",b); + } + } + } + typedef void (*quirk_handler)(struct pci_dev *, int); *************** *** 162,167 **** --- 202,208 ---- #endif { quirk_passive_release,"Passive release enable" }, { quirk_isa_dma_hangs, "Work around ISA DMA hangs" }, + { quirk_triton_1_pcon, "Disable streaming and peer concurrency on Triton 1" }, }; *************** *** 202,207 **** --- 243,249 ---- */ { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0, quirk_isa_dma_hangs, 0x00 }, { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596_0, quirk_isa_dma_hangs, 0x00 }, + { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82430, quirk_triton_1_pcon, 0x00 }, }; __initfunc(void pci_quirks_init(void))