linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bart Hartgers <bart.hartgers@gmail.com>
To: linux-kernel@vger.kernel.org, Jeff Garzik <jgarzik@pobox.com>
Cc: linux-ide@vger.kernel.org, Bart Hartgers <bart.hartgers@gmail.com>
Subject: [patch 2/2] sata_via: Delay on vt6420 when starting ATAPI DMA write
Date: Sun, 17 Jan 2010 00:56:55 +0100	[thread overview]
Message-ID: <20100116235851.884756038@gmail.com> (raw)
In-Reply-To: 20100116235653.898098245@gmail.com

[-- Attachment #1: sata_via/vt6420-atapi-dma.patch --]
[-- Type: text/plain, Size: 2478 bytes --]

When writing a disc on certain lite-on dvd-writers (also rebadged as
optiarc/LG/...) connected to a vt6420, the ATAPI CDB ends up in the
datastream and on the disc, causing silent corruption.  Delaying
between sending the CDB and starting DMA seems to prevent this.

I do not know if there are burners that do not suffer from this, but
the patch should be safe for those as well.

There are many reports of this issue, but AFAICT no solution was 
found before. For example:
http://lkml.indiana.edu/hypermail/linux/kernel/0802.3/0561.html

Signed-off-by: Bart Hartgers <bart.hartgers@gmail.com>
---
Index: linux-2.6.33-rc4/drivers/ata/sata_via.c
===================================================================
--- linux-2.6.33-rc4.orig/drivers/ata/sata_via.c	2010-01-16 22:29:30.000000000 +0100
+++ linux-2.6.33-rc4/drivers/ata/sata_via.c	2010-01-16 22:29:38.000000000 +0100
@@ -40,6 +40,8 @@
 #include <linux/blkdev.h>
 #include <linux/delay.h>
 #include <linux/device.h>
+#include <scsi/scsi.h>
+#include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_host.h>
 #include <linux/libata.h>
 
@@ -80,6 +82,7 @@ static int vt8251_scr_write(struct ata_l
 static void svia_tf_load(struct ata_port *ap, const struct ata_taskfile *tf);
 static void svia_noop_freeze(struct ata_port *ap);
 static int vt6420_prereset(struct ata_link *link, unsigned long deadline);
+static void vt6420_bmdma_start(struct ata_queued_cmd *qc);
 static int vt6421_pata_cable_detect(struct ata_port *ap);
 static void vt6421_set_pio_mode(struct ata_port *ap, struct ata_device *adev);
 static void vt6421_set_dma_mode(struct ata_port *ap, struct ata_device *adev);
@@ -121,6 +124,7 @@ static struct ata_port_operations vt6420
 	.inherits		= &svia_base_ops,
 	.freeze			= svia_noop_freeze,
 	.prereset		= vt6420_prereset,
+	.bmdma_start		= vt6420_bmdma_start,
 };
 
 static struct ata_port_operations vt6421_pata_ops = {
@@ -377,6 +381,19 @@ static int vt6420_prereset(struct ata_li
 	return 0;
 }
 
+static void vt6420_bmdma_start(struct ata_queued_cmd *qc)
+{
+	struct ata_port *ap = qc->ap;
+	if ((qc->tf.command == ATA_CMD_PACKET) &&
+	    unlikely(qc->scsicmd->sc_data_direction == DMA_TO_DEVICE)) {
+		/* Prevents corruption on some ATAPI burners */
+		printk_once(KERN_WARNING DRV_NAME
+			    ": fixing DMA to device for ATAPI\n");
+		ata_sff_pause(ap);
+	}
+	ata_bmdma_start(qc);
+}
+
 static int vt6421_pata_cable_detect(struct ata_port *ap)
 {
 	struct pci_dev *pdev = to_pci_dev(ap->host->dev);

-- 

  parent reply	other threads:[~2010-01-16 23:56 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-01-16 23:56 [patch 0/2] sata_via: bugfixes for vt6420 and vt6421 Bart Hartgers
2010-01-16 23:56 ` [patch 1/2] sata_via: Correctly setup PIO/DMA for pata slave on vt6421 Bart Hartgers
2010-01-20  3:33   ` Tejun Heo
2010-01-20 19:35   ` Jeff Garzik
2010-01-16 23:56 ` Bart Hartgers [this message]
2010-01-20  3:30   ` [patch 2/2] sata_via: Delay on vt6420 when starting ATAPI DMA write Tejun Heo
2010-01-20  4:53     ` Robert Hancock
2010-01-20  6:33       ` Bart Hartgers
2010-01-20  6:54         ` Tejun Heo
2010-01-20 10:43           ` Bart Hartgers
2010-01-20  6:44     ` Bart Hartgers
2010-01-20  6:55       ` Tejun Heo
2010-02-13 22:47         ` Jeff Garzik
2010-02-14 11:20           ` Bart Hartgers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100116235851.884756038@gmail.com \
    --to=bart.hartgers@gmail.com \
    --cc=jgarzik@pobox.com \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).