1 /*
2  * CDDL HEADER START
3  *
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.
7  *
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.
12  *
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]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 /*
27  * local SCSI definitions
28  */
29 
30 #ifndef	_G_SCSI_H
31 #define	_G_SCSI_H
32 
33 
34 /*
35  * Include any headers you depend on.
36  */
37 
38 /*
39  * I18N message number ranges
40  *  This file: 18500 - 18999
41  *  Shared common messages: 1 - 1999
42  */
43 
44 #ifdef	__cplusplus
45 extern "C" {
46 #endif
47 
48 #define	MODEPAGE_GEOMETRY	0x04
49 
50 /* NOTE: These command op codes are not defined in commands.h */
51 #define		SCMD_SYNC_CACHE			0x35
52 #define		SCMD_LOG_SENSE			0x4d
53 #define		SCMD_PERS_RESERV_IN		0x5e
54 #define		SCMD_PERS_RESERV_OUT		0x5f
55 
56 #define	MAX_MODE_SENSE_LEN		0xffff
57 
58 /*
59  *  Structure for MODE SELECT/SENSE 10 byte page header
60  *
61  */
62 typedef struct mode_header_10_struct {
63 	ushort_t length;
64 	uchar_t medium_type; /* device specific */
65 	uchar_t device_specific; /* device specfic parameters */
66 	ushort_t	rsvdl;	/* reserved */
67 	ushort_t bdesc_length;	/* length of block descriptor(s), if any */
68 } Mode_header_10;
69 
70 typedef	struct	mode_page_04_struct {
71 	struct	mode_page mode_page;	/* common mode page header */
72 	uchar_t	num_cylinders_hi;
73 	uchar_t	num_cylinders_mid;
74 	uchar_t	num_cylinders_lo;
75 	uchar_t	num_heads;
76 	uchar_t	write_precomp_hi;
77 	uchar_t	write_precomp_mid;
78 	uchar_t	write_precomp_lo;
79 	uchar_t	reduced_write_i_hi;
80 	uchar_t	reduced_write_i_mid;
81 	uchar_t	reduced_write_i_lo;
82 	ushort_t	step_rate;
83 	uchar_t	landing_zone_hi;
84 	uchar_t	landing_zone_mid;
85 	uchar_t	landing_zone_lo;
86 #if defined(_BIT_FIELDS_LTOH)
87 	uchar_t	rpl	: 2,	/* RPL */
88 			: 6;
89 #elif defined(_BIT_FIELDS_HTOL)
90 	uchar_t		: 6,
91 		rpl	: 2;    /* disable correction */
92 #else
93 #error  One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
94 #endif  /* _BIT_FIELDS_LTOH */
95 	uchar_t	rot_offset;
96 	uchar_t	: 8;	/* reserved */
97 	ushort_t	rpm;
98 	uchar_t	: 8;	/* reserved */
99 	uchar_t	: 8;	/* reserved */
100 } Mp_04;
101 
102 
103 typedef	struct	mode_page_01_struct {
104 	struct	mode_page mode_page;	/* common mode page header */
105 #if defined(_BIT_FIELDS_LTOH)
106 	uchar_t	dcr	: 1,	/* disable correction */
107 		dte	: 1,	/* disable transfer on error */
108 		per	: 1,	/* post error */
109 		eec	: 1,	/* enable early correction */
110 		rc	: 1,	/* read continuous */
111 		tb	: 1,	/* transfer block */
112 		arre	: 1,	/* auto read realloc enabled */
113 		awre	: 1;	/* auto write realloc enabled */
114 #elif defined(_BIT_FIELDS_HTOL)
115 	uchar_t	awre	: 1,	/* auto write realloc enabled */
116 		arre	: 1,	/* auto read realloc enabled */
117 		tb	: 1,	/* transfer block */
118 		rc	: 1,	/* read continuous */
119 		eec	: 1,	/* enable early correction */
120 		per	: 1,	/* post error */
121 		dte	: 1,	/* disable transfer on error */
122 		dcr	: 1;    /* disable correction */
123 #else
124 #error  One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
125 #endif  /* _BIT_FIELDS_LTOH */
126 	uchar_t	read_retry_count;
127 	uchar_t	correction_span;
128 	uchar_t	head_offset_count;
129 	uchar_t	strobe_offset_count;
130 	uchar_t			: 8;	/* reserved */
131 	uchar_t	write_retry_count;
132 	uchar_t			: 8;	/* reserved */
133 	ushort_t	recovery_time_limit;
134 } Mp_01;
135 
136 /*
137  * I define here for backward compatability
138  * with 2.5.1
139  * For 2.6 & above you can use "mode_caching"
140  */
141 struct my_mode_caching {
142 	struct	mode_page mode_page;	/* common mode page header */
143 #if defined(_BIT_FIELDS_LTOH)
144 	uchar_t	rcd		: 1,	/* Read Cache Disable */
145 		mf		: 1,	/* Multiplication Factor */
146 		wce		: 1,	/* Write Cache Enable */
147 				: 5;	/* Reserved */
148 	uchar_t	write_ret_prio	: 4,	/* Write Retention Priority */
149 		dmd_rd_ret_prio	: 4;	/* Demand Read Retention Priority */
150 #elif defined(_BIT_FIELDS_HTOL)
151 	uchar_t			: 5,	/* Reserved */
152 		wce		: 1,	/* Write Cache Enable */
153 		mf		: 1,	/* Multiplication Factor */
154 		rcd		: 1;	/* Read Cache Disable */
155 	uchar_t	dmd_rd_ret_prio	: 4,	/* Demand Read Retention Priority */
156 		write_ret_prio	: 4;	/* Write Retention Priority */
157 #else
158 #error	One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
159 #endif	/* _BIT_FIELDS_LTOH */
160 	ushort_t	pf_dsbl_trans_len;	/* Disable prefetch Xfer len. */
161 	ushort_t	min_prefetch;	/* Minimum Prefetch */
162 	ushort_t	max_prefetch;	/* Maximum Prefetch */
163 	ushort_t	max_prefetch_ceiling;	/* Maximum Prefetch Ceiling */
164 };
165 
166 /*
167  *              SCSI CDB structures
168  */
169 typedef	struct	my_cdb_g0 {
170 	unsigned	char	cmd;
171 	unsigned	char	lba_msb;
172 	unsigned	char	lba;
173 	unsigned	char	lba_lsb;
174 	unsigned	char	count;
175 	unsigned	char	control;
176 	}my_cdb_g0;
177 
178 typedef	struct {
179 	unsigned	char	cmd;
180 	unsigned	char	byte1;
181 	unsigned	char	byte2;
182 	unsigned	char	byte3;
183 	unsigned	char	byte4;
184 	unsigned	char	byte5;
185 	unsigned	char	byte6;
186 	unsigned	char	byte7;
187 	unsigned	char	byte8;
188 	unsigned	char	byte9;
189 	}my_cdb_g1;
190 
191 typedef struct l_inquiry80_struct {
192 	/*
193 	 * byte 0
194 	 *
195 	 * Bits 7-5 are the Peripheral Device Qualifier
196 	 * Bits 4-0 are the Peripheral Device Type
197 	 *
198 	 */
199 	uchar_t	inq_dtype;
200 	uchar_t	inq_page_code;
201 	uchar_t reserved;		/* reserved */
202 	uchar_t inq_page_len;
203 	uchar_t inq_serial[251];
204 } L_inquiry80;
205 
206 typedef struct l_inquiry00_struct {
207 	uchar_t		qual    :3,
208 			dtype   :5;
209 	uchar_t		page_code;
210 	uchar_t		reserved;
211 	uchar_t		len;
212 	uchar_t		page_list[251];
213 } L_inquiry00;
214 
215 #ifdef	__cplusplus
216 }
217 #endif
218 
219 #endif	/* _G_SCSI_H */
220