ata.h revision 119877
118334Speter/*-
290075Sobrien * Copyright (c) 2000 - 2003 S�ren Schmidt <sos@FreeBSD.org>
3169689Skan * All rights reserved.
4169689Skan *
518334Speter * Redistribution and use in source and binary forms, with or without
690075Sobrien * modification, are permitted provided that the following conditions
718334Speter * are met:
890075Sobrien * 1. Redistributions of source code must retain the above copyright
990075Sobrien *    notice, this list of conditions and the following disclaimer,
1090075Sobrien *    without modification, immediately at the beginning of the file.
1190075Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1218334Speter *    notice, this list of conditions and the following disclaimer in the
1390075Sobrien *    documentation and/or other materials provided with the distribution.
1490075Sobrien * 3. The name of the author may not be used to endorse or promote products
1590075Sobrien *    derived from this software without specific prior written permission.
1690075Sobrien *
1718334Speter * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1818334Speter * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1990075Sobrien * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20169689Skan * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21169689Skan * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2218334Speter * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2318334Speter * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2418334Speter * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2518334Speter * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2618334Speter * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2718334Speter *
2818334Speter * $FreeBSD: head/sys/sys/ata.h 119877 2003-09-08 08:30:43Z sos $
2918334Speter */
3018334Speter
31117395Skan#ifndef _SYS_ATA_H_
3218334Speter#define _SYS_ATA_H_
3318334Speter
3450397Sobrien#include <sys/ioccom.h>
35132718Skan
36132718Skan/* ATA/ATAPI device parameters */
3750397Sobrienstruct ata_params {
3850397Sobrien/*000*/ u_int16_t	config; 		/* configuration info */
39117395Skan#define ATA_PROTO_MASK			0x8003
4090075Sobrien#define ATA_PROTO_ATA			0x0002
4150397Sobrien#define ATA_PROTO_ATAPI_12		0x8000
4250397Sobrien#define ATA_PROTO_ATAPI_16		0x8001
4350397Sobrien#define ATA_ATAPI_TYPE_MASK		0x1f00
4490075Sobrien#define ATA_ATAPI_TYPE_DIRECT		0x0000	/* disk/floppy */
4590075Sobrien#define ATA_ATAPI_TYPE_TAPE		0x0100	/* streaming tape */
4690075Sobrien#define ATA_ATAPI_TYPE_CDROM		0x0500	/* CD-ROM device */
4790075Sobrien#define ATA_ATAPI_TYPE_OPTICAL		0x0700	/* optical disk */
4890075Sobrien#define ATA_DRQ_MASK			0x0060
49169689Skan#define ATA_DRQ_SLOW			0x0000  /* cpu 3 ms delay */
50169689Skan#define ATA_DRQ_INTR			0x0020  /* interrupt 10 ms delay */
51169689Skan#define ATA_DRQ_FAST			0x0040  /* accel 50 us delay */
52169689Skan
53169689Skan/*001*/	u_int16_t	cylinders;		/* # of cylinders */
5418334Speter	u_int16_t	reserved2;
55169689Skan/*003*/	u_int16_t	heads;			/* # heads */
56169689Skan	u_int16_t	obsolete4;
57169689Skan	u_int16_t	obsolete5;
58169689Skan/*006*/	u_int16_t	sectors;		/* # sectors/track */
59169689Skan/*007*/	u_int16_t	vendor7[3];
60169689Skan/*010*/	u_int8_t	serial[20];		/* serial number */
61169689Skan/*020*/	u_int16_t	retired20;
62169689Skan	u_int16_t	retired21;
63169689Skan	u_int16_t	obsolete22;
64169689Skan/*023*/	u_int8_t	revision[8];		/* firmware revision */
65169689Skan/*027*/	u_int8_t	model[40];		/* model name */
66169689Skan/*047*/	u_int16_t	sectors_intr;		/* sectors per interrupt */
67169689Skan/*048*/	u_int16_t	usedmovsd;		/* double word read/write? */
68169689Skan/*049*/	u_int16_t	capabilities1;
69169689Skan#define ATA_SUPPORT_DMA			0x0100
70169689Skan#define ATA_SUPPORT_LBA			0x0200
71169689Skan#define ATA_SUPPORT_OVERLAP		0x4000
7290075Sobrien
73132718Skan/*050*/	u_int16_t	capabilities2;
7418334Speter/*051*/	u_int16_t	retired_piomode;	/* PIO modes 0-2 */
75117395Skan#define ATA_RETIRED_PIO_MASK		0x0300
7618334Speter
7718334Speter/*052*/	u_int16_t	retired_dmamode;	/* DMA modes */
7890075Sobrien#define ATA_RETIRED_DMA_MASK		0x0003
7990075Sobrien
8018334Speter/*053*/	u_int16_t	atavalid;		/* fields valid */
81132718Skan#define ATA_FLAG_54_58			0x0001	/* words 54-58 valid */
8290075Sobrien#define ATA_FLAG_64_70			0x0002	/* words 64-70 valid */
8318334Speter#define ATA_FLAG_88			0x0004	/* word 88 valid */
8418334Speter
8518334Speter/*054*/	u_int16_t	obsolete54[5];
8618334Speter/*059*/	u_int16_t	multi;
8718334Speter#define	ATA_MULTI_VALID			0x0100
8818334Speter
8918334Speter/*060*/	u_int16_t	lba_size_1;
9018334Speter	u_int16_t	lba_size_2;
9118334Speter	u_int16_t	obsolete62;
9218334Speter/*063*/	u_int16_t	mwdmamodes;		/* multiword DMA modes */
9318334Speter/*064*/	u_int16_t	apiomodes;		/* advanced PIO modes */
94169689Skan
95169689Skan/*065*/	u_int16_t	mwdmamin;		/* min. M/W DMA time/word ns */
96169689Skan/*066*/	u_int16_t	mwdmarec;		/* rec. M/W DMA time ns */
97169689Skan/*067*/	u_int16_t	pioblind;		/* min. PIO cycle w/o flow */
9818334Speter/*068*/	u_int16_t	pioiordy;		/* min. PIO cycle IORDY flow */
9918334Speter	u_int16_t	reserved69;
100169689Skan	u_int16_t	reserved70;
101169689Skan/*071*/	u_int16_t	rlsovlap;		/* rel time (us) for overlap */
10218334Speter/*072*/	u_int16_t	rlsservice;		/* rel time (us) for service */
103117395Skan	u_int16_t	reserved73;
10418334Speter	u_int16_t	reserved74;
10518334Speter/*075*/	u_int16_t	queue;
106132718Skan#define	ATA_QUEUE_LEN(x)		((x) & 0x001f)
10718334Speter
108132718Skan	u_int16_t	reserved76;
10918334Speter	u_int16_t	reserved77;
11090075Sobrien	u_int16_t	reserved78;
11190075Sobrien	u_int16_t	reserved79;
11250397Sobrien/*080*/	u_int16_t	version_major;
113117395Skan/*081*/	u_int16_t	version_minor;
11418334Speter
11590075Sobrien	struct {
11690075Sobrien/*082/085*/ u_int16_t	command1;
11790075Sobrien#define ATA_SUPPORT_SMART		0x0001
11818334Speter#define ATA_SUPPORT_SECURITY		0x0002
11990075Sobrien#define ATA_SUPPORT_REMOVABLE		0x0004
12090075Sobrien#define ATA_SUPPORT_POWERMGT		0x0008
12118334Speter#define ATA_SUPPORT_PACKET		0x0010
12290075Sobrien#define ATA_SUPPORT_WRITECACHE		0x0020
12390075Sobrien#define ATA_SUPPORT_LOOKAHEAD		0x0040
12490075Sobrien#define ATA_SUPPORT_RELEASEIRQ		0x0080
12590075Sobrien#define ATA_SUPPORT_SERVICEIRQ		0x0100
12690075Sobrien#define ATA_SUPPORT_RESET		0x0200
12790075Sobrien#define ATA_SUPPORT_PROTECTED		0x0400
12818334Speter#define ATA_SUPPORT_WRITEBUFFER		0x1000
129117395Skan#define ATA_SUPPORT_READBUFFER		0x2000
130117395Skan#define ATA_SUPPORT_NOP			0x4000
13118334Speter
132169689Skan/*083/086*/ u_int16_t	command2;
133169689Skan#define ATA_SUPPORT_MICROCODE		0x0001
134169689Skan#define ATA_SUPPORT_QUEUED		0x0002
135169689Skan#define ATA_SUPPORT_CFA			0x0004
136169689Skan#define ATA_SUPPORT_APM			0x0008
137169689Skan#define ATA_SUPPORT_NOTIFY		0x0010
138169689Skan#define ATA_SUPPORT_STANDBY		0x0020
139169689Skan#define ATA_SUPPORT_SPINUP		0x0040
140169689Skan#define ATA_SUPPORT_MAXSECURITY		0x0100
141169689Skan#define ATA_SUPPORT_AUTOACOUSTIC	0x0200
142169689Skan#define ATA_SUPPORT_ADDRESS48		0x0400
143169689Skan#define ATA_SUPPORT_OVERLAY		0x0800
144169689Skan#define ATA_SUPPORT_FLUSHCACHE		0x1000
145169689Skan#define ATA_SUPPORT_FLUSHCACHE48	0x2000
146169689Skan
147169689Skan/*084/087*/ u_int16_t	extension;
148169689Skan	} support, enabled;
149169689Skan
150169689Skan/*088*/	u_int16_t	udmamodes;		/* UltraDMA modes */
151169689Skan/*089*/	u_int16_t	erase_time;
152169689Skan/*090*/	u_int16_t	enhanced_erase_time;
153169689Skan/*091*/	u_int16_t	apm_value;
154169689Skan/*092*/	u_int16_t	master_passwd_revision;
155169689Skan/*093*/	u_int16_t	hwres;
156169689Skan#define ATA_CABLE_ID			0x2000
157169689Skan
158169689Skan/*094*/	u_int16_t	acoustic;
159169689Skan#define	ATA_ACOUSTIC_CURRENT(x)		((x) & 0x00ff)
160132718Skan#define	ATA_ACOUSTIC_VENDOR(x)		(((x) & 0xff00) >> 8)
161132718Skan
162132718Skan/*095*/	u_int16_t	stream_min_req_size;
163169689Skan/*096*/	u_int16_t	stream_transfer_time;
164169689Skan/*097*/	u_int16_t	stream_access_latency;
165132718Skan/*098*/	u_int32_t	stream_granularity;
166169689Skan/*100*/	u_int16_t	lba_size48_1;
167169689Skan	u_int16_t	lba_size48_2;
168132718Skan	u_int16_t	lba_size48_3;
169169689Skan	u_int16_t	lba_size48_4;
170169689Skan	u_int16_t	reserved104[23];
17118334Speter/*127*/	u_int16_t	removable_status;
17290075Sobrien/*128*/	u_int16_t	security_status;
17390075Sobrien	u_int16_t	reserved129[31];
174169689Skan/*160*/	u_int16_t	cfa_powermode1;
175169689Skan	u_int16_t	reserved161[14];
176169689Skan/*176*/	u_int16_t	media_serial[30];
177169689Skan	u_int16_t	reserved206[49];
178169689Skan/*255*/	u_int16_t	integrity;
179169689Skan};
180169689Skan
181169689Skan/* ATA transfer modes */
182169689Skan#define ATA_MODE_MASK		0x0f
183169689Skan#define ATA_DMA_MASK		0xf0
184169689Skan#define ATA_PIO			0x00
185169689Skan#define ATA_PIO0		0x08
186169689Skan#define ATA_PIO1		0x09
187169689Skan#define ATA_PIO2		0x0a
188169689Skan#define ATA_PIO3		0x0b
189169689Skan#define ATA_PIO4		0x0c
190169689Skan#define ATA_PIO_MAX		0x0f
191169689Skan#define ATA_DMA			0x10
192169689Skan#define ATA_WDMA0		0x20
193169689Skan#define ATA_WDMA1		0x21
194169689Skan#define ATA_WDMA2		0x22
195169689Skan#define ATA_UDMA0		0x40
196169689Skan#define ATA_UDMA1		0x41
197169689Skan#define ATA_UDMA2		0x42
198169689Skan#define ATA_UDMA3		0x43
199169689Skan#define ATA_UDMA4		0x44
200169689Skan#define ATA_UDMA5		0x45
201169689Skan#define ATA_UDMA6		0x46
202169689Skan#define ATA_SA150		0x47
203169689Skan#define ATA_DMA_MAX		0x4f
204169689Skan
205169689Skan/* ATA commands */
206169689Skan#define	ATA_NOP				0x00	/* NOP command */
207169689Skan#define		ATA_NF_FLUSHQUEUE	0x00	/* flush queued cmd's */
208169689Skan#define		ATA_NF_AUTOPOLL		0x01	/* start autopoll function */
209169689Skan#define	ATA_ATAPI_RESET			0x08	/* reset ATAPI device */
210169689Skan#define	ATA_READ			0x20	/* read command */
211169689Skan#define	ATA_READ48			0x24	/* read command */
212169689Skan#define	ATA_READ_DMA48			0x25	/* read w/DMA command */
21390075Sobrien#define	ATA_READ_DMA_QUEUED48	 	0x26	/* read w/DMA QUEUED command */
214117395Skan#define	ATA_READ_MUL48			0x29	/* read multi command */
21518334Speter#define	ATA_WRITE			0x30	/* write command */
21618334Speter#define	ATA_WRITE48			0x34	/* write command */
217132718Skan#define	ATA_WRITE_DMA48			0x35	/* write w/DMA command */
21818334Speter#define	ATA_WRITE_DMA_QUEUED48		0x36	/* write w/DMA QUEUED command */
21990075Sobrien#define	ATA_WRITE_MUL48			0x39	/* write multi command */
220132718Skan#define	ATA_PACKET_CMD			0xa0	/* packet command */
221132718Skan#define	ATA_ATAPI_IDENTIFY		0xa1	/* get ATAPI params*/
222169689Skan#define	ATA_SERVICE			0xa2	/* service command */
223169689Skan#define	ATA_READ_MUL			0xc4	/* read multi command */
224169689Skan#define	ATA_WRITE_MUL			0xc5	/* write multi command */
225169689Skan#define	ATA_SET_MULTI			0xc6	/* set multi size command */
226169689Skan#define	ATA_READ_DMA_QUEUED		0xc7	/* read w/DMA QUEUED command */
227169689Skan#define	ATA_READ_DMA			0xc8	/* read w/DMA command */
228169689Skan#define	ATA_WRITE_DMA			0xca	/* write w/DMA command */
229169689Skan#define	ATA_WRITE_DMA_QUEUED		0xcc	/* write w/DMA QUEUED command */
230169689Skan#define	ATA_SLEEP			0xe6	/* sleep command */
231169689Skan#define	ATA_FLUSHCACHE			0xe7	/* flush cache to disk */
232169689Skan#define	ATA_FLUSHCACHE48		0xea	/* flush cache to disk */
233169689Skan#define	ATA_ATA_IDENTIFY		0xec	/* get ATA params */
234169689Skan#define	ATA_SETFEATURES			0xef	/* features command */
235169689Skan#define		ATA_SF_SETXFER		0x03	/* set transfer mode */
236169689Skan#define		ATA_SF_ENAB_WCACHE	0x02	/* enable write cache */
237169689Skan#define		ATA_SF_DIS_WCACHE	0x82	/* disable write cache */
238169689Skan#define		ATA_SF_ENAB_RCACHE	0xaa	/* enable readahead cache */
239169689Skan#define		ATA_SF_DIS_RCACHE	0x55	/* disable readahead cache */
240169689Skan#define		ATA_SF_ENAB_RELIRQ	0x5d	/* enable release interrupt */
241169689Skan#define		ATA_SF_DIS_RELIRQ	0xdd	/* disable release interrupt */
242169689Skan#define		ATA_SF_ENAB_SRVIRQ	0x5e	/* enable service interrupt */
243169689Skan#define		ATA_SF_DIS_SRVIRQ	0xde	/* disable service interrupt */
244169689Skan
245169689Skan/* ATAPI commands */
246169689Skan#define ATAPI_TEST_UNIT_READY		0x00	/* check if device is ready */
247169689Skan#define ATAPI_REZERO			0x01	/* rewind */
248169689Skan#define ATAPI_REQUEST_SENSE		0x03	/* get sense data */
249169689Skan#define ATAPI_FORMAT			0x04	/* format unit */
250169689Skan#define ATAPI_READ			0x08	/* read data */
251169689Skan#define ATAPI_WRITE			0x0a	/* write data */
252169689Skan#define ATAPI_WEOF			0x10	/* write filemark */
253169689Skan#define 	ATAPI_WF_WRITE		0x01
254169689Skan#define ATAPI_SPACE			0x11	/* space command */
255169689Skan#define	    	ATAPI_SP_FM		0x01
256169689Skan#define	    	ATAPI_SP_EOD		0x03
257169689Skan#define ATAPI_MODE_SELECT		0x15	/* mode select */
258169689Skan#define ATAPI_ERASE			0x19	/* erase */
259169689Skan#define ATAPI_MODE_SENSE		0x1a	/* mode sense */
260169689Skan#define ATAPI_START_STOP		0x1b	/* start/stop unit */
261169689Skan#define	    	ATAPI_SS_LOAD		0x01
262169689Skan#define	    	ATAPI_SS_RETENSION	0x02
263169689Skan#define	    	ATAPI_SS_EJECT		0x04
264169689Skan#define ATAPI_PREVENT_ALLOW		0x1e	/* media removal */
265169689Skan#define ATAPI_READ_FORMAT_CAPACITIES	0x23	/* get format capacities */
266169689Skan#define ATAPI_READ_CAPACITY		0x25	/* get volume capacity */
267169689Skan#define ATAPI_READ_BIG			0x28	/* read data */
268169689Skan#define ATAPI_WRITE_BIG			0x2a	/* write data */
269169689Skan#define ATAPI_LOCATE			0x2b	/* locate to position */
270169689Skan#define ATAPI_READ_POSITION		0x34	/* read position */
271169689Skan#define ATAPI_SYNCHRONIZE_CACHE		0x35	/* flush buf, close channel */
272169689Skan#define ATAPI_WRITE_BUFFER		0x3b	/* write device buffer */
273169689Skan#define ATAPI_READ_BUFFER		0x3c	/* read device buffer */
274169689Skan#define ATAPI_READ_SUBCHANNEL		0x42	/* get subchannel info */
275169689Skan#define ATAPI_READ_TOC			0x43	/* get table of contents */
276169689Skan#define ATAPI_PLAY_10			0x45	/* play by lba */
277169689Skan#define ATAPI_PLAY_MSF			0x47	/* play by MSF address */
278169689Skan#define ATAPI_PLAY_TRACK		0x48	/* play by track number */
279169689Skan#define ATAPI_PAUSE			0x4b	/* pause audio operation */
280169689Skan#define ATAPI_READ_DISK_INFO		0x51	/* get disk info structure */
281169689Skan#define ATAPI_READ_TRACK_INFO		0x52	/* get track info structure */
282169689Skan#define ATAPI_RESERVE_TRACK		0x53	/* reserve track */
283169689Skan#define ATAPI_SEND_OPC_INFO		0x54	/* send OPC structurek */
284169689Skan#define ATAPI_MODE_SELECT_BIG		0x55	/* set device parameters */
285169689Skan#define ATAPI_REPAIR_TRACK		0x58	/* repair track */
286169689Skan#define ATAPI_READ_MASTER_CUE		0x59	/* read master CUE info */
287169689Skan#define ATAPI_MODE_SENSE_BIG		0x5a	/* get device parameters */
288169689Skan#define ATAPI_CLOSE_TRACK		0x5b	/* close track/session */
289169689Skan#define ATAPI_READ_BUFFER_CAPACITY	0x5c	/* get buffer capicity */
290169689Skan#define ATAPI_SEND_CUE_SHEET		0x5d	/* send CUE sheet */
291169689Skan#define ATAPI_BLANK			0xa1	/* blank the media */
292169689Skan#define ATAPI_SEND_KEY			0xa3	/* send DVD key structure */
293169689Skan#define ATAPI_REPORT_KEY		0xa4	/* get DVD key structure */
294169689Skan#define ATAPI_PLAY_12			0xa5	/* play by lba */
29518334Speter#define ATAPI_LOAD_UNLOAD		0xa6	/* changer control command */
29618334Speter#define ATAPI_READ_STRUCTURE		0xad	/* get DVD structure */
29718334Speter#define ATAPI_PLAY_CD			0xb4	/* universal play command */
298117395Skan#define ATAPI_SET_SPEED			0xbb	/* set drive speed */
299117395Skan#define ATAPI_MECH_STATUS		0xbd	/* get changer status */
300117395Skan#define ATAPI_READ_CD			0xbe	/* read data */
301117395Skan#define ATAPI_POLL_DSC			0xff	/* poll DSC status bit */
302132718Skan
30318334Speterstruct ata_cmd {
304117395Skan    int				channel;
305169689Skan    int				device;
306169689Skan    int				cmd;
30718334Speter#define ATAGMAXCHANNEL		0x0101
30818334Speter#define ATAGPARM		0x0102
309169689Skan#define ATAGMODE		0x0103
310169689Skan#define ATASMODE		0x0104
311169689Skan#define ATAREQUEST		0x0108
31290075Sobrien#define ATAREINIT		0x0110
313169689Skan#define ATAATTACH		0x0111
31418334Speter#define ATADETACH		0x0112
31590075Sobrien#define ATARAIDCREATE		0x0120
31690075Sobrien#define ATARAIDDELETE		0x0121
317169689Skan#define ATARAIDSTATUS		0x0122
318169689Skan#define ATARAIDADDSPARE		0x0123
319169689Skan#define ATARAIDREBUILD		0x0124
320169689Skan#define ATAENCSTAT		0x0130
321169689Skan
322169689Skan    union {
323169689Skan	int			maxchan;
324169689Skan
325169689Skan	struct {
326169689Skan	    int			type[2];
327169689Skan	    char		name[2][32];
328169689Skan	    struct ata_params	params[2];
329169689Skan	} param;
330169689Skan
331169689Skan	struct {
332169689Skan	    int			mode[2];
333169689Skan	} mode;
334169689Skan
335169689Skan	struct {
336169689Skan	    union {
337169689Skan		struct {
338169689Skan	    	    u_int8_t            command;
339169689Skan            	    u_int8_t            feature;
340169689Skan            	    u_int64_t           lba;
341169689Skan            	    u_int16_t           count;
342169689Skan		} ata;
343169689Skan		struct {
344169689Skan	    	    char		ccb[16];
345169689Skan		} atapi;
34650397Sobrien	    } u;
347169689Skan	    caddr_t		data;
34890075Sobrien	    int			count;
34918334Speter	    int			flags;
350169689Skan#define ATA_CMD_CONTROL			0x01
351169689Skan#define ATA_CMD_READ			0x02
352169689Skan#define ATA_CMD_WRITE			0x04
353169689Skan#define ATA_CMD_ATAPI			0x08
354169689Skan
355169689Skan	    int			timeout;
35690075Sobrien	    int			error;
357169689Skan	} request;
35818334Speter
359169689Skan	struct raid_setup {
360132718Skan	    int			type;
361132718Skan#define	AR_RAID0			1
362132718Skan#define	AR_RAID1			2
363132718Skan#define	AR_SPAN				4
364132718Skan
365132718Skan	    int			total_disks;
366169689Skan	    int			disks[16];
367132718Skan	    int			interleave;
368169689Skan	    int			unit;
369132718Skan	} raid_setup;
37018334Speter
371169689Skan	struct raid_status {
372132718Skan	    int			type;
373132718Skan	    int			total_disks;
374132718Skan	    int			disks[16];
375132718Skan	    int			interleave;
37618334Speter	    int			status;
377132718Skan#define	AR_READY			1
378132718Skan#define	AR_DEGRADED			2
379132718Skan#define	AR_REBUILDING			4
380169689Skan
381169689Skan	    int			progress;
382169689Skan	} raid_status;
383169689Skan
384169689Skan	struct {
385169689Skan	    int			disk;
386169689Skan	} raid_spare;
387169689Skan
388169689Skan	struct {
389169689Skan	    int			fan;
390169689Skan	    int			temp;
391132718Skan	    int			v05;
392169689Skan	    int			v12;
393132718Skan	} enclosure;
394132718Skan    } u;
39590075Sobrien};
396169689Skan
39790075Sobrien#define IOCATA			_IOWR('a',  1, struct ata_cmd)
39818334Speter
39918334Speter#endif /* _SYS_ATA_H_ */
400169689Skan