All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch 0/1] [PATCH v2] sata_via: Delay on vt6420 when starting ATAPI DMA write
@ 2010-02-14 12:04 Bart Hartgers
  2010-02-14 12:04 ` [patch 1/1] " Bart Hartgers
  0 siblings, 1 reply; 3+ messages in thread
From: Bart Hartgers @ 2010-02-14 12:04 UTC (permalink / raw)
  To: Jeff Garzik, linux-ide, linux-kernel; +Cc: Tejun Heo

Hi Jeff,

As promised, here is the updated patch to fix the vt6420 ATAPI
corruption. It applies on top of my previous patch for the vt6421 PATA
DMA fix.

Sorry for sending this as a quilt patchset of one, but it is the only
reliable way I know to send patches through gmail unharmed.

Groeten,
Bart
-- 

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

* [patch 1/1] Delay on vt6420 when starting ATAPI DMA write
  2010-02-14 12:04 [patch 0/1] [PATCH v2] sata_via: Delay on vt6420 when starting ATAPI DMA write Bart Hartgers
@ 2010-02-14 12:04 ` Bart Hartgers
  2010-02-16  8:34   ` Tejun Heo
  0 siblings, 1 reply; 3+ messages in thread
From: Bart Hartgers @ 2010-02-14 12:04 UTC (permalink / raw)
  To: Jeff Garzik, linux-ide, linux-kernel; +Cc: Tejun Heo, Bart Hartgers

[-- Attachment #1: sata_via/vt6420-atapi-dma.patch --]
[-- Type: text/plain, Size: 2551 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-02-14 11:54:15.000000000 +0100
+++ linux-2.6.33-rc4/drivers/ata/sata_via.c	2010-02-14 11:55:42.000000000 +0100
@@ -40,11 +40,13 @@
 #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>
 
 #define DRV_NAME	"sata_via"
-#define DRV_VERSION	"2.5"
+#define DRV_VERSION	"2.6"
 
 /*
  * vt8251 is different from other sata controllers of VIA.  It has two
@@ -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,17 @@ 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) &&
+	    (qc->scsicmd->sc_data_direction == DMA_TO_DEVICE)) {
+		/* Prevents corruption on some ATAPI burners */
+		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);

-- 

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

* Re: [patch 1/1] Delay on vt6420 when starting ATAPI DMA write
  2010-02-14 12:04 ` [patch 1/1] " Bart Hartgers
@ 2010-02-16  8:34   ` Tejun Heo
  0 siblings, 0 replies; 3+ messages in thread
From: Tejun Heo @ 2010-02-16  8:34 UTC (permalink / raw)
  To: Bart Hartgers; +Cc: Jeff Garzik, linux-ide, linux-kernel

On 02/14/2010 09:04 PM, Bart Hartgers wrote:
> 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>

Acked-by: Tejun Heo <tj@kernel.org>

Thanks!

-- 
tejun

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

end of thread, other threads:[~2010-02-16  8:26 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-02-14 12:04 [patch 0/1] [PATCH v2] sata_via: Delay on vt6420 when starting ATAPI DMA write Bart Hartgers
2010-02-14 12:04 ` [patch 1/1] " Bart Hartgers
2010-02-16  8:34   ` Tejun Heo

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.