Add support for REPD bit in RSTMF command.

We have no real timeout values to report there, but its better then error.

MFC after:	2 weeks
This commit is contained in:
Alexander Motin 2016-12-22 12:18:40 +00:00
parent 8202971892
commit 2be7cd9bdb
3 changed files with 47 additions and 6 deletions

View File

@ -7462,7 +7462,7 @@ int
ctl_report_supported_tmf(struct ctl_scsiio *ctsio)
{
struct scsi_report_supported_tmf *cdb;
struct scsi_report_supported_tmf_data *data;
struct scsi_report_supported_tmf_ext_data *data;
int retval;
int alloc_len, total_len;
@ -7472,7 +7472,10 @@ ctl_report_supported_tmf(struct ctl_scsiio *ctsio)
retval = CTL_RETVAL_COMPLETE;
total_len = sizeof(struct scsi_report_supported_tmf_data);
if (cdb->options & RST_REPD)
total_len = sizeof(struct scsi_report_supported_tmf_ext_data);
else
total_len = sizeof(struct scsi_report_supported_tmf_data);
alloc_len = scsi_4btoul(cdb->length);
ctsio->kern_data_ptr = malloc(total_len, M_CTL, M_WAITOK | M_ZERO);
@ -7491,10 +7494,11 @@ ctl_report_supported_tmf(struct ctl_scsiio *ctsio)
ctsio->kern_data_resid = 0;
ctsio->kern_rel_offset = 0;
data = (struct scsi_report_supported_tmf_data *)ctsio->kern_data_ptr;
data = (struct scsi_report_supported_tmf_ext_data *)ctsio->kern_data_ptr;
data->byte1 |= RST_ATS | RST_ATSS | RST_CTSS | RST_LURS | RST_QTS |
RST_TRS;
data->byte2 |= RST_QAES | RST_QTSS | RST_ITNRS;
data->length = total_len - 4;
ctl_set_success(ctsio);
ctsio->io_hdr.flags |= CTL_FLAG_ALLOCATED;

View File

@ -824,7 +824,7 @@ const struct ctl_cmd_entry ctl_cmd_table_a3[32] =
CTL_FLAG_DATA_IN |
CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
CTL_LUN_PAT_NONE,
12, {0x0d, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
12, {0x0d, 0x80, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
/* 0E */
{NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},

View File

@ -1482,6 +1482,10 @@ struct scsi_report_supported_opcodes_descr
uint8_t flags;
#define RSO_SERVACTV 0x01
#define RSO_CTDP 0x02
#define RSO_CDLP_MASK 0x0c
#define RSO_CDLP_NO 0x00
#define RSO_CDLP_A 0x04
#define RSO_CDLP_B 0x08
uint8_t cdb_length[2];
struct scsi_report_supported_opcodes_timeout timeout[0];
};
@ -1497,6 +1501,10 @@ struct scsi_report_supported_opcodes_one
uint8_t reserved;
uint8_t support;
#define RSO_ONE_CTDP 0x80
#define RSO_ONE_CDLP_MASK 0x18
#define RSO_ONE_CDLP_NO 0x00
#define RSO_ONE_CDLP_A 0x08
#define RSO_ONE_CDLP_B 0x10
#define RSO_ONE_SUP_MASK 0x07
#define RSO_ONE_SUP_UNAVAIL 0x00
#define RSO_ONE_SUP_NOT_SUP 0x01
@ -1510,7 +1518,9 @@ struct scsi_report_supported_tmf
{
uint8_t opcode;
uint8_t service_action;
uint8_t reserved[4];
uint8_t options;
#define RST_REPD 0x80
uint8_t reserved[3];
uint8_t length[4];
uint8_t reserved1;
uint8_t control;
@ -1531,7 +1541,34 @@ struct scsi_report_supported_tmf_data
#define RST_ITNRS 0x01
#define RST_QTSS 0x02
#define RST_QAES 0x04
uint8_t reserved[2];
uint8_t reserved;
uint8_t length;
};
struct scsi_report_supported_tmf_ext_data
{
uint8_t byte1;
uint8_t byte2;
uint8_t reserved;
uint8_t length;
uint8_t byte5;
#define RST_TMFTMOV 0x01
uint8_t reserved2;
uint8_t byte7;
#define RST_WAKETS 0x01
#define RST_TRTS 0x02
#define RST_QTTS 0x04
#define RST_LURTS 0x08
#define RST_CTSTS 0x10
#define RST_CACATS 0x20
#define RST_ATSTS 0x40
#define RST_ATTS 0x80
uint8_t byte8;
#define RST_ITNRTS 0x01
#define RST_QTSTS 0x02
#define RST_QAETS 0x04
uint8_t long_timeout[4];
uint8_t short_timeout[4];
};
struct scsi_report_timestamp