Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / dev / pci / mlyreg.h @ 14

History | View | Annotate | Download (39 KB)

1
/*        $NetBSD: mlyreg.h,v 1.5 2008/09/08 23:36:54 gmcgarry Exp $        */
2

    
3
/*-
4
 * Copyright (c) 2001 The NetBSD Foundation, Inc.
5
 * All rights reserved.
6
 *
7
 * This code is derived from software contributed to The NetBSD Foundation
8
 * by Andrew Doran, Thor Lancelot Simon, and Eric Haszlakiewicz.
9
 *
10
 * Redistribution and use in source and binary forms, with or without
11
 * modification, are permitted provided that the following conditions
12
 * are met:
13
 * 1. Redistributions of source code must retain the above copyright
14
 *    notice, this list of conditions and the following disclaimer.
15
 * 2. Redistributions in binary form must reproduce the above copyright
16
 *    notice, this list of conditions and the following disclaimer in the
17
 *    documentation and/or other materials provided with the distribution.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29
 * POSSIBILITY OF SUCH DAMAGE.
30
 */
31

    
32
/*-
33
 * Copyright (c) 2000 Michael Smith
34
 * Copyright (c) 2000 BSDi
35
 * All rights reserved.
36
 *
37
 * Redistribution and use in source and binary forms, with or without
38
 * modification, are permitted provided that the following conditions
39
 * are met:
40
 * 1. Redistributions of source code must retain the above copyright
41
 *    notice, this list of conditions and the following disclaimer.
42
 * 2. Redistributions in binary form must reproduce the above copyright
43
 *    notice, this list of conditions and the following disclaimer in the
44
 *    documentation and/or other materials provided with the distribution.
45
 *
46
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
47
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
48
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
49
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
50
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
51
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
52
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
53
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
54
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
55
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56
 * SUCH DAMAGE.
57
 *
58
 * from FreeBSD: mlyreg.h,v 1.1 2000/08/23 03:22:39 msmith Exp
59
 */
60

    
61
/*
62
 * Section numbers in this document refer to the Mylex "Firmware Software Interface"
63
 * document ('FSI'), revision 0.11 04/11/00 unless otherwise qualified.
64
 *
65
 * Reference is made to the Mylex "Programming Guide for 6.x Controllers" document
66
 * ('PG6'), document #771242 revision 0.02, 04/11/00
67
 *
68
 * Note that fields marked N/A are not supported by the PCI controllers, but are
69
 * defined here to hold place in datastructures that are shared with the SCSI
70
 * controllers.  Items not relevant to PCI controllers are not described here.
71
 *
72
 * Ordering of items in this file is a little odd due to the constraints of
73
 * nested declarations.
74
 */
75

    
76
#ifndef _PCI_MLYREG_H_
77
#define        _PCI_MLYREG_H_
78

    
79
/*
80
 * 2.1 (Scatter Gather List Format)
81
 */
82
struct mly_sg_entry {
83
        u_int64_t        physaddr;
84
        u_int64_t        length;
85
} __packed;
86

    
87
/*
88
 * 5.2 System Device Access
89
 *
90
 * This is corroborated by the layout of the MDACIOCTL_GETCONTROLLERINFO data
91
 * in 21.8
92
 */
93
#define        MLY_MAX_CHANNELS        6
94
#define        MLY_MAX_TARGETS                16
95
#define        MLY_MAX_LUNS                1
96

    
97
/*
98
 * 8.1 Different Device States
99
 */
100
#define        MLY_DEVICE_STATE_OFFLINE        0x08        /* DEAD/OFFLINE */
101
#define        MLY_DEVICE_STATE_UNCONFIGURED        0x00
102
#define        MLY_DEVICE_STATE_ONLINE                0x01
103
#define        MLY_DEVICE_STATE_CRITICAL        0x09
104
#define        MLY_DEVICE_STATE_WRITEONLY        0x03
105
#define        MLY_DEVICE_STATE_STANDBY        0x21
106
#define        MLY_DEVICE_STATE_MISSING        0x04        /* or-ed with (ONLINE or WRITEONLY or STANDBY) */
107

    
108
/*
109
 * 8.2 Device Type Field definitions
110
 */
111
#define        MLY_DEVICE_TYPE_RAID0                0x0        /* RAID 0 */
112
#define        MLY_DEVICE_TYPE_RAID1                0x1        /* RAID 1 */
113
#define        MLY_DEVICE_TYPE_RAID3                0x3        /* RAID 3 right asymmetric parity */
114
#define        MLY_DEVICE_TYPE_RAID5                0x5        /* RAID 5 right asymmetric parity */
115
#define        MLY_DEVICE_TYPE_RAID6                0x6        /* RAID 6 (Mylex RAID 6) */
116
#define        MLY_DEVICE_TYPE_RAID7                0x7        /* RAID 7 (JBOD) */
117
#define        MLY_DEVICE_TYPE_NEWSPAN                0x8        /* New Mylex SPAN */
118
#define        MLY_DEVICE_TYPE_RAID3F                0x9        /* RAID 3 fixed parity */
119
#define        MLY_DEVICE_TYPE_RAID3L                0xb        /* RAID 3 left symmetric parity */
120
#define        MLY_DEVICE_TYPE_SPAN                0xc        /* current spanning implementation */
121
#define        MLY_DEVICE_TYPE_RAID5L                0xd        /* RAID 5 left symmetric parity */
122
#define        MLY_DEVICE_TYPE_RAIDE                0xe        /* RAID E (concatenation) */
123
#define        MLY_DEVICE_TYPE_PHYSICAL        0xf        /* physical device */
124

    
125
/*
126
 * 8.3 Stripe Size
127
 */
128
#define        MLY_STRIPE_ZERO                0x0        /* no stripe (RAID 1, RAID 7, etc) */
129
#define        MLY_STRIPE_512b                0x1
130
#define        MLY_STRIPE_1k                0x2
131
#define        MLY_STRIPE_2k                0x3
132
#define        MLY_STRIPE_4k                0x4
133
#define        MLY_STRIPE_8k                0x5
134
#define        MLY_STRIPE_16k                0x6
135
#define        MLY_STRIPE_32k                0x7
136
#define        MLY_STRIPE_64k                0x8
137
#define        MLY_STRIPE_128k                0x9
138
#define        MLY_STRIPE_256k                0xa
139
#define        MLY_STRIPE_512k                0xb
140
#define        MLY_STRIPE_1m                0xc
141

    
142
/*
143
 * 8.4 Cacheline Size
144
 */
145
#define        MLY_CACHELINE_ZERO        0x0        /* caching cannot be enabled */
146
#define        MLY_CACHELINE_512b        0x1
147
#define        MLY_CACHELINE_1k        0x2
148
#define        MLY_CACHELINE_2k        0x3
149
#define        MLY_CACHELINE_4k        0x4
150
#define        MLY_CACHELINE_8k        0x5
151
#define        MLY_CACHELINE_16k        0x6
152
#define        MLY_CACHELINE_32k        0x7
153
#define        MLY_CACHELINE_64k        0x8
154

    
155
/*
156
 * 8.5 Read/Write control
157
 */
158
#define        MLY_RWCtl_INITTED        (1<<7)        /* if set, the logical device is initialised */
159
                        /* write control */
160
#define        MLY_RWCtl_WCD                (0)        /* write cache disabled */
161
#define        MLY_RWCtl_WDISABLE        (1<<3)        /* writing disabled */
162
#define        MLY_RWCtl_WCE                (2<<3)        /* write cache enabled */
163
#define        MLY_RWCtl_IWCE                (3<<3)        /* intelligent write cache enabled */
164
                        /* read control */
165
#define        MLY_RWCtl_RCD                (0)        /* read cache is disabled */
166
#define        MLY_RWCtl_RCE                (1)        /* read cache enabled */
167
#define        MLY_RWCtl_RAHEAD        (2)        /* readahead enabled */
168
#define        MLY_RWCtl_IRAHEAD        (3)        /* intelligent readahead enabled */
169

    
170
/*
171
 * 9.0 LUN Map Format
172
 */
