This patch adds support for passing ATA_16 commands through to ATAPI devices in libata. In practice, the upper layers will still currently prevent ATA_16 commands, as no (?) ATAPI drives support them yet. But it will work if such a drive is ever encountered. Support for ATA_16 is necessary for using SG_IO from userspace, and an upcoming hdparm release will be updated to use this interface. This version is very similar to the earlier first submission, except that ATA_12 is no longer passed through to ATAPI because of the conflict it has with the SCSI BLANK opcode. Signed-off-by: Mark Lord <mlord@xxxxxxxxx> --- old/drivers/ata/libata-scsi.c 2007-01-02 19:20:23.000000000 -0500 +++ new/drivers/ata/libata-scsi.c 2007-01-02 19:20:49.000000000 -0500 @@ -2650,6 +2650,12 @@ static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd) { + if (cmd == ATA_16) + return ata_scsi_pass_thru; + + if (dev->class == ATA_DEV_ATAPI) + return atapi_xlat; + switch (cmd) { case READ_6: case READ_10: @@ -2670,7 +2676,6 @@ return ata_scsi_verify_xlat; case ATA_12: - case ATA_16: return ata_scsi_pass_thru; case START_STOP: @@ -2708,6 +2713,7 @@ void (*done)(struct scsi_cmnd *), struct ata_device *dev) { + ata_xlat_func_t xlat_func; int rc = 0; if (unlikely(!scmd->cmd_len)) { @@ -2717,17 +2723,11 @@ return 0; } - if (dev->class == ATA_DEV_ATA) { - ata_xlat_func_t xlat_func = ata_get_xlat_func(dev, - scmd->cmnd[0]); - - if (xlat_func) - rc = ata_scsi_translate(dev, scmd, done, xlat_func); - else - ata_scsi_simulate(dev, scmd, done); - } else - rc = ata_scsi_translate(dev, scmd, done, atapi_xlat); - + xlat_func = ata_get_xlat_func(dev, scmd->cmnd[0]); + if (xlat_func) + rc = ata_scsi_translate(dev, scmd, done, xlat_func); + else + ata_scsi_simulate(dev, scmd, done); return rc; } - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html