it821x: Add ultra_mask quirk for Vortex86SX
authorBrandon Philips <brandon@ifup.org>
Wed, 14 Jan 2009 18:19:02 +0000 (19:19 +0100)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Wed, 14 Jan 2009 18:19:02 +0000 (19:19 +0100)
On Vortex86SX with IDE controller revision 0x11 ultra DMA must be
disabled. This patch was tested by DMP and seems to work.

It is a cleaned up version of their older Kernel patch:
 http://www.dmp.com.tw/tech/vortex86sx/patch-2.6.24-DMP.gz

Tested-by: Shawn Lin <shawn@dmp.com.tw>
Signed-off-by: Brandon Philips <bphilips@suse.de>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/it821x.c
include/linux/pci_ids.h

index 0be27ac1f07767854fb9bf98b4caa7723d3e68c0..983440a9a5f764973bf6b2a6dafeba608a57f70b 100644 (file)
@@ -68,6 +68,8 @@
 
 #define DRV_NAME "it821x"
 
+#define QUIRK_VORTEX86 1
+
 struct it821x_dev
 {
        unsigned int smart:1,           /* Are we in smart raid mode */
@@ -79,6 +81,7 @@ struct it821x_dev
        u16     pio[2];                 /* Cached PIO values */
        u16     mwdma[2];               /* Cached MWDMA values */
        u16     udma[2];                /* Cached UDMA values (per drive) */
+       u16     quirks;
 };
 
 #define ATA_66         0
@@ -577,6 +580,12 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
 
        hwif->ultra_mask = ATA_UDMA6;
        hwif->mwdma_mask = ATA_MWDMA2;
+
+       /* Vortex86SX quirk: prevent Ultra-DMA mode to fix BadCRC issue */
+       if (idev->quirks & QUIRK_VORTEX86) {
+               if (dev->revision == 0x11)
+                       hwif->ultra_mask = 0;
+       }
 }
 
 static void it8212_disable_raid(struct pci_dev *dev)
@@ -649,6 +658,8 @@ static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_devic
                return -ENOMEM;
        }
 
+       itdevs->quirks = id->driver_data;
+
        rc = ide_pci_init_one(dev, &it821x_chipset, itdevs);
        if (rc)
                kfree(itdevs);
@@ -668,6 +679,7 @@ static void __devexit it821x_remove(struct pci_dev *dev)
 static const struct pci_device_id it821x_pci_tbl[] = {
        { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8211), 0 },
        { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8212), 0 },
+       { PCI_VDEVICE(RDC, PCI_DEVICE_ID_RDC_D1010), QUIRK_VORTEX86 },
        { 0, },
 };
 
index d543365518ab476c3e0b9ef2a68de89e2b3268d1..d56ad9c21c09fb677e9a312da9c30987268ca504 100644 (file)
 #define PCI_DEVICE_ID_RDC_R6040                0x6040
 #define PCI_DEVICE_ID_RDC_R6060                0x6060
 #define PCI_DEVICE_ID_RDC_R6061                0x6061
+#define PCI_DEVICE_ID_RDC_D1010                0x1010
 
 #define PCI_VENDOR_ID_LENOVO           0x17aa