All pastes #150093 Raw Edit

Untitled

public text v1 · immutable
#150093 ·published 2006-08-26 13:31 UTC
rendered paste body
--- /usr/src/linux-2.6.17/drivers/ide/pci/amd74xx.c     2006-06-18 03:49:35.000000000 +0200
+++ amd74xx.c   2006-04-05 11:52:18.000000000 +0200
@@ -48,6 +48,9 @@
 #define AMD_BAD_FIFO           0x20
 #define AMD_CHECK_SERENADE     0x40

+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_IDE  0x0265
+#define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_IDE  0x036E
+
 /*
  * AMD SouthBridge chips.
  */
@@ -74,7 +77,6 @@
        { 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_AMD_CS5536_IDE,                 0x40, AMD_UDMA_100 },
        { 0 }
 };

@@ -311,7 +313,7 @@
  * and initialize its drive independent registers.
  */

-static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev, const char *name)
+static unsigned int __init init_chipset_amd74xx(struct pci_dev *dev, const char *name)
 {
        unsigned char t;
        unsigned int u;
@@ -338,6 +340,8 @@
                        pci_read_config_byte(dev, AMD_CABLE_DETECT, &t);
                        pci_read_config_dword(dev, AMD_UDMA_TIMING, &u);
                        amd_80w = ((t & 0x3) ? 1 : 0) | ((t & 0xc) ? 2 : 0);
+                       if(dev->vendor == PCI_VENDOR_ID_NVIDIA)
+                               amd_80w = ((t & 0x4) ? 0 : 1) | ((t & 0x8) ? 0 : 2);
                        for (i = 24; i >= 0; i -= 8)
                                if (((u >> i) & 4) && !(amd_80w & (1 << (1 - (i >> 4))))) {
                                        printk(KERN_WARNING "%s: BIOS didn't set cable bits correctly. Enabling workaround.\n",
@@ -347,8 +351,10 @@
                        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 +390,8 @@
        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;
        }

@@ -411,12 +419,12 @@
        return dev->irq;
 }

-static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
+static void __init init_hwif_amd74xx(ide_hwif_t *hwif)
 {
        int i;

-       if (hwif->irq == 0) /* 0 is bogus but will do for now */
-               hwif->irq = pci_get_legacy_ide_irq(hwif->pci_dev, hwif->channel);
+       if (!hwif->irq)
+               hwif->irq = hwif->channel ? 15 : 14;

        hwif->autodma = 0;

@@ -487,20 +495,16 @@
        /* 13 */ DECLARE_NV_DEV("NFORCE-CK804"),
        /* 14 */ DECLARE_NV_DEV("NFORCE-MCP04"),
        /* 15 */ DECLARE_NV_DEV("NFORCE-MCP51"),
-       /* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"),
-       /* 17 */ DECLARE_AMD_DEV("AMD5536"),
+       /* 16 */ DECLARE_NV_DEV("NFORCE-MCP55"),
 };

 static int __devinit amd74xx_probe(struct pci_dev *dev, const struct pci_device_id *id)
 {
        amd_chipset = amd74xx_chipsets + id->driver_data;
        amd_config = amd_ide_chips + id->driver_data;
-       if (dev->device != amd_config->id) {
-               printk(KERN_ERR "%s: assertion 0x%02x == 0x%02x failed !\n",
-                      pci_name(dev), dev->device, amd_config->id);
-               return -ENODEV;
-       }
-       return ide_setup_pci_device(dev, amd_chipset);
+       if (dev->device != amd_config->id) BUG();
+       ide_setup_pci_device(dev, amd_chipset);
+       return 0;
 }

 static struct pci_device_id amd74xx_pci_tbl[] = {
@@ -525,7 +529,6 @@
        { 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 },
        { 0, },
 };
 MODULE_DEVICE_TABLE(pci, amd74xx_pci_tbl);