All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] sata_mv: enable ATAPI DMA for GEN_IIE chips
@ 2009-02-04 18:05 Mark Lord
  2009-02-05 15:33 ` Mark Lord
  0 siblings, 1 reply; 4+ messages in thread
From: Mark Lord @ 2009-02-04 18:05 UTC (permalink / raw)
  To: Jeff Garzik, IDE/ATA development list

Enable ATAPI DMA transfers on GEN_IIE chips (6042/7042/SOC).
This also gets rid of any need for mv_mode_filter().

Signed-off-by: Mark Lord <mlord@pobox.com>

--- old/drivers/ata/sata_mv.c	2009-02-03 14:58:13.000000000 -0500
+++ linux/drivers/ata/sata_mv.c	2009-02-04 12:58:52.000000000 -0500
@@ -345,7 +345,7 @@
 	EDMA_ARB_CFG_OFS	= 0x38,
 
 	EDMA_HALTCOND_OFS	= 0x60,		/* GenIIe halt conditions */
-
+	EDMA_UNKNOWN_RSVD_OFS	= 0x6C,		/* GenIIe unknown/reserved */
 
 	BMDMA_CMD_OFS		= 0x224,	/* bmdma command register */
 	BMDMA_STATUS_OFS	= 0x228,	/* bmdma status register */
@@ -551,8 +551,6 @@
 static void mv_process_crpb_entries(struct ata_port *ap,
 					struct mv_port_priv *pp);
 
-static unsigned long mv_mode_filter(struct ata_device *dev,
-				    unsigned long xfer_mask);
 static void mv_sff_irq_clear(struct ata_port *ap);
 static int mv_check_atapi_dma(struct ata_queued_cmd *qc);
 static void mv_bmdma_setup(struct ata_queued_cmd *qc);
@@ -614,7 +612,6 @@
 	.bmdma_start		= mv_bmdma_start,
 	.bmdma_stop		= mv_bmdma_stop,
 	.bmdma_status		= mv_bmdma_status,
-	.mode_filter		= mv_mode_filter,
 };
 
 static struct ata_port_operations mv_iie_ops = {
@@ -1260,6 +1257,25 @@
 	writelfl(cfg, port_mmio + EDMA_CFG_OFS);
 }
 
+/**
+ * 	mv_bmdma_enable - set a magic bit on GEN_IIE to allow bmdma
+ * 	@ap: Port being initialized
+ */
+static void mv_bmdma_enable(struct ata_port *ap)
+{
+	struct mv_host_priv *hpriv = ap->host->private_data;
+
+	if (IS_GEN_IIE(hpriv)) {
+		void __iomem *port_mmio = mv_ap_base(ap);
+		/*
+		 * Some magic is required to get non-EDMA DMA to work:
+		 */
+		u32 rsvd = readl(port_mmio + EDMA_UNKNOWN_RSVD_OFS);
+		if (!(rsvd & 1))
+			writel(rsvd | 1, port_mmio + EDMA_UNKNOWN_RSVD_OFS);
+	}
+}
+
 static void mv_port_free_dma_mem(struct ata_port *ap)
 {
 	struct mv_host_priv *hpriv = ap->host->private_data;
@@ -1340,6 +1356,7 @@
 		}
 	}
 	mv_edma_cfg(ap, 0, 0);
+	mv_bmdma_enable(ap);
 	return 0;
 
 out_port_free_dma_mem:
@@ -1417,26 +1434,6 @@
 }
 
 /**
- *	mv_mode_filter - Allow ATAPI DMA only on GenII chips.
- *	@dev: device whose xfer modes are being configured.
- *
- *	Only the GenII hardware can use DMA with ATAPI drives.
- */
-static unsigned long mv_mode_filter(struct ata_device *adev,
-				    unsigned long xfer_mask)
-{
-	if (adev->class == ATA_DEV_ATAPI) {
-		struct mv_host_priv *hpriv = adev->link->ap->host->private_data;
-		if (!IS_GEN_II(hpriv)) {
-			xfer_mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
-			ata_dev_printk(adev, KERN_INFO,
-				"ATAPI DMA not supported on this chipset\n");
-		}
-	}
-	return xfer_mask;
-}
-
-/**
  *	mv_sff_irq_clear - Clear hardware interrupt after DMA.
  *	@ap: Port associated with this ATA transaction.
  *
@@ -2997,7 +2994,7 @@
 		}
 	} while (sstatus != 0x0 && sstatus != 0x113 && sstatus != 0x123);
 	mv_edma_cfg(ap, 0, 0);
-
+	mv_bmdma_enable(ap);
 	return rc;
 }
 

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2009-02-05 15:37 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-04 18:05 [PATCH] sata_mv: enable ATAPI DMA for GEN_IIE chips Mark Lord
2009-02-05 15:33 ` Mark Lord
2009-02-05 15:36   ` [PATCH 01/02] sata_mv: cache frequently read port registers Mark Lord
2009-02-05 15:37     ` [PATCH 02/02] sata_mv: enable ATAPI DMA for GEN_IIE (v2) Mark Lord

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.