Existing ATAPI devices do not support 16-byte commands, so issuing ATA_16 against them gets rejected by the upper layers. This patch updates the libata implementations of HDIO_DRIVE_CMD and HDIO_DRIVE_TASK to use ATA_12 (rather than ATA_16) so that they can now also be used for ATAPI devices. Signed-off-by: Mark Lord <mlord@xxxxxxxxx> --- --- linux/drivers/ata/libata-scsi.c.1 2007-01-02 15:31:56.000000000 -0500 +++ linux/drivers/ata/libata-scsi.c 2007-01-02 15:43:20.000000000 -0500 @@ -199,18 +199,17 @@ data_dir = DMA_NONE; } - scsi_cmd[0] = ATA_16; - - scsi_cmd[4] = args[2]; + scsi_cmd[0] = ATA_12; + scsi_cmd[3] = args[2]; if (args[0] == WIN_SMART) { /* hack -- ide driver does this too... */ - scsi_cmd[6] = args[3]; - scsi_cmd[8] = args[1]; - scsi_cmd[10] = 0x4f; - scsi_cmd[12] = 0xc2; + scsi_cmd[4] = args[3]; + scsi_cmd[5] = args[1]; + scsi_cmd[6] = 0x4f; + scsi_cmd[7] = 0xc2; } else { - scsi_cmd[6] = args[1]; + scsi_cmd[4] = args[1]; } - scsi_cmd[14] = args[0]; + scsi_cmd[9] = args[0]; /* Good values for timeout and retries? Values below from scsi_ioctl_send_command() for default case... */ @@ -283,15 +282,15 @@ return -EFAULT; memset(scsi_cmd, 0, sizeof(scsi_cmd)); - scsi_cmd[0] = ATA_16; - scsi_cmd[1] = (3 << 1); /* Non-data */ + scsi_cmd[0] = ATA_12; + scsi_cmd[1] = (3 << 1); /* Non-data */ /* scsi_cmd[2] is already 0 -- no off.line, cc, or data xfer */ - scsi_cmd[4] = args[1]; - scsi_cmd[6] = args[2]; - scsi_cmd[8] = args[3]; - scsi_cmd[10] = args[4]; - scsi_cmd[12] = args[5]; - scsi_cmd[14] = args[0]; + scsi_cmd[3] = args[1]; + scsi_cmd[4] = args[2]; + scsi_cmd[5] = args[3]; + scsi_cmd[6] = args[4]; + scsi_cmd[7] = args[5]; + scsi_cmd[9] = args[0]; /* Good values for timeout and retries? Values below from scsi_ioctl_send_command() for default case... */ - 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