]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.31/patches.drivers/libata-add-and-use-HORKAGE_ATAPI_MOD16_DMA
Reenabled linux-xen, added patches for Xen Kernel Version 2.6.27.31,
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / libata-add-and-use-HORKAGE_ATAPI_MOD16_DMA
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libata-add-and-use-HORKAGE_ATAPI_MOD16_DMA b/src/patches/suse-2.6.27.31/patches.drivers/libata-add-and-use-HORKAGE_ATAPI_MOD16_DMA
new file mode 100644 (file)
index 0000000..325edbf
--- /dev/null
@@ -0,0 +1,54 @@
+From 6a87e42e955ff27e07a77f65f8f077dc7c4171e1 Mon Sep 17 00:00:00 2001
+From: Tejun Heo <tj@kernel.org>
+Date: Mon, 3 Nov 2008 19:01:09 +0900
+Subject: [PATCH] libata: implement ATA_HORKAGE_ATAPI_MOD16_DMA and apply it
+
+libata always uses PIO for ATAPI commands when the number of bytes to
+transfer isn't multiple of 16 but quantum DAT72 chokes on odd bytes
+PIO transfers.  Implement a horkage to skip the mod16 check and apply
+it to the quantum device.
+
+This is reported by John Clark in the following thread.
+
+  http://thread.gmane.org/gmane.linux.ide/34748
+
+Signed-off-by: Tejun Heo <tj@kernel.org>
+Cc: John Clark <clarkjc@runbox.com>
+Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
+Signed-off-by: Tejun Heo <teheo@suse.de>
+---
+ drivers/ata/libata-core.c |    4 +++-
+ include/linux/libata.h    |    2 ++
+ 2 files changed, 5 insertions(+), 1 deletion(-)
+
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -4036,6 +4036,7 @@ static const struct ata_blacklist_entry 
+       /* Weird ATAPI devices */
+       { "TORiSAN DVD-ROM DRD-N216", NULL,     ATA_HORKAGE_MAX_SEC_128 },
++      { "QUANTUM DAT    DAT72-000", NULL,     ATA_HORKAGE_ATAPI_MOD16_DMA },
+       /* Devices we expect to fail diagnostics */
+@@ -4519,7 +4520,8 @@ int atapi_check_dma(struct ata_queued_cm
+       /* Don't allow DMA if it isn't multiple of 16 bytes.  Quite a
+        * few ATAPI devices choke on such DMA requests.
+        */
+-      if (unlikely(qc->nbytes & 15))
++      if (!(qc->dev->horkage & ATA_HORKAGE_ATAPI_MOD16_DMA) &&
++          unlikely(qc->nbytes & 15))
+               return 1;
+       if (ap->ops->check_atapi_dma)
+--- a/include/linux/libata.h
++++ b/include/linux/libata.h
+@@ -372,6 +372,8 @@ enum {
+       ATA_HORKAGE_IVB         = (1 << 8),     /* cbl det validity bit bugs */
+       ATA_HORKAGE_STUCK_ERR   = (1 << 9),     /* stuck ERR on next PACKET */
+       ATA_HORKAGE_BRIDGE_OK   = (1 << 10),    /* no bridge limits */
++      ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 11), /* use ATAPI DMA for commands
++                                                  not multiple of 16 bytes */
+       ATA_HORKAGE_FIRMWARE_WARN = (1 << 12),  /* firwmare update warning */
+        /* DMA mask for user DMA control: User visible values; DO NOT