summaryrefslogtreecommitdiffstats
path: root/drivers/pci/quirks.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/quirks.c')
-rw-r--r--drivers/pci/quirks.c74
1 files changed, 36 insertions, 38 deletions
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index d3f29dd29876..e0d78d23483a 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -48,8 +48,8 @@ static void quirk_mellanox_tavor(struct pci_dev *dev)
48{ 48{
49 dev->broken_parity_status = 1; /* This device gives false positives */ 49 dev->broken_parity_status = 1; /* This device gives false positives */
50} 50}
51DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR,quirk_mellanox_tavor); 51DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX, PCI_DEVICE_ID_MELLANOX_TAVOR, quirk_mellanox_tavor);
52DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX,PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE,quirk_mellanox_tavor); 52DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_MELLANOX, PCI_DEVICE_ID_MELLANOX_TAVOR_BRIDGE, quirk_mellanox_tavor);
53 53
54/* Deal with broken BIOSes that neglect to enable passive release, 54/* Deal with broken BIOSes that neglect to enable passive release,
55 which can cause problems in combination with the 82441FX/PPro MTRRs */ 55 which can cause problems in combination with the 82441FX/PPro MTRRs */
@@ -82,7 +82,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_p
82static void quirk_isa_dma_hangs(struct pci_dev *dev) 82static void quirk_isa_dma_hangs(struct pci_dev *dev)
83{ 83{
84 if (!isa_dma_bridge_buggy) { 84 if (!isa_dma_bridge_buggy) {
85 isa_dma_bridge_buggy=1; 85 isa_dma_bridge_buggy = 1;
86 dev_info(&dev->dev, "Activating ISA DMA hang workarounds\n"); 86 dev_info(&dev->dev, "Activating ISA DMA hang workarounds\n");
87 } 87 }
88} 88}
@@ -123,7 +123,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TGP_LPC, quirk
123 */ 123 */
124static void quirk_nopcipci(struct pci_dev *dev) 124static void quirk_nopcipci(struct pci_dev *dev)
125{ 125{
126 if ((pci_pci_problems & PCIPCI_FAIL)==0) { 126 if ((pci_pci_problems & PCIPCI_FAIL) == 0) {
127 dev_info(&dev->dev, "Disabling direct PCI/PCI transfers\n"); 127 dev_info(&dev->dev, "Disabling direct PCI/PCI transfers\n");
128 pci_pci_problems |= PCIPCI_FAIL; 128 pci_pci_problems |= PCIPCI_FAIL;
129 } 129 }
@@ -148,7 +148,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8151_0, quirk_nopci
148 */ 148 */
149static void quirk_triton(struct pci_dev *dev) 149static void quirk_triton(struct pci_dev *dev)
150{ 150{
151 if ((pci_pci_problems&PCIPCI_TRITON)==0) { 151 if ((pci_pci_problems&PCIPCI_TRITON) == 0) {
152 dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n"); 152 dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n");
153 pci_pci_problems |= PCIPCI_TRITON; 153 pci_pci_problems |= PCIPCI_TRITON;
154 } 154 }
@@ -163,8 +163,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439TX, quirk_
163 * Made according to a windows driver based patch by George E. Breese 163 * Made according to a windows driver based patch by George E. Breese
164 * see PCI Latency Adjust on http://www.viahardware.com/download/viatweak.shtm 164 * see PCI Latency Adjust on http://www.viahardware.com/download/viatweak.shtm
165 * and http://www.georgebreese.com/net/software/#PCI 165 * and http://www.georgebreese.com/net/software/#PCI
166 * Also see http://www.au-ja.org/review-kt133a-1-en.phtml for 166 * Also see http://www.au-ja.org/review-kt133a-1-en.phtml for
167 * the info on which Mr Breese based his work. 167 * the info on which Mr Breese based his work.
168 * 168 *
169 * Updated based on further information from the site and also on 169 * Updated based on further information from the site and also on
170 * information provided by VIA 170 * information provided by VIA
@@ -177,14 +177,14 @@ static void quirk_vialatency(struct pci_dev *dev)
177 a buggy southbridge */ 177 a buggy southbridge */
178 178
179 p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, NULL); 179 p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, NULL);
180 if (p!=NULL) { 180 if (p != NULL) {
181 /* 0x40 - 0x4f == 686B, 0x10 - 0x2f == 686A; thanks Dan Hollis */ 181 /* 0x40 - 0x4f == 686B, 0x10 - 0x2f == 686A; thanks Dan Hollis */
182 /* Check for buggy part revisions */ 182 /* Check for buggy part revisions */
183 if (p->revision < 0x40 || p->revision > 0x42) 183 if (p->revision < 0x40 || p->revision > 0x42)
184 goto exit; 184 goto exit;
185 } else { 185 } else {
186 p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL); 186 p = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL);
187 if (p==NULL) /* No problem parts */ 187 if (p == NULL) /* No problem parts */
188 goto exit; 188 goto exit;
189 /* Check for buggy part revisions */ 189 /* Check for buggy part revisions */
190 if (p->revision < 0x10 || p->revision > 0x12) 190 if (p->revision < 0x10 || p->revision > 0x12)
@@ -227,7 +227,7 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8361, quirk_viala
227 */ 227 */
228static void quirk_viaetbf(struct pci_dev *dev) 228static void quirk_viaetbf(struct pci_dev *dev)
229{ 229{
230 if ((pci_pci_problems&PCIPCI_VIAETBF)==0) { 230 if ((pci_pci_problems&PCIPCI_VIAETBF) == 0) {
231 dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n"); 231 dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n");
232 pci_pci_problems |= PCIPCI_VIAETBF; 232 pci_pci_problems |= PCIPCI_VIAETBF;
233 } 233 }
@@ -236,7 +236,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_via
236 236
237static void quirk_vsfx(struct pci_dev *dev) 237static void quirk_vsfx(struct pci_dev *dev)
238{ 238{
239 if ((pci_pci_problems&PCIPCI_VSFX)==0) { 239 if ((pci_pci_problems&PCIPCI_VSFX) == 0) {
240 dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n"); 240 dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n");
241 pci_pci_problems |= PCIPCI_VSFX; 241 pci_pci_problems |= PCIPCI_VSFX;
242 } 242 }
@@ -251,7 +251,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C576, quirk_vsfx)
251 */ 251 */
252static void quirk_alimagik(struct pci_dev *dev) 252static void quirk_alimagik(struct pci_dev *dev)
253{ 253{
254 if ((pci_pci_problems&PCIPCI_ALIMAGIK)==0) { 254 if ((pci_pci_problems&PCIPCI_ALIMAGIK) == 0) {
255 dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n"); 255 dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n");
256 pci_pci_problems |= PCIPCI_ALIMAGIK|PCIPCI_TRITON; 256 pci_pci_problems |= PCIPCI_ALIMAGIK|PCIPCI_TRITON;
257 } 257 }
@@ -265,7 +265,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1651, quirk_alimagi
265 */ 265 */
266static void quirk_natoma(struct pci_dev *dev) 266static void quirk_natoma(struct pci_dev *dev)
267{ 267{
268 if ((pci_pci_problems&PCIPCI_NATOMA)==0) { 268 if ((pci_pci_problems&PCIPCI_NATOMA) == 0) {
269 dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n"); 269 dev_info(&dev->dev, "Limiting direct PCI/PCI transfers\n");
270 pci_pci_problems |= PCIPCI_NATOMA; 270 pci_pci_problems |= PCIPCI_NATOMA;
271 } 271 }
@@ -703,7 +703,7 @@ static void quirk_via_ioapic(struct pci_dev *dev)
703 tmp == 0 ? "Disa" : "Ena"); 703 tmp == 0 ? "Disa" : "Ena");
704 704
705 /* Offset 0x58: External APIC IRQ output control */ 705 /* Offset 0x58: External APIC IRQ output control */
706 pci_write_config_byte (dev, 0x58, tmp); 706 pci_write_config_byte(dev, 0x58, tmp);
707} 707}
708DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_ioapic); 708DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_ioapic);
709DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_ioapic); 709DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_ioapic);
@@ -916,12 +916,12 @@ static void quirk_amd_ordering(struct pci_dev *dev)
916{ 916{
917 u32 pcic; 917 u32 pcic;
918 pci_read_config_dword(dev, 0x4C, &pcic); 918 pci_read_config_dword(dev, 0x4C, &pcic);
919 if ((pcic&6)!=6) { 919 if ((pcic & 6) != 6) {
920 pcic |= 6; 920 pcic |= 6;
921 dev_warn(&dev->dev, "BIOS failed to enable PCI standards compliance; fixing this error\n"); 921 dev_warn(&dev->dev, "BIOS failed to enable PCI standards compliance; fixing this error\n");
922 pci_write_config_dword(dev, 0x4C, pcic); 922 pci_write_config_dword(dev, 0x4C, pcic);
923 pci_read_config_dword(dev, 0x84, &pcic); 923 pci_read_config_dword(dev, 0x84, &pcic);
924 pcic |= (1<<23); /* Required in this mode */ 924 pcic |= (1 << 23); /* Required in this mode */
925 pci_write_config_dword(dev, 0x84, pcic); 925 pci_write_config_dword(dev, 0x84, pcic);
926 } 926 }
927} 927}
@@ -937,7 +937,7 @@ DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_700C
937 */ 937 */
938static void quirk_dunord(struct pci_dev *dev) 938static void quirk_dunord(struct pci_dev *dev)
939{ 939{
940 struct resource *r = &dev->resource [1]; 940 struct resource *r = &dev->resource[1];
941 941
942 r->flags |= IORESOURCE_UNSET; 942 r->flags |= IORESOURCE_UNSET;
943 r->start = 0; 943 r->start = 0;
@@ -967,11 +967,12 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TOSHIBA, 0x605, quirk_transparent_bridge)
967static void quirk_mediagx_master(struct pci_dev *dev) 967static void quirk_mediagx_master(struct pci_dev *dev)
968{ 968{
969 u8 reg; 969 u8 reg;
970
970 pci_read_config_byte(dev, 0x41, &reg); 971 pci_read_config_byte(dev, 0x41, &reg);
971 if (reg & 2) { 972 if (reg & 2) {
972 reg &= ~2; 973 reg &= ~2;
973 dev_info(&dev->dev, "Fixup for MediaGX/Geode Slave Disconnect Boundary (0x41=0x%02x)\n", reg); 974 dev_info(&dev->dev, "Fixup for MediaGX/Geode Slave Disconnect Boundary (0x41=0x%02x)\n", reg);
974 pci_write_config_byte(dev, 0x41, reg); 975 pci_write_config_byte(dev, 0x41, reg);
975 } 976 }
976} 977}
977DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master); 978DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master);
@@ -1120,7 +1121,7 @@ static void asus_hides_smbus_hostbridge(struct pci_dev *dev)
1120{ 1121{
1121 if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK)) { 1122 if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK)) {
1122 if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB) 1123 if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB)
1123 switch(dev->subsystem_device) { 1124 switch (dev->subsystem_device) {
1124 case 0x8025: /* P4B-LX */ 1125 case 0x8025: /* P4B-LX */
1125 case 0x8070: /* P4B */ 1126 case 0x8070: /* P4B */
1126 case 0x8088: /* P4B533 */ 1127 case 0x8088: /* P4B533 */
@@ -1128,14 +1129,14 @@ static void asus_hides_smbus_hostbridge(struct pci_dev *dev)
1128 asus_hides_smbus = 1; 1129 asus_hides_smbus = 1;
1129 } 1130 }
1130 else if (dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) 1131 else if (dev->device == PCI_DEVICE_ID_INTEL_82845G_HB)
1131 switch(dev->subsystem_device) { 1132 switch (dev->subsystem_device) {
1132 case 0x80b1: /* P4GE-V */ 1133 case 0x80b1: /* P4GE-V */
1133 case 0x80b2: /* P4PE */ 1134 case 0x80b2: /* P4PE */
1134 case 0x8093: /* P4B533-V */ 1135 case 0x8093: /* P4B533-V */
1135 asus_hides_smbus = 1; 1136 asus_hides_smbus = 1;
1136 } 1137 }
1137 else if (dev->device == PCI_DEVICE_ID_INTEL_82850_HB) 1138 else if (dev->device == PCI_DEVICE_ID_INTEL_82850_HB)
1138 switch(dev->subsystem_device) { 1139 switch (dev->subsystem_device) {
1139 case 0x8030: /* P4T533 */ 1140 case 0x8030: /* P4T533 */
1140 asus_hides_smbus = 1; 1141 asus_hides_smbus = 1;
1141 } 1142 }
@@ -1175,7 +1176,7 @@ static void asus_hides_smbus_hostbridge(struct pci_dev *dev)
1175 } 1176 }
1176 } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_HP)) { 1177 } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_HP)) {
1177 if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB) 1178 if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB)
1178 switch(dev->subsystem_device) { 1179 switch (dev->subsystem_device) {
1179 case 0x088C: /* HP Compaq nc8000 */ 1180 case 0x088C: /* HP Compaq nc8000 */
1180 case 0x0890: /* HP Compaq nc6000 */ 1181 case 0x0890: /* HP Compaq nc6000 */
1181 asus_hides_smbus = 1; 1182 asus_hides_smbus = 1;
@@ -1192,20 +1193,20 @@ static void asus_hides_smbus_hostbridge(struct pci_dev *dev)
1192 case 0x12bf: /* HP xw4100 */ 1193 case 0x12bf: /* HP xw4100 */
1193 asus_hides_smbus = 1; 1194 asus_hides_smbus = 1;
1194 } 1195 }
1195 } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG)) { 1196 } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG)) {
1196 if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB) 1197 if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB)
1197 switch(dev->subsystem_device) { 1198 switch (dev->subsystem_device) {
1198 case 0xC00C: /* Samsung P35 notebook */ 1199 case 0xC00C: /* Samsung P35 notebook */
1199 asus_hides_smbus = 1; 1200 asus_hides_smbus = 1;
1200 } 1201 }
1201 } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_COMPAQ)) { 1202 } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_COMPAQ)) {
1202 if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB) 1203 if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB)
1203 switch(dev->subsystem_device) { 1204 switch (dev->subsystem_device) {
1204 case 0x0058: /* Compaq Evo N620c */ 1205 case 0x0058: /* Compaq Evo N620c */
1205 asus_hides_smbus = 1; 1206 asus_hides_smbus = 1;
1206 } 1207 }
1207 else if (dev->device == PCI_DEVICE_ID_INTEL_82810_IG3) 1208 else if (dev->device == PCI_DEVICE_ID_INTEL_82810_IG3)
1208 switch(dev->subsystem_device) { 1209 switch (dev->subsystem_device) {
1209 case 0xB16C: /* Compaq Deskpro EP 401963-001 (PCA# 010174) */ 1210 case 0xB16C: /* Compaq Deskpro EP 401963-001 (PCA# 010174) */
1210 /* Motherboard doesn't have Host bridge 1211 /* Motherboard doesn't have Host bridge
1211 * subvendor/subdevice IDs, therefore checking 1212 * subvendor/subdevice IDs, therefore checking
@@ -1213,7 +1214,7 @@ static void asus_hides_smbus_hostbridge(struct pci_dev *dev)
1213 asus_hides_smbus = 1; 1214 asus_hides_smbus = 1;
1214 } 1215 }
1215 else if (dev->device == PCI_DEVICE_ID_INTEL_82801DB_2) 1216 else if (dev->device == PCI_DEVICE_ID_INTEL_82801DB_2)
1216 switch(dev->subsystem_device) { 1217 switch (dev->subsystem_device) {
1217 case 0x00b8: /* Compaq Evo D510 CMT */ 1218 case 0x00b8: /* Compaq Evo D510 CMT */
1218 case 0x00b9: /* Compaq Evo D510 SFF */ 1219 case 0x00b9: /* Compaq Evo D510 SFF */
1219 case 0x00ba: /* Compaq Evo D510 USDT */ 1220 case 0x00ba: /* Compaq Evo D510 USDT */
@@ -1514,10 +1515,8 @@ static void quirk_alder_ioapic(struct pci_dev *pdev)
1514 1515
1515 /* The next five BARs all seem to be rubbish, so just clean 1516 /* The next five BARs all seem to be rubbish, so just clean
1516 * them out */ 1517 * them out */
1517 for (i=1; i < 6; i++) { 1518 for (i = 1; i < 6; i++)
1518 memset(&pdev->resource[i], 0, sizeof(pdev->resource[i])); 1519 memset(&pdev->resource[i], 0, sizeof(pdev->resource[i]));
1519 }
1520
1521} 1520}
1522DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EESSC, quirk_alder_ioapic); 1521DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EESSC, quirk_alder_ioapic);
1523#endif 1522#endif
@@ -1552,7 +1551,7 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_PXHV, quirk_pci
1552 * Some Intel PCI Express chipsets have trouble with downstream 1551 * Some Intel PCI Express chipsets have trouble with downstream
1553 * device power management. 1552 * device power management.
1554 */ 1553 */
1555static void quirk_intel_pcie_pm(struct pci_dev * dev) 1554static void quirk_intel_pcie_pm(struct pci_dev *dev)
1556{ 1555{
1557 pci_pm_d3_delay = 120; 1556 pci_pm_d3_delay = 120;
1558 dev->no_d1d2 = 1; 1557 dev->no_d1d2 = 1;
@@ -2189,8 +2188,7 @@ static int msi_ht_cap_enabled(struct pci_dev *dev)
2189 u8 flags; 2188 u8 flags;
2190 2189
2191 if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS, 2190 if (pci_read_config_byte(dev, pos + HT_MSI_FLAGS,
2192 &flags) == 0) 2191 &flags) == 0) {
2193 {
2194 dev_info(&dev->dev, "Found %s HT MSI Mapping\n", 2192 dev_info(&dev->dev, "Found %s HT MSI Mapping\n",
2195 flags & HT_MSI_FLAGS_ENABLE ? 2193 flags & HT_MSI_FLAGS_ENABLE ?
2196 "enabled" : "disabled"); 2194 "enabled" : "disabled");
@@ -3040,7 +3038,7 @@ void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev)
3040{ 3038{
3041 struct pci_fixup *start, *end; 3039 struct pci_fixup *start, *end;
3042 3040
3043 switch(pass) { 3041 switch (pass) {
3044 case pci_fixup_early: 3042 case pci_fixup_early:
3045 start = __start_pci_fixups_early; 3043 start = __start_pci_fixups_early;
3046 end = __end_pci_fixups_early; 3044 end = __end_pci_fixups_early;