linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / ide / pci / amd74xx.c
index b22ee54..31b6d74 100644 (file)
@@ -74,6 +74,9 @@ static struct amd_ide_chip {
        { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,        0x50, AMD_UDMA_133 },
        { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE,        0x50, AMD_UDMA_133 },
        { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE,        0x50, AMD_UDMA_133 },
+       { PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE,        0x50, AMD_UDMA_133 },
        { PCI_DEVICE_ID_AMD_CS5536_IDE,                 0x40, AMD_UDMA_100 },
        { 0 }
 };
@@ -347,8 +350,10 @@ static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev, const ch
                        break;
 
                case AMD_UDMA_66:
-                       /* no host side cable detection */
-                       amd_80w = 0x03;
+                       pci_read_config_dword(dev, AMD_UDMA_TIMING, &u);
+                       for (i = 24; i >= 0; i -= 8)
+                               if ((u >> i) & 4)
+                                       amd_80w |= (1 << (1 - (i >> 4)));
                        break;
        }
 
@@ -384,6 +389,8 @@ static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev, const ch
        if (amd_clock < 20000 || amd_clock > 50000) {
                printk(KERN_WARNING "%s: User given PCI clock speed impossible (%d), using 33 MHz instead.\n",
                        amd_chipset->name, amd_clock);
+               printk(KERN_WARNING "%s: Use ide0=ata66 if you want to assume 80-wire cable\n",
+                       amd_chipset->name);
                amd_clock = 33333;
        }
 
@@ -488,7 +495,10 @@ static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
        /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"),
        /* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"),
        /* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"),
-       /* 17 */ DECLARE_AMD_DEV("AMD5536"),
+       /* 17 */ DECLARE_NV_DEV("NFORCE-MCP61"),
+       /* 18 */ DECLARE_NV_DEV("NFORCE-MCP65"),
+       /* 19 */ DECLARE_NV_DEV("NFORCE-MCP67"),
+       /* 20 */ DECLARE_AMD_DEV("AMD5536"),
 };
 
 static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id)
@@ -525,7 +535,10 @@ static struct pci_device_id amd74xx_pci_tbl[] = {
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 14 },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 15 },
        { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 16 },
-       { PCI_VENDOR_ID_AMD,    PCI_DEVICE_ID_AMD_CS5536_IDE,           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 17 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP65_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 18 },
+       { PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP67_IDE,  PCI_ANY_ID, PCI_ANY_ID, 0, 0, 19 },
+       { PCI_VENDOR_ID_AMD,    PCI_DEVICE_ID_AMD_CS5536_IDE,           PCI_ANY_ID, PCI_ANY_ID, 0, 0, 20 },
        { 0, },
 };
 MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl);