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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 1996-1998 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #ifndef	_SYS_SCSI_GENERIC_DAD_MODE_H
28 #define	_SYS_SCSI_GENERIC_DAD_MODE_H
29 
30 #ifdef	__cplusplus
31 extern "C" {
32 #endif
33 
34 /*
35  * Structures and defines for DIRECT ACCESS mode sense/select operations
36  */
37 
38 /*
39  * Direct Access Device mode header device specific byte definitions.
40  *
41  * On MODE SELECT operations, the effect of the state of the WP bit is unknown,
42  * else reflects the Write-Protect status of the device.
43  *
44  * On MODE SELECT operations, the the DPOFUA bit is reserved and must
45  * be zero, else on MODE SENSE operations it reflects whether or not
46  * DPO and FUA bits are supported.
47  */
48 
49 #define	MODE_DAD_WP	0x80
50 #define	MODE_DAD_DPOFUA	0x10
51 
52 /*
53  * Direct Access Device Medium Types (for non direct-access magentic tapes)
54  */
55 
56 #define	DAD_MTYP_DFLT	0x0 /* default (currently mounted) type */
57 
58 #define	DAD_MTYP_FLXSS	0x1 /* flexible disk, single side, unspec. media */
59 #define	DAD_MTYP_FLXDS	0x2 /* flexible disk, double side, unspec. media */
60 
61 #define	DAD_MTYP_FLX_8SSSD 0x05	/* 8", single side, single density, 48tpi */
62 #define	DAD_MTYP_FLX_8DSSD 0x06	/* 8", double side, single density, 48tpi */
63 #define	DAD_MTYP_FLX_8SSDD 0x09	/* 8", single side, double density, 48tpi */
64 #define	DAD_MTYP_FLX_8DSDD 0x0A	/* 8", double side, double density, 48tpi */
65 #define	DAD_MTYP_FLX_5SSLD 0x0D	/* 5.25", single side, single density, 48tpi */
66 #define	DAD_MTYP_FLX_5DSMD1 0x12 /* 5.25", double side, medium density, 48tpi */
67 #define	DAD_MTYP_FLX_5DSMD2 0x16 /* 5.25", double side, medium density, 96tpi */
68 #define	DAD_MTYP_FLX_5DSQD 0x1A	/* 5.25", double side, quad density, 96tpi */
69 #define	DAD_MTYP_FLX_3DSLD 0x1E	/* 3.5", double side, low density, 135tpi */
70 
71 
72 /*
73  * Direct Access device Mode Sense/Mode Select Defined pages
74  */
75 
76 #define	DAD_MODE_ERR_RECOV	0x01
77 #define	DAD_MODE_FORMAT		0x03
78 #define	DAD_MODE_GEOMETRY	0x04
79 #define	DAD_MODE_FLEXDISK	0x05
80 #define	DAD_MODE_VRFY_ERR_RECOV	0x07
81 #define	DAD_MODE_CACHE		0x08
82 #define	DAD_MODE_MEDIA_TYPES	0x0B
83 #define	DAD_MODE_NOTCHPART	0x0C
84 #define	DAD_MODE_POWER_COND	0x0D
85 
86 /*
87  * Definitions of selected pages
88  */
89 
90 /*
91  * Page 0x1 - Error Recovery Parameters
92  *
93  * Note:	This structure is incompatible with previous SCSI
94  *		implementations. See <scsi/impl/mode.h> for an
95  *		alternative form of this structure. They can be
96  *		distinguished by the length of data returned
97  *		from a MODE SENSE command.
98  */
99 
100 #define	PAGELENGTH_DAD_MODE_ERR_RECOV	0x0A
101 
102 struct mode_err_recov {
103 	struct	mode_page mode_page;	/* common mode page header */
104 #if defined(_BIT_FIELDS_LTOH)
105 	uchar_t		dcr	: 1,	/* disable correction */
106 			dte	: 1,	/* disable transfer on error */
107 			per	: 1,	/* post error */
108 			eec	: 1,	/* enable early correction */
109 			rc	: 1,	/* read continuous */
110 			tb	: 1,	/* transfer block */
111 			arre	: 1,	/* auto read realloc enabled */
112 			awre	: 1;	/* auto write realloc enabled */
113 #elif defined(_BIT_FIELDS_HTOL)
114 	uchar_t		awre	: 1,	/* auto write realloc enabled */
115 			arre	: 1,	/* auto read realloc enabled */
116 			tb	: 1,	/* transfer block */
117 			rc	: 1,	/* read continuous */
118 			eec	: 1,	/* enable early correction */
119 			per	: 1,	/* post error */
120 			dte	: 1,	/* disable transfer on error */
121 			dcr	: 1;	/* disable correction */
122 #else
123 #error	One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
124 #endif	/* _BIT_FIELDS_LTOH */
125 	uchar_t	read_retry_count;
126 	uchar_t	correction_span;
127 	uchar_t	head_offset_count;
128 	uchar_t	strobe_offset_count;
129 	uchar_t	reserved;
130 	uchar_t	write_retry_count;
131 	uchar_t	reserved_2;
132 	ushort_t recovery_time_limit;
133 };
134 
135 /*
136  * Page 0x3 - Direct Access Device Format Parameters
137  */
138 
139 struct mode_format {
140 	struct	mode_page mode_page;	/* common mode page header */
141 	ushort_t tracks_per_zone;	/* Handling of Defects Fields */
142 	ushort_t alt_sect_zone;
143 	ushort_t alt_tracks_zone;
144 	ushort_t alt_tracks_vol;
145 	ushort_t sect_track;		/* Track Format Field */
146 	ushort_t data_bytes_sect;	/* Sector Format Fields */
147 	ushort_t interleave;
148 	ushort_t track_skew;
149 	ushort_t cylinder_skew;
150 #if defined(_BIT_FIELDS_LTOH)
151 	uchar_t			: 3,
152 		_reserved_ins	: 1,	/* see <scsi/impl/mode.h> */
153 			surf	: 1,
154 			rmb	: 1,
155 			hsec	: 1,
156 			ssec	: 1;	/* Drive Type Field */
157 #elif defined(_BIT_FIELDS_HTOL)
158 	uchar_t		ssec	: 1,	/* Drive Type Field */
159 			hsec	: 1,
160 			rmb	: 1,
161 			surf	: 1,
162 		_reserved_ins	: 1,	/* see <scsi/impl/mode.h> */
163 				: 3;
164 #else
165 #error	One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
166 #endif	/* _BIT_FIELDS_LTOH */
167 	uchar_t	reserved[2];
168 };
169 
170 /*
171  * Page 0x4 - Rigid Disk Drive Geometry Parameters
172  */
173 
174 struct mode_geometry {
175 	struct	mode_page mode_page;	/* common mode page header */
176 	uchar_t	cyl_ub;			/* number of cylinders */
177 	uchar_t	cyl_mb;
178 	uchar_t	cyl_lb;
179 	uchar_t	heads;			/* number of heads */
180 	uchar_t	precomp_cyl_ub;		/* cylinder to start precomp */
181 	uchar_t	precomp_cyl_mb;
182 	uchar_t	precomp_cyl_lb;
183 	uchar_t	current_cyl_ub;		/* cyl to start reduced current */
184 	uchar_t	current_cyl_mb;
185 	uchar_t	current_cyl_lb;
186 	ushort_t step_rate;		/* drive step rate */
187 	uchar_t	landing_cyl_ub;		/* landing zone cylinder */
188 	uchar_t	landing_cyl_mb;
189 	uchar_t	landing_cyl_lb;
190 #if defined(_BIT_FIELDS_LTOH)
191 	uchar_t		rpl	: 2,	/* rotational position locking */
192 				: 6;
193 #elif defined(_BIT_FIELDS_HTOL)
194 	uchar_t			: 6,
195 			rpl	: 2;	/* rotational position locking */
196 #else
197 #error	One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
198 #endif	/* _BIT_FIELDS_LTOH */
199 	uchar_t	rotational_offset;	/* rotational offset */
200 	uchar_t	reserved;
201 	ushort_t rpm;			/* rotations per minute */
202 	uchar_t	reserved2[2];
203 };
204 
205 #define	RPL_SPINDLE_SLAVE		1
206 #define	RPL_SPINDLE_MASTER		2
207 #define	RPL_SPINDLE_MASTER_CONTROL	3
208 
209 /*
210  * Page 0x8 - Caching Page
211  *
212  * Note:	This structure is incompatible with previous SCSI
213  *		implementations. See <scsi/impl/mode.h> for an
214  *		alternative form of this structure. They can be
215  *		distinguished by the length of data returned
216  *		from a MODE SENSE command.
217  */
218 
219 #define	PAGELENGTH_DAD_MODE_CACHE_SCSI3	0x12
220 
221 struct mode_cache_scsi3 {
222 	struct	mode_page mode_page;	/* common mode page header */
223 #if defined(_BIT_FIELDS_LTOH)
224 	uchar_t		rcd	: 1,	/* Read Cache Disable */
225 			mf	: 1,	/* Multiplication Factor */
226 			wce	: 1,	/* Write Cache Enable */
227 			size	: 1,	/* Size Enable */
228 			disc	: 1,	/* Discontinuity */
229 			cap	: 1,	/* Caching Analysis Permitted */
230 			abpf	: 1,	/* Abort Pre-Fetch */
231 			ic	: 1;	/* Initiator Control */
232 	uchar_t	write_reten_pri	: 4,	/* Write Retention Priority */
233 		read_reten_pri	: 4;	/* Demand Read Retention Priority */
234 #elif defined(_BIT_FIELDS_HTOL)
235 	uchar_t		ic	: 1,	/* Initiator Control */
236 			abpf	: 1,	/* Abort Pre-Fetch */
237 			cap	: 1,	/* Caching Analysis Permitted */
238 			disc	: 1,	/* Discontinuity */
239 			size	: 1,	/* Size Enable */
240 			wce	: 1,	/* Write Cache Enable */
241 			mf	: 1,	/* Multiplication Factor */
242 			rcd	: 1;	/* Read Cache Disable */
243 	uchar_t	read_reten_pri	: 4,	/* Demand Read Retention Priority */
244 		write_reten_pri	: 4;	/* Write Retention Priority */
245 #else
246 #error	One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
247 #endif	/* _BIT_FIELDS_LTOH */
248 	ushort_t dis_prefetch_len;	/* Disable prefetch xfer length */
249 	ushort_t min_prefetch;		/* minimum prefetch length */
250 	ushort_t max_prefetch;		/* maximum prefetch length */
251 	ushort_t prefetch_ceiling;	/* max prefetch ceiling */
252 #if defined(_BIT_FIELDS_LTOH)
253 	uchar_t			: 3,	/* reserved */
254 			vu_123	: 1,	/* Vendor Specific, byte 12 bit 3 */
255 			vu_124	: 1,	/* Vendor Specific, byte 12 bit 4 */
256 			dra	: 1,	/* Disable Read-Ahead */
257 			lbcss	: 1,	/* Logical Block Cache Segment Size */
258 			fsw	: 1;	/* Force Sequential Write */
259 #elif defined(_BIT_FIELDS_HTOL)
260 	uchar_t		fsw	: 1,	/* Force Sequential Write */
261 			lbcss	: 1,	/* Logical Block Cache Segment Size */
262 			dra	: 1,	/* Disable Read-Ahead */
263 			vu_124	: 1,	/* Vendor Specific, byte 12 bit 4 */
264 			vu_123	: 1,	/* Vendor Specific, byte 12 bit 3 */
265 				: 3;	/* reserved */
266 #else
267 #error	One of _BIT_FIELDS_LTOH or _BIT_FIELDS_HTOL must be defined
268 #endif	/* _BIT_FIELDS_LTOH */
269 	uchar_t	num_cache_seg;		/* Number of cache segments */
270 	ushort_t cache_seg_size;	/* Cache segment size */
271 	uchar_t	reserved;
272 	uchar_t	non_cache_seg_size_ub;	/* Non cache segment size */
273 	uchar_t	non_cache_seg_size_mb;
274 	uchar_t	non_cache_seg_size_lb;
275 };
276 
277 #ifdef	__cplusplus
278 }
279 #endif
280 
281 #endif	/* _SYS_SCSI_GENERIC_DAD_MODE_H */
282