173
struct mly_lun_map {
174
        u_int8_t        res1:4;
175
        u_int8_t        host_port_mapped:1;        /* this system drive visibile to host on this controller/port combination */
176
        u_int8_t        tid_valid:1;                /* target ID valid */
177
        u_int8_t        hid_valid:1;                /* host ID valid */
178
        u_int8_t        lun_valid:1;                /* LUN valid */
179
        u_int8_t        res2;
180
        u_int8_t        lun;                        /* LUN */
181
        u_int8_t        tid;                        /* TID */
182
        u_int8_t        hid[32];                /* HID (one bit for each host) */
183
} __packed;
184

    
185
/*
186
 * 10.1 Controller Parameters
187
 */
188
struct mly_param_controller {
189
        u_int8_t        rdahen:1;                                /* N/A */
190
        u_int8_t        bilodly:1;                                /* N/A */
191
        u_int8_t           fua_disable:1;
192
        u_int8_t        reass1s:1;                                /* N/A */
193
        u_int8_t        truvrfy:1;                                /* N/A */
194
        u_int8_t        dwtvrfy:1;                                /* N/A */
195
        u_int8_t        background_initialisation:1;
196
        u_int8_t        clustering:1;                                /* N/A */
197

    
198
        u_int8_t        bios_disable:1;
199
        u_int8_t           boot_from_cdrom:1;
200
        u_int8_t        drive_coercion:1;
201
        u_int8_t        write_same_disable:1;
202
        u_int8_t        hba_mode:1;                                /* N/A */
203
        u_int8_t        bios_geometry:2;
204
#define        MLY_BIOSGEOM_2G        0x0
205
#define        MLY_BIOSGEOM_8G        0x1
206
        u_int8_t        res1:1;                                        /* N/A */
207

    
208
        u_int8_t        res2[2];                                /* N/A */
209

    
210
        u_int8_t        v_dec:1;
211
        u_int8_t        safte:1;                                /* N/A */
212
        u_int8_t        ses:1;                                        /* N/A */
213
        u_int8_t        res3:2;                                        /* N/A */
214
        u_int8_t        v_arm:1;
215
        u_int8_t        v_ofm:1;
216
        u_int8_t        res4:1;                                        /* N/A */
217

    
218
        u_int8_t        rebuild_check_rate;
219
        u_int8_t        cache_line_size;                        /* see 8.4 */
220
        u_int8_t        oem_code;
221
#define        MLY_OEM_MYLEX        0x00
222
#define        MLY_OEM_IBM        0x08
223
#define        MLY_OEM_HP        0x0a
224
#define        MLY_OEM_DEC        0x0c
225
#define        MLY_OEM_SIEMENS        0x10
226
#define        MLY_OEM_INTEL        0x12
227
        u_int8_t        spinup_mode;
228
#define        MLY_SPIN_AUTO                0
229
#define        MLY_SPIN_PWRSPIN        1
230
#define        MLY_SPIN_WSSUSPIN        2
231
        u_int8_t        spinup_devices;
232
        u_int8_t        spinup_interval;
233
        u_int8_t        spinup_wait_time;
234

    
235
        u_int8_t        res5:3;                                        /* N/A */
236
        u_int8_t        vutursns:1;                                /* N/A */
237
        u_int8_t        dccfil:1;                                /* N/A */
238
        u_int8_t        nopause:1;                                /* N/A */
239
        u_int8_t        disqfull:1;                                /* N/A */
240
        u_int8_t        disbusy:1;                                /* N/A */
241

    
242
        u_int8_t        res6:2;                                        /* N/A */
243
        u_int8_t        failover_node_name;                        /* N/A */
244
        u_int8_t        res7:1;                                        /* N/A */
245
        u_int8_t        ftopo:3;                                /* N/A */
246
        u_int8_t        disable_ups:1;                                /* N/A */
247

    
248
        u_int8_t        res8:1;                                        /* N/A */
249
        u_int8_t        propagate_reset:1;                        /* N/A */
250
        u_int8_t        nonstd_mp_reset:1;                        /* N/A */
251
        u_int8_t        res9:5;                                        /* N/A */
252

    
253
        u_int8_t        res10;                                        /* N/A */
254
        u_int8_t        serial_port_baud_rate;                        /* N/A */
255
        u_int8_t        serial_port_control;                        /* N/A */
256
        u_int8_t        change_stripe_ok_developer_flag_only;        /* N/A */
257

    
258
        u_int8_t        small_large_host_transfers:2;                /* N/A */
259
        u_int8_t        frame_control:2;                        /* N/A */
260
        u_int8_t        pci_latency_control:2;                        /* N/A */
261
        u_int8_t        treat_lip_as_reset:1;                        /* N/A */
262
        u_int8_t        res11:1;                                /* N/A */
263

    
264
        u_int8_t        ms_autorest:1;                                /* N/A */
265
        u_int8_t        res12:7;                                /* N/A */
266

    
267
        u_int8_t        ms_aa_fsim:1;                                /* N/A */
268
        u_int8_t        ms_aa_ccach:1;                                /* N/A */
269
        u_int8_t        ms_aa_fault_signals:1;                        /* N/A */
270
        u_int8_t        ms_aa_c4_faults:1;                        /* N/A */
271
        u_int8_t        ms_aa_host_reset_delay_mask:4;                /* N/A */
272

    
273
        u_int8_t        ms_flg_simplex_no_rstcom:1;                /* N/A */
274
        u_int8_t        res13:7;                                /* N/A */
275

    
276
        u_int8_t        res14;                                        /* N/A */
277
        u_int8_t        hardloopid[2][2];                        /* N/A */
278
        u_int8_t        ctrlname[2][16+1];                        /* N/A */
279
        u_int8_t        initiator_id;
280
        u_int8_t        startup_option;
281
#define        MLY_STARTUP_IF_NO_CHANGE        0x0
282
#define        MLY_STARTUP_IF_NO_LUN_CHANGE        0x1
283
#define        MLY_STARTUP_IF_NO_LUN_OFFLINE        0x2
284
#define        MLY_STARTUP_IF_LUN0_NO_CHANGE        0x3
285
#define        MLY_STARTUP_IF_LUN0_NOT_OFFLINE        0x4
286
#define        MLY_STARTUP_ALWAYS                0x5
287

    
288
        u_int8_t        res15[62];
289
} __packed__;
290

    
291
/*
292
 * 10.2 Physical Device Parameters
293
 */
294
struct mly_param_physical_device {
295
        u_int16_t        tags;
296
        u_int16_t        speed;
297
        u_int8_t        width;
298
        u_int8_t        combing:1;
299
        u_int8_t        res1:7;
300
        u_int8_t        res2[3];
301
} __packed;
302

    
303
/*
304
 * 10.3 Logical Device Parameters
305
 */
306
struct mly_param_logical_device {
307
        u_int8_t        type;                        /* see 8.2 */
308
        u_int8_t        state;                        /* see 8.1 */
309
        u_int16_t        raid_device;
310
        u_int8_t        res1;
311
        u_int8_t        bios_geometry;                /* BIOS control word? */
312
        u_int8_t        stripe_size;                /* see 8.3 */
313
        u_int8_t        read_write_control;        /* see 8.5 */
314
        u_int8_t        res2[8];
315
} __packed;
316

    
317
/*
318
 * 12.3 Health Status Buffer
319
 *
320
 * Pad to 128 bytes.
321
 */
322
struct mly_health_status {
323
        u_int32_t        uptime_us;                                /* N/A */
324
        u_int32_t        uptime_ms;                                /* N/A */
325
        u_int32_t        realtime;                                /* N/A */
326
        u_int32_t        res1;                                        /* N/A */
327
        u_int32_t        change_counter;
328
        u_int32_t        res2;                                        /* N/A */
329
        u_int32_t        debug_message_index;                        /* N/A */
330
        u_int32_t        bios_message_index;                        /* N/A */
331
        u_int32_t        trace_page;                                /* N/A */
332
        u_int32_t        profiler_page;                                /* N/A */
333
        u_int32_t        next_event;
334
        u_int8_t        res3[4 + 16 + 64];                        /* N/A */
335
} __packed;
336

    
337
/*
338
 * 14.2 Timeout Bit Format
339
 */
