[libata] sata_sil: disable DMA engine in sil_freeze()
authorJeff Garzik <jeff@garzik.org>
Tue, 7 Apr 2009 23:18:32 +0000 (19:18 -0400)
committerJeff Garzik <jgarzik@redhat.com>
Tue, 1 Sep 2009 23:47:19 +0000 (19:47 -0400)
We must disable the DMA engine before accessing taskfile registers.

Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/ata/sata_sil.c

index 35bd5cc7f2854b04654039ef4025f6ccfff4a739..3cb69d5fb817ff3ee4027db5481e57540181fcd0 100644 (file)
@@ -565,6 +565,19 @@ static void sil_freeze(struct ata_port *ap)
        tmp |= SIL_MASK_IDE0_INT << ap->port_no;
        writel(tmp, mmio_base + SIL_SYSCFG);
        readl(mmio_base + SIL_SYSCFG);  /* flush */
+
+       /* Ensure DMA_ENABLE is off.
+        *
+        * This is because the controller will not give us access to the
+        * taskfile registers while a DMA is in progress
+        */
+       iowrite8(ioread8(ap->ioaddr.bmdma_addr) & ~SIL_DMA_ENABLE,
+                ap->ioaddr.bmdma_addr);
+
+       /* According to ata_bmdma_stop, an HDMA transition requires
+        * on PIO cycle. But we can't read a taskfile register.
+        */
+       ioread8(ap->ioaddr.bmdma_addr);
 }
 
 static void sil_thaw(struct ata_port *ap)