xref: /openbsd/sys/dev/ic/amireg.h (revision d415bd75)
1 /*	$OpenBSD: amireg.h,v 1.30 2008/10/22 18:42:29 marco Exp $	*/
2 
3 /*
4  * Copyright (c) 2000 Michael Shalayeff
5  * Copyright (c) 2005 Marco Peereboom
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
21  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
25  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
26  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27  * THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #define	AMI_MAX_PDRIVES		(75)
31 #define	AMI_MAX_LDRIVES		8
32 #define	AMI_MAX_SPANDEPTH	4
33 #define	AMI_MAX_DEVDEPTH	8
34 #define	AMI_MAX_TARGET		16
35 
36 #define	AMI_BIG_MAX_PDRIVES	(256)
37 #define	AMI_BIG_MAX_LDRIVES	40
38 #define	AMI_BIG_MAX_SPANDEPTH	8
39 #define	AMI_BIG_MAX_DEVDEPTH	32
40 
41 #define	AMI_MAXCMDS	126		/* theoretical limit is 250 */
42 #define	AMI_SECTOR_SIZE	512
43 #define	AMI_MAXOFFSETS	26
44 #define	AMI_SGEPERCMD	32		/* to prevent page boundary crossing */
45 #define AMI_MAX_BUSYWAIT 10		/* wait up to 10 usecs */
46 #define AMI_MAX_POLLWAIT 1000000	/* wait up to 1000 000 usecs */
47 #define AMI_MAXIOCTLCMDS 1		/* number of parallel ioctl calls */
48 #define AMI_MAXPROCS	 2		/* number of processors on a channel */
49 #define AMI_MAXRAWCMDS	 2		/* number of parallel processor cmds */
50 
51 #define	AMI_MAXFER	(AMI_MAXOFFSETS * PAGE_SIZE)
52 
53 #define	AMI_QIDB	0x20
54 #define		AMI_QIDB_EXEC	0x01
55 #define		AMI_QIDB_ACK	0x02
56 #define	AMI_QODB	0x2c
57 #define		AMI_QODB_READY	0x10001234
58 
59 #define	AMI_SCMD	0x10
60 #define		AMI_SCMD_EXEC	0x10
61 #define		AMI_SCMD_ACK	0x08
62 #define	AMI_SMBSTAT	0x10
63 #define		AMI_SMBST_BUSY	0x10
64 #define	AMI_SIEM	0x11
65 #define		AMI_SEIM_ENA	0xc0
66 #define	AMI_SMBADDR	0x14
67 #define	AMI_SMBENA	0x18
68 #define	AMI_ISTAT	0x1a
69 #define		AMI_ISTAT_PEND	0x40
70 
71 /* commands */
72 #define	AMI_READ	0x01
73 #define	AMI_WRITE	0x02
74 #define	AMI_PASSTHRU	0x03	/* pass scsi cdb to the device */
75 #define	AMI_EINQUIRY	0x04	/* extended inquiry */
76 #define	AMI_INQUIRY	0x05	/* inquiry */
77 #define	AMI_CHSTATE	0x06	/* pad[0] -- state */
78 #define		AMI_STATE_ON	3
79 #define		AMI_STATE_FAIL	4
80 #define		AMI_STATE_SPARE	6
81 #define	AMI_RCONFIG	0x07	/* read configuration up to 4 spans */
82 #define	AMI_REBUILDPD	0x08	/* rebuild physical drive */
83 #define	AMI_CHECK	0x09	/* check consistency */
84 #define	AMI_FLUSH	0x0a
85 #define	AMI_ILDRIVE	0x0b	/* init logical drive */
86 #define	AMI_EINQUIRY3	0x0c
87 #define	AMI_DCHDR	0x14	/* get/set dedicated channel/drives */
88 #define	AMI_GRBLDPROGR	0x18	/* get rebuild progress */
89 #define	AMI_GCHECKPROGR	0x19	/* get check consistency progress */
90 #define	AMI_GILDRPROGR	0x1b	/* get init logical drive progress */
91 #define	AMI_WRCONFIG	0x20	/* write configuration up to 4 spans */
92 #define	AMI_RWRCONFIG	0x21	/* raid write config */
93 #define	AMI_RRDCONFIG	0x22	/* raid read config */
94 #define	AMI_GRBLDRATE	0x23	/* get rebuild rate */
95 #define	AMI_SRBLDRATE	0x24	/* set rebuild rate */
96 #define	AMI_UPLDCFGUT	0x25	/* upload config utility */
97 #define	AMI_UPLDRVPROP	0x26	/* update logical drive property */
98 #define	AMI_ABRTREBLD	0x28	/* abort rebuild */
99 #define	AMI_ABRTCHECK	0x29	/* abort check consistency */
100 #define	AMI_ABRTILDRV	0x2b	/* abort init logical drive */
101 #define	AMI_WRBLOCK	0x2c	/* flash write block */
102 #define	AMI_PRGFLASH	0x2d	/* flash program */
103 #define	AMI_SFLUSHINTV	0x2e	/* channel == cache flush interval */
104 #define	AMI_PCHIPSETVAL	0x2f	/* program chipset values */
105 #define		AMI_CS_NEPTUNE	0x61
106 #define		AMI_CS_OTHER	0xe1
107 #define		AMI_CS_TRITON	0xe2
108 #define	AMI_SNEG	0x30	/* scsi sync negotiation get/ena/dis */
109 #define		AMI_SNEG_GET	1
110 #define		AMI_SNEG_SET	2
111 #define	AMI_QTAG	0x31	/* scsi queue tag get/set */
112 #define		AMI_QTAG_GET	1
113 #define		AMI_QTAG_SET	2
114 #define	AMI_GSUPARAM	0x32	/* get spinup parameters */
115 #define	AMI_SSUPARAM	0x33	/* set spinup parameters */
116 #define	AMI_GDROAMINFO	0x34
117 #define	AMI_GMACHID	0x36	/* get machine id */
118 #define	AMI_BIOSPDATA	0x40	/* get bios private data */
119 #define	AMI_I2OCFGDLG	0x41	/* I2O config dialog */
120 #define	AMI_GCACHESTAT	0x50	/* get cache statistics */
121 #define	AMI_SPEAKER	0x51	/* speaker control */
122 #define		AMI_SPKR_OFF	0
123 #define		AMI_SPKR_ON	1
124 #define		AMI_SPKR_SHUT	2
125 #define		AMI_SPKR_GVAL	3
126 #define		AMI_SPKR_TEST	4
127 #define	AMI_GDUMP	0x52	/* get error condition in text */
128 #define	AMI_SENSEDUMPA	0x53	/* get SCSI sense dump area */
129 #define	AMI_STDIAG	0x54	/* start diagnostics -- 2.1 */
130 #define	AMI_FRAID_PF	0x55	/* get/set flexraid power fail */
131 #define		AMI_GFRAIDPF	1
132 #define		AMI_SFRAIDPF	2
133 #define	AMI_FRAIDVS	0x56	/* get/set flexraid virtual sizing */
134 #define		AMI_GFRAIDVS	1
135 #define		AMI_SFRAIDVS	2
136 #define	AMI_BBMANAGE	0x57	/* bad block manage */
137 #define	AMI_RECONSTRUCT	0x60	/* begin reconstruction */
138 #define	AMI_GRECONSTRUCT 0x61	/* get reconstruction progress */
139 #define	AMI_BIOSSTAT	0x62	/* enable/disable bios */
140 #define	AMI_RDCFGDSK	0x63	/* read configuration from disk */
141 #define	AMI_AREBUILD	0x64	/* get/set autorebuild/battery charge */
142 #define		AMI_GUCAP	1	/* get ultra capabilities */
143 #define		AMI_SUCAP	2	/* set ultra capability */
144 #define		AMI_GARBLD	3
145 #define		AMI_SARBLD	4
146 #define		AMI_GFCC	5	/* get fast charge counter */
147 #define		AMI_SFCC	6	/* set fast charge counter */
148 #define		AMI_GCUCAP	7	/* get channel ultra capabilities */
149 #define		AMI_SCUCAP	8	/* set channel ultra capabilities */
150 #define	AMI_SFD		0x66	/* set factory defaults */
151 #define	AMI_RDCONFIG8	0x67	/* read configuration up to 8 spans */
152 #define	AMI_WRCONFIG8	0x68	/* write config up to 8 spans */
153 #define	AMI_ESENSEDUMPA	0x69	/* extended scsi dump area */
154 #define	AMI_RERRC	0x6a	/* reset error counter */
155 #define	AMI_BOOTUP	0x6b	/* ena/dis physical drive boot up */
156 #define	AMI_ENCLOSURE	0x6c	/* get/set enclosure type */
157 #define	AMI_WRCFGD	0x6c	/* write config disk -- 2.1 */
158 #define	AMI_HAPIRRLD	0x6e
159 #define	AMI_LDRVRIGHTS	0x6f
160 #define	AMI_CLUSTERING	0x70
161 #define	AMI_GCHPROP	0x71	/* get channel properties */
162 #define	AMI_SCHTERM	0x72	/* set channel termination */
163 #define		AMI_TERM_DISABLE 0
164 #define		AMI_TERM_ENABLE	1
165 #define		AMI_TERM_HIGH	2
166 #define		AMI_TERM_WIDE	3
167 #define		AMI_TERM_DFLT	16
168 #define	AMI_QUIETCH	0x73	/* quiet channel */
169 #define	AMI_ACTIVATECH	0x74	/* activate channel */
170 #define	AMI_STARTU	0x75	/* start unit, pad[0] -- sync/async */
171 #define		AMI_STARTU_SYNC	1
172 #define		AMI_STARTU_ASYN	2
173 #define	AMI_STOPU	0x76	/* stop unit */
174 #define	AMI_GERRC	0x77	/* get error counter */
175 #define	AMI_GBTDS	0x78	/* get boot time drive status */
176 #define	AMI_FMTPROG	0x79
177 #define	AMI_RCAPCMD	0x7a	/* read capacity */
178 #define	AMI_WRCRX	0x7b
179 #define	AMI_RDCRX	0x7c
180 #define	AMI_GINID	0x7d	/* get initiator id */
181 #define	AMI_HAPICMD	0x7e
182 #define	AMI_SINID	0x7f	/* set initiator id */
183 #define	AMI_SMARTMSEL	0x80
184 #define	AMI_SPSTARTU	0x85	/* special start unit command */
185 #define	AMI_NVFAILHIST	0x90
186 #define	AMI_DCMDABRT	0x91
187 #define	AMI_GDRIVEHIST	0x92	/* get drive history */
188 #define	AMI_GESENSE	0x93	/* get extended sense data dump */
189 #define	AMI_ADAPTER	0x95	/* save/restore adapter params */
190 #define		AMI_ADP_SAVE	0
191 #define		AMI_ADP_LOAD	1
192 #define	AMI_RESET	0x96	/* adapter reset */
193 #define	AMI_PRGCLASS	0x97	/* program class code */
194 #define	AMI_UPHTML	0x98	/* upload html utility */
195 #define	AMI_NEWCFG	0x99
196 #define	AMI_NEWOP	0xa0
197 #define	AMI_FCOP	0xa1
198 #define		AMI_FC_PROCEED	0x02
199 #define		AMI_FC_DELLDRV	0x03
200 #define		AMI_FC_RDCONF	0x04
201 #define		AMI_FC_RDFCONF	0x05
202 #define		AMI_FC_GCONFDSK	0x06
203 #define		AMI_FC_CHLDNO	0x07
204 #define		AMI_FC_CMPCTCFG	0x08
205 #define		AMI_FC_DRVGRP	0x09
206 #define		AMI_FC_GLOOPINF	0x0a
207 #define		AMI_FC_CHLOOPID	0x0b
208 #define		AMI_FC_GNSCH	0x0c
209 #define		AMI_FC_WRCONF	0x0d
210 #define		AMI_FC_PRODINF	0x0e
211 #define		AMI_FC_EINQ3	0x0f
212 #define		AMI_FC_EINQ4	0x1f
213 #define			AMI_FC_EINQ3_SOLICITED_NOTIFY	0x01
214 #define			AMI_FC_EINQ3_SOLICITED_FULL	0x02
215 #define			AMI_FC_EINQ3_UNSOLICITED	0x03
216 #define	AMI_MISC	0xa4
217 #define		AMI_GET_BGI	0x13
218 #define		AMI_GET_IO_CMPL	0x5b
219 #define		AMI_SET_IO_CMPL	0x5c
220 #define	AMI_CHFUNC	0xa9
221 #define	AMI_MANAGE	0xb0	/* manage functions */
222 #define		AMI_MGR_LUN	0x00
223 #define		AMI_MGR_THERM	0x01
224 #define		AMI_MGR_EEPROM	0x02
225 #define		AMI_MGR_LDNAMES	0x03
226 #define		AMI_MGR_FCWWN	0x04
227 #define		AMI_MGR_CFGACC	0x05
228 #define	AMI_HSPDIAG	0xb1
229 #define	AMI_GESENSEINFO	0xb2	/* get extended sense info */
230 #define	AMI_SYSFLUSH	0xfe	/* flush system */
231 
232 /* command structures */
233 struct ami_iocmd {
234 	u_int8_t	acc_cmd;
235 	u_int8_t	acc_id;
236 	union {
237 #define	acc_mbox	_._ami_mbox
238 		struct {
239 			u_int16_t	amb_nsect;
240 			u_int32_t	amb_lba;
241 			u_int32_t	amb_data;
242 			u_int8_t	amb_ldn;	/* logical drive no */
243 			u_int8_t	amb_nsge;
244 			u_int8_t	amb_reserved;
245 		} __packed _ami_mbox;
246 
247 #define	acc_io		_._ami_io
248 		struct {
249 			u_int8_t	aio_channel;
250 			u_int8_t	aio_param;
251 			u_int8_t	aio_pad[4];
252 			u_int32_t	aio_data;
253 			u_int8_t	aio_pad1[3];
254 		} __packed _ami_io;
255 
256 #define	acc_passthru	_._ami_passthru
257 		struct {
258 			u_int16_t	apt_dummy0;
259 			u_int32_t	apt_dummy1;
260 			u_int32_t	apt_data;
261 			u_int8_t	apt_dummy2;
262 			u_int8_t	apt_dummy3;
263 			u_int8_t	apt_reserved;
264 		} __packed _ami_passthru;
265 
266 #define	acc_ldrv	_._ami_ldrv
267 		struct {
268 			u_int16_t	ald_dummy0;
269 			u_int32_t	ald_dummy1;
270 			u_int32_t	ald_data;
271 			u_int8_t	ald_ldrv;
272 			u_int8_t	ald_dummy2;
273 			u_int8_t	ald_reserved;
274 		} __packed _ami_ldrv;
275 	} __packed _;
276 	u_int8_t	acc_busy;
277 	u_int8_t	acc_nstat;
278 	u_int8_t	acc_status;
279 #define	AMI_MAXSTATACK	0x2e
280 	u_int8_t	acc_cmplidl[AMI_MAXSTATACK];
281 	u_int8_t	acc_poll;
282 	u_int8_t	acc_ack;
283 	u_int8_t	acc_pad[0x3e];	/* pad to 128 bytes */
284 } __packed;
285 
286 struct ami_sgent {
287 	u_int32_t	asg_addr;
288 	u_int32_t	asg_len;
289 } __packed;
290 
291 struct ami_iocmd64 {
292 	u_int8_t	acc_cmd;
293 	u_int8_t	acc_id;
294 	union {
295 		struct {
296 			u_int16_t	amb_nsect;
297 			u_int32_t	amb_lba;
298 			u_int32_t	amb_reserved1;
299 			u_int8_t	amb_ldn;	/* logical drive no */
300 			u_int8_t	amb_nsge;	/* high bit == 1 */
301 			u_int8_t	amb_reserved;
302 		} __packed _ami_mbox;
303 
304 		struct {
305 			u_int8_t	aio_channel;
306 			u_int8_t	aio_param;
307 			u_int8_t	aio_pad[4];
308 			u_int32_t	aio_data;
309 			u_int8_t	aio_pad1[3];
310 		} __packed _ami_io;
311 
312 		struct {
313 			u_int16_t	apt_dummy0;
314 			u_int32_t	apt_dummy1;
315 			u_int32_t	apt_data;
316 			u_int8_t	apt_dummy2;
317 			u_int8_t	apt_dummy3;
318 			u_int8_t	apt_reserved;
319 		} __packed _ami_passthru;
320 
321 		struct {
322 			u_int16_t	ald_dummy0;
323 			u_int32_t	ald_dummy1;
324 			u_int32_t	ald_data;
325 			u_int8_t	ald_ldrv;
326 			u_int8_t	ald_dummy2;
327 			u_int8_t	ald_reserved;
328 		} __packed _ami_ldrv;
329 	} __packed _;
330 	u_int8_t	acc_busy;
331 	u_int32_t	acc_data_l;
332 	u_int32_t	acc_data_h;
333 	u_int32_t	acc_reserved;
334 	u_int8_t	acc_nstat;
335 	u_int8_t	acc_status;
336 	u_int8_t	acc_cmplidl[AMI_MAXSTATACK];
337 	u_int8_t	acc_poll;
338 	u_int8_t	acc_ack;
339 	u_int8_t	acc_pad[0x32];	/* pad to 128 bytes */
340 } __packed;
341 
342 struct ami_sgent64 {
343 	u_int32_t	asg_addr_l;
344 	u_int32_t	asg_addr_h;
345 	u_int32_t	asg_len;
346 } __packed;
347 
348 struct ami_passthrough {
349 	u_int8_t	apt_param;
350 #define	AMI_PTPARAM(t,a,l)	(((l) << 7) | (((a) & 1) << 3) | ((t) & 3))
351 #define	AMI_TIMEOUT_6	0
352 #define	AMI_TIMEOUT_60	1
353 #define	AMI_TIMEOUT_10m	2
354 #define	AMI_TIMEOUT_3h	3
355 	u_int8_t	apt_ldn;
356 	u_int8_t	apt_channel;
357 	u_int8_t	apt_target;
358 	u_int8_t	apt_qtag;
359 	u_int8_t	apt_qact;
360 #define	AMI_MAX_CDB	10
361 	u_int8_t	apt_cdb[AMI_MAX_CDB];
362 	u_int8_t	apt_ncdb;
363 	u_int8_t	apt_nsense;
364 #define	AMI_MAX_SENSE	32
365 	u_int8_t	apt_sense[AMI_MAX_SENSE];
366 	u_int8_t	apt_nsge;
367 	u_int8_t	apt_scsistat;
368 	u_int32_t	apt_data;
369 	u_int32_t	apt_datalen;
370 } __packed;
371 
372 struct ami_inquiry {
373 	u_int8_t	ain_maxcmd;
374 	u_int8_t	ain_rbldrate;	/* rebuild rate %% */
375 	u_int8_t	ain_targets;	/* max targets per channel */
376 	u_int8_t	ain_channels;
377 	u_int8_t	ain_fwver[4];
378 	u_int16_t	ain_flashage;
379 	u_int8_t	ain_chipset;	/* parity generation policy */
380 	u_int8_t	ain_ramsize;
381 	u_int8_t	ain_flushintv;
382 	u_int8_t	ain_biosver[4];
383 	u_int8_t	ain_brdtype;
384 	u_int8_t	ain_scsisensealert;
385 	u_int8_t	ain_wrcfgcnt;	/* write config count */
386 	u_int8_t	ain_drvinscnt;	/* drive insertion count */
387 	u_int8_t	ain_insdrv;	/* inserted drive */
388 	u_int8_t	ain_battery;	/* battery status */
389 	u_int8_t	ain_reserved;
390 
391 	u_int8_t	ain_nlogdrv;
392 	u_int8_t	ain_reserved1[3];
393 	u_int32_t	ain_ldsize[AMI_MAX_LDRIVES];
394 	u_int8_t	ain_ldprop[AMI_MAX_LDRIVES];
395 	u_int8_t	ain_ldstat[AMI_MAX_LDRIVES];
396 
397 	u_int8_t	ain_pdstat[AMI_MAX_PDRIVES];
398 	u_int8_t	ain_predictivefailure;
399 
400 	u_int8_t	ain_pdfmtinp[AMI_MAX_PDRIVES];
401 	u_int8_t	ain_reserved2[AMI_MAX_PDRIVES];
402 
403 	u_int32_t	ain_esize;	/* extended data size */
404 	u_int16_t	ain_ssid;	/* subsystem id */
405 	u_int16_t	ain_ssvid;	/* subsystem vendor id */
406 	u_int32_t	ain_signature;
407 #define	AMI_SIGN431	0xfffe0001
408 #define	AMI_SIGN438	0xfffd0002
409 #define	AMI_SIGN762	0xfffc0003
410 #define	AMI_SIGNT5	0xfffb0004
411 #define	AMI_SIGN466	0xfffa0005
412 } __packed;
413 
414 #define MAX_NOTIFY_SIZE	0x80
415 #define CUR_NOTIFY_SIZE (sizeof(struct ami_notify))
416 struct ami_notify {
417 	u_int32_t	ano_eventcounter;	/* incremented for changes */
418 
419 	u_int8_t	ano_paramcounter;	/* param change */
420 	u_int8_t	ano_paramid;		/* param modified */
421 #define AMI_PARAM_RBLD_RATE		0x01 /* new rebuild rate */
422 #define AMI_PARAM_CACHE_FLUSH_INTERVAL	0x02 /* new cache flush interval */
423 #define AMI_PARAM_SENSE_ALERT		0x03 /* pd caused check condition */
424 #define AMI_PARAM_DRIVE_INSERTED	0x04 /* pd inserted */
425 #define AMI_PARAM_BATTERY_STATUS	0x05 /* battery status */
426 #define AMI_PARAM_NVRAM_EVENT_ALERT	0x06 /* NVRAM # of entries */
427 #define AMI_PARAM_PATROL_READ_UPDATE	0x07 /* # pd done with patrol read */
428 #define AMI_PARAM_PATROL_READ_STATUS	0x08 /* 0 stopped
429 					      * 2 aborted
430 					      * 4 started */
431 
432 	u_int16_t	ano_paramval;		/* new val modified param */
433 
434 	u_int8_t	ano_writeconfcounter;	/* write config */
435 	u_int8_t	ano_writeconfrsvd[3];
436 
437 	u_int8_t	ano_ldopcounter;	/* ld op started/completed */
438 	u_int8_t	ano_ldopid;		/* ld modified */
439 	u_int8_t	ano_ldopcmd;		/* ld operation */
440 #define AMI_LDCMD_CHKCONSISTANCY	0x01
441 #define AMI_LDCMD_INITIALIZE		0x02
442 #define AMI_LDCMD_RECONSTRUCTION	0x03
443 	u_int8_t	ano_ldopstatus;		/* status of the operation */
444 #define AMI_LDOP_SUCCESS		0x00
445 #define AMI_LDOP_FAILED			0x01
446 #define AMI_LDOP_ABORTED		0x02
447 #define AMI_LDOP_CORRECTED		0x03
448 #define AMI_LDOP_STARTED		0x04
449 
450 	u_int8_t	ano_ldstatecounter;	/* change of ld state */
451 	u_int8_t	ano_ldstateid;		/* ld state changed */
452 	u_int8_t	ano_ldstatenew;		/* new state */
453 	u_int8_t	ano_ldstateold;		/* old state */
454 #define AMI_RDRV_OFFLINE		0
455 #define AMI_RDRV_DEGRADED		1
456 #define AMI_RDRV_OPTIMAL		2
457 #define AMI_RDRV_DELETED		3
458 
459 	u_int8_t	ano_pdstatecounter;	/* change of pd state */
460 	u_int8_t	ano_pdstateid;		/* pd state changed */
461 	u_int8_t	ano_pdstatenew;		/* new state */
462 	u_int8_t	ano_pdstateold;		/* old state */
463 #define AMI_PD_UNCNF			0
464 #define AMI_PD_ONLINE			3
465 #define AMI_PD_FAILED			4
466 #define AMI_PD_RBLD			5
467 #define AMI_PD_HOTSPARE			6
468 
469 	u_int8_t	ano_pdfmtcounter;	/* pd format started/over */
470 	u_int8_t	ano_pdfmtid;		/* pd id */
471 	u_int8_t	ano_pdfmtval;		/* format started/over */
472 #define AMI_PDFMT_START			0x01
473 #define AMI_PDFMT_OVER			0x02
474 	u_int8_t	ano_pdfmtrsvd;
475 
476 	u_int8_t	ano_targxfercounter;	/* SCSI-2 Xfer rate change */
477 	u_int8_t	ano_targxferid;		/* pd that changed  */
478 	u_int8_t	ano_targxferval;	/* new xfer parameters */
479 	u_int8_t	ano_targxferrsvd;
480 
481 	u_int8_t	ano_fclidchgcounter;	/* loop id changed */
482 	u_int8_t	ano_fclidpdid;		/* pd id */
483 	u_int8_t	ano_fclid0;		/* loop id on fc loop 0 */
484 	u_int8_t	ano_fclid1;		/* loop id on fc loop 1 */
485 
486 	u_int8_t	ano_fclstatecounter;	/* loop state changed */
487 	u_int8_t	ano_fclstate0;		/* state of fc loop 0 */
488 	u_int8_t	ano_fclstate1;		/* state of fc loop 1 */
489 #define AMI_FCLOOP_FAILED		0
490 #define AMI_FCLOOP_ACTIVE		1
491 #define AMI_FCLOOP_TRANSIENT		2
492 	u_int8_t	ano_fclstatersvd;
493 } __packed;
494 
495 struct ami_fc_einquiry {
496 	u_int32_t	ain_size;	/* size of this structure */
497 
498 	/* notify */
499 	struct	ami_notify ain_notify;
500 	u_int8_t	ain_notifyrsvd[MAX_NOTIFY_SIZE - CUR_NOTIFY_SIZE];
501 
502 	u_int8_t	ain_rbldrate;	/* rebuild rate %% */
503 	u_int8_t	ain_flushintvl;
504 	u_int8_t	ain_sensealert;
505 	u_int8_t	ain_drvinscnt;	/* drive insertion count */
506 	u_int8_t	ain_battery;	/* battery status */
507 
508 	u_int8_t	ain_nlogdrv;
509 	u_int8_t	ain_recon[AMI_BIG_MAX_LDRIVES / 8];
510 	u_int16_t	ain_stat[AMI_BIG_MAX_LDRIVES / 8];
511 
512 	u_int32_t	ain_ldsize[AMI_BIG_MAX_LDRIVES];
513 	u_int8_t	ain_ldprop[AMI_BIG_MAX_LDRIVES];
514 	u_int8_t	ain_ldstat[AMI_BIG_MAX_LDRIVES];
515 
516 	u_int8_t	ain_pdstat[AMI_BIG_MAX_PDRIVES];
517 	u_int16_t	ain_pdfmtinp[AMI_BIG_MAX_PDRIVES / 16];
518 	u_int8_t	ain_pdrates[80];	/* pdrv xfer rates */
519 	u_int8_t	ain_pad[263];		/* pad to 1k */
520 } __packed;
521 
522 struct ami_fc_prodinfo {
523 	u_int32_t	api_size;	/* size of this structure */
524 	u_int32_t	api_config;
525 	u_int8_t	api_fwver[16];
526 	u_int8_t	api_biosver[16];
527 	u_int8_t	api_product[80];
528 	u_int8_t	api_maxcmd;
529 	u_int8_t	api_channels;
530 	u_int8_t	api_fcloops;
531 	u_int8_t	api_memtype;
532 	u_int32_t	api_signature;
533 	u_int16_t	api_ramsize;
534 	u_int16_t	api_ssid;
535 	u_int16_t	api_ssvid;
536 	u_int8_t	api_nnotify;
537 } __packed;
538 
539 struct ami_diskarray {
540 	u_int8_t	ada_nld;
541 	u_int8_t	ada_pad[3];
542 	struct {
543 		u_int8_t	adl_spandepth;
544 		u_int8_t	adl_raidlvl;
545 		u_int8_t	adl_rdahead;
546 		u_int8_t	adl_stripesz;
547 		u_int8_t	adl_status;
548 		u_int8_t	adl_wrpolicy;
549 		u_int8_t	adl_directio;
550 		u_int8_t	adl_nstripes;
551 		struct {
552 			u_int32_t	ads_start;
553 			u_int32_t	ads_length;	/* blocks */
554 			struct {
555 				u_int8_t	add_channel;
556 				u_int8_t	add_target;
557 			} __packed ads_devs[AMI_MAX_DEVDEPTH];
558 		} __packed adl_spans[AMI_MAX_SPANDEPTH];
559 	} __packed ada_ldrv[AMI_MAX_LDRIVES];
560 	struct {
561 		u_int8_t	adp_type;	/* SCSI device type */
562 		u_int8_t	adp_ostatus;	/* status during config */
563 		u_int8_t	adp_tagdepth;	/* level of tagging */
564 		u_int8_t	adp_sneg;	/* sync negotiation */
565 		u_int32_t	adp_size;
566 	} __packed ada_pdrv[AMI_MAX_PDRIVES];
567 } __packed;
568 
569 struct ami_big_diskarray {
570 	u_int8_t	ada_nld;
571 	u_int8_t	ada_pad[3];
572 #define ald ada_ldrv
573 	struct {
574 		u_int8_t	adl_spandepth;
575 		u_int8_t	adl_raidlvl;
576 		u_int8_t	adl_rdahead;
577 		u_int8_t	adl_stripesz;
578 		u_int8_t	adl_status;
579 		u_int8_t	adl_wrpolicy;
580 		u_int8_t	adl_directio;
581 		u_int8_t	adl_nstripes;
582 #define 	asp adl_spans
583 		struct {
584 			u_int32_t	ads_start;
585 			u_int32_t	ads_length;	/* blocks */
586 #define 		adv ads_devs
587 			struct {
588 				u_int8_t	add_channel;
589 				u_int8_t	add_target;
590 			} __packed ads_devs[AMI_BIG_MAX_DEVDEPTH];
591 		} __packed adl_spans[AMI_BIG_MAX_SPANDEPTH];
592 	} __packed ada_ldrv[AMI_BIG_MAX_LDRIVES];
593 #define apd ada_pdrv
594 	struct {
595 		u_int8_t	adp_type;	/* SCSI device type */
596 		u_int8_t	adp_ostatus;	/* status during config */
597 		u_int8_t	adp_tagdepth;	/* level of tagging */
598 		u_int8_t	adp_sneg;	/* sync negotiation */
599 		u_int32_t	adp_size;
600 	} __packed ada_pdrv[AMI_BIG_MAX_PDRIVES];
601 } __packed;
602 
603 struct ami_scsisense {
604 	u_int8_t	ase_end;
605 	struct {
606 		u_int8_t	asd_channel;
607 		u_int8_t	asd_target;
608 		u_int16_t	asd_errcode;
609 		u_int16_t	asd_sense;
610 		u_int16_t	asd_addarea1;
611 		u_int16_t	asd_addarea2;
612 		u_int16_t	asd_cmdspec0;
613 		u_int16_t	asd_cmdspec1;
614 		u_int16_t	asd_asc_ascq;
615 	} __packed ase_dump[5];
616 } __packed;
617 
618 struct ami_escsisense {
619 	u_int8_t	ase_end;
620 	struct {
621 		u_int8_t	asd_channel;
622 		u_int8_t	asd_target;
623 		u_int16_t	asd_errcode;
624 		u_int16_t	asd_sense;
625 		u_int16_t	asd_addarea1;
626 		u_int16_t	asd_addarea2;
627 		u_int16_t	asd_cmdspec0;
628 		u_int16_t	asd_cmdspec1;
629 		u_int16_t	asd_asc_ascq;
630 		u_int16_t	asd_extarea;
631 	} __packed ase_dump[5];
632 } __packed;
633 
634 struct ami_cachestats {
635 	u_int32_t	acs_total;
636 	u_int32_t	acs_hits;
637 } __packed;
638 
639 struct ami_drivehistory {
640 	struct {
641 		u_int8_t	adh_error;
642 #define	AMI_ADHERR_TIMEOUT(e)	((e) & 15)
643 #define	AMI_ADHERR_PARITY(e)	(((e) >> 4) & 15)
644 		u_int8_t	adh_throttle;
645 	} __packed adh_err[3][16];	/* channels * drives */
646 	u_int8_t	adh_failidx;
647 	struct {
648 		u_int8_t	adh_tag;
649 #define	AMI_ADHTAG_CH(t)	((t) & 7)
650 #define	AMI_ADHTAG_TARG(t)	(((t) >> 3) & 15)
651 #define	AMI_ADHTAG_VALID(t)	((t) & 0x80)
652 		u_int8_t	reason;
653 #define	AMI_ADHERR_MEDIA	1
654 #define	AMI_ADHERR_NMEDIA	2
655 #define	AMI_ADHERR_CMDTMO	3
656 #define	AMI_ADHERR_SELTMO	4
657 #define	AMI_ADHERR_HAFAIL	5
658 #define	AMI_ADHERR_REASSIGN	6
659 #define	AMI_ADHERR_CMDFAIL	7
660 #define	AMI_ADHERR_OTHER	8
661 
662 #define	AMI_FAILHISTORY		10
663 	} __packed adh_fail[AMI_FAILHISTORY];
664 } __packed;
665 
666 struct ami_progress {
667 	u_int32_t	apr_progress;
668 } __packed;
669