340
#define        MLY_TIMEOUT_SECONDS        0x00
341
#define        MLY_TIMEOUT_MINUTES        0x40
342
#define        MLY_TIMEOUT_HOURS        0x80
343

    
344
/*
345
 * 14.3 Operation Device
346
 */
347
#define        MLY_OPDEVICE_PHYSICAL_DEVICE                0x0
348
#define        MLY_OPDEVICE_RAID_DEVICE                0x1
349
#define        MLY_OPDEVICE_PHYSICAL_CHANNEL                0x2
350
#define        MLY_OPDEVICE_RAID_CHANNEL                0x3
351
#define        MLY_OPDEVICE_PHYSICAL_CONTROLLER        0x4
352
#define        MLY_OPDEVICE_RAID_CONTROLLER                0x5
353
#define        MLY_OPDEVICE_CONFIGURATION_GROUP        0x10
354

    
355
/*
356
 * 14.4 Status Bit Format
357
 *
358
 * AKA Status Mailbox Format
359
 *
360
 * XXX format conflict between FSI and PG6 over the ordering of the
361
 * status and sense length fields.
362
 */
363
struct mly_status {
364
        u_int16_t        command_id;
365
        u_int8_t        status;
366
        u_int8_t        sense_length;
367
        int32_t                residue;
368
} __packed;
369

    
370
/*
371
 * 14.5 Command Control Bit (CCB) format
372
 *
373
 * This byte is unfortunately named.
374
 */
375
#define        MLY_CMDCTL_FORCE_UNIT_ACCESS        0x01
376
#define        MLY_CMDCTL_DISABLE_PAGE_OUT        0x02
377
#define        MLY_CMDCTL_EXTENDED_SG_TABLE        0x08
378
#define        MLY_CMDCTL_DATA_DIRECTION        0x10
379
#define        MLY_CMDCTL_NO_AUTO_SENSE        0x40
380
#define        MLY_CMDCTL_DISABLE_DISCONNECT        0x80
381

    
382
/*
383
 * 15.0 Commands
384
 *
385
 * We use the command names as given by Mylex
386
 */
387
#define        MDACMD_MEMCOPY                0x1        /* memory to memory copy */
388
#define        MDACMD_SCSIPT                0x2        /* SCSI passthrough (small command) */
389
#define        MDACMD_SCSILCPT                0x3        /* SCSI passthrough (large command) */
390
#define        MDACMD_SCSI                0x4        /* SCSI command for logical/phyiscal device (small command) */
391
#define        MDACMD_SCSILC                0x5        /* SCSI command for logical/phyiscal device (large command) */
392
#define        MDACMD_IOCTL                0x20        /* Management command */
393
#define        MDACMD_IOCTLCHECK        0x23        /* Validate management command (not implemented) */
394

    
395
/*
396
 * 16.0 IOCTL command
397
 *
398
 * We use the IOCTL names as given by Mylex
399
 * Note that only ioctls supported by the PCI controller family are listed
400
 */
401
#define        MDACIOCTL_GETCONTROLLERINFO                0x1
402
#define        MDACIOCTL_GETLOGDEVINFOVALID                0x3
403
#define        MDACIOCTL_GETPHYSDEVINFOVALID                0x5
404
#define        MDACIOCTL_GETCONTROLLERSTATISTICS        0xb
405
#define        MDACIOCTL_GETLOGDEVSTATISTICS                0xd
406
#define        MDACIOCTL_GETPHYSDEVSTATISTICS                0xf
407
#define        MDACIOCTL_GETHEALTHSTATUS                0x11
408
#define        MDACIOCTL_GETEVENT                        0x15
409
/* flash update */
410
#define        MDACIOCTL_STOREIMAGE                        0x2c
411
#define        MDACIOCTL_READIMAGE                        0x2d
412
#define        MDACIOCTL_FLASHIMAGES                        0x2e
413
/* battery backup unit */
414
#define        MDACIOCTL_GET_SUBSYSTEM_DATA                0x70
415
#define        MDACIOCTL_SET_SUBSYSTEM_DATA                0x71
416
/* non-data commands */
417
#define        MDACIOCTL_STARTDISOCVERY                0x81
418
#define        MDACIOCTL_SETRAIDDEVSTATE                0x82
419
#define        MDACIOCTL_INITPHYSDEVSTART                0x84
420
#define        MDACIOCTL_INITPHYSDEVSTOP                0x85
421
#define        MDACIOCTL_INITRAIDDEVSTART                0x86
422
#define        MDACIOCTL_INITRAIDDEVSTOP                0x87
423
#define        MDACIOCTL_REBUILDRAIDDEVSTART                0x88
424
#define        MDACIOCTL_REBUILDRAIDDEVSTOP                0x89
425
#define        MDACIOCTL_MAKECONSISTENTDATASTART        0x8a
426
#define        MDACIOCTL_MAKECONSISTENTDATASTOP        0x8b
427
#define        MDACIOCTL_CONSISTENCYCHECKSTART                0x8c
428
#define        MDACIOCTL_CONSISTENCYCHECKSTOP                0x8d
429
#define        MDACIOCTL_SETMEMORYMAILBOX                0x8e
430
#define        MDACIOCTL_RESETDEVICE                        0x90
431
#define        MDACIOCTL_FLUSHDEVICEDATA                0x91
432
#define        MDACIOCTL_PAUSEDEVICE                        0x92
433
#define        MDACIOCTL_UNPAUSEDEVICE                        0x93
434
#define        MDACIOCTL_LOCATEDEVICE                        0x94
435
#define        MDACIOCTL_SETMASTERSLAVEMODE                0x95
436
#define        MDACIOCTL_SETREALTIMECLOCK                0xac
437
/* RAID configuration */
438
#define        MDACIOCTL_CREATENEWCONF                        0xc0
439
#define        MDACIOCTL_DELETERAIDDEV                        0xc1
440
#define        MDACIOCTL_REPLACEINTERNALDEV                0xc2
441
#define        MDACIOCTL_RENAMERAIDDEV                        0xc3
442
#define        MDACIOCTL_ADDNEWCONF                        0xc4
443
#define        MDACIOCTL_XLATEPHYSDEVTORAIDDEV                0xc5
444
#define        MDACIOCTL_MORE                                0xc6
445
#define        MDACIOCTL_SETPHYSDEVPARAMETER                0xc8
446
#define        MDACIOCTL_GETPHYSDEVPARAMETER                0xc9
447
#define        MDACIOCTL_CLEARCONF                        0xca
448
#define        MDACIOCTL_GETDEVCONFINFO                0xcb
449
#define        MDACIOCTL_GETGROUPCONFINFO                0xcc
450
#define        MDACIOCTL_GETFREESPACELIST                0xcd
451
#define        MDACIOCTL_GETLOGDEVPARAMETER                0xce
452
#define        MDACIOCTL_SETLOGDEVPARAMETER                0xcf
453
#define        MDACIOCTL_GETCONTROLLERPARAMETER        0xd0
454
#define        MDACIOCTL_SETCONTRLLERPARAMETER                0xd1
455
#define        MDACIOCTL_CLEARCONFSUSPMODE                0xd2
456
#define        MDACIOCTL_GETBDT_FOR_SYSDRIVE                0xe0
457

    
458
/*
459
 * 17.1.4 Data Transfer Memory Address Without SG List
460
 */
461
struct mly_short_transfer {
462
        struct mly_sg_entry        sg[2];
463
} __packed;
464

    
465
/*
466
 * 17.1.5 Data Transfer Memory Address With SG List
467
 *
468
 * Note that only the first s/g table is currently used.
469
 */
470
struct mly_sg_transfer {
471
        u_int16_t        entries[3];
472
        u_int16_t        res1;
473
        u_int64_t        table_physaddr[3];
474
} __packed;
475

    
476
/*
477
 * 17.1.3 Data Transfer Memory Address Format
478
 */
