Skip to content

Commit

Permalink
target: Handle ATA_16 passthrough for pSCSI backend devices
Browse files Browse the repository at this point in the history
The cdrecord uses ATA_PASS_THROUGH_16 command while burning CDs
with a SATA CD-ROM. This patch adds support to it so that PSCSI
CD-ROM passthrough works with the cdrecord.

(nab: Add !passthrough check to prevent non pSCSI backends from ATA_16)

Signed-off-by: Cong Meng <mc@linux.vnet.ibm.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
  • Loading branch information
mengcong authored and Nicholas Bellinger committed May 17, 2012
1 parent 5b9a4d7 commit 8da1093
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions drivers/target/target_core_transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -2927,6 +2927,38 @@ static int transport_generic_cmd_sequencer(
size = (cdb[7] << 8) | cdb[8];
cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
break;
case ATA_16:
/* Only support ATA passthrough to pSCSI backends.. */
if (!passthrough)
goto out_unsupported_cdb;

/* T_LENGTH */
switch (cdb[2] & 0x3) {
case 0x0:
sectors = 0;
break;
case 0x1:
sectors = (((cdb[1] & 0x1) ? cdb[3] : 0) << 8) | cdb[4];
break;
case 0x2:
sectors = (((cdb[1] & 0x1) ? cdb[5] : 0) << 8) | cdb[6];
break;
case 0x3:
pr_err("T_LENGTH=0x3 not supported for ATA_16\n");
goto out_invalid_cdb_field;
}

/* BYTE_BLOCK */
if (cdb[2] & 0x4) {
/* BLOCK T_TYPE: 512 or sector */
size = sectors * ((cdb[2] & 0x10) ?
dev->se_sub_dev->se_dev_attrib.block_size : 512);
} else {
/* BYTE */
size = sectors;
}
cmd->se_cmd_flags |= SCF_SCSI_CONTROL_SG_IO_CDB;
break;
default:
pr_warn("TARGET_CORE[%s]: Unsupported SCSI Opcode"
" 0x%02x, sending CHECK_CONDITION.\n",
Expand Down

0 comments on commit 8da1093

Please sign in to comment.