From 18d37258763ddd7b1e4023df2caccd8bccb98958 Mon Sep 17 00:00:00 2001 From: mengcong Date: Thu, 17 May 2012 11:14:46 +0800 Subject: [PATCH] --- yaml --- r: 302423 b: refs/heads/master c: 8da10935bc8358f03c9d90ed2e4a3bbaa19940ab h: refs/heads/master i: 302421: 305bb880b7670c940383c703034f6ec9b6638bd1 302419: 8c977147f5e6ae9f96200064365f6c0fc7de1a52 302415: f812b56b567d0deea8c4b1472865662d4c4ea19c v: v3 --- [refs] | 2 +- trunk/drivers/target/target_core_transport.c | 32 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index f53796c14ccf..5f8dc4e21a76 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5b9a4d7280e160982a8ea37bc03619f53b5c98b7 +refs/heads/master: 8da10935bc8358f03c9d90ed2e4a3bbaa19940ab diff --git a/trunk/drivers/target/target_core_transport.c b/trunk/drivers/target/target_core_transport.c index f95a74da4d40..b05fdc0c05d3 100644 --- a/trunk/drivers/target/target_core_transport.c +++ b/trunk/drivers/target/target_core_transport.c @@ -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",