pata_sis: enable MWDMA for UDMA 133 chipset
[linux-2.6-microblaze.git] / drivers / ata / pata_sis.c
index fb4e90f..a42668b 100644 (file)
@@ -485,21 +485,30 @@ static void sis_133_set_dmamode (struct ata_port *ap, struct ata_device *adev)
        int port;
        u32 t1;
 
-       /* bits 4- cycle time 8 - cvs time */
-       static const u32 timing_u100[] = { 0x6B0, 0x470, 0x350, 0x140, 0x120, 0x110, 0x000 };
-       static const u32 timing_u133[] = { 0x9F0, 0x6A0, 0x470, 0x250, 0x230, 0x220, 0x210 };
-
        port = sis_port_base(adev);
        pci_read_config_dword(pdev, port, &t1);
 
        if (adev->dma_mode < XFER_UDMA_0) {
+               /* Recovery << 24 | Act << 16 | Ini << 12, like PIO modes */
+               static const u32 timing_u100[] = { 0x19154000, 0x06072000, 0x04062000 };
+               static const u32 timing_u133[] = { 0x221C6000, 0x0C0A3000, 0x05093000 };
+               int speed = adev->dma_mode - XFER_MW_DMA_0;
+
+               t1 &= 0xC0C00FFF;
+               /* disable UDMA */
                t1 &= ~0x00000004;
-               /* FIXME: need data sheet to add MWDMA here. Also lacking on
-                  ide/pci driver */
+               if (t1 & 0x08)
+                       t1 |= timing_u133[speed];
+               else
+                       t1 |= timing_u100[speed];
        } else {
+               /* bits 4- cycle time 8 - cvs time */
+               static const u32 timing_u100[] = { 0x6B0, 0x470, 0x350, 0x140, 0x120, 0x110, 0x000 };
+               static const u32 timing_u133[] = { 0x9F0, 0x6A0, 0x470, 0x250, 0x230, 0x220, 0x210 };
                int speed = adev->dma_mode - XFER_UDMA_0;
-               /* if & 8 no UDMA133 - need info for ... */
+
                t1 &= ~0x00000FF0;
+               /* enable UDMA */
                t1 |= 0x00000004;
                if (t1 & 0x08)
                        t1 |= timing_u133[speed];
@@ -620,7 +629,7 @@ static const struct ata_port_info sis_info100_early = {
 static const struct ata_port_info sis_info133 = {
        .flags          = ATA_FLAG_SLAVE_POSS,
        .pio_mask       = ATA_PIO4,
-       /* No MWDMA */
+       .mwdma_mask     = ATA_MWDMA2,
        .udma_mask      = ATA_UDMA6,
        .port_ops       = &sis_133_ops,
 };