479
union mly_cmd_transfer {
480
        struct mly_short_transfer        direct;
481
        struct mly_sg_transfer        indirect;
482
};
483

    
484
/*
485
 * 21.1  MDACIOCTL_SETREALTIMECLOCK
486
 * 21.7  MDACIOCTL_GETHEALTHSTATUS
487
 * 21.8  MDACIOCTL_GETCONTROLLERINFO
488
 * 21.9  MDACIOCTL_GETLOGDEVINFOVALID
489
 * 21.10 MDACIOCTL_GETPHYSDEVINFOVALID
490
 * 21.11 MDACIOCTL_GETPHYSDEVSTATISTICS
491
 * 21.12 MDACIOCTL_GETLOGDEVSTATISTICS
492
 * 21.13 MDACIOCTL_GETCONTROLLERSTATISTICS
493
 * 21.27 MDACIOCTL_GETBDT_FOR_SYSDRIVE
494
 * 23.4  MDACIOCTL_CREATENEWCONF
495
 * 23.5  MDACIOCTL_ADDNEWCONF
496
 * 23.8  MDACIOCTL_GETDEVCONFINFO
497
 * 23.9  MDACIOCTL_GETFREESPACELIST
498
 * 24.1  MDACIOCTL_MORE
499
 * 25.1  MDACIOCTL_GETPHYSDEVPARAMETER
500
 * 25.2  MDACIOCTL_SETPHYSDEVPARAMETER
501
 * 25.3  MDACIOCTL_GETLOGDEVPARAMETER
502
 * 25.4  MDACIOCTL_SETLOGDEVPARAMETER
503
 * 25.5  MDACIOCTL_GETCONTROLLERPARAMETER
504
 * 25.6  MDACIOCTL_SETCONTROLLERPARAMETER
505
 *
506
 * These commands just transfer data
507
 */
508
struct mly_ioctl_param_data {
509
        u_int8_t        param[10];
510
        union mly_cmd_transfer        transfer;
511
} __packed;
512

    
513
/*
514
 * 21.2 MDACIOCTL_SETMEMORYMAILBOX
515
 */
516
struct mly_ioctl_param_setmemorymailbox {
517
        u_int8_t        health_buffer_size;
518
        u_int8_t        res1;
519
        u_int64_t        health_buffer_physaddr;
520
        u_int64_t        command_mailbox_physaddr;
521
        u_int64_t        status_mailbox_physaddr;
522
        u_int64_t        res2[2];
523
} __packed;
524

    
525
/*
526
 * 21.8.2 MDACIOCTL_GETCONTROLLERINFO: Data Format
527
 */
528
struct mly_ioctl_getcontrollerinfo {
529
        u_int8_t        res1;                                        /* N/A */
530
        u_int8_t        interface_type;
531
        u_int8_t        controller_type;
532
        u_int8_t        res2;                                        /* N/A */
533
        u_int16_t        interface_speed;
534
        u_int8_t        interface_width;
535
        u_int8_t        res3[9];                                /* N/A */
536
        char                interface_name[16];
537
        char                controller_name[16];
538
        u_int8_t        res4[16];                                /* N/A */
539
        /* firmware release information */
540
        u_int8_t        fw_major;
541
        u_int8_t        fw_minor;
542
        u_int8_t        fw_turn;
543
        u_int8_t        fw_build;
544
        u_int8_t        fw_day;
545
        u_int8_t        fw_month;
546
        u_int8_t        fw_century;
547
        u_int8_t        fw_year;
548
        /* hardware release information */
549
        u_int8_t        hw_revision;                                /* N/A */
550
        u_int8_t        res5[3];                                /* N/A */
551
        u_int8_t        hw_release_day;                                /* N/A */
552
        u_int8_t        hw_release_month;                        /* N/A */
553
        u_int8_t        hw_release_century;                        /* N/A */
554
        u_int8_t        hw_release_year;                        /* N/A */
555
        /* hardware manufacturing information */
556
        u_int8_t        batch_number;                                /* N/A */
557
        u_int8_t        res6;                                        /* N/A */
558
        u_int8_t        plant_number;
559
        u_int8_t        res7;
560
        u_int8_t        hw_manuf_day;
561
        u_int8_t        hw_manuf_month;
562
        u_int8_t        hw_manuf_century;
563
        u_int8_t        hw_manuf_year;
564
        u_int8_t        max_pdd_per_xldd;
565
        u_int8_t        max_ildd_per_xldd;
566
        u_int16_t        nvram_size;
567
        u_int8_t        max_number_of_xld;                        /* N/A */
568
        u_int8_t        res8[3];                                /* N/A */
569
        /* unique information per controller */
570
        char                serial_number[16];
571
        u_int8_t        res9[16];                                /* N/A */
572
        /* vendor information */
573
        u_int8_t        res10[3];                                /* N/A */
574
        u_int8_t        oem_information;
575
        char                vendor_name[16];                        /* N/A */
576
        /* other physical/controller/operation information */
577
        u_int8_t        bbu_present:1;
578
        u_int8_t        active_clustering:1;
579
        u_int8_t        res11:6;                                /* N/A */
580
        u_int8_t        res12[3];                                /* N/A */
581
        /* physical device scan information */
582
        u_int8_t        physical_scan_active:1;
583
        u_int8_t        res13:7;                                /* N/A */
584
        u_int8_t        physical_scan_channel;
585
        u_int8_t        physical_scan_target;
586
        u_int8_t        physical_scan_lun;
587
        /* maximum command data transfer size */
588
        u_int16_t        maximum_block_count;
589
        u_int16_t        maximum_sg_entries;
590
        /* logical/physical device counts */
591
        u_int16_t        logical_devices_present;
592
        u_int16_t        logical_devices_critical;
593
        u_int16_t        logical_devices_offline;
594
        u_int16_t        physical_devices_present;
595
        u_int16_t        physical_disks_present;
596
        u_int16_t        physical_disks_critical;                /* N/A */
597
        u_int16_t        physical_disks_offline;
598
        u_int16_t        maximum_parallel_commands;
599
        /* channel and target ID information */
600
        u_int8_t        physical_channels_present;
601
        u_int8_t        virtual_channels_present;
602
        u_int8_t        physical_channels_possible;
603
        u_int8_t        virtual_channels_possible;
604
        u_int8_t        maximum_targets_possible[16];                /* N/A (6 and up) */
605
        u_int8_t        res14[12];                                /* N/A */
606
        /* memory/cache information */
607
        u_int16_t        memory_size;
608
        u_int16_t        cache_size;
609
        u_int32_t        valid_cache_size;                        /* N/A */
610
        u_int32_t        dirty_cache_size;                        /* N/A */
611
        u_int16_t        memory_speed;
612
        u_int8_t        memory_width;
613
        u_int8_t        memory_type:5;
614
        u_int8_t        res15:1;                                /* N/A */
615
        u_int8_t        memory_parity:1;
616
        u_int8_t        memory_ecc:1;
617
        char                memory_information[16];                        /* N/A */
618
        /* execution memory information */
619
        u_int16_t        exmemory_size;
620
        u_int16_t        l2cache_size;                                /* N/A */
621
        u_int8_t        res16[8];                                /* N/A */
622
        u_int16_t        exmemory_speed;
623
        u_int8_t        exmemory_width;
624
        u_int8_t        exmemory_type:5;
625
        u_int8_t        res17:1;                                /* N/A */
626
        u_int8_t        exmemory_parity:1;
627
        u_int8_t        exmemory_ecc:1;
628
        char                exmemory_name[16];                        /* N/A */
629
        /* CPU information */
630
        struct {
631
                u_int16_t        speed;
632
                u_int8_t        type;
633
                u_int8_t        number;
634
                u_int8_t        res1[12];                        /* N/A */
635
                char                name[16];                        /* N/A */
636
        } cpu[2] __packed;
637
        /* debugging/profiling/command time tracing information */
638
        u_int16_t        profiling_page;                                /* N/A */
639
        u_int16_t        profiling_programs;                        /* N/A */
640
        u_int16_t        time_trace_page;                        /* N/A */
641
        u_int16_t        time_trace_programs;                        /* N/A */
642
        u_int8_t        res18[8];                                /* N/A */
643
        /* error counters on physical devices */
644
        u_int16_t        physical_device_bus_resets;                /* N/A */
645
        u_int16_t        physical_device_parity_errors;                /* N/A */
646
        u_int16_t        physical_device_soft_errors;                /* N/A */
647
        u_int16_t        physical_device_commands_failed;        /* N/A */
648
        u_int16_t        physical_device_miscellaneous_errors;        /* N/A */
649
        u_int16_t        physical_device_command_timeouts;        /* N/A */
650
        u_int16_t        physical_device_selection_timeouts;        /* N/A */
651
        u_int16_t        physical_device_retries;                /* N/A */
652
        u_int16_t        physical_device_aborts;                        /* N/A */
653
        u_int16_t        physical_device_host_command_aborts;        /* N/A */
654
        u_int16_t        physical_device_PFAs_detected;                /* N/A */
655
        u_int16_t        physical_device_host_commands_failed;        /* N/A */
656
        u_int8_t        res19[8];                                /* N/A */
657
        /* error counters on logical devices */
658
        u_int16_t        logical_device_soft_errors;                /* N/A */
659
        u_int16_t        logical_device_commands_failed;                /* N/A */
660
        u_int16_t        logical_device_host_command_aborts;        /* N/A */
661
        u_int16_t        res20;                                        /* N/A */
662
        /* error counters on controller */
663
        u_int16_t        controller_parity_ecc_errors;
664
        u_int16_t        controller_host_command_aborts;                /* N/A */
665
        u_int8_t        res21[4];                                /* N/A */
666
        /* long duration activity information */
667
        u_int16_t        background_inits_active;
668
        u_int16_t        logical_inits_active;
669
        u_int16_t        physical_inits_active;
670
        u_int16_t        consistency_checks_active;
671
        u_int16_t        rebuilds_active;
672
        u_int16_t        MORE_active;
673
        u_int16_t        patrol_active;                                /* N/A */
674
        u_int8_t        long_operation_status;                        /* N/A */
675
        u_int8_t        res22;                                        /* N/A */
676
        /* flash ROM information */
677
        u_int8_t        flash_type;                                /* N/A */
678
        u_int8_t        res23;                                        /* N/A */
679
        u_int16_t        flash_size;
680
        u_int32_t        flash_maximum_age;
681
        u_int32_t        flash_age;
682
        u_int8_t        res24[4];                                /* N/A */
683
        char                flash_name[16];                                /* N/A */
684
        /* firmware runtime information */
685
        u_int8_t        rebuild_rate;
686
        u_int8_t        background_init_rate;
687
        u_int8_t        init_rate;
688
        u_int8_t        consistency_check_rate;
689
        u_int8_t        res25[4];                                /* N/A */
690
        u_int32_t        maximum_dp;
691
        u_int32_t        free_dp;
692
        u_int32_t        maximum_iop;
693
        u_int32_t        free_iop;
694
        u_int16_t        maximum_comb_length;
695
        u_int16_t        maximum_configuration_groups;
696
        u_int8_t        installation_abort:1;
697
        u_int8_t        maintenance:1;
698
        u_int8_t        res26:6;                                /* N/A */
699
        u_int8_t        res27[3];                                /* N/A */
700
        u_int8_t        res28[32 + 512];                        /* N/A */
701
} __packed;
702

    
703
/*
704
 * 21.9.2 MDACIOCTL_GETLOGDEVINFOVALID
705
 */
