]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
pata_sis: enable MWDMA for UDMA 133 chipset
authorDan McGee <dpmcgee@gmail.com>
Wed, 7 Sep 2011 16:23:20 +0000 (11:23 -0500)
committerJeff Garzik <jgarzik@redhat.com>
Sat, 8 Oct 2011 04:07:16 +0000 (00:07 -0400)
This ports the timing values over from the old IDE driver into the new
PATA-based one. The comment was lying when it stated the old driver was
not MWDMA capable.

Boot tested on actual hardware using 'libata.force=mwdma2'.

Signed-off-by: Dan McGee <dpmcgee@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/ata/pata_sis.c

index fb4e90f6d749e47d6dcb5a1e14b1cb63563fbf5f..a42668bd48f8d4d6cd780011c5934f095453daff 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,
 };