Add unmarshalling ot REPORT_CAPABILITIES

This commit is contained in:
Ronnie Sahlberg
2012-12-18 21:19:25 -08:00
parent 4522658254
commit 09df905d30
2 changed files with 30 additions and 0 deletions

View File

@@ -727,6 +727,18 @@ struct scsi_persistent_reserve_in_read_reservation {
uint32_t additional_length;
};
struct scsi_persistent_reserve_in_report_capabilities {
uint16_t length;
uint8_t crh;
uint8_t sip_c;
uint8_t atp_c;
uint8_t ptpl_c;
uint8_t tmv;
uint8_t allow_commands;
uint8_t ptpl_a;
uint16_t persistent_reservation_type_mask;
};
struct scsi_read10_cdb {
enum scsi_opcode opcode;
uint8_t rdprotect;

View File

@@ -635,6 +635,8 @@ scsi_persistentreservein_datain_getfullsize(struct scsi_task *task)
return scsi_get_uint32(&task->datain.data[4]) + 8;
case SCSI_PERSISTENT_RESERVE_READ_RESERVATION:
return 8;
case SCSI_PERSISTENT_RESERVE_REPORT_CAPABILITIES:
return 8;
default:
return -1;
}
@@ -645,6 +647,7 @@ scsi_persistentreservein_datain_unmarshall(struct scsi_task *task)
{
struct scsi_persistent_reserve_in_read_keys *rk;
struct scsi_persistent_reserve_in_read_reservation *rr;
struct scsi_persistent_reserve_in_report_capabilities *rc;
int i;
switch (scsi_persistentreservein_sa(task)) {
@@ -672,6 +675,21 @@ scsi_persistentreservein_datain_unmarshall(struct scsi_task *task)
rr->additional_length = scsi_get_uint32(&task->datain.data[4]);
return rr;
case SCSI_PERSISTENT_RESERVE_REPORT_CAPABILITIES:
rc = scsi_malloc(task, sizeof(struct scsi_persistent_reserve_in_report_capabilities));
if (rc == NULL) {
return NULL;
}
rc->length = scsi_get_uint16(&task->datain.data[0]);
rc->crh = !!(task->datain.data[2] & 0x10);
rc->sip_c = !!(task->datain.data[2] & 0x08);
rc->atp_c = !!(task->datain.data[2] & 0x04);
rc->ptpl_c = !!(task->datain.data[2] & 0x01);
rc->tmv = !!(task->datain.data[3] & 0x80);
rc->allow_commands = task->datain.data[3] >> 4;
rc->persistent_reservation_type_mask = scsi_get_uint16(&task->datain.data[4]);
return rc;
default:
return NULL;
}