706
struct mly_ioctl_getlogdevinfovalid {
707
        u_int8_t        res1;                                        /* N/A */
708
        u_int8_t        channel;
709
        u_int8_t        target;
710
        u_int8_t        lun;
711
        u_int8_t        state;                                        /* see 8.1 */
712
        u_int8_t        raid_level;                                /* see 8.2 */
713
        u_int8_t        stripe_size;                                /* see 8.3 */
714
        u_int8_t        cache_line_size;                        /* see 8.4 */
715
        u_int8_t        read_write_control;                        /* see 8.5 */
716
        u_int8_t        consistency_check:1;
717
        u_int8_t        rebuild:1;
718
        u_int8_t        make_consistent:1;
719
        u_int8_t        initialisation:1;
720
        u_int8_t        migration:1;
721
        u_int8_t        patrol:1;
722
        u_int8_t        res2:2;                                        /* N/A */
723
        u_int8_t        ar5_limit;
724
        u_int8_t        ar5_algo;
725
        u_int16_t        logical_device_number;
726
        u_int16_t        bios_control;
727
        /* erorr counters */
728
        u_int16_t        soft_errors;                                /* N/A */
729
        u_int16_t        commands_failed;                        /* N/A */
730
        u_int16_t        host_command_aborts;                        /* N/A */
731
        u_int16_t        deferred_write_errors;                        /* N/A */
732
        u_int8_t        res3[8];                                /* N/A */
733
        /* device size information */
734
        u_int8_t        res4[2];                                /* N/A */
735
        u_int16_t        device_block_size;
736
        u_int32_t        original_device_size;                        /* N/A */
737
        u_int32_t        device_size;                /* XXX "blocks or MB" Huh? */
738
        u_int8_t        res5[4];                                /* N/A */
739
        char                device_name[32];                        /* N/A */
740
        u_int8_t        inquiry[36];
741
        u_int8_t        res6[12];                                /* N/A */
742
        u_int64_t        last_read_block;                        /* N/A */
743
        u_int64_t        last_written_block;                        /* N/A */
744
        u_int64_t        consistency_check_block;
745
        u_int64_t        rebuild_block;
746
        u_int64_t        make_consistent_block;
747
        u_int64_t        initialisation_block;
748
        u_int64_t        migration_block;
749
        u_int64_t        patrol_block;                                /* N/A */
750
        u_int8_t        res7[64];                                /* N/A */
751
} __packed;
752

    
753
/*
754
 * 21.10.2 MDACIOCTL_GETPHYSDEVINFOVALID: Data Format
755
 */
756
struct mly_ioctl_getphysdevinfovalid {
757
        u_int8_t        res1;
758
        u_int8_t        channel;
759
        u_int8_t        target;
760
        u_int8_t        lun;
761
        u_int8_t        raid_ft:1;                        /* configuration status */
762
        u_int8_t        res2:1;                                        /* N/A */
763
        u_int8_t        local:1;
764
        u_int8_t        res3:5;
765
        u_int8_t        host_dead:1;                        /* multiple host/controller status *//* N/A */
766
        u_int8_t        host_connection_dead:1;                        /* N/A */
767
        u_int8_t        res4:6;                                        /* N/A */
768
        u_int8_t        state;                                /* see 8.1 */
769
        u_int8_t        width;
770
        u_int16_t        speed;
771
        /* multiported physical device information */
772
        u_int8_t        ports_available;                        /* N/A */
773
        u_int8_t        ports_inuse;                                /* N/A */
774
        u_int8_t        res5[4];
775
        u_int8_t        ether_address[16];                        /* N/A */
776
        u_int16_t        command_tags;
777
        u_int8_t        consistency_check:1;                        /* N/A */
778
        u_int8_t        rebuild:1;                                /* N/A */
779
        u_int8_t        make_consistent:1;                        /* N/A */
780
        u_int8_t        initialisation:1;
781
        u_int8_t        migration:1;                                /* N/A */
782
        u_int8_t        patrol:1;                                /* N/A */
783
        u_int8_t        res6:2;
784
        u_int8_t        long_operation_status;                        /* N/A */
785
        u_int8_t        parity_errors;
786
        u_int8_t        soft_errors;
787
        u_int8_t        hard_errors;
788
        u_int8_t        miscellaneous_errors;
789
        u_int8_t        command_timeouts;                        /* N/A */
790
        u_int8_t        retries;                                /* N/A */
791
        u_int8_t        aborts;                                        /* N/A */
792
        u_int8_t        PFAs_detected;                                /* N/A */
793
        u_int8_t        res7[6];
794
        u_int16_t        block_size;
795
        u_int32_t        original_device_size;                /* XXX "blocks or MB" Huh? */
796
        u_int32_t        device_size;                        /* XXX "blocks or MB" Huh? */
797
        u_int8_t        res8[4];
798
        char                name[16];                                /* N/A */
799
        u_int8_t        res9[16 + 32];
800
        u_int8_t        inquiry[36];
801
        u_int8_t        res10[12 + 16];
802
        u_int64_t        last_read_block;                        /* N/A */
803
        u_int64_t        last_written_block;                        /* N/A */
804
        u_int64_t        consistency_check_block;                /* N/A */
805
        u_int64_t        rebuild_block;                                /* N/A */
806
        u_int64_t        make_consistent_block;                        /* N/A */
807
        u_int64_t        initialisation_block;                        /* N/A */
808
        u_int64_t        migration_block;                        /* N/A */
809
        u_int64_t        patrol_block;                                /* N/A */
810
        u_int8_t        res11[256];
811
} __packed;
812

    
813
union mly_devinfo {
814
        struct mly_ioctl_getlogdevinfovalid        logdev;
815
        struct mly_ioctl_getphysdevinfovalid        physdev;
816
};
817

    
818
/*
819
 * 21.11.2 MDACIOCTL_GETPHYSDEVSTATISTICS: Data Format
820
 * 21.12.2 MDACIOCTL_GETLOGDEVSTATISTICS: Data Format
821
 */
