diff options
Diffstat (limited to 'drivers/pci/quirks.c')
| -rw-r--r-- | drivers/pci/quirks.c | 71 |
1 files changed, 69 insertions, 2 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index dda6099903c1..4970f47be72c 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
| @@ -575,8 +575,11 @@ static void __init quirk_amd_8131_ioapic(struct pci_dev *dev) | |||
| 575 | { | 575 | { |
| 576 | unsigned char revid, tmp; | 576 | unsigned char revid, tmp; |
| 577 | 577 | ||
| 578 | pci_msi_quirk = 1; | 578 | if (dev->subordinate) { |
| 579 | printk(KERN_WARNING "PCI: MSI quirk detected. pci_msi_quirk set.\n"); | 579 | printk(KERN_WARNING "PCI: MSI quirk detected. " |
| 580 | "PCI_BUS_FLAGS_NO_MSI set for subordinate bus.\n"); | ||
| 581 | dev->subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI; | ||
| 582 | } | ||
| 580 | 583 | ||
| 581 | if (nr_ioapics == 0) | 584 | if (nr_ioapics == 0) |
| 582 | return; | 585 | return; |
| @@ -934,6 +937,12 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) | |||
| 934 | case 0x12bd: /* HP D530 */ | 937 | case 0x12bd: /* HP D530 */ |
| 935 | asus_hides_smbus = 1; | 938 | asus_hides_smbus = 1; |
| 936 | } | 939 | } |
| 940 | if (dev->device == PCI_DEVICE_ID_INTEL_82915GM_HB) { | ||
| 941 | switch (dev->subsystem_device) { | ||
| 942 | case 0x099c: /* HP Compaq nx6110 */ | ||
| 943 | asus_hides_smbus = 1; | ||
| 944 | } | ||
| 945 | } | ||
| 937 | } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_TOSHIBA)) { | 946 | } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_TOSHIBA)) { |
| 938 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) | 947 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) |
| 939 | switch(dev->subsystem_device) { | 948 | switch(dev->subsystem_device) { |
| @@ -1068,6 +1077,37 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_651, quirk_sis_96x_ | |||
| 1068 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_735, quirk_sis_96x_compatible ); | 1077 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_735, quirk_sis_96x_compatible ); |
| 1069 | 1078 | ||
| 1070 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503, quirk_sis_503 ); | 1079 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503, quirk_sis_503 ); |
| 1080 | /* | ||
| 1081 | * On ASUS A8V and A8V Deluxe boards, the onboard AC97 audio controller | ||
| 1082 | * and MC97 modem controller are disabled when a second PCI soundcard is | ||
| 1083 | * present. This patch, tweaking the VT8237 ISA bridge, enables them. | ||
| 1084 | * -- bjd | ||
| 1085 | */ | ||
| 1086 | static void __init asus_hides_ac97_lpc(struct pci_dev *dev) | ||
| 1087 | { | ||
| 1088 | u8 val; | ||
| 1089 | int asus_hides_ac97 = 0; | ||
| 1090 | |||
| 1091 | if (likely(dev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK)) { | ||
| 1092 | if (dev->device == PCI_DEVICE_ID_VIA_8237) | ||
| 1093 | asus_hides_ac97 = 1; | ||
| 1094 | } | ||
| 1095 | |||
| 1096 | if (!asus_hides_ac97) | ||
| 1097 | return; | ||
| 1098 | |||
| 1099 | pci_read_config_byte(dev, 0x50, &val); | ||
| 1100 | if (val & 0xc0) { | ||
| 1101 | pci_write_config_byte(dev, 0x50, val & (~0xc0)); | ||
| 1102 | pci_read_config_byte(dev, 0x50, &val); | ||
| 1103 | if (val & 0xc0) | ||
| 1104 | printk(KERN_INFO "PCI: onboard AC97/MC97 devices continue to play 'hide and seek'! 0x%x\n", val); | ||
| 1105 | else | ||
| 1106 | printk(KERN_INFO "PCI: enabled onboard AC97/MC97 devices\n"); | ||
| 1107 | } | ||
| 1108 | } | ||
| 1109 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, asus_hides_ac97_lpc ); | ||
| 1110 | |||
| 1071 | 1111 | ||
| 1072 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_961, quirk_sis_96x_smbus ); | 1112 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_961, quirk_sis_96x_smbus ); |
| 1073 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_smbus ); | 1113 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_smbus ); |
| @@ -1242,6 +1282,33 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXH_1, quirk_pc | |||
| 1242 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_pcie_pxh); | 1282 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_pcie_pxh); |
| 1243 | 1283 | ||
| 1244 | 1284 | ||
| 1285 | /* | ||
| 1286 | * Fixup the cardbus bridges on the IBM Dock II docking station | ||
| 1287 | */ | ||
| 1288 | static void __devinit quirk_ibm_dock2_cardbus(struct pci_dev *dev) | ||
| 1289 | { | ||
| 1290 | u32 val; | ||
| 1291 | |||
| 1292 | /* | ||
| 1293 | * tie the 2 interrupt pins to INTA, and configure the | ||
| 1294 | * multifunction routing register to handle this. | ||
| 1295 | */ | ||
| 1296 | if ((dev->subsystem_vendor == PCI_VENDOR_ID_IBM) && | ||
| 1297 | (dev->subsystem_device == 0x0148)) { | ||
| 1298 | printk(KERN_INFO "PCI: Found IBM Dock II Cardbus Bridge " | ||
| 1299 | "applying quirk\n"); | ||
| 1300 | pci_read_config_dword(dev, 0x8c, &val); | ||
| 1301 | val = ((val & 0xffffff00) | 0x1002); | ||
| 1302 | pci_write_config_dword(dev, 0x8c, val); | ||
| 1303 | pci_read_config_dword(dev, 0x80, &val); | ||
| 1304 | val = ((val & 0x00ffff00) | 0x2864c077); | ||
| 1305 | pci_write_config_dword(dev, 0x80, val); | ||
| 1306 | } | ||
| 1307 | } | ||
| 1308 | |||
| 1309 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_1420, | ||
| 1310 | quirk_ibm_dock2_cardbus); | ||
| 1311 | |||
| 1245 | static void __devinit quirk_netmos(struct pci_dev *dev) | 1312 | static void __devinit quirk_netmos(struct pci_dev *dev) |
| 1246 | { | 1313 | { |
| 1247 | unsigned int num_parallel = (dev->subsystem_device & 0xf0) >> 4; | 1314 | unsigned int num_parallel = (dev->subsystem_device & 0xf0) >> 4; |
