summaryrefslogtreecommitdiffstats
path: root/sys/cam
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2017-01-05 11:50:01 +0000
committermav <mav@FreeBSD.org>2017-01-05 11:50:01 +0000
commitb788df4bf232a817c8425debc52d8ef59b192e11 (patch)
tree9effd2a85acf518e66c13482651f740cb5447243 /sys/cam
parentf991e56abee60b2bbbe32e38c4d19e6855676405 (diff)
downloadFreeBSD-src-b788df4bf232a817c8425debc52d8ef59b192e11.zip
FreeBSD-src-b788df4bf232a817c8425debc52d8ef59b192e11.tar.gz
MFC r310390: Add support for REPD bit in RSTMF command.
We have no real timeout values to report there, but its better then error.
Diffstat (limited to 'sys/cam')
-rw-r--r--sys/cam/ctl/ctl.c10
-rw-r--r--sys/cam/ctl/ctl_cmd_table.c2
-rw-r--r--sys/cam/scsi/scsi_all.h41
3 files changed, 47 insertions, 6 deletions
diff --git a/sys/cam/ctl/ctl.c b/sys/cam/ctl/ctl.c
index 3c28838..ed9cbfb 100644
--- a/sys/cam/ctl/ctl.c
+++ b/sys/cam/ctl/ctl.c
@@ -7453,7 +7453,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;
@@ -7463,7 +7463,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);
@@ -7482,10 +7485,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;
diff --git a/sys/cam/ctl/ctl_cmd_table.c b/sys/cam/ctl/ctl_cmd_table.c
index 53752d5..e4dbadf 100644
--- a/sys/cam/ctl/ctl_cmd_table.c
+++ b/sys/cam/ctl/ctl_cmd_table.c
@@ -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},
diff --git a/sys/cam/scsi/scsi_all.h b/sys/cam/scsi/scsi_all.h
index b682624f..73c573a 100644
--- a/sys/cam/scsi/scsi_all.h
+++ b/sys/cam/scsi/scsi_all.h
@@ -1479,6 +1479,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];
};
@@ -1494,6 +1498,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
@@ -1507,7 +1515,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;
@@ -1528,7 +1538,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
OpenPOWER on IntegriCloud