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