822
struct mly_ioctl_getdevstatistics {
823
        u_int32_t        uptime_ms;                        /* getphysedevstatistics only */
824
        u_int8_t        res1[5];                                /* N/A */
825
        u_int8_t        channel;
826
        u_int8_t        target;
827
        u_int8_t        lun;
828
        u_int16_t        raid_device;                        /* getlogdevstatistics only */
829
        u_int8_t        res2[2];                                /* N/A */
830
        /* total read/write performance including cache data */
831
        u_int32_t        total_reads;
832
        u_int32_t        total_writes;
833
        u_int32_t        total_read_size;
834
        u_int32_t        total_write_size;
835
        /* cache read/write performance */
836
        u_int32_t        cache_reads;                                /* N/A */
837
        u_int32_t        cache_writes;                                /* N/A */
838
        u_int32_t        cache_read_size;                        /* N/A */
839
        u_int32_t        cache_write_size;                        /* N/A */
840
        /* commands active/wait information */
841
        u_int32_t        command_waits_done;                        /* N/A */
842
        u_int16_t        active_commands;                        /* N/A */
843
        u_int16_t        waiting_commands;                        /* N/A */
844
        u_int8_t        res3[8];                                /* N/A */
845
} __packed;
846

    
847
/*
848
 * 21.13.2 MDACIOCTL_GETCONTROLLERSTATISTICS: Data Format
849
 */
850
struct mly_ioctl_getcontrollerstatistics {
851
        u_int32_t        uptime_ms;                                /* N/A */
852
        u_int8_t        res1[12];                                /* N/A */
853
        /* target physical device performance data information */
854
        u_int32_t        target_physical_device_interrupts;        /* N/A */
855
        u_int32_t        target_physical_device_stray_interrupts;/* N/A */
856
        u_int8_t        res2[8];                                /* N/A */
857
        u_int32_t        target_physical_device_reads;                /* N/A */
858
        u_int32_t        target_physical_device_writes;                /* N/A */
859
        u_int32_t        target_physical_device_read_size;        /* N/A */
860
        u_int32_t        target_physical_device_write_size;        /* N/A */
861
        /* host system performance data information */
862
        u_int32_t        host_system_interrupts;                        /* N/A */
863
        u_int32_t        host_system_stray_interrupts;                /* N/A */
864
        u_int32_t        host_system_sent_interrupts;                /* N/A */
865
        u_int8_t        res3[4];                                /* N/A */
866
        u_int32_t        physical_device_reads;                        /* N/A */
867
        u_int32_t        physical_device_writes;                        /* N/A */
868
        u_int32_t        physical_device_read_size;                /* N/A */
869
        u_int32_t        physical_device_write_size;                /* N/A */
870
        u_int32_t        physical_device_cache_reads;                /* N/A */
871
        u_int32_t        physical_device_cache_writes;                /* N/A */
872
        u_int32_t        physical_device_cache_read_size;        /* N/A */
873
        u_int32_t        physical_device_cache_write_size;        /* N/A */
874
        u_int32_t        logical_device_reads;                        /* N/A */
875
        u_int32_t        logical_device_writes;                        /* N/A */
876
        u_int32_t        logical_device_read_size;                /* N/A */
877
        u_int32_t        logical_device_write_size;                /* N/A */
878
        u_int32_t        logical_device_cache_reads;                /* N/A */
879
        u_int32_t        logical_device_cache_writes;                /* N/A */
880
        u_int32_t        logical_device_cache_read_size;                /* N/A */
881
        u_int32_t        logical_device_cache_write_size;        /* N/A */
882
        u_int16_t        target_physical_device_commands_active;        /* N/A */
883
        u_int16_t        target_physical_device_commands_waiting;/* N/A */
884
        u_int16_t        host_system_commands_active;                /* N/A */
885
        u_int16_t        host_system_commands_waiting;                /* N/A */
886
        u_int8_t        res4[48 + 64];                                /* N/A */
887
} __packed;
888

    
889
/*
890
 * 21.2 MDACIOCTL_SETRAIDDEVSTATE
891
 */
892
struct mly_ioctl_param_setraiddevstate {
893
        u_int8_t        state;
894
} __packed;
895

    
896
/*
897
 * 21.27.2 MDACIOCTL_GETBDT_FOR_SYSDRIVE: Data Format
898
 */
899
#define        MLY_MAX_BDT_ENTRIES        1022
900
struct mly_ioctl_getbdt_for_sysdrive {
901
        u_int32_t        num_of_bdt_entries;
902
        u_int32_t        bad_data_block_address[MLY_MAX_BDT_ENTRIES];
903
} __packed;
904

    
905
/*
906
 * 22.1 Physical Device Definition (PDD)
907
 */
908
struct mly_pdd {
909
        u_int8_t        type;                                /* see 8.2 */
910
        u_int8_t        state;                                /* see 8.1 */
911
        u_int16_t        raid_device;
912
        u_int32_t        device_size;                        /* XXX "block or MB" Huh? */
913
        u_int8_t        controller;
914
        u_int8_t        channel;
915
        u_int8_t        target;
916
        u_int8_t        lun;
917
        u_int32_t        start_address;
918
} __packed;
919

    
920
/*
921
 * 22.2 RAID Device Use Definition (UDD)
922
 */
923
struct mly_udd {
924
        u_int8_t        res1;
925
        u_int8_t        state;                                /* see 8.1 */
926
        u_int16_t        raid_device;
927
        u_int32_t        start_address;
928
} __packed;
929

    
930
/*
931
 * RAID Device Definition (LDD)
932
 */
933
struct mly_ldd {
934
        u_int8_t        type;                                /* see 8.2 */
935
        u_int8_t        state;                                /* see 8.1 */
936
        u_int16_t        raid_device;
937
        u_int32_t        device_size;                        /* XXX "block or MB" Huh? */
938
        u_int8_t        devices_used_count;
939
        u_int8_t        stripe_size;                        /* see 8.3 */
940
        u_int8_t        cache_line_size;                /* see 8.4 */
941
        u_int8_t        read_write_control;                /* see 8.5 */
942
        u_int32_t        devices_used_size;                /* XXX "block or MB" Huh? */
943
        u_int16_t        devices_used[32];                /* XXX actual size of this field unknown! */
944
} __packed;
945

    
946
/*
947
 * Define a datastructure giving the smallest allocation that will hold
948
 * a PDD, UDD or LDD for MDACIOCTL_GETDEVCONFINFO.
949
 */
950
struct mly_devconf_hdr {
951
        u_int8_t        type;                                /* see 8.2 */
952
        u_int8_t        state;                                /* see 8.1 */
953
        u_int16_t        raid_device;
954
};
955

    
956
union mly_ioctl_devconfinfo {
957
        struct mly_pdd                pdd;
958
        struct mly_udd                udd;
959
        struct mly_ldd                ldd;
960
        struct mly_devconf_hdr        hdr;
961
};
962

    
963
/*
964
 * 22.3 MDACIOCTL_RENAMERAIDDEV
965
 *
966
 * XXX this command is listed as transferring data, but does not define the data.
967
 */
968
struct mly_ioctl_param_renameraiddev {
969
        u_int8_t        new_raid_device;
970
} __packed;
971

    
972
/*
973
 * 23.6.2 MDACIOCTL_XLATEPHYSDEVTORAIDDEV
974
 *
975
 * XXX documentation suggests this format will change
976
 */
977
struct mly_ioctl_param_xlatephysdevtoraiddev {
978
        u_int16_t        raid_device;
979
        u_int8_t        res1[2];
980
        u_int8_t        controller;
981
        u_int8_t        channel;
982
        u_int8_t        target;
983
        u_int8_t        lun;
984
} __packed;
985

    
986
/*
987
 * 23.7 MDACIOCTL_GETGROUPCONFINFO
988
 */
989
struct mly_ioctl_param_getgroupconfinfo {
990
        u_int16_t                        group;
991
        u_int8_t                        res1[8];
992
        union mly_cmd_transfer        transfer;
993
} __packed;
994

    
995
/*
996
 * 23.9.2 MDACIOCTL_GETFREESPACELIST: Data Format
997
 *
998
 * The controller will populate as much of this structure as is provided,
999
 * or as is required to fully list the free space available.
1000
 */
1001
struct mly_ioctl_getfreespacelist_entry {
1002
        u_int16_t        raid_device;
1003
        u_int8_t        res1[6];
1004
        u_int32_t        address;                /* XXX "blocks or MB" Huh? */
1005
        u_int32_t        size;                        /* XXX "blocks or MB" Huh? */
1006
} __packed;
1007

    
1008
struct mly_ioctl_getfrespacelist {
1009
        u_int16_t        returned_entries;
1010
        u_int16_t        total_entries;
1011
        u_int8_t        res1[12];
1012
        struct mly_ioctl_getfreespacelist_entry space[];        /* expand to suit */
1013
} __packed;
1014

    
1015
/*
1016
 * 27.1 MDACIOCTL_GETSUBSYSTEMDATA
1017
 * 27.2 MDACIOCTL_SETSUBSYSTEMDATA
1018
 *
1019
 * PCI controller only supports a limited subset of the possible operations.
1020
 *
1021
 * XXX where does the status end up? (the command transfers no data)
1022
 */
1023
struct mly_ioctl_param_subsystemdata {
1024
        u_int8_t        operation:4;
1025
#define        MLY_BBU_GETSTATUS        0x00
1026
#define        MLY_BBU_SET_THRESHOLD        0x00        /* minutes in param[0,1] */
1027
        u_int8_t        subsystem:4;
1028
#define        MLY_SUBSYSTEM_BBU        0x01
1029
        u_int        parameter[3];                /* only for SETSUBSYSTEMDATA */
1030
} __packed;
1031

    
1032
struct mly_ioctl_getsubsystemdata_bbustatus {
1033
        u_int16_t        current_power;
1034
        u_int16_t        maximum_power;
1035
        u_int16_t        power_threshold;
1036
        u_int8_t        charge_level;
1037
        u_int8_t        hardware_version;
1038
        u_int8_t        battery_type;
1039
#define        MLY_BBU_TYPE_UNKNOWN        0x00
1040
#define        MLY_BBU_TYPE_NICAD        0x01
1041
#define        MLY_BBU_TYPE_MISSING        0xfe
1042
        u_int8_t        res1;
1043
        u_int8_t        operation_status;
1044
#define        MLY_BBU_STATUS_NO_SYNC                0x01
1045
#define        MLY_BBU_STATUS_OUT_OF_SYNC        0x02
1046
#define        MLY_BBU_STATUS_FIRST_WARNING        0x04
1047
#define        MLY_BBU_STATUS_SECOND_WARNING        0x08
1048
#define        MLY_BBU_STATUS_RECONDITIONING        0x10
1049
#define        MLY_BBU_STATUS_DISCHARGING        0x20
1050
#define        MLY_BBU_STATUS_FASTCHARGING        0x40
1051
        u_int8_t        res2;
1052
} __packed;
1053

    
1054
/*
1055
 * 28.9  MDACIOCTL_RESETDEVICE
1056
 * 28.10 MDACIOCTL_FLUSHDEVICEDATA
1057
 * 28.11 MDACIOCTL_PAUSEDEVICE
1058
 * 28.12 MDACIOCTL_UNPAUSEDEVICE
1059
 */
1060
struct mly_ioctl_param_deviceoperation {
1061
        u_int8_t        operation_device;                /* see 14.3 */
1062
} __packed;
1063

    
1064
/*
1065
 * 31.1 Event Data Format
1066
 */
1067
struct mly_event {
1068
        u_int32_t        sequence_number;
1069
        u_int32_t        timestamp;
1070
        u_int32_t        code;
1071
        u_int8_t        controller;
1072
        u_int8_t        channel;
1073
        u_int8_t        target;                                /* also enclosure */
1074
        u_int8_t        lun;                                /* also enclosure unit */
1075
        u_int8_t           res1[4];
1076
        u_int32_t        param;
1077
        u_int8_t        sense[40];
1078
} __packed;
1079

    
1080
/*
1081
 * 31.2 MDACIOCTL_GETEVENT
1082
 */
1083
struct mly_ioctl_param_getevent {
1084
        u_int16_t                sequence_number_low;
1085
        u_int8_t                res1[8];
1086
        union mly_cmd_transfer        transfer;
1087
} __packed;
1088

    
1089
union mly_ioctl_param {
1090
        struct mly_ioctl_param_data                        data;
1091
        struct mly_ioctl_param_setmemorymailbox                setmemorymailbox;
1092
        struct mly_ioctl_param_setraiddevstate                setraiddevstate;
1093
        struct mly_ioctl_param_renameraiddev                renameraiddev;
1094
        struct mly_ioctl_param_xlatephysdevtoraiddev        xlatephysdevtoraiddev;
1095
        struct mly_ioctl_param_getgroupconfinfo                getgroupconfinfo;
1096
        struct mly_ioctl_param_subsystemdata                subsystemdata;
1097
        struct mly_ioctl_param_deviceoperation                deviceoperation;
1098
        struct mly_ioctl_param_getevent                        getevent;
1099
};
1100

    
1101
/*
1102
 * 19 SCSI Command Format
1103
 */
1104
#define        MLY_PHYADDR(c, b, t, l)        \
1105
        ((l) | ((t) << 8) | ((b) << 16) | ((c) << 19))
1106
#define        MLY_LOGADDR(c, u)        \
1107
        ((u) | ((c) << 19))
1108

    
1109
#define        MLY_LOGADDR_DEV(a)                (a & 0xffff)
1110
#define        MLY_LOGADDR_CTLR(a)                (a >> 19)
1111

    
1112
#define        MLY_PHYADDR_LUN(a)                (a & 0xff)
1113
#define        MLY_PHYADDR_TARGET(a)                ((a >> 8) & 0xff)
1114
#define        MLY_PHYADDR_CHANNEL(a)                ((a >> 16) & 0x07)
1115
#define        MLY_PHYADDR_CTLR(a)                ((a >> 19) & 0x1f)
1116

    
1117
/*
1118
 * struct mly_cmd_address_physical {
1119
 *        u_int8_t                        lun;
1120
 *        u_int8_t                        target;
1121
 *        u_int8_t                        channel:3;
1122
 *        u_int8_t                        controller:5;
1123
 * } __packed;
1124
 *
1125
 * struct mly_cmd_address_logical {
1126
 *        u_int16_t                        logdev;
1127
 *        u_int8_t                        res1:3;
1128
 *        u_int8_t                        controller:5;
1129
 * } __packed;
1130
 */
1131

    
1132
struct mly_cmd_generic {
1133
        u_int16_t                        command_id;
1134
        u_int8_t                        opcode;
1135
        u_int8_t                        command_control;
1136
        u_int32_t                        data_size;
1137
        u_int64_t                        sense_buffer_address;
1138
        u_int8_t                        addr[3];
1139
        u_int8_t                        timeout;
1140
        u_int8_t                        maximum_sense_size;
1141
        u_int8_t                        res1[11];
1142
        union mly_cmd_transfer        transfer;
1143
} __packed;
1144

    
1145

    
1146
/*
1147
 * 19.1 MDACMD_SCSI & MDACMD_SCSIPT
1148
 */
1149
#define        MLY_CMD_SCSI_SMALL_CDB        10
1150
struct mly_cmd_scsi_small {
1151
        u_int16_t                        command_id;
1152
        u_int8_t                        opcode;
1153
        u_int8_t                        command_control;
1154
        u_int32_t                        data_size;
1155
        u_int64_t                        sense_buffer_address;
1156
        u_int8_t                        addr[3];
1157
        u_int8_t                        timeout;
1158
        u_int8_t                        maximum_sense_size;
1159
        u_int8_t                        cdb_length;
1160
        u_int8_t                        cdb[MLY_CMD_SCSI_SMALL_CDB];
1161
        union mly_cmd_transfer        transfer;
1162
} __packed;
1163

    
1164
/*
1165
 * 19.2 MDACMD_SCSILC & MDACMD_SCSILCPT
1166
 */
1167
struct mly_cmd_scsi_large {
1168
        u_int16_t                        command_id;
1169
        u_int8_t                        opcode;
1170
        u_int8_t                        command_control;
1171
        u_int32_t                        data_size;
1172
        u_int64_t                        sense_buffer_address;
1173
        u_int8_t                        addr[3];
1174
        u_int8_t                        timeout;
1175
        u_int8_t                        maximum_sense_size;
1176
        u_int8_t                        cdb_length;
1177
        u_int16_t                        res1;
1178
        u_int64_t                        cdb_physaddr;
1179
        union mly_cmd_transfer        transfer;
1180
} __packed;
1181

    
1182
/*
1183
 * 20.1 IOCTL Command Format: Internal Bus
1184
 */
1185
struct mly_cmd_ioctl {
1186
        u_int16_t                        command_id;
1187
        u_int8_t                        opcode;
1188
        u_int8_t                        command_control;
1189
        u_int32_t                        data_size;
1190
        u_int64_t                        sense_buffer_address;
1191
        u_int8_t                        addr[3];
1192
        u_int8_t                        timeout;
1193
        u_int8_t                        maximum_sense_size;
1194
        u_int8_t                        sub_ioctl;
1195
        union mly_ioctl_param                param;
1196
} __packed;
1197

    
1198
/*
1199
 * PG6: 8.2.2
1200
 */
1201
struct mly_cmd_mmbox {
1202
        u_int32_t                        flag;
1203
        u_int8_t                        data[60];
1204
} __packed;
1205

    
1206
union mly_cmd_packet {
1207
        struct mly_cmd_generic                generic;
1208
        struct mly_cmd_scsi_small        scsi_small;
1209
        struct mly_cmd_scsi_large        scsi_large;
1210
        struct mly_cmd_ioctl                ioctl;
1211
        struct mly_cmd_mmbox                mmbox;
1212
};
1213

    
1214
/*
1215
 * PG6: 5.3
1216
 */
1217
#define        MLY_I960RX_COMMAND_MAILBOX        0x10
1218
#define        MLY_I960RX_STATUS_MAILBOX        0x18
1219
#define        MLY_I960RX_IDBR                        0x20
1220
#define        MLY_I960RX_ODBR                        0x2c
1221
#define        MLY_I960RX_ERROR_STATUS                0x2e
1222
#define        MLY_I960RX_INTERRUPT_STATUS        0x30
1223
#define        MLY_I960RX_INTERRUPT_MASK        0x34
1224

    
1225
#define        MLY_STRONGARM_COMMAND_MAILBOX        0x50
1226
#define        MLY_STRONGARM_STATUS_MAILBOX        0x58
1227
#define        MLY_STRONGARM_IDBR                0x60
1228
#define        MLY_STRONGARM_ODBR                0x61
1229
#define        MLY_STRONGARM_ERROR_STATUS        0x63
1230
#define        MLY_STRONGARM_INTERRUPT_STATUS        0x30
1231
#define        MLY_STRONGARM_INTERRUPT_MASK        0x34
1232

    
1233
/*
1234
 * PG6: 5.4.3 Doorbell 0
1235
 */
1236
#define        MLY_HM_CMDSENT                        (1<<0)
1237
#define        MLY_HM_STSACK                        (1<<1)
1238
#define        MLY_SOFT_RST                        (1<<3)
1239
#define        MLY_AM_CMDSENT                        (1<<4)
1240

    
1241
/*
1242
 * PG6: 5.4.4 Doorbell 1
1243
 *
1244
 * Note that the documentation claims that these bits are set when the
1245
 * status queue(s) are empty, wheras the Linux driver and experience
1246
 * suggest they are set when there is status available.
1247
 */
1248
#define        MLY_HM_STSREADY                        (1<<0)
1249
#define        MLY_AM_STSREADY                        (1<<1)
1250

    
1251
/*
1252
 * PG6: 5.4.6 Doorbell 3
1253
 */
1254
#define        MLY_MSG_EMPTY                        (1<<3)
1255
#define        MLY_MSG_SPINUP                        0x08
1256
#define        MLY_MSG_RACE_RECOVERY_FAIL        0x60
1257
#define        MLY_MSG_RACE_IN_PROGRESS        0x70
1258
#define        MLY_MSG_RACE_ON_CRITICAL        0xb0
1259
#define        MLY_MSG_PARITY_ERROR                0xf0
1260

    
1261
/*
1262
 * PG6: 5.4.8 Outbound Interrupt Mask
1263
 */
1264
#define        MLY_INTERRUPT_MASK_DISABLE        0xff
1265
#define        MLY_INTERRUPT_MASK_ENABLE        (0xff & ~(1<<2))
1266

    
1267
/*
1268
 * PG6: 8.2 Advanced Mailbox Scheme
1269
 *
1270
 * Note that this must be allocated on a 4k boundary, and all internal
1271
 * fields must also reside on a 4k boundary.
1272
 * We could dynamically size this structure, but the extra effort
1273
 * is probably unjustified.  Note that these buffers do not need to be
1274
 * adjacent - we just group them to simplify allocation of the bus-visible
1275
 * buffer.
1276
 *
1277
 * XXX Note that for some reason, if MLY_MMBOX_COMMANDS is > 64, the controller
1278
 * fails to respond to the command at (MLY_MMBOX_COMMANDS - 64).  It's not
1279
 * wrapping to 0 at this point (determined by experimentation).  This is not
1280
 * consistent with the Linux driver's implementation.
1281
 * Whilst it's handy to have lots of room for status returns in case we end up
1282
 * being slow getting back to completed commands, it seems unlikely that we
1283
 * would get 64 commands ahead of the controller on the submissions side, so
1284
 * the current workaround is to simply limit the command ring to 64 entries.
1285
 */
1286
union mly_status_packet {
1287
         struct mly_status                status;
1288
         struct {
1289
                 u_int32_t                flag;
1290
                 u_int8_t                data[4];
1291
         } __packed mmbox;
1292
};
1293
union mly_health_region {
1294
        struct mly_health_status        status;
1295
        u_int8_t                        pad[1024];
1296
};
1297

    
1298
#define        MLY_MMBOX_COMMANDS                64
1299
#define        MLY_MMBOX_STATUS                512
1300
struct mly_mmbox {
1301
        union mly_cmd_packet        mmm_command[MLY_MMBOX_COMMANDS];
1302
        union mly_status_packet        mmm_status[MLY_MMBOX_STATUS];
1303
        union mly_health_region        mmm_health;
1304
} __packed;
1305

    
1306
#endif        /* !defined _PCI_MLYREG_H_ */