|
@@ -2873,6 +2873,26 @@ static void atapi_request_sense(struct ata_queued_cmd *qc)
|
|
|
DPRINTK("EXIT\n");
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * ATAPI devices typically report zero for their SCSI version, and sometimes
|
|
|
+ * deviate from the spec WRT response data format. If SCSI version is
|
|
|
+ * reported as zero like normal, then we make the following fixups:
|
|
|
+ * 1) Fake MMC-5 version, to indicate to the Linux scsi midlayer this is a
|
|
|
+ * modern device.
|
|
|
+ * 2) Ensure response data format / ATAPI information are always correct.
|
|
|
+ */
|
|
|
+static void atapi_fixup_inquiry(struct scsi_cmnd *cmd)
|
|
|
+{
|
|
|
+ u8 buf[4];
|
|
|
+
|
|
|
+ sg_copy_to_buffer(scsi_sglist(cmd), scsi_sg_count(cmd), buf, 4);
|
|
|
+ if (buf[2] == 0) {
|
|
|
+ buf[2] = 0x5;
|
|
|
+ buf[3] = 0x32;
|
|
|
+ }
|
|
|
+ sg_copy_from_buffer(scsi_sglist(cmd), scsi_sg_count(cmd), buf, 4);
|
|
|
+}
|
|
|
+
|
|
|
static void atapi_qc_complete(struct ata_queued_cmd *qc)
|
|
|
{
|
|
|
struct scsi_cmnd *cmd = qc->scsicmd;
|
|
@@ -2927,30 +2947,8 @@ static void atapi_qc_complete(struct ata_queued_cmd *qc)
|
|
|
*/
|
|
|
ata_gen_passthru_sense(qc);
|
|
|
} else {
|
|
|
- u8 *scsicmd = cmd->cmnd;
|
|
|
-
|
|
|
- if ((scsicmd[0] == INQUIRY) && ((scsicmd[1] & 0x03) == 0)) {
|
|
|
- unsigned long flags;
|
|
|
- u8 *buf;
|
|
|
-
|
|
|
- buf = ata_scsi_rbuf_get(cmd, true, &flags);
|
|
|
-
|
|
|
- /* ATAPI devices typically report zero for their SCSI version,
|
|
|
- * and sometimes deviate from the spec WRT response data
|
|
|
- * format. If SCSI version is reported as zero like normal,
|
|
|
- * then we make the following fixups: 1) Fake MMC-5 version,
|
|
|
- * to indicate to the Linux scsi midlayer this is a modern
|
|
|
- * device. 2) Ensure response data format / ATAPI information
|
|
|
- * are always correct.
|
|
|
- */
|
|
|
- if (buf[2] == 0) {
|
|
|
- buf[2] = 0x5;
|
|
|
- buf[3] = 0x32;
|
|
|
- }
|
|
|
-
|
|
|
- ata_scsi_rbuf_put(cmd, true, &flags);
|
|
|
- }
|
|
|
-
|
|
|
+ if (cmd->cmnd[0] == INQUIRY && (cmd->cmnd[1] & 0x03) == 0)
|
|
|
+ atapi_fixup_inquiry(cmd);
|
|
|
cmd->result = SAM_STAT_GOOD;
|
|
|
}
|
|
|
|