From patchwork Sun Feb 14 12:04:50 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bart Hartgers X-Patchwork-Id: 45297 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id DA21CB7CCD for ; Sun, 14 Feb 2010 23:08:52 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758505Ab0BNMI1 (ORCPT ); Sun, 14 Feb 2010 07:08:27 -0500 Received: from mail-vw0-f46.google.com ([209.85.212.46]:60562 "EHLO mail-vw0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758502Ab0BNMIY (ORCPT ); Sun, 14 Feb 2010 07:08:24 -0500 Received: by mail-vw0-f46.google.com with SMTP id 20so1279122vws.19 for ; Sun, 14 Feb 2010 04:08:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:message-id:references :user-agent:date:from:to:cc:subject:content-disposition; bh=EwAyCyqgAwxg2QElD1Owl6mwoCMnqbl0LLKod99E+bk=; b=HLDcT32rEdM2DFoLCP6nZBLjXuIFKRaBPrjUBfPH16v7QNhp0XIEyXDIp6cwZivINp JosJUba0wlw27gwg8cx5HILWFtcjbbjXt3aJJwhZ5Jkusm5RVuBRPcl4RyN3V0QUa5uC Pv6ia3osAiN1pBhMnLtEfRrNch1iTJ5OJ4T0k= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:references:user-agent:date:from:to:cc:subject :content-disposition; b=KEJAze8tWb3opuf33h6tZCfCuHYPVIInZDWo4QpaCHOuijaxXuSMZaRMLadCFY6Ein uTTrlhPUdH7XnXcmS+UQcn171iNFzZyrpki9g6Ihq4lBrukNXU3tQYkOSmJ0eOhI/qe3 gyLpBq8hobJnEoKmEMXUWZX++3jyz0NsEOoDc= Received: by 10.220.48.213 with SMTP id s21mr2637740vcf.105.1266149303914; Sun, 14 Feb 2010 04:08:23 -0800 (PST) Received: from localhost ([84.24.254.225]) by mx.google.com with ESMTPS id 42sm54074666vws.12.2010.02.14.04.08.22 (version=TLSv1/SSLv3 cipher=RC4-MD5); Sun, 14 Feb 2010 04:08:22 -0800 (PST) Message-Id: <20100214120819.947320201@gmail.com> References: <20100214120449.503204189@gmail.com> User-Agent: quilt/0.46-1 Date: Sun, 14 Feb 2010 13:04:50 +0100 From: Bart Hartgers To: Jeff Garzik , linux-ide@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Tejun Heo , Bart Hartgers Subject: [patch 1/1] Delay on vt6420 when starting ATAPI DMA write Content-Disposition: inline; filename=sata_via/vt6420-atapi-dma.patch Sender: linux-ide-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ide@vger.kernel.org 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 Acked-by: Tejun Heo 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 #include #include +#include +#include #include #include #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);