From: Alan Cox <[EMAIL PROTECTED]>

This will allow us to handle the tape drive problems Mark Lord reported

On Thu, 20 Sep 2007 22:42:17 +0100 Alan Cox <[EMAIL PROTECTED]> wrote:

> > According to information I have received, some ATA (and possibly ATAPI?) 
> > devices intentionally return some data in these cases.  In the case of 
> > certain ATA devices, this returned data permits inspection of the 
> > incorrected data.
> 
> News to me. ATA like ST-506/ST-412 exposes error data on I/O READ/WRITE
> via the READ_BUFFER functionality but its basically useless without a lot
> of knowledge of the drive on anything post ST-412 era.
> 
> Got any references ?
> 
> The other possibility is to whine but accept it happens - on the other
> hand being lax about HSM errors is asking for corruption and it seems
> to be unique to this tape device.
> 
> (and someone please don't tell me early pre ATAPI standard devices are
> trying to return the sense data in this way or I'll be ill)

Signed-off-by: Alan Cox <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
---

 drivers/ata/libata-core.c |    9 +++++++--
 include/linux/libata.h    |    1 +
 2 files changed, 8 insertions(+), 2 deletions(-)

diff -puN 
drivers/ata/libata-core.c~libata-add-a-horkage-entry-for-drq-mishandling-atapi 
drivers/ata/libata-core.c
--- 
a/drivers/ata/libata-core.c~libata-add-a-horkage-entry-for-drq-mishandling-atapi
+++ a/drivers/ata/libata-core.c
@@ -5240,8 +5240,13 @@ fsm_start:
                if (unlikely(status & (ATA_ERR | ATA_DF))) {
                        ata_port_printk(ap, KERN_WARNING, "DRQ=1 with device "
                                        "error, dev_stat 0x%X\n", status);
-                       qc->err_mask |= AC_ERR_HSM;
-                       ap->hsm_task_state = HSM_ST_ERR;
+
+                       /* Some tape drives muck this up so don't explode
+                          in those cases */
+                       if (!(qc->dev->horkage & ATA_HORKAGE_DRQ)) {
+                               qc->err_mask |= AC_ERR_HSM;
+                               ap->hsm_task_state = HSM_ST_ERR;
+                       }
                        goto fsm_start;
                }
 
diff -puN 
include/linux/libata.h~libata-add-a-horkage-entry-for-drq-mishandling-atapi 
include/linux/libata.h
--- 
a/include/linux/libata.h~libata-add-a-horkage-entry-for-drq-mishandling-atapi
+++ a/include/linux/libata.h
@@ -338,6 +338,7 @@ enum {
        ATA_HORKAGE_BROKEN_HPA  = (1 << 4),     /* Broken HPA */
        ATA_HORKAGE_SKIP_PM     = (1 << 5),     /* Skip PM operations */
        ATA_HORKAGE_HPA_SIZE    = (1 << 6),     /* native size off by one */
+       ATA_HORKAGE_DRQ         = (1 << 7),     /* Device forgets to clear DRQ 
on error */
 
         /* DMA mask for user DMA control: User visible values; DO NOT 
            renumber */
_
-
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to