Add unmarshallers for READ*/VERIFY*/WRITE* cdb
This commit is contained in:
@@ -746,6 +746,13 @@ struct scsi_persistent_reserve_in_report_capabilities {
|
|||||||
uint16_t persistent_reservation_type_mask;
|
uint16_t persistent_reservation_type_mask;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct scsi_read6_cdb {
|
||||||
|
enum scsi_opcode opcode;
|
||||||
|
uint32_t lba;
|
||||||
|
uint16_t transfer_length;
|
||||||
|
uint8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
struct scsi_read10_cdb {
|
struct scsi_read10_cdb {
|
||||||
enum scsi_opcode opcode;
|
enum scsi_opcode opcode;
|
||||||
uint8_t rdprotect;
|
uint8_t rdprotect;
|
||||||
@@ -758,6 +765,101 @@ struct scsi_read10_cdb {
|
|||||||
uint8_t control;
|
uint8_t control;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct scsi_read12_cdb {
|
||||||
|
enum scsi_opcode opcode;
|
||||||
|
uint8_t rdprotect;
|
||||||
|
uint8_t dpo;
|
||||||
|
uint8_t fua;
|
||||||
|
uint8_t rarc;
|
||||||
|
uint8_t fua_nv;
|
||||||
|
uint32_t lba;
|
||||||
|
uint32_t transfer_length;
|
||||||
|
uint8_t group;
|
||||||
|
uint8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct scsi_read16_cdb {
|
||||||
|
enum scsi_opcode opcode;
|
||||||
|
uint8_t rdprotect;
|
||||||
|
uint8_t dpo;
|
||||||
|
uint8_t fua;
|
||||||
|
uint8_t rarc;
|
||||||
|
uint8_t fua_nv;
|
||||||
|
uint64_t lba;
|
||||||
|
uint32_t transfer_length;
|
||||||
|
uint8_t group;
|
||||||
|
uint8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct scsi_verify10_cdb {
|
||||||
|
enum scsi_opcode opcode;
|
||||||
|
uint8_t vrprotect;
|
||||||
|
uint8_t dpo;
|
||||||
|
uint8_t bytchk;
|
||||||
|
uint32_t lba;
|
||||||
|
uint8_t group;
|
||||||
|
uint16_t verification_length;
|
||||||
|
uint8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct scsi_verify12_cdb {
|
||||||
|
enum scsi_opcode opcode;
|
||||||
|
uint8_t vrprotect;
|
||||||
|
uint8_t dpo;
|
||||||
|
uint8_t bytchk;
|
||||||
|
uint32_t lba;
|
||||||
|
uint32_t verification_length;
|
||||||
|
uint8_t group;
|
||||||
|
uint8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct scsi_verify16_cdb {
|
||||||
|
enum scsi_opcode opcode;
|
||||||
|
uint8_t vrprotect;
|
||||||
|
uint8_t dpo;
|
||||||
|
uint8_t bytchk;
|
||||||
|
uint64_t lba;
|
||||||
|
uint32_t verification_length;
|
||||||
|
uint8_t group;
|
||||||
|
uint8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct scsi_write10_cdb {
|
||||||
|
enum scsi_opcode opcode;
|
||||||
|
uint8_t wrprotect;
|
||||||
|
uint8_t dpo;
|
||||||
|
uint8_t fua;
|
||||||
|
uint8_t fua_nv;
|
||||||
|
uint32_t lba;
|
||||||
|
uint8_t group;
|
||||||
|
uint16_t transfer_length;
|
||||||
|
uint8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct scsi_write12_cdb {
|
||||||
|
enum scsi_opcode opcode;
|
||||||
|
uint8_t wrprotect;
|
||||||
|
uint8_t dpo;
|
||||||
|
uint8_t fua;
|
||||||
|
uint8_t fua_nv;
|
||||||
|
uint32_t lba;
|
||||||
|
uint32_t transfer_length;
|
||||||
|
uint8_t group;
|
||||||
|
uint8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct scsi_write16_cdb {
|
||||||
|
enum scsi_opcode opcode;
|
||||||
|
uint8_t wrprotect;
|
||||||
|
uint8_t dpo;
|
||||||
|
uint8_t fua;
|
||||||
|
uint8_t fua_nv;
|
||||||
|
uint32_t lba;
|
||||||
|
uint32_t transfer_length;
|
||||||
|
uint8_t group;
|
||||||
|
uint8_t control;
|
||||||
|
};
|
||||||
|
|
||||||
EXTERN int scsi_datain_getfullsize(struct scsi_task *task);
|
EXTERN int scsi_datain_getfullsize(struct scsi_task *task);
|
||||||
EXTERN void *scsi_datain_unmarshall(struct scsi_task *task);
|
EXTERN void *scsi_datain_unmarshall(struct scsi_task *task);
|
||||||
EXTERN void *scsi_cdb_unmarshall(struct scsi_task *task, enum scsi_opcode opcode);
|
EXTERN void *scsi_cdb_unmarshall(struct scsi_task *task, enum scsi_opcode opcode);
|
||||||
|
|||||||
@@ -2574,6 +2574,24 @@ scsi_datain_unmarshall(struct scsi_task *task)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static struct scsi_read6_cdb *
|
||||||
|
scsi_read6_cdb_unmarshall(struct scsi_task *task)
|
||||||
|
{
|
||||||
|
struct scsi_read6_cdb *read6;
|
||||||
|
|
||||||
|
read6 = scsi_malloc(task, sizeof(struct scsi_read6_cdb));
|
||||||
|
if (read6 == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
read6->opcode = SCSI_OPCODE_READ6;
|
||||||
|
read6->lba = scsi_get_uint32(&task->cdb[0]) & 0x001fffff;
|
||||||
|
read6->transfer_length = task->cdb[4];
|
||||||
|
read6->control = task->cdb[5];
|
||||||
|
|
||||||
|
return read6;
|
||||||
|
}
|
||||||
|
|
||||||
static struct scsi_read10_cdb *
|
static struct scsi_read10_cdb *
|
||||||
scsi_read10_cdb_unmarshall(struct scsi_task *task)
|
scsi_read10_cdb_unmarshall(struct scsi_task *task)
|
||||||
{
|
{
|
||||||
@@ -2597,6 +2615,189 @@ scsi_read10_cdb_unmarshall(struct scsi_task *task)
|
|||||||
return read10;
|
return read10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct scsi_read12_cdb *
|
||||||
|
scsi_read12_cdb_unmarshall(struct scsi_task *task)
|
||||||
|
{
|
||||||
|
struct scsi_read12_cdb *read12;
|
||||||
|
|
||||||
|
read12 = scsi_malloc(task, sizeof(struct scsi_read12_cdb));
|
||||||
|
if (read12 == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
read12->opcode = SCSI_OPCODE_READ12;
|
||||||
|
read12->rdprotect = (task->cdb[1] >> 5) & 0x7;
|
||||||
|
read12->dpo = !!(task->cdb[1] & 0x10);
|
||||||
|
read12->fua = !!(task->cdb[1] & 0x08);
|
||||||
|
read12->rarc = !!(task->cdb[1] & 0x04);
|
||||||
|
read12->fua_nv = !!(task->cdb[1] & 0x02);
|
||||||
|
read12->lba = scsi_get_uint32(&task->cdb[2]);
|
||||||
|
read12->transfer_length = scsi_get_uint32(&task->cdb[6]);
|
||||||
|
read12->group = task->cdb[10] & 0x1f;
|
||||||
|
read12->control = task->cdb[11];
|
||||||
|
|
||||||
|
return read12;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct scsi_read16_cdb *
|
||||||
|
scsi_read16_cdb_unmarshall(struct scsi_task *task)
|
||||||
|
{
|
||||||
|
struct scsi_read16_cdb *read16;
|
||||||
|
|
||||||
|
read16 = scsi_malloc(task, sizeof(struct scsi_read16_cdb));
|
||||||
|
if (read16 == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
read16->opcode = SCSI_OPCODE_READ16;
|
||||||
|
read16->rdprotect = (task->cdb[1] >> 5) & 0x7;
|
||||||
|
read16->dpo = !!(task->cdb[1] & 0x10);
|
||||||
|
read16->fua = !!(task->cdb[1] & 0x08);
|
||||||
|
read16->rarc = !!(task->cdb[1] & 0x04);
|
||||||
|
read16->fua_nv = !!(task->cdb[1] & 0x02);
|
||||||
|
read16->lba = scsi_get_uint64(&task->cdb[2]);
|
||||||
|
read16->transfer_length = scsi_get_uint32(&task->cdb[10]);
|
||||||
|
read16->group = task->cdb[14] & 0x1f;
|
||||||
|
read16->control = task->cdb[15];
|
||||||
|
|
||||||
|
return read16;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct scsi_verify10_cdb *
|
||||||
|
scsi_verify10_cdb_unmarshall(struct scsi_task *task)
|
||||||
|
{
|
||||||
|
struct scsi_verify10_cdb *verify10;
|
||||||
|
|
||||||
|
verify10 = scsi_malloc(task, sizeof(struct scsi_verify10_cdb));
|
||||||
|
if (verify10 == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
verify10->opcode = SCSI_OPCODE_VERIFY10;
|
||||||
|
verify10->vrprotect = (task->cdb[1] >> 5) & 0x7;
|
||||||
|
verify10->dpo = !!(task->cdb[1] & 0x10);
|
||||||
|
verify10->bytchk = !!(task->cdb[1] & 0x02);
|
||||||
|
verify10->lba = scsi_get_uint32(&task->cdb[2]);
|
||||||
|
verify10->group = task->cdb[6] & 0x1f;
|
||||||
|
verify10->verification_length = scsi_get_uint16(&task->cdb[7]);
|
||||||
|
verify10->control = task->cdb[9];
|
||||||
|
|
||||||
|
return verify10;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct scsi_verify12_cdb *
|
||||||
|
scsi_verify12_cdb_unmarshall(struct scsi_task *task)
|
||||||
|
{
|
||||||
|
struct scsi_verify12_cdb *verify12;
|
||||||
|
|
||||||
|
verify12 = scsi_malloc(task, sizeof(struct scsi_verify12_cdb));
|
||||||
|
if (verify12 == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
verify12->opcode = SCSI_OPCODE_VERIFY12;
|
||||||
|
verify12->vrprotect = (task->cdb[1] >> 5) & 0x7;
|
||||||
|
verify12->dpo = !!(task->cdb[1] & 0x10);
|
||||||
|
verify12->bytchk = !!(task->cdb[1] & 0x02);
|
||||||
|
verify12->lba = scsi_get_uint32(&task->cdb[2]);
|
||||||
|
verify12->verification_length = scsi_get_uint32(&task->cdb[6]);
|
||||||
|
verify12->group = task->cdb[10] & 0x1f;
|
||||||
|
verify12->control = task->cdb[11];
|
||||||
|
|
||||||
|
return verify12;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct scsi_verify16_cdb *
|
||||||
|
scsi_verify16_cdb_unmarshall(struct scsi_task *task)
|
||||||
|
{
|
||||||
|
struct scsi_verify16_cdb *verify16;
|
||||||
|
|
||||||
|
verify16 = scsi_malloc(task, sizeof(struct scsi_verify16_cdb));
|
||||||
|
if (verify16 == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
verify16->opcode = SCSI_OPCODE_VERIFY16;
|
||||||
|
verify16->vrprotect = (task->cdb[1] >> 5) & 0x7;
|
||||||
|
verify16->dpo = !!(task->cdb[1] & 0x10);
|
||||||
|
verify16->bytchk = !!(task->cdb[1] & 0x02);
|
||||||
|
verify16->lba = scsi_get_uint64(&task->cdb[2]);
|
||||||
|
verify16->verification_length = scsi_get_uint32(&task->cdb[10]);
|
||||||
|
verify16->group = task->cdb[14] & 0x1f;
|
||||||
|
verify16->control = task->cdb[15];
|
||||||
|
|
||||||
|
return verify16;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct scsi_write10_cdb *
|
||||||
|
scsi_write10_cdb_unmarshall(struct scsi_task *task)
|
||||||
|
{
|
||||||
|
struct scsi_write10_cdb *write10;
|
||||||
|
|
||||||
|
write10 = scsi_malloc(task, sizeof(struct scsi_write10_cdb));
|
||||||
|
if (write10 == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
write10->opcode = SCSI_OPCODE_WRITE10;
|
||||||
|
write10->wrprotect = (task->cdb[1] >> 5) & 0x7;
|
||||||
|
write10->dpo = !!(task->cdb[1] & 0x10);
|
||||||
|
write10->fua = !!(task->cdb[1] & 0x08);
|
||||||
|
write10->fua_nv = !!(task->cdb[1] & 0x02);
|
||||||
|
write10->lba = scsi_get_uint32(&task->cdb[2]);
|
||||||
|
write10->group = task->cdb[6] & 0x1f;
|
||||||
|
write10->transfer_length = scsi_get_uint16(&task->cdb[7]);
|
||||||
|
write10->control = task->cdb[9];
|
||||||
|
|
||||||
|
return write10;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct scsi_write12_cdb *
|
||||||
|
scsi_write12_cdb_unmarshall(struct scsi_task *task)
|
||||||
|
{
|
||||||
|
struct scsi_write12_cdb *write12;
|
||||||
|
|
||||||
|
write12 = scsi_malloc(task, sizeof(struct scsi_write12_cdb));
|
||||||
|
if (write12 == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
write12->opcode = SCSI_OPCODE_WRITE12;
|
||||||
|
write12->wrprotect = (task->cdb[1] >> 5) & 0x7;
|
||||||
|
write12->dpo = !!(task->cdb[1] & 0x10);
|
||||||
|
write12->fua = !!(task->cdb[1] & 0x08);
|
||||||
|
write12->fua_nv = !!(task->cdb[1] & 0x02);
|
||||||
|
write12->lba = scsi_get_uint32(&task->cdb[2]);
|
||||||
|
write12->transfer_length = scsi_get_uint32(&task->cdb[6]);
|
||||||
|
write12->group = task->cdb[10] & 0x1f;
|
||||||
|
write12->control = task->cdb[11];
|
||||||
|
|
||||||
|
return write12;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct scsi_write16_cdb *
|
||||||
|
scsi_write16_cdb_unmarshall(struct scsi_task *task)
|
||||||
|
{
|
||||||
|
struct scsi_write16_cdb *write16;
|
||||||
|
|
||||||
|
write16 = scsi_malloc(task, sizeof(struct scsi_write16_cdb));
|
||||||
|
if (write16 == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
write16->opcode = SCSI_OPCODE_WRITE16;
|
||||||
|
write16->wrprotect = (task->cdb[1] >> 5) & 0x7;
|
||||||
|
write16->dpo = !!(task->cdb[1] & 0x10);
|
||||||
|
write16->fua = !!(task->cdb[1] & 0x08);
|
||||||
|
write16->fua_nv = !!(task->cdb[1] & 0x02);
|
||||||
|
write16->lba = scsi_get_uint64(&task->cdb[2]);
|
||||||
|
write16->transfer_length = scsi_get_uint32(&task->cdb[10]);
|
||||||
|
write16->group = task->cdb[14] & 0x1f;
|
||||||
|
write16->control = task->cdb[15];
|
||||||
|
|
||||||
|
return write16;
|
||||||
|
}
|
||||||
|
|
||||||
void *
|
void *
|
||||||
scsi_cdb_unmarshall(struct scsi_task *task, enum scsi_opcode opcode)
|
scsi_cdb_unmarshall(struct scsi_task *task, enum scsi_opcode opcode)
|
||||||
{
|
{
|
||||||
@@ -2605,8 +2806,26 @@ scsi_cdb_unmarshall(struct scsi_task *task, enum scsi_opcode opcode)
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (task->cdb[0]) {
|
switch (task->cdb[0]) {
|
||||||
|
case SCSI_OPCODE_READ6:
|
||||||
|
return scsi_read6_cdb_unmarshall(task);
|
||||||
case SCSI_OPCODE_READ10:
|
case SCSI_OPCODE_READ10:
|
||||||
return scsi_read10_cdb_unmarshall(task);
|
return scsi_read10_cdb_unmarshall(task);
|
||||||
|
case SCSI_OPCODE_READ12:
|
||||||
|
return scsi_read12_cdb_unmarshall(task);
|
||||||
|
case SCSI_OPCODE_READ16:
|
||||||
|
return scsi_read16_cdb_unmarshall(task);
|
||||||
|
case SCSI_OPCODE_VERIFY10:
|
||||||
|
return scsi_verify10_cdb_unmarshall(task);
|
||||||
|
case SCSI_OPCODE_VERIFY12:
|
||||||
|
return scsi_verify12_cdb_unmarshall(task);
|
||||||
|
case SCSI_OPCODE_VERIFY16:
|
||||||
|
return scsi_verify16_cdb_unmarshall(task);
|
||||||
|
case SCSI_OPCODE_WRITE10:
|
||||||
|
return scsi_write10_cdb_unmarshall(task);
|
||||||
|
case SCSI_OPCODE_WRITE12:
|
||||||
|
return scsi_write12_cdb_unmarshall(task);
|
||||||
|
case SCSI_OPCODE_WRITE16:
|
||||||
|
return scsi_write16_cdb_unmarshall(task);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user