John Clark wrote: >> We can create a HORKAGE for it. Can you please post the result of >> "hdparm -I" of the device? >> >> > Tejun, > > Here it is: > > /dev/nst0: > > ATAPI Sequential-access device, with removable media > Model Number: QUANTUM DAT DAT72-000 Can you please test the attached patch? Alan, John Clark is reporting that the above tape drive chokes on odd byte PIO transfer, so the default condition check (qc->nbytes & 15) in atapi_check_dma() breaks the SATA tape drive, so there's always one which breaks the other way around. :-( For the time being, I think the horkage should do. I was wondering whether you still think we should lift the default mod16 check in atapi_check_dma(). Thanks. -- tejun
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 1ee9499..e97afce 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -4023,6 +4023,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { /* 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 */ @@ -4436,7 +4437,8 @@ int atapi_check_dma(struct ata_queued_cmd *qc) /* 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) diff --git a/include/linux/libata.h b/include/linux/libata.h index 8bb81d0..9d903b3 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -371,6 +371,8 @@ enum { ATA_HORKAGE_IPM = (1 << 7), /* Link PM problems */ ATA_HORKAGE_IVB = (1 << 8), /* cbl det validity bit bugs */ ATA_HORKAGE_STUCK_ERR = (1 << 9), /* stuck ERR on next PACKET */ + ATA_HORKAGE_ATAPI_MOD16_DMA = (1 << 10), /* use ATAPI DMA for commands + not multiple of 16 bytes */ /* DMA mask for user DMA control: User visible values; DO NOT renumber */