--- /dev/null
+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