4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
29 #pragma ident "%Z%%M% %I% %E% SMI"
31 #include <sys/types.h>
32 #include <sys/byteorder.h>
33 #include <sys/scsi/scsi.h>
41 #if !defined(_BIT_FIELDS_LTOH) && !defined(_BIT_FIELDS_HTOL)
42 #error One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
50 typedef struct scsi_log_header
{
51 #if defined(_BIT_FIELDS_LTOH)
55 uint8_t __reserved
: 2,
62 typedef struct scsi_log_parameter_header
{
64 #if defined(_BIT_FIELDS_LTOH)
82 } scsi_log_parameter_header_t
;
84 typedef struct scsi_supported_log_pages
{
85 scsi_log_header_t slp_hdr
;
87 } scsi_supported_log_pages_t
;
89 typedef struct scsi_ie_log_param
{
90 scsi_log_parameter_header_t ie_hdr
;
93 } scsi_ie_log_param_t
;
96 * The SCSI-3 SPC document states that IE log page (0x2F) parameter 0
97 * must have a length of at least 4 (including the length byte).
99 #define LOGPARAM_IE_MIN_LEN 2 /* the asc and ascq fields */
101 #define INVALID_TEMPERATURE 0xff
103 #define LOGPARAM_IE 0x0000
105 typedef struct scsi_temp_log_param
{
106 scsi_log_parameter_header_t t_hdr
;
109 } scsi_temp_log_param_t
;
111 typedef struct scsi_selftest_log_param
{
112 scsi_log_parameter_header_t st_hdr
;
113 #if defined(_BIT_FIELDS_LTOH)
114 uint8_t st_results
: 4,
118 uint8_t st_testcode
: 3,
123 uint16_t st_timestamp
;
125 #if defined(_BIT_FIELDS_LTOH)
126 uint8_t st_sensekey
: 4,
129 uint8_t __reserved2
: 4,
135 } scsi_selftest_log_param_t
;
137 /* The results field of the self-test log parameter */
138 #define SELFTEST_OK 0x0
139 #define SELFTEST_ABORT_REQUEST 0x1
140 #define SELFTEST_ABORT_OTHER 0x2
141 #define SELFTEST_FAILURE_INCOMPLETE 0x3
142 #define SELFTEST_FAILURE_SEG_UNKNOWN 0x4
143 #define SELFTEST_FAILURE_SEG_FIRST 0x5
144 #define SELFTEST_FAILURE_SEG_SECOND 0x6
145 #define SELFTEST_FAILURE_SEG_OTHER 0x7
146 #define SELFTEST_INPROGRESS 0xf
148 #define SELFTEST_COMPLETE(code) \
149 ((code) == SELFTEST_OK || \
150 ((code) >= SELFTEST_FAILURE_INCOMPLETE && \
151 ((code) <= SELFTEST_FAILURE_SEG_OTHER)))
153 #define LOGPARAM_TEMP_CURTEMP 0x0000
154 #define LOGPARAM_TEMP_REFTEMP 0x0001
156 #define LOGPARAM_TEMP_LEN \
157 (sizeof (scsi_temp_log_param_t) - \
158 sizeof (scsi_log_parameter_header_t))
161 * Mode sense/select page header information
163 typedef struct scsi_ms_header
{
164 struct mode_header ms_header
;
165 struct block_descriptor ms_descriptor
;
168 typedef struct scsi_ms_header_g1
{
169 struct mode_header_g1 ms_header
;
170 struct block_descriptor ms_descriptor
;
171 } scsi_ms_header_g1_t
;
173 typedef struct scsi_ms_hdrs
{
177 scsi_ms_header_g1_t g1
;
181 typedef struct scsi_ie_page
{
182 struct mode_page ie_mp
;
183 #if defined(_BIT_FIELDS_LTOH)
184 uint8_t ie_logerr
: 1, /* Errors should be logged */
186 ie_test
: 1, /* Enable test gen of IEs */
187 ie_dexcpt
: 1, /* Disable exceptions */
188 ie_ewasc
: 1, /* Enable warning generation */
189 ie_ebf
: 1, /* enable backgrnd functions */
191 ie_perf
: 1; /* No delays during excptns */
192 uint8_t ie_mrie
: 4, /* Method/reporting excptons */
195 uint8_t ie_perf
: 1, /* No delays during excptons */
197 ie_ebf
: 1, /* enable background funcs */
198 ie_ewasc
: 1, /* Enable warning generation */
199 ie_dexcpt
: 1, /* Disable exceptions */
200 ie_test
: 1, /* Enable test gen of IEs */
202 ie_logerr
: 1; /* Errors should be logged */
203 uint8_t __reserved3
: 4,
204 ie_mrie
: 4; /* Method of report excptns */
206 uint32_t ie_interval_timer
; /* reporting interval for IEs */
207 uint32_t ie_report_count
; /* # of times to report an IE */
212 #define MODEPAGE_INFO_EXCPT_LEN (sizeof (scsi_ie_page_t))
214 #define IEC_IE_ENABLED(ies) ((ies).ie_dexcpt == 0)
215 #define IEC_IE_CHANGEABLE(ies) ((ies).ie_dexcpt == 1)
216 #define IEC_MRIE_CHANGEABLE(ies) ((ies).ie_mrie == 0xf)
217 #define IEC_PERF_CHANGEABLE(ies) ((ies).ie_perf == 1)
218 #define IEC_EWASC_CHANGEABLE(ies) ((ies).ie_ewasc == 1)
219 #define IEC_TEST_CHANGEABLE(ies) ((ies).ie_test == 1)
220 #define IEC_RPTCNT_CHANGEABLE(ies) ((ies).ie_report_count == BE_32(0xffffffff))
221 #define IEC_LOGERR_CHANGEABLE(ies) ((ies).ie_logerr == 1)
224 * Values for the MRIE field of the informational exceptions control mode page
226 #define IE_REPORT_NONE 0
227 #define IE_REPORT_ASYNCH 1
228 #define IE_REPORT_UNIT_ATTN 2
229 #define IE_REPORT_RECOV_ERR_COND 3
230 #define IE_REPORT_RECOV_ERR_ALWAYS 4
231 #define IE_REPORT_NO_SENSE 5
232 #define IE_REPORT_ON_REQUEST 6
235 * Constants in support of the CONTROL MODE mode page (page 0xA)
237 #define MODEPAGE_CTRL_MODE_LEN (sizeof (struct mode_control_scsi3))
238 #define GLTSD_CHANGEABLE(chg) ((chg).gltsd == 1)
240 #define LOGPAGE_SELFTEST_MIN_PARAM_CODE 0x0001
241 #define LOGPAGE_SELFTEST_MAX_PARAM_CODE 0x0014
243 #define LOGPAGE_SELFTEST_PARAM_LEN \
244 ((sizeof (scsi_selftest_log_param_t)) - \
245 (sizeof (scsi_log_parameter_header_t)))
248 * Macro to extract the length of a mode sense page
249 * as returned by a target.
251 #define MODESENSE_PAGE_LEN(p) (((int)((struct mode_page *)p)->length) + \
252 sizeof (struct mode_page))
255 * Mode Select options
257 #define MODE_SELECT_SP 0x01
258 #define MODE_SELECT_PF 0x10
262 * Mode Sense Page Control
264 #define PC_CURRENT (0 << 6)
265 #define PC_CHANGEABLE (1 << 6)
266 #define PC_DEFAULT (2 << 6)
267 #define PC_SAVED (3 << 6)
270 * Log Sense Page Control
272 #define PC_CUMULATIVE (1 << 6)
277 #define LOGPAGE_SUPP_LIST 0x00
278 #define LOGPAGE_TEMP 0x0d
279 #define LOGPAGE_SELFTEST 0x10
280 #define LOGPAGE_IE 0x2f
283 #define ASC_INVALID_OPCODE 0x20
284 #define ASC_INVALID_CDB_FIELD 0x24
285 #define ASC_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d
288 #define ASCQ_INVALID_OPCODE 0
291 #define SCSI_INVALID_OPCODE(s, a, aq) \
292 (((s) == KEY_ILLEGAL_REQUEST) && ((a) == ASC_INVALID_OPCODE) && \
293 ((aq) == ASCQ_INVALID_OPCODE))
295 #define MODE_PAGE_UNSUPPORTED(s, a, aq) \
296 (((s) == KEY_ILLEGAL_REQUEST) && ((a) == ASC_INVALID_CDB_FIELD))
298 /* command length to use */
299 #define MODE_CMD_LEN_UNKNOWN 0
300 #define MODE_CMD_LEN_6 1
301 #define MODE_CMD_LEN_10 2
303 /* supported modepages bitmask */
304 #define MODEPAGE_SUPP_IEC 0x1
306 /* supported logpages bitmask */
307 #define LOGPAGE_SUPP_IE 0x1
308 #define LOGPAGE_SUPP_TEMP 0x2
309 #define LOGPAGE_SUPP_SELFTEST 0x4
311 #define MSG_BUFLEN 256
314 * For SCSI commands which want to accept arbitrary length responses, we need to
315 * allocate an appropriate sized buffer. The maximum length is USHRT_MAX,
316 * because some devices return nothing if the buffer length is too big.
318 #define MAX_BUFLEN(type) (USHRT_MAX - sizeof (type))
320 extern ds_transport_t ds_scsi_uscsi_transport
;
321 extern ds_transport_t ds_scsi_sim_transport
;
327 #endif /* _DS_SCSI_H */