libata: implement and use HORKAGE_NOSETXFER, take#2
PATCH 1/1 libata: implement and use HORKAGE_NOSETXFER, take#2
PIONEER DVD-RW DVRTD08 times out SETXFER if no media is present. The device is SATA and simply skipping SETXFER works around the problem. Implement ATA_HORKAGE_NOSETXFER and apply it to the device.
Reported by Moritz Rigler in the following thread.
http://thread.gmane.org/gmane.linux.ide/36790
and by Lars in bko#9540.
Updated to whine and ignore NOSETXFER if PATA component is detected as suggested by Alan Cox.
---
Comment also added. Thanks.
drivers/ata/libata-core.c | 20 ++++++++++++++++++-- include/linux/libata.h | 1 + 2 files changed, 19 insertions(+), 2 deletions(-)
drivers/ata/libata-core.c +18 -2
@@ -3392,17 +3392,27 @@ int ata_down_xfermask_limit(struct ata_device *dev, unsigned int sel)static int ata_dev_set_mode (struct ata_device *dev) { +struct ata_port *ap = dev->link->ap;struct ata_eh_context *ehc = &dev->link->eh_context; +const bool nosetxfer = dev->horkage &ATA_HORKAGE_NOSETXFER ;const char *dev_err_whine ="" ;int ign_dev_err =0 ; -unsigned int err_mask; +unsigned int err_mask =0 ;int rc; dev->flags &= ~ATA_DFLAG_PIO ;if (dev->xfer_shift ==ATA_SHIFT_PIO ) dev->flags |=ATA_DFLAG_PIO ; - err_mask =ata_dev_set_xfermode (dev); +if (nosetxfer && ap->flags &ATA_FLAG_SATA &&ata_id_is_sata (dev->id)) + dev_err_whine =" (SET_XFERMODE skipped)" ; +else { +if (nosetxfer) +ata_dev_printk (dev,KERN_WARNING , +"NOSETXFER but PATA detected - can't " +"skip SETXFER, might malfunction\n" ); + err_mask =ata_dev_set_xfermode (dev); + }if (err_mask & ~AC_ERR_DEV ) goto fail;
@@ -4297,6 +4307,12 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {/* Devices which aren't very happy with higher link speeds */ { "WD My Book", NULL, ATA_HORKAGE_1_5_GBPS, }, + /* + * Devices which choke on SETXFER. Applies only if both the + * device and controller are SATA. + */ + { "PIONEER DVD-RW DVRTD08", "1.00", ATA_HORKAGE_NOSETXFER }, + /* End Marker */ { } };
include/linux/libata.h +1 -0
@@ -385,6 +385,7 @@ enum {not multiple of 16 bytes */ ATA_HORKAGE_FIRMWARE_WARN = (1 <<12 ),/* firmware update warning */ ATA_HORKAGE_1_5_GBPS = (1 <<13 ),/* force 1.5 Gbps */ + ATA_HORKAGE_NOSETXFER = (1 << 14), /* skip SETXFER, SATA only *//* DMA mask for user DMA control: User visible values; DO NOT renumber */
Quoted 17 lines · Tejun Heo
PIONEER DVD-RW DVRTD08 times out SETXFER if no media is present. The device is SATA and simply skipping SETXFER works around the problem. Implement
ATA_HORKAGE_NOSETXFERand apply it to the device.Reported by Moritz Rigler in the following thread.
http://thread.gmane.org/gmane.linux.ide/36790
and by Lars in bko#9540.
Updated to whine and ignore NOSETXFER if PATA component is detected as suggested by Alan Cox.
Signed-off-by Tejun Heo <[email protected]>Reported-by Moritz Rigler <[email protected]>Reported-by Lars <[email protected]>Cc Alan Cox <[email protected]>
Quoted 6 lines
---
Comment also added. Thanks.drivers/ata/libata-core.c | 20 ++++++++++++++++++-- include/linux/libata.h | 1 + 2 files changed, 19 insertions(+), 2 deletions(-)
Man, what a crappy device... :)
Will queue immediately...
Jeff Garzik
AppliedQuoted 17 lines · Tejun Heo
PIONEER DVD-RW DVRTD08 times out SETXFER if no media is present. The device is SATA and simply skipping SETXFER works around the problem. Implement
ATA_HORKAGE_NOSETXFERand apply it to the device.Reported by Moritz Rigler in the following thread.
http://thread.gmane.org/gmane.linux.ide/36790
and by Lars in bko#9540.
Updated to whine and ignore NOSETXFER if PATA component is detected as suggested by Alan Cox.
Signed-off-by Tejun Heo <[email protected]>Reported-by Moritz Rigler <[email protected]>Reported-by Lars <[email protected]>Cc Alan Cox <[email protected]>
Quoted 5 lines
---
Comment also added. Thanks.drivers/ata/libata-core.c | 20 ++++++++++++++++++-- include/linux/libata.h | 1 +
applied