xref: /titanic_50/usr/src/lib/libbc/inc/include/sun/dkio.h (revision 5d54f3d8999eac1762fe0a8c7177d20f1f201fae)
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 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef _sun_dkio_h
28 #define	_sun_dkio_h
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 /* #include <sys/ioctl.h> not needed? */
33 #include <sun/dklabel.h>
34 
35 /*
36  * Structures and definitions for disk io control commands
37  */
38 
39 /*
40  * Structures used as data by ioctl calls.
41  */
42 
43 /*
44  * Used for controller info
45  */
46 struct dk_info {
47 	int	dki_ctlr;		/* controller address */
48 	short	dki_unit;		/* unit (slave) address */
49 	short	dki_ctype;		/* controller type */
50 	short	dki_flags;		/* flags */
51 };
52 
53 #define	DK_DEVLEN	16		/* device name max length, including */
54 					/* unit # & NULL (ie - "xyc1") */
55 /*
56  * Used for configuration info
57  */
58 struct dk_conf {
59 	char	dkc_cname[DK_DEVLEN];	/* controller name (no unit #) */
60 	u_short	dkc_ctype;		/* controller type */
61 	u_short	dkc_flags;		/* flags */
62 	short	dkc_cnum;		/* controller number */
63 	int	dkc_addr;		/* controller address */
64 	u_int	dkc_space;		/* controller bus type */
65 	int	dkc_prio;		/* interrupt priority */
66 	int	dkc_vec;		/* interrupt vector */
67 	char	dkc_dname[DK_DEVLEN];	/* drive name (no unit #) */
68 	short	dkc_unit;		/* unit number */
69 	short	dkc_slave;		/* slave number */
70 };
71 
72 /*
73  * Controller types
74  */
75 #define	DKC_UNKNOWN	0
76 /* 1 used to be Interphase 2180 */
77 #define	DKC_WDC2880	2
78 /* 3 used to be Interphase 2181 */
79 /* 4 used to be Xylogics 440 */
80 #define	DKC_DSD5215	5
81 #define	DKC_XY450	6
82 #define	DKC_ACB4000	7
83 #define	DKC_MD21	8
84 /* 9 used to be Xylogics 751 */
85 #define	DKC_NCRFLOPPY	10
86 /* #define	DKC_XB1401	10 does not match dkinfo.c*/
87 #define	DKC_XD7053	11
88 #define	DKC_SMSFLOPPY	12
89 #define	DKC_SCSI_CCS	13
90 #define	DKC_INTEL82072	14	/* floppy ctlr on campus and hydra */
91 #define	DKC_PANTHER	15
92 #define DKC_SUN_IPI1	DKC_PANTHER	/* Sun Panther VME/IPI controller */
93 #define	DKC_MD		16	/* meta-disk (virtual-disk) driver */
94 #define DKC_CDC_9057	17	/* CDC 9057-321 (CM-3) IPI String Controller */
95 #define DKC_FJ_M1060	18	/* Fujitsu/Intellistor M1060 IPI-3 SC */
96 
97 /*
98  * Flags
99  */
100 #define	DKI_BAD144	0x01	/* use DEC std 144 bad sector fwding */
101 #define	DKI_MAPTRK	0x02	/* controller does track mapping */
102 #define	DKI_FMTTRK	0x04	/* formats only full track at a time */
103 #define	DKI_FMTVOL	0x08	/* formats only full volume at a time */
104 #define	DKI_FMTCYL	0x10	/* formats only full cylinders at a time */
105 #define DKI_HEXUNIT	0x20	/* unit number is printed as 3 hex digits */
106 
107 /*
108  * Used for drive info
109  */
110 struct dk_type {
111 	u_short dkt_hsect;		/* hard sector count (read only) */
112 	u_short dkt_promrev;		/* prom revision (read only) */
113 	u_char	dkt_drtype;		/* drive type (ctlr specific) */
114 	u_char	dkt_drstat;		/* drive status (ctlr specific, ro) */
115 };
116 
117 /*
118  * Used for all partitions
119  */
120 struct dk_allmap {
121 	struct dk_map	dka_map[NDKMAP];
122 };
123 
124 /*
125  * Used for bad sector map
126  */
127 struct dk_badmap {
128 	caddr_t dkb_bufaddr;		/* address of user's map buffer */
129 };
130 
131 /*
132  * Definition of a disk's geometry
133  */
134 struct dk_geom {
135 	unsigned short	dkg_ncyl;	/* # of data cylinders */
136 	unsigned short	dkg_acyl;	/* # of alternate cylinders */
137 	unsigned short	dkg_bcyl;	/* cyl offset (for fixed head area) */
138 	unsigned short	dkg_nhead;	/* # of heads */
139 	unsigned short	dkg_obs1;	/* obsolete */
140 	unsigned short	dkg_nsect;	/* # of data sectors per track */
141 	unsigned short	dkg_intrlv;	/* interleave factor */
142 	unsigned short	dkg_obs2;	/* obsolete */
143 	unsigned short	dkg_obs3;	/* obsolete */
144 	unsigned short	dkg_apc;	/* alternates per cyl (SCSI only) */
145 	unsigned short	dkg_rpm;	/* revolutions per minute */
146 	unsigned short	dkg_pcyl;	/* # of physical cylinders */
147 	unsigned short	dkg_extra[7];	/* for compatible expansion */
148 };
149 /*
150  * These defines are for historic compatibility with old drivers.
151  */
152 #define	dkg_bhead	dkg_obs1	/* used to be head offset */
153 #define	dkg_gap1	dkg_obs2	/* used to be gap1 */
154 #define	dkg_gap2	dkg_obs3	/* used to be gap2 */
155 
156 /*
157  * Used for generic commands
158  */
159 struct dk_cmd {
160 	u_short	dkc_cmd;		/* command to be executed */
161 	int	dkc_flags;		/* execution flags */
162 	daddr_t	dkc_blkno;		/* disk address for command */
163 	int	dkc_secnt;		/* sector count for command */
164 	caddr_t	dkc_bufaddr;		/* user's buffer address */
165 	u_int	dkc_buflen;		/* size of user's buffer */
166 };
167 
168 /*
169  * Execution flags.
170  */
171 #define	DK_SILENT	0x01		/* no error messages */
172 #define	DK_DIAGNOSE	0x02		/* fail if any error occurs */
173 #define	DK_ISOLATE	0x04		/* isolate from normal commands */
174 #define	DK_READ		0x08		/* read from device */
175 #define	DK_WRITE	0x10		/* write to device */
176 
177 /*
178  * Used for disk diagnostics
179  */
180 struct dk_diag {
181 	u_short	dkd_errcmd;		/* most recent command in error */
182 	daddr_t	dkd_errsect;		/* most recent sector in error */
183 	u_char	dkd_errno;		/* most recent error number */
184 	u_char	dkd_severe;		/* severity of most recent error */
185 };
186 
187 /*
188  * Used for getting disk error log.
189  */
190 struct dk_loghdr {
191 	long	dkl_entries;		/* number of dk_log entries */
192 	long	dkl_max_size;		/* max. size of dk_log table */
193 	caddr_t	dkl_logbfr;		/* pointer to dk_log table */
194 };
195 
196 /*
197  * Disk error log table entry.
198  */
199 struct dk_log {
200 	daddr_t	block;			/* location of block in error */
201 	u_long	count;			/* number of failures */
202 	short	type;			/* type of error (e.g. soft error) */
203 	short	err1;			/* primary error code (e.g sense key) */
204 	short	err2;			/* secondary error code */
205 };
206 
207 /*
208  * Dk_log type flags.
209  *
210  * FIXME:  Really should specify dkd_errno error codes.
211  *	For some reason they're specified in the drivers
212  *	instead of here??  Should also use those here for
213  *	dk_log.type too.
214  */
215 #define	DKL_SOFT	0x01		/* recoverable erro */
216 #define	DKL_HARD	0x02		/* unrecoverable error */
217 
218 /*
219  * Used for floppies
220  */
221 struct fdk_char{
222 	u_char medium;		/* medium type. Unused, why have it? history! */
223 	int transfer_rate;	/* transfer rate */
224 	int ncyl;		/* number of cylinders */
225 	int nhead;		/* number of heads */
226 	int sec_size;		/* sector size */
227 	int secptrack;		/* sectors per track */
228 	int steps;		/* number of steps per  */
229 };
230 
231 struct fdk_state {
232 	int	fkc_bsec;		/* bytes per sector */
233 	int 	fkc_strack;		/* sectors per track */
234 	int	fkc_step;		/* step rate */
235 	int	fkc_rate;		/* data rate */
236 	int	fkc_error;		/* error returned by controller */
237 };
238 
239 struct fdk_cmd {		/* used by generic command */
240 	struct dk_cmd dcmd;	/* disk command info */
241 	struct fdk_state fstate; /* floppy state info */
242 };
243 
244 /*
245  * Floppy commands
246  */
247 #define	FKWRITE 	1
248 #define	FKREAD  	2
249 #define	FKSEEK		3
250 #define	FKREZERO 	4
251 #define	FKFORMAT_UNIT 	5
252 #define	FKFORMAT_TRACK 	6
253 
254 /*
255  * Used by FDKGETCHANGE, return state of the sense disk change bit.
256  */
257 #define	FDKGC_HISTORY	0x01	/* disk has changed since last call */
258 #define	FDKGC_CURRENT	0x02	/* current state of disk change */
259 
260 /*
261  * Used by FDK{G, S}ETDRIVECHAR
262  */
263 struct fdk_drive {
264 	int fdd_ejectable;	/* does the drive support eject? */
265 	int fdd_maxsearch;	/* size of per-unit search table */
266 
267 	int fdd_writeprecomp;	/* cyl to start write prcompensation */
268 	int fdd_writereduce;	/* cyl to start recucing write current */
269 	int fdd_stepwidth;	/* width of step pulse in 1 us units */
270 	int fdd_steprate;	/* step rate in 100 us units */
271 	int fdd_headsettle;	/* delay, in 100 us units */
272 	int fdd_headload;	/* delay, in 100 us units */
273 	int fdd_headunload;	/* delay, in 100 us units */
274 	int fdd_motoron;	/* delay, in 100 ms units */
275 	int fdd_motoroff;	/* delay, in 100 ms units */
276 	int fdd_precomplevel;	/* bit shift, in nano-secs */
277 	int fdd_pins;		/* defines meaning of pin 1, 2, 4, and 34 */
278 	int fdd_flags;		/* TRUE READY, Starting Sector #, & Motor On */
279 };
280 
281 /*
282  * Used by FDK{G, S}ETSEARCH
283  */
284 struct fdk_search {
285 	int	fdk_numentries; /* number of elements in the table */
286 	struct fdk_char *fdk_search;
287 };
288 
289 /*
290  * Used by F_RAW
291  */
292 struct fdraw {
293 	char	fr_cmd[10];	/* user-supplied command bytes */
294 	short   fr_cnum;	/* number of command bytes */
295 	char    fr_result[10];  /* controller-supplied result bytes */
296 	short	fr_nbytes;	/* number to transfer if read/write command */
297 	char	*fr_addr;	/* where to transfer if read/write command */
298 };
299 
300 /*
301  * Floppy raw commands
302  */
303 #define	FRAW_SPECIFY	0x03
304 #define	FRAW_READID	0x0a
305 #define	FRAW_SENSE_DRV	0x04
306 #define	FRAW_REZERO	0x07
307 #define	FRAW_SEEK	0x0f
308 #define	FRAW_SENSE_INT	0x08
309 #define	FRAW_FORMAT	0x0d
310 #define	FRAW_READTRACK	0x02
311 #define	FRAW_WRCMD	0x05
312 #define	FRAW_RDCMD	0x06
313 #define	FRAW_WRITEDEL	0x09
314 #define	FRAW_READDEL	0x0c
315 
316 /*
317  * Severity values
318  */
319 #define	DK_NOERROR	0
320 #define	DK_CORRECTED	1
321 #define	DK_RECOVERED	2
322 #define	DK_FATAL	3
323 
324 /*
325  * Error types
326  */
327 #define	DK_NONMEDIA	0		/* not caused by a media defect */
328 #define	DK_ISMEDIA	1		/* caused by a media defect */
329 
330 
331 /*
332  * Disk io control commands
333  */
334 #define	DKIOCGGEOM	_IOR('d', 2, struct dk_geom)	/* Get geometry */
335 #define	DKIOCSGEOM	_IOW('d', 3, struct dk_geom)	/* Set geometry */
336 #define	DKIOCGPART	_IOR('d', 4, struct dk_map)	/* Get partition info */
337 #define	DKIOCSPART	_IOW('d', 5, struct dk_map)	/* Set partition info */
338 #define	DKIOCINFO	_IOR('d', 8, struct dk_info)	/* Get info */
339 #define	DKIOCGCONF	_IOR('d', 126, struct dk_conf)	/* Get conf info */
340 #define	DKIOCSTYPE	_IOW('d', 125, struct dk_type)	/* Set drive info */
341 #define	DKIOCGTYPE	_IOR('d', 124, struct dk_type)	/* Get drive info */
342 #define	DKIOCSAPART	_IOW('d', 123, struct dk_allmap)	/* Set all partitions */
343 #define	DKIOCGAPART	_IOR('d', 122, struct dk_allmap)	/* Get all partitions */
344 #define	DKIOCSBAD	_IOW('d', 121, struct dk_badmap)	/* Set bad sector map */
345 #define	DKIOCGBAD	_IOW('d', 120, struct dk_badmap)	/* Get bad sector map */
346 #define	DKIOCSCMD	_IOW('d', 119, struct dk_cmd)	/* Set generic cmd */
347 #define	DKIOCGLOG	_IOR('d', 118, struct dk_loghdr)	/* Get error log */
348 #define	DKIOCGDIAG	_IOR('d', 116, struct dk_diag)	/* Get diagnostics */
349 #define	DKIOCWCHK	_IOWR('d', 115, int)		/* Toggle write check */
350 #define	FDKIOGCHAR	_IOR('d', 114, struct fdk_char)	/* GetCharacteristics */
351 #define	FDKIOSCHAR	_IOW('d', 113, struct fdk_char)	/* SetCharacteristics */
352 #define	FDKEJECT	_IO('d', 112)			/* Eject floppy disk */
353 #define	FDKGETCHANGE	_IOR('d', 111, int)		/* Get diskchng stat */
354 #define	FDKGETDRIVECHAR	_IOR('d', 110, struct fdk_drive)	/* Get drivechar */
355 #define	FDKSETDRIVECHAR	_IOW('d', 109, struct fdk_drive)	/* Set drivechar */
356 #define	FDKGETSEARCH	_IOR('d', 108, struct fdk_search)	/* Get search tbl */
357 #define	FDKSETSEARCH	_IOW('d', 107, struct fdk_search)	/* Set search tbl */
358 #define	FDKIOCSCMD	_IOWR('d', 106, struct fdk_cmd)	/* Floppy command */
359 #define	F_RAW		_IOWR('d', 105, struct fdraw)	/* ECDstyle genericcmd*/
360 
361 #endif /* !_sun_dkio_h */
362