VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / drivers / pci / quirks.c
index b82a1c3..6e7c350 100644 (file)
@@ -694,28 +694,43 @@ static int __initdata asus_hides_smbus = 0;
 
 static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev)
 {
-       if (likely(dev->subsystem_vendor != PCI_VENDOR_ID_ASUSTEK))
-               return;
-
-       if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB)
-               switch(dev->subsystem_device) {
-               case 0x8070: /* P4B */
-               case 0x8088: /* P4B533 */
-                       asus_hides_smbus = 1;
-               }
-       if (dev->device == PCI_DEVICE_ID_INTEL_82845G_HB)
-               switch(dev->subsystem_device) {
-               case 0x80b2: /* P4PE */
-               case 0x8093: /* P4B533-V */
-                       asus_hides_smbus = 1;
-               }
-       if ((dev->device == PCI_DEVICE_ID_INTEL_82850_HB) &&
-           (dev->subsystem_device == 0x8030)) /* P4T533 */
-               asus_hides_smbus = 1;
-       if ((dev->device == PCI_DEVICE_ID_INTEL_7205_0) &&
-           (dev->subsystem_device == 0x8070)) /* P4G8X Deluxe */
-               asus_hides_smbus = 1;
-       return;
+       if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_ASUSTEK)) {
+               if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB)
+                       switch(dev->subsystem_device) {
+                       case 0x8070: /* P4B */
+                       case 0x8088: /* P4B533 */
+                               asus_hides_smbus = 1;
+                       }
+               if (dev->device == PCI_DEVICE_ID_INTEL_82845G_HB)
+                       switch(dev->subsystem_device) {
+                       case 0x80b1: /* P4GE-V */
+                       case 0x80b2: /* P4PE */
+                       case 0x8093: /* P4B533-V */
+                               asus_hides_smbus = 1;
+                       }
+               if (dev->device == PCI_DEVICE_ID_INTEL_82850_HB)
+                       switch(dev->subsystem_device) {
+                       case 0x8030: /* P4T533 */
+                               asus_hides_smbus = 1;
+                       }
+               if (dev->device == PCI_DEVICE_ID_INTEL_7205_0)
+                       switch (dev->subsystem_device) {
+                       case 0x8070: /* P4G8X Deluxe */
+                               asus_hides_smbus = 1;
+                       }
+               if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB)
+                       switch (dev->subsystem_device) {
+                       case 0x1751: /* M2N notebook */
+                               asus_hides_smbus = 1;
+                       }
+       } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_HP)) {
+               if (dev->device ==  PCI_DEVICE_ID_INTEL_82855PM_HB)
+                       switch(dev->subsystem_device) {
+                       case 0x088C: /* HP Compaq nc8000 */
+                       case 0x0890: /* HP Compaq nc6000 */
+                               asus_hides_smbus = 1;
+                       }
+       }
 }
 
 static void __init asus_hides_smbus_lpc(struct pci_dev *dev)
@@ -816,6 +831,7 @@ static void __init quirk_alder_ioapic(struct pci_dev *pdev)
 static void __init quirk_intel_ide_combined(struct pci_dev *pdev)
 {
        u8 prog, comb, tmp;
+       int ich = 0;
 
        /*
         * Narrow down to Intel SATA PCI devices.
@@ -826,8 +842,12 @@ static void __init quirk_intel_ide_combined(struct pci_dev *pdev)
        case 0x24df:
        case 0x25a3:
        case 0x25b0:
+               ich = 5;
+               break;
        case 0x2651:
        case 0x2652:
+       case 0x2653:
+               ich = 6;
                break;
        default:
                /* we do not handle this PCI device */
@@ -838,13 +858,25 @@ static void __init quirk_intel_ide_combined(struct pci_dev *pdev)
         * Read combined mode register.
         */
        pci_read_config_byte(pdev, 0x90, &tmp); /* combined mode reg */
-       tmp &= 0x6;     /* interesting bits 2:1, PATA primary/secondary */
-       if (tmp == 0x4)         /* bits 10x */
-               comb = (1 << 0);                /* SATA port 0, PATA port 1 */
-       else if (tmp == 0x6)    /* bits 11x */
-               comb = (1 << 2);                /* PATA port 0, SATA port 1 */
-       else
-               return;                         /* not in combined mode */
+
+       if (ich == 5) {
+               tmp &= 0x6;  /* interesting bits 2:1, PATA primary/secondary */
+               if (tmp == 0x4)         /* bits 10x */
+                       comb = (1 << 0);        /* SATA port 0, PATA port 1 */
+               else if (tmp == 0x6)    /* bits 11x */
+                       comb = (1 << 2);        /* PATA port 0, SATA port 1 */
+               else
+                       return;                 /* not in combined mode */
+       } else {
+               WARN_ON(ich != 6);
+               tmp &= 0x3;  /* interesting bits 1:0 */
+               if (tmp & (1 << 0))
+                       comb = (1 << 2);        /* PATA port 0, SATA port 1 */
+               else if (tmp & (1 << 1))
+                       comb = (1 << 0);        /* SATA port 0, PATA port 1 */
+               else
+                       return;                 /* not in combined mode */
+       }
 
        /*
         * Read programming interface register.
@@ -986,13 +1018,17 @@ static struct pci_fixup pci_fixups[] __devinitdata = {
 
        /*
         * on Asus P4B boards, the i801SMBus device is disabled at startup.
+        * this also goes for boards in HP Compaq nc6000 and nc8000 notebooks.
         */
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82845_HB,   asus_hides_smbus_hostbridge },
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82845G_HB,  asus_hides_smbus_hostbridge },
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82850_HB,   asus_hides_smbus_hostbridge },
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_7205_0,     asus_hides_smbus_hostbridge },
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82855PM_HB, asus_hides_smbus_hostbridge },
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82855GM_HB, asus_hides_smbus_hostbridge },
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801DB_0,  asus_hides_smbus_lpc },
        { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801BA_0,  asus_hides_smbus_lpc },
+       { PCI_FIXUP_HEADER,     PCI_VENDOR_ID_INTEL,    PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc },
 
 #ifdef CONFIG_SCSI_SATA
        /* Fixup BIOSes that configure Parallel ATA (PATA / IDE) and