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