1/*	$NetBSD: i2o.h,v 1.18 2023/09/07 20:03:25 ad Exp $	*/
2
3/*-
4 * Copyright (c) 2000, 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.
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 * Structures and constants, as presented by the I2O specification revision
34 * 1.5 (obtainable from http://www.intelligent-io.com/).  Currently, only
35 * what's useful to us is defined in this file.  LAN defs used to be here
36 * but were removed as they're useless.
37 */
38
39#ifndef	_I2O_I2O_H_
40#define	_I2O_I2O_H_
41
42#include <sys/cdefs.h>
43#include <sys/types.h>
44
45/*
46 * ================= Miscellaneous definitions =================
47 */
48
49/* Organisation IDs */
50#define	I2O_ORG_DPT			0x001b
51#define	I2O_ORG_INTEL			0x0028
52#define	I2O_ORG_AMI			0x1000
53
54/* Macros to assist in building message headers */
55#define	I2O_MSGFLAGS(s)		(I2O_VERSION_11 | (sizeof(struct s) << 14))
56#define	I2O_MSGFUNC(t, f)	((t) | (I2O_TID_HOST << 12) | ((f) << 24))
57#define	I2O_MSGPRIV(o, f)	((f) | ((o) << 16))
58
59/* Common message function codes with no payload or an undefined payload */
60#define	I2O_UTIL_NOP			0x00
61#define	I2O_EXEC_IOP_CLEAR		0xbe
62#define	I2O_EXEC_SYS_QUIESCE		0xc3
63#define	I2O_EXEC_SYS_ENABLE		0xd1
64#define	I2O_PRIVATE_MESSAGE		0xff
65
66/* Device class codes */
67#define	I2O_CLASS_EXECUTIVE			0x00
68#define	I2O_CLASS_DDM				0x01
69#define	I2O_CLASS_RANDOM_BLOCK_STORAGE		0x10
70#define	I2O_CLASS_SEQUENTIAL_STORAGE		0x11
71#define	I2O_CLASS_LAN				0x20
72#define	I2O_CLASS_WAN				0x30
73#define	I2O_CLASS_FIBRE_CHANNEL_PORT		0x40
74#define	I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL	0x41
75#define	I2O_CLASS_SCSI_PERIPHERAL		0x51
76#define	I2O_CLASS_ATE_PORT			0x60
77#define	I2O_CLASS_ATE_PERIPHERAL		0x61
78#define	I2O_CLASS_FLOPPY_CONTROLLER		0x70
79#define	I2O_CLASS_FLOPPY_DEVICE			0x71
80#define	I2O_CLASS_BUS_ADAPTER_PORT		0x80
81
82#define	I2O_CLASS_ANY				0xffffffff
83
84/* Reply status codes */
85#define	I2O_STATUS_SUCCESS			0x00
86#define	I2O_STATUS_ABORT_DIRTY			0x01
87#define	I2O_STATUS_ABORT_NO_DATA_XFER		0x02
88#define	I2O_STATUS_ABORT_PARTIAL_XFER		0x03
89#define	I2O_STATUS_ERROR_DIRTY			0x04
90#define	I2O_STATUS_ERROR_NO_DATA_XFER		0x05
91#define	I2O_STATUS_ERROR_PARTIAL_XFER		0x06
92#define	I2O_STATUS_PROCESS_ABORT_DIRTY        	0x08
93#define	I2O_STATUS_PROCESS_ABORT_NO_DATA_XFER	0x09
94#define	I2O_STATUS_PROCESS_ABORT_PARTIAL_XFER	0x0a
95#define	I2O_STATUS_TRANSACTION_ERROR		0x0b
96#define	I2O_STATUS_PROGRESS_REPORT		0x80
97
98/* Detailed status codes */
99#define	I2O_DSC_SUCCESS				0x00
100#define	I2O_DSC_BAD_KEY				0x02
101#define	I2O_DSC_TCL_ERROR			0x03
102#define	I2O_DSC_REPLY_BUFFER_FULL		0x04
103#define	I2O_DSC_NO_SUCH_PAGE			0x05
104#define	I2O_DSC_INSUFFICIENT_RESOURCE_SOFT	0x06
105#define	I2O_DSC_INSUFFICIENT_RESOURCE_HARD	0x07
106#define	I2O_DSC_CHAIN_BUFFER_TOO_LARGE		0x09
107#define	I2O_DSC_UNSUPPORTED_FUNCTION		0x0a
108#define	I2O_DSC_DEVICE_LOCKED			0x0b
109#define	I2O_DSC_DEVICE_RESET			0x0c
110#define	I2O_DSC_INAPPROPRIATE_FUNCTION		0x0d
111#define	I2O_DSC_INVALID_INITIATOR_ADDRESS	0x0e
112#define	I2O_DSC_INVALID_MESSAGE_FLAGS		0x0f
113#define	I2O_DSC_INVALID_OFFSET			0x10
114#define	I2O_DSC_INVALID_PARAMETER		0x11
115#define	I2O_DSC_INVALID_REQUEST			0x12
116#define	I2O_DSC_INVALID_TARGET_ADDRESS		0x13
117#define	I2O_DSC_MESSAGE_TOO_LARGE		0x14
118#define	I2O_DSC_MESSAGE_TOO_SMALL		0x15
119#define	I2O_DSC_MISSING_PARAMETER		0x16
120#define	I2O_DSC_TIMEOUT				0x17
121#define	I2O_DSC_UNKNOWN_ERROR			0x18
122#define	I2O_DSC_UNKNOWN_FUNCTION		0x19
123#define	I2O_DSC_UNSUPPORTED_VERSION		0x1a
124#define	I2O_DSC_DEVICE_BUSY			0x1b
125#define	I2O_DSC_DEVICE_NOT_AVAILABLE		0x1c
126
127/* Message versions */
128#define	I2O_VERSION_10			0x00
129#define	I2O_VERSION_11			0x01
130#define	I2O_VERSION_20			0x02
131
132/* Commonly used TIDs */
133#define	I2O_TID_IOP			0
134#define	I2O_TID_HOST			1
135#define	I2O_TID_NONE			4095
136
137/* SGL flags.  This list covers only a fraction of the possibilities. */
138#define	I2O_SGL_IGNORE			0x00000000
139#define	I2O_SGL_SIMPLE			0x10000000
140#define	I2O_SGL_PAGE_LIST		0x20000000
141
142#define	I2O_SGL_BC_32BIT		0x01000000
143#define	I2O_SGL_BC_64BIT		0x02000000
144#define	I2O_SGL_BC_96BIT		0x03000000
145#define	I2O_SGL_DATA_OUT		0x04000000
146#define	I2O_SGL_END_BUFFER		0x40000000
147#define	I2O_SGL_END			0x80000000
148
149/* Serial number formats */
150#define	I2O_SNFMT_UNKNOWN		0
151#define	I2O_SNFMT_BINARY		1
152#define	I2O_SNFMT_ASCII			2
153#define	I2O_SNFMT_UNICODE		3
154#define	I2O_SNFMT_LAN_MAC		4
155#define	I2O_SNFMT_WAN_MAC		5
156
157/*
158 * ================= Common structures =================
159 */
160
161/*
162 * Standard I2O message frame.  All message frames begin with this.
163 *
164 * Bits  Field          Meaning
165 * ----  -------------  ----------------------------------------------------
166 * 0-2   msgflags       Message header version. Must be 001 (little endian).
167 * 3     msgflags	Reserved.
168 * 4-7   msgflags       Offset to SGLs expressed as # of 32-bit words.
169 * 8-15  msgflags       Control flags.
170 * 16-31 msgflags       Message frame size expressed as # of 32-bit words.
171 * 0-11  msgfunc	TID of target.
172 * 12-23 msgfunc        TID of initiator.
173 * 24-31 msgfunc        Function (i.e., type of message).
174 */
175struct i2o_msg {
176	u_int32_t	msgflags;
177	u_int32_t	msgfunc;
178	u_int32_t	msgictx;	/* Initiator context */
179	u_int32_t	msgtctx;	/* Transaction context */
180
181	/* Message payload */
182
183} __packed;
184
185#define	I2O_MSGFLAGS_STATICMF		0x0100
186#define	I2O_MSGFLAGS_64BIT		0x0200
187#define	I2O_MSGFLAGS_MULTI		0x1000
188#define	I2O_MSGFLAGS_FAIL		0x2000
189#define	I2O_MSGFLAGS_LAST_REPLY		0x4000
190#define	I2O_MSGFLAGS_REPLY		0x8000
191
192/*
193 * Standard reply frame.  msgflags, msgfunc, msgictx and msgtctx have the
194 * same meaning as in `struct i2o_msg'.
195 */
196struct i2o_reply {
197	u_int32_t	msgflags;
198	u_int32_t	msgfunc;
199	u_int32_t	msgictx;
200	u_int32_t	msgtctx;
201	u_int16_t	detail;		/* Detailed status code */
202	u_int8_t	reserved;
203	u_int8_t	reqstatus;	/* Request status code */
204
205	/* Reply payload */
206
207} __packed;
208
209/*
210 * Fault notification reply, returned when a message frame can not be
211 * processed (i.e I2O_MSGFLAGS_FAIL is set in the reply).
212 */
213struct i2o_fault_notify {
214	u_int32_t	msgflags;
215	u_int32_t	msgfunc;
216	u_int32_t	msgictx;
217	u_int32_t	msgtctx;	/* Not valid! */
218	u_int8_t	lowestver;
219	u_int8_t	highestver;
220	u_int8_t	severity;
221	u_int8_t	failurecode;
222	u_int16_t	failingiop;	/* Bits 0-12 only */
223	u_int16_t	failinghostunit;
224	u_int32_t	agelimit;
225	u_int32_t	lowmfa;
226	u_int32_t	highmfa;
227};
228
229/*
230 * Hardware resource table.  Not documented here.
231 */
232struct i2o_hrt_entry {
233	u_int32_t	adapterid;
234	u_int16_t	controllingtid;
235	u_int8_t	busnumber;
236	u_int8_t	bustype;
237	u_int8_t	businfo[8];
238} __packed;
239
240struct i2o_hrt {
241	u_int16_t	numentries;
242	u_int8_t	entrysize;
243	u_int8_t	hrtversion;
244	u_int32_t	changeindicator;
245	struct i2o_hrt_entry	entry[1];
246} __packed;
247
248/*
249 * Logical configuration table entry.  Bitfields are broken down as follows:
250 *
251 * Bits   Field           Meaning
252 * -----  --------------  ---------------------------------------------------
253 *  0-11  classid         Class ID.
254 * 12-15  classid         Class version.
255 *  0-11  usertid         User TID
256 * 12-23  usertid         Parent TID.
257 * 24-31  usertid         BIOS info.
258 */
259struct i2o_lct_entry {
260	u_int16_t	entrysize;
261	u_int16_t	localtid;		/* Bits 0-12 only */
262	u_int32_t	changeindicator;
263	u_int32_t	deviceflags;
264	u_int16_t	classid;
265	u_int16_t	orgid;
266	u_int32_t	subclassinfo;
267	u_int32_t	usertid;
268	u_int8_t	identitytag[8];
269	u_int32_t	eventcaps;
270} __packed;
271
272/*
273 * Logical configuration table header.
274 */
275struct i2o_lct {
276	u_int16_t	tablesize;
277	u_int16_t	flags;
278	u_int32_t	iopflags;
279	u_int32_t	changeindicator;
280	struct i2o_lct_entry	entry[1];
281} __packed;
282
283/*
284 * IOP system table.  Bitfields are broken down as follows:
285 *
286 * Bits   Field           Meaning
287 * -----  --------------  ---------------------------------------------------
288 *  0-11  iopid           IOP ID.
289 * 12-31  iopid           Reserved.
290 *  0-11  segnumber       Segment number.
291 * 12-15  segnumber       I2O version.
292 * 16-23  segnumber       IOP state.
293 * 24-31  segnumber       Messenger type.
294 */
295struct i2o_systab_entry {
296	u_int16_t	orgid;
297	u_int16_t	reserved0;
298	u_int32_t	iopid;
299	u_int32_t	segnumber;
300	u_int16_t	inboundmsgframesize;
301	u_int16_t	reserved1;
302	u_int32_t	lastchanged;
303	u_int32_t	iopcaps;
304	u_int32_t	inboundmsgportaddresslow;
305	u_int32_t	inboundmsgportaddresshigh;
306} __packed;
307
308struct i2o_systab {
309	u_int8_t	numentries;
310	u_int8_t	version;
311	u_int16_t	reserved0;
312	u_int32_t	changeindicator;
313	u_int32_t	reserved1[2];
314	struct	i2o_systab_entry entry[1];
315} __packed;
316
317/*
318 * IOP status record.  Bitfields are broken down as follows:
319 *
320 * Bits   Field           Meaning
321 * -----  --------------  ---------------------------------------------------
322 *  0-11  iopid           IOP ID.
323 * 12-15  iopid           Reserved.
324 * 16-31  iopid           Host unit ID.
325 *  0-11  segnumber       Segment number.
326 * 12-15  segnumber       I2O version.
327 * 16-23  segnumber       IOP state.
328 * 24-31  segnumber       Messenger type.
329 */
330struct i2o_status {
331	u_int16_t	orgid;
332	u_int16_t	reserved0;
333	u_int32_t	iopid;
334	u_int32_t	segnumber;
335	u_int16_t	inboundmframesize;
336	u_int8_t	initcode;
337	u_int8_t	reserved1;
338	u_int32_t	maxinboundmframes;
339	u_int32_t	currentinboundmframes;
340	u_int32_t	maxoutboundmframes;
341	u_int8_t	productid[24];
342	u_int32_t	expectedlctsize;
343	u_int32_t	iopcaps;
344	u_int32_t	desiredprivmemsize;
345	u_int32_t	currentprivmemsize;
346	u_int32_t	currentprivmembase;
347	u_int32_t	desiredpriviosize;
348	u_int32_t	currentpriviosize;
349	u_int32_t	currentpriviobase;
350	u_int8_t	reserved2[3];
351	u_int8_t	syncbyte;
352} __packed;
353
354#define	I2O_IOP_STATE_INITIALIZING		0x01
355#define	I2O_IOP_STATE_RESET			0x02
356#define	I2O_IOP_STATE_HOLD			0x04
357#define	I2O_IOP_STATE_READY			0x05
358#define	I2O_IOP_STATE_OPERATIONAL		0x08
359#define	I2O_IOP_STATE_FAILED			0x10
360#define	I2O_IOP_STATE_FAULTED			0x11
361
362/*
363 * ================= Executive class messages =================
364 */
365
366#define	I2O_EXEC_STATUS_GET		0xa0
367struct i2o_exec_status_get {
368	u_int32_t	msgflags;
369	u_int32_t	msgfunc;
370	u_int32_t	reserved[4];
371	u_int32_t	addrlow;
372	u_int32_t	addrhigh;
373	u_int32_t	length;
374} __packed;
375
376#define	I2O_EXEC_OUTBOUND_INIT		0xa1
377struct i2o_exec_outbound_init {
378	u_int32_t	msgflags;
379	u_int32_t	msgfunc;
380	u_int32_t	msgictx;
381	u_int32_t	msgtctx;
382	u_int32_t	pagesize;
383	u_int32_t	flags;		/* init code, outbound msg size */
384} __packed;
385
386#define	I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS	1
387#define	I2O_EXEC_OUTBOUND_INIT_REJECTED		2
388#define	I2O_EXEC_OUTBOUND_INIT_FAILED		3
389#define	I2O_EXEC_OUTBOUND_INIT_COMPLETE		4
390
391#define	I2O_EXEC_LCT_NOTIFY		0xa2
392struct i2o_exec_lct_notify {
393	u_int32_t	msgflags;
394	u_int32_t	msgfunc;
395	u_int32_t	msgictx;
396	u_int32_t	msgtctx;
397	u_int32_t	classid;
398	u_int32_t	changeindicator;
399} __packed;
400
401#define	I2O_EXEC_SYS_TAB_SET		0xa3
402struct i2o_exec_sys_tab_set {
403	u_int32_t	msgflags;
404	u_int32_t	msgfunc;
405	u_int32_t	msgictx;
406	u_int32_t	msgtctx;
407	u_int32_t	iopid;
408	u_int32_t	segnumber;
409} __packed;
410
411#define	I2O_EXEC_HRT_GET		0xa8
412struct i2o_exec_hrt_get {
413	u_int32_t	msgflags;
414	u_int32_t	msgfunc;
415	u_int32_t	msgictx;
416	u_int32_t	msgtctx;
417} __packed;
418
419#define	I2O_EXEC_IOP_RESET		0xbd
420struct i2o_exec_iop_reset {
421	u_int32_t	msgflags;
422	u_int32_t	msgfunc;
423	u_int32_t	reserved[4];
424	u_int32_t	statuslow;
425	u_int32_t	statushigh;
426} __packed;
427
428#define	I2O_RESET_IN_PROGRESS		0x01
429#define	I2O_RESET_REJECTED		0x02
430
431/*
432 * ================= Executive class parameter groups =================
433 */
434
435#define	I2O_PARAM_EXEC_LCT_SCALAR	0x0101
436#define	I2O_PARAM_EXEC_LCT_TABLE	0x0102
437
438/*
439 * ================= HBA class messages =================
440 */
441
442#define	I2O_HBA_BUS_SCAN		0x89
443struct i2o_hba_bus_scan {
444	u_int32_t	msgflags;
445	u_int32_t	msgfunc;
446	u_int32_t	msgictx;
447	u_int32_t	msgtctx;
448} __packed;
449
450/*
451 * ================= HBA class parameter groups =================
452 */
453
454#define	I2O_PARAM_HBA_CTLR_INFO		0x0000
455struct i2o_param_hba_ctlr_info {
456	u_int8_t	bustype;
457	u_int8_t	busstate;
458	u_int16_t	reserved;
459	u_int8_t	busname[12];
460} __packed;
461
462#define	I2O_HBA_BUS_GENERIC		0x00
463#define	I2O_HBA_BUS_SCSI		0x01
464#define	I2O_HBA_BUS_FCA			0x10
465
466#define	I2O_PARAM_HBA_SCSI_PORT_INFO	0x0001
467struct i2o_param_hba_scsi_port_info {
468	u_int8_t	physicalif;
469	u_int8_t	electricalif;
470	u_int8_t	isosynchonrous;
471	u_int8_t	connectortype;
472	u_int8_t	connectorgender;
473	u_int8_t	reserved1;
474	u_int16_t	reserved2;
475	u_int32_t	maxnumberofdevices;
476} __packed;
477
478#define	I2O_PARAM_HBA_SCSI_PORT_GENERIC	0x01
479#define	I2O_PARAM_HBA_SCSI_PORT_UNKNOWN	0x02
480#define	I2O_PARAM_HBA_SCSI_PORT_PARINTF	0x03
481#define	I2O_PARAM_HBA_SCSI_PORT_FCL	0x04
482#define	I2O_PARAM_HBA_SCSI_PORT_1394	0x05
483#define	I2O_PARAM_HBA_SCSI_PORT_SSA	0x06
484
485#define	I2O_PARAM_HBA_SCSI_PORT_SE	0x03
486#define	I2O_PARAM_HBA_SCSI_PORT_DIFF	0x04
487#define	I2O_PARAM_HBA_SCSI_PORT_LVD	0x05
488#define	I2O_PARAM_HBA_SCSI_PORT_OPTCL	0x06
489
490#define	I2O_PARAM_HBA_SCSI_PORT_HDBS50	0x04
491#define	I2O_PARAM_HBA_SCSI_PORT_HDBU50	0x05
492#define	I2O_PARAM_HBA_SCSI_PORT_DBS50	0x06
493#define	I2O_PARAM_HBA_SCSI_PORT_DBU50	0x07
494#define	I2O_PARAM_HBA_SCSI_PORT_HDBS68	0x08
495#define	I2O_PARAM_HBA_SCSI_PORT_HDBU68	0x09
496#define	I2O_PARAM_HBA_SCSI_PORT_SCA1	0x0a
497#define	I2O_PARAM_HBA_SCSI_PORT_SCA2	0x0b
498#define	I2O_PARAM_HBA_SCSI_PORT_FCDB9	0x0c
499#define	I2O_PARAM_HBA_SCSI_PORT_FC	0x0d
500#define	I2O_PARAM_HBA_SCSI_PORT_FCSCA40	0x0e
501#define	I2O_PARAM_HBA_SCSI_PORT_FCSCA20	0x0f
502#define	I2O_PARAM_HBA_SCSI_PORT_FCBNC	0x10
503
504#define	I2O_PARAM_HBA_SCSI_PORT_FEMALE	0x03
505#define	I2O_PARAM_HBA_SCSI_PORT_MALE	0x04
506
507#define	I2O_PARAM_HBA_SCSI_CTLR_INFO	0x0200
508struct i2o_param_hba_scsi_ctlr_info {
509	u_int8_t	scsitype;
510	u_int8_t	protection;
511	u_int8_t	settings;
512	u_int8_t	reserved;
513	u_int32_t	initiatorid;
514	u_int64_t	scanlun0only;
515	u_int16_t	disabledevice;
516	u_int8_t	maxoffset;
517	u_int8_t	maxdatawidth;
518	u_int64_t	maxsyncrate;
519} __packed;
520
521/*
522 * ================= Utility messages =================
523 */
524
525#define	I2O_UTIL_ABORT			0x01
526struct i2o_util_abort {
527	u_int32_t	msgflags;
528	u_int32_t	msgfunc;
529	u_int32_t	msgictx;
530	u_int32_t	msgtctx;
531	u_int32_t	flags;		/* abort type and function type */
532	u_int32_t	tctxabort;
533} __packed;
534
535#define	I2O_UTIL_ABORT_EXACT		0x00000000
536#define	I2O_UTIL_ABORT_FUNCTION		0x00010000
537#define	I2O_UTIL_ABORT_TRANSACTION	0x00020000
538#define	I2O_UTIL_ABORT_WILD		0x00030000
539
540#define	I2O_UTIL_ABORT_CLEAN		0x00040000
541
542struct i2o_util_abort_reply {
543	u_int32_t	msgflags;
544	u_int32_t	msgfunc;
545	u_int32_t	msgictx;
546	u_int32_t	msgtctx;
547	u_int32_t	count;
548} __packed;
549
550#define	I2O_UTIL_PARAMS_SET		0x05
551#define	I2O_UTIL_PARAMS_GET		0x06
552struct i2o_util_params_op {
553	u_int32_t	msgflags;
554	u_int32_t	msgfunc;
555	u_int32_t	msgictx;
556	u_int32_t	msgtctx;
557	u_int32_t	flags;
558} __packed;
559
560#define	I2O_PARAMS_OP_FIELD_GET		1
561#define	I2O_PARAMS_OP_LIST_GET		2
562#define	I2O_PARAMS_OP_MORE_GET		3
563#define	I2O_PARAMS_OP_SIZE_GET		4
564#define	I2O_PARAMS_OP_TABLE_GET		5
565#define	I2O_PARAMS_OP_FIELD_SET		6
566#define	I2O_PARAMS_OP_LIST_SET		7
567#define	I2O_PARAMS_OP_ROW_ADD		8
568#define	I2O_PARAMS_OP_ROW_DELETE	9
569#define	I2O_PARAMS_OP_TABLE_CLEAR	10
570
571struct i2o_param_op_list_header {
572	u_int16_t	count;
573	u_int16_t	reserved;
574} __packed;
575
576struct i2o_param_op_all_template {
577	u_int16_t	operation;
578	u_int16_t	group;
579	u_int16_t	fieldcount;
580	u_int16_t	fields[1];
581} __packed;
582
583struct i2o_param_op_results {
584	u_int16_t	count;
585	u_int16_t	reserved;
586} __packed;
587
588struct i2o_param_read_results {
589	u_int16_t	blocksize;
590	u_int8_t	blockstatus;
591	u_int8_t	errorinfosize;
592} __packed;
593
594struct i2o_param_table_results {
595	u_int16_t	blocksize;
596	u_int8_t	blockstatus;
597	u_int8_t	errorinfosize;
598	u_int16_t	rowcount;
599	u_int16_t	moreflag;
600} __packed;
601
602#define	I2O_UTIL_CLAIM			0x09
603struct i2o_util_claim {
604	u_int32_t	msgflags;
605	u_int32_t	msgfunc;
606	u_int32_t	msgictx;
607	u_int32_t	msgtctx;
608	u_int32_t	flags;
609} __packed;
610
611#define	I2O_UTIL_CLAIM_RESET_SENSITIVE		0x00000002
612#define	I2O_UTIL_CLAIM_STATE_SENSITIVE		0x00000004
613#define	I2O_UTIL_CLAIM_CAPACITY_SENSITIVE	0x00000008
614#define	I2O_UTIL_CLAIM_NO_PEER_SERVICE		0x00000010
615#define	I2O_UTIL_CLAIM_NO_MANAGEMENT_SERVICE	0x00000020
616
617#define	I2O_UTIL_CLAIM_PRIMARY_USER		0x01000000
618#define	I2O_UTIL_CLAIM_AUTHORIZED_USER		0x02000000
619#define	I2O_UTIL_CLAIM_SECONDARY_USER		0x03000000
620#define	I2O_UTIL_CLAIM_MANAGEMENT_USER		0x04000000
621
622#define	I2O_UTIL_CLAIM_RELEASE		0x0b
623struct i2o_util_claim_release {
624	u_int32_t	msgflags;
625	u_int32_t	msgfunc;
626	u_int32_t	msgictx;
627	u_int32_t	msgtctx;
628	u_int32_t	flags;		/* User flags as per I2O_UTIL_CLAIM */
629} __packed;
630
631#define	I2O_UTIL_CLAIM_RELEASE_CONDITIONAL	0x00000001
632
633#define	I2O_UTIL_CONFIG_DIALOG		0x10
634struct i2o_util_config_dialog {
635	u_int32_t	msgflags;
636	u_int32_t	msgfunc;
637	u_int32_t	msgictx;
638	u_int32_t	msgtctx;
639	u_int32_t	pageno;
640} __packed;
641
642#define	I2O_UTIL_EVENT_REGISTER		0x13
643struct i2o_util_event_register {
644	u_int32_t	msgflags;
645	u_int32_t	msgfunc;
646	u_int32_t	msgictx;
647	u_int32_t	msgtctx;
648	u_int32_t	eventmask;
649} __packed;
650
651struct i2o_util_event_register_reply {
652	u_int32_t	msgflags;
653	u_int32_t	msgfunc;
654	u_int32_t	msgictx;
655	u_int32_t	msgtctx;
656	u_int32_t	event;
657	u_int32_t	eventdata[1];
658} __packed;
659
660/* Generic events. */
661#define	I2O_EVENT_GEN_DEVICE_STATE		0x00400000
662#define	I2O_EVENT_GEN_VENDOR_EVENT		0x00800000
663#define	I2O_EVENT_GEN_FIELD_MODIFIED		0x01000000
664#define	I2O_EVENT_GEN_EVENT_MASK_MODIFIED	0x02000000
665#define	I2O_EVENT_GEN_DEVICE_RESET		0x04000000
666#define	I2O_EVENT_GEN_CAPABILITY_CHANGE		0x08000000
667#define	I2O_EVENT_GEN_LOCK_RELEASE		0x10000000
668#define	I2O_EVENT_GEN_NEED_CONFIGURATION	0x20000000
669#define	I2O_EVENT_GEN_GENERAL_WARNING		0x40000000
670#define	I2O_EVENT_GEN_STATE_CHANGE		0x80000000
671
672/* Executive class events. */
673#define	I2O_EVENT_EXEC_RESOURCE_LIMITS		0x00000001
674#define	I2O_EVENT_EXEC_CONNECTION_FAIL		0x00000002
675#define	I2O_EVENT_EXEC_ADAPTER_FAULT		0x00000004
676#define	I2O_EVENT_EXEC_POWER_FAIL		0x00000008
677#define	I2O_EVENT_EXEC_RESET_PENDING		0x00000010
678#define	I2O_EVENT_EXEC_RESET_IMMINENT		0x00000020
679#define	I2O_EVENT_EXEC_HARDWARE_FAIL		0x00000040
680#define	I2O_EVENT_EXEC_XCT_CHANGE		0x00000080
681#define	I2O_EVENT_EXEC_NEW_LCT_ENTRY		0x00000100
682#define	I2O_EVENT_EXEC_MODIFIED_LCT		0x00000200
683#define	I2O_EVENT_EXEC_DDM_AVAILIBILITY		0x00000400
684
685/*
686 * ================= Utility parameter groups =================
687 */
688
689#define	I2O_PARAM_DEVICE_IDENTITY	0xf100
690struct i2o_param_device_identity {
691	u_int32_t	classid;
692	u_int16_t	ownertid;
693	u_int16_t	parenttid;
694	u_int8_t	vendorinfo[16];
695	u_int8_t	productinfo[16];
696	u_int8_t	description[16];
697	u_int8_t	revlevel[8];
698	u_int8_t	snformat;
699	u_int8_t	serialnumber[1];
700} __packed;
701
702#define	I2O_PARAM_DDM_IDENTITY		0xf101
703struct i2o_param_ddm_identity {
704	u_int16_t	ddmtid;
705	u_int8_t	name[24];
706	u_int8_t	revlevel[8];
707	u_int8_t	snformat;
708	u_int8_t	serialnumber[12];
709} __packed;
710
711/*
712 * ================= Block storage class messages =================
713 */
714
715#define	I2O_RBS_BLOCK_READ		0x30
716struct i2o_rbs_block_read {
717	u_int32_t	msgflags;
718	u_int32_t	msgfunc;
719	u_int32_t	msgictx;
720	u_int32_t	msgtctx;
721	u_int32_t	flags;		/* flags, time multiplier, read ahead */
722	u_int32_t	datasize;
723	u_int32_t	lowoffset;
724	u_int32_t	highoffset;
725} __packed;
726
727#define	I2O_RBS_BLOCK_READ_NO_RETRY	0x01
728#define	I2O_RBS_BLOCK_READ_SOLO		0x02
729#define	I2O_RBS_BLOCK_READ_CACHE_READ	0x04
730#define	I2O_RBS_BLOCK_READ_PREFETCH	0x08
731#define	I2O_RBS_BLOCK_READ_CACHE_ONLY	0x10
732
733#define	I2O_RBS_BLOCK_WRITE             0x31
734struct i2o_rbs_block_write {
735	u_int32_t	msgflags;
736	u_int32_t	msgfunc;
737	u_int32_t	msgictx;
738	u_int32_t	msgtctx;
739	u_int32_t	flags;		/* flags, time multiplier */
740	u_int32_t	datasize;
741	u_int32_t	lowoffset;
742	u_int32_t	highoffset;
743} __packed;
744
745#define	I2O_RBS_BLOCK_WRITE_NO_RETRY	0x01
746#define	I2O_RBS_BLOCK_WRITE_SOLO	0x02
747#define	I2O_RBS_BLOCK_WRITE_CACHE_NONE	0x04
748#define	I2O_RBS_BLOCK_WRITE_CACHE_WT	0x08
749#define	I2O_RBS_BLOCK_WRITE_CACHE_WB	0x10
750
751#define	I2O_RBS_CACHE_FLUSH             0x37
752struct i2o_rbs_cache_flush {
753	u_int32_t	msgflags;
754	u_int32_t	msgfunc;
755	u_int32_t	msgictx;
756	u_int32_t	msgtctx;
757	u_int32_t	flags;		/* flags, time multiplier */
758} __packed;
759
760#define	I2O_RBS_MEDIA_MOUNT		0x41
761struct i2o_rbs_media_mount {
762	u_int32_t	msgflags;
763	u_int32_t	msgfunc;
764	u_int32_t	msgictx;
765	u_int32_t	msgtctx;
766	u_int32_t	mediaid;
767	u_int32_t	loadflags;
768} __packed;
769
770#define	I2O_RBS_MEDIA_EJECT             0x43
771struct i2o_rbs_media_eject {
772	u_int32_t	msgflags;
773	u_int32_t	msgfunc;
774	u_int32_t	msgictx;
775	u_int32_t	msgtctx;
776	u_int32_t	mediaid;
777} __packed;
778
779#define	I2O_RBS_MEDIA_LOCK		0x49
780struct i2o_rbs_media_lock {
781	u_int32_t	msgflags;
782	u_int32_t	msgfunc;
783	u_int32_t	msgictx;
784	u_int32_t	msgtctx;
785	u_int32_t	mediaid;
786} __packed;
787
788#define	I2O_RBS_MEDIA_UNLOCK		0x4b
789struct i2o_rbs_media_unlock {
790	u_int32_t	msgflags;
791	u_int32_t	msgfunc;
792	u_int32_t	msgictx;
793	u_int32_t	msgtctx;
794	u_int32_t	mediaid;
795} __packed;
796
797/* Standard RBS reply frame. */
798struct i2o_rbs_reply {
799	u_int32_t	msgflags;
800	u_int32_t	msgfunc;
801	u_int32_t	msgictx;
802	u_int32_t	msgtctx;
803	u_int16_t	detail;
804	u_int8_t	retrycount;
805	u_int8_t	reqstatus;
806	u_int32_t	transfercount;
807	u_int64_t	offset;		/* Error replies only */
808} __packed;
809
810/*
811 * ================= Block storage class parameter groups =================
812 */
813
814#define	I2O_PARAM_RBS_DEVICE_INFO	0x0000
815struct i2o_param_rbs_device_info {
816	u_int8_t	type;
817	u_int8_t	npaths;
818	u_int16_t	powerstate;
819	u_int32_t	blocksize;
820	u_int64_t	capacity;
821	u_int32_t	capabilities;
822	u_int32_t	state;
823} __packed;
824
825#define	I2O_RBS_TYPE_DIRECT		0x00
826#define	I2O_RBS_TYPE_WORM		0x04
827#define	I2O_RBS_TYPE_CDROM		0x05
828#define	I2O_RBS_TYPE_OPTICAL		0x07
829
830#define	I2O_RBS_CAP_CACHING		0x00000001
831#define	I2O_RBS_CAP_MULTI_PATH		0x00000002
832#define	I2O_RBS_CAP_DYNAMIC_CAPACITY	0x00000004
833#define	I2O_RBS_CAP_REMOVABLE_MEDIA	0x00000008
834#define	I2O_RBS_CAP_REMOVABLE_DEVICE	0x00000010
835#define	I2O_RBS_CAP_READ_ONLY		0x00000020
836#define	I2O_RBS_CAP_LOCKOUT		0x00000040
837#define	I2O_RBS_CAP_BOOT_BYPASS		0x00000080
838#define	I2O_RBS_CAP_COMPRESSION		0x00000100
839#define	I2O_RBS_CAP_DATA_SECURITY	0x00000200
840#define	I2O_RBS_CAP_RAID		0x00000400
841
842#define	I2O_RBS_STATE_CACHING		0x00000001
843#define	I2O_RBS_STATE_POWERED_ON	0x00000002
844#define	I2O_RBS_STATE_READY		0x00000004
845#define	I2O_RBS_STATE_MEDIA_LOADED	0x00000008
846#define	I2O_RBS_STATE_DEVICE_LOADED	0x00000010
847#define	I2O_RBS_STATE_READ_ONLY		0x00000020
848#define	I2O_RBS_STATE_LOCKOUT		0x00000040
849#define	I2O_RBS_STATE_BOOT_BYPASS	0x00000080
850#define	I2O_RBS_STATE_COMPRESSION	0x00000100
851#define	I2O_RBS_STATE_DATA_SECURITY	0x00000200
852#define	I2O_RBS_STATE_RAID		0x00000400
853
854#define	I2O_PARAM_RBS_OPERATION		0x0001
855struct i2o_param_rbs_operation {
856	u_int8_t	autoreass;
857	u_int8_t	reasstolerance;
858	u_int8_t	numretries;
859	u_int8_t	reserved0;
860	u_int32_t	reasssize;
861	u_int32_t	expectedtimeout;
862	u_int32_t	rwvtimeout;
863	u_int32_t	rwvtimeoutbase;
864	u_int32_t	timeoutbase;
865	u_int32_t	orderedreqdepth;
866	u_int32_t	atomicwritesize;
867} __packed;
868
869#define	I2O_PARAM_RBS_OPERATION_autoreass		0
870#define	I2O_PARAM_RBS_OPERATION_reasstolerance		1
871#define	I2O_PARAM_RBS_OPERATION_numretries		2
872#define	I2O_PARAM_RBS_OPERATION_reserved0		3
873#define	I2O_PARAM_RBS_OPERATION_reasssize		4
874#define	I2O_PARAM_RBS_OPERATION_expectedtimeout		5
875#define	I2O_PARAM_RBS_OPERATION_rwvtimeout		6
876#define	I2O_PARAM_RBS_OPERATION_rwvtimeoutbase		7
877#define	I2O_PARAM_RBS_OPERATION_timeoutbase		8
878#define	I2O_PARAM_RBS_OPERATION_orderedreqdepth		9
879#define	I2O_PARAM_RBS_OPERATION_atomicwritesize		10
880
881#define	I2O_PARAM_RBS_CACHE_CONTROL	0x0003
882struct i2o_param_rbs_cache_control {
883	u_int32_t	totalcachesize;
884	u_int32_t	readcachesize;
885	u_int32_t	writecachesize;
886	u_int8_t	writepolicy;
887	u_int8_t	readpolicy;
888	u_int8_t	errorcorrection;
889	u_int8_t	reserved;
890} __packed;
891
892/*
893 * ================= SCSI peripheral class messages =================
894 */
895
896#define	I2O_SCSI_DEVICE_RESET		0x27
897struct i2o_scsi_device_reset {
898	u_int32_t	msgflags;
899	u_int32_t	msgfunc;
900	u_int32_t	msgictx;
901	u_int32_t	msgtctx;
902} __packed;
903
904#define	I2O_SCSI_SCB_EXEC		0x81
905struct i2o_scsi_scb_exec {
906	u_int32_t	msgflags;
907	u_int32_t	msgfunc;
908	u_int32_t	msgictx;
909	u_int32_t	msgtctx;
910	u_int32_t	flags;		/* CDB length and flags */
911	u_int8_t	cdb[16];
912	u_int32_t	datalen;
913} __packed;
914
915#define	I2O_SCB_FLAG_SENSE_DATA_IN_MESSAGE  0x00200000
916#define	I2O_SCB_FLAG_SENSE_DATA_IN_BUFFER   0x00600000
917#define	I2O_SCB_FLAG_SIMPLE_QUEUE_TAG       0x00800000
918#define	I2O_SCB_FLAG_HEAD_QUEUE_TAG         0x01000000
919#define	I2O_SCB_FLAG_ORDERED_QUEUE_TAG      0x01800000
920#define	I2O_SCB_FLAG_ACA_QUEUE_TAG          0x02000000
921#define	I2O_SCB_FLAG_ENABLE_DISCONNECT      0x20000000
922#define	I2O_SCB_FLAG_XFER_FROM_DEVICE       0x40000000
923#define	I2O_SCB_FLAG_XFER_TO_DEVICE         0x80000000
924
925#define	I2O_SCSI_SCB_ABORT		0x83
926struct i2o_scsi_scb_abort {
927	u_int32_t	msgflags;
928	u_int32_t	msgfunc;
929	u_int32_t	msgictx;
930	u_int32_t	msgtctx;
931	u_int32_t	tctxabort;
932} __packed;
933
934struct i2o_scsi_reply {
935	u_int32_t	msgflags;
936	u_int32_t	msgfunc;
937	u_int32_t	msgictx;
938	u_int32_t	msgtctx;
939	u_int8_t	scsistatus;
940	u_int8_t	hbastatus;
941	u_int8_t	reserved;
942	u_int8_t	reqstatus;
943	u_int32_t	datalen;
944	u_int32_t	senselen;
945	u_int8_t	sense[40];
946} __packed;
947
948#define	I2O_SCSI_DSC_SUCCESS                0x00
949#define	I2O_SCSI_DSC_REQUEST_ABORTED        0x02
950#define	I2O_SCSI_DSC_UNABLE_TO_ABORT        0x03
951#define	I2O_SCSI_DSC_COMPLETE_WITH_ERROR    0x04
952#define	I2O_SCSI_DSC_ADAPTER_BUSY           0x05
953#define	I2O_SCSI_DSC_REQUEST_INVALID        0x06
954#define	I2O_SCSI_DSC_PATH_INVALID           0x07
955#define	I2O_SCSI_DSC_DEVICE_NOT_PRESENT     0x08
956#define	I2O_SCSI_DSC_UNABLE_TO_TERMINATE    0x09
957#define	I2O_SCSI_DSC_SELECTION_TIMEOUT      0x0a
958#define	I2O_SCSI_DSC_COMMAND_TIMEOUT        0x0b
959#define	I2O_SCSI_DSC_MR_MESSAGE_RECEIVED    0x0d
960#define	I2O_SCSI_DSC_SCSI_BUS_RESET         0x0e
961#define	I2O_SCSI_DSC_PARITY_ERROR_FAILURE   0x0f
962#define	I2O_SCSI_DSC_AUTOSENSE_FAILED       0x10
963#define	I2O_SCSI_DSC_NO_ADAPTER             0x11
964#define	I2O_SCSI_DSC_DATA_OVERRUN           0x12
965#define	I2O_SCSI_DSC_UNEXPECTED_BUS_FREE    0x13
966#define	I2O_SCSI_DSC_SEQUENCE_FAILURE       0x14
967#define	I2O_SCSI_DSC_REQUEST_LENGTH_ERROR   0x15
968#define	I2O_SCSI_DSC_PROVIDE_FAILURE        0x16
969#define	I2O_SCSI_DSC_BDR_MESSAGE_SENT       0x17
970#define	I2O_SCSI_DSC_REQUEST_TERMINATED     0x18
971#define	I2O_SCSI_DSC_IDE_MESSAGE_SENT       0x33
972#define	I2O_SCSI_DSC_RESOURCE_UNAVAILABLE   0x34
973#define	I2O_SCSI_DSC_UNACKNOWLEDGED_EVENT   0x35
974#define	I2O_SCSI_DSC_MESSAGE_RECEIVED       0x36
975#define	I2O_SCSI_DSC_INVALID_CDB            0x37
976#define	I2O_SCSI_DSC_LUN_INVALID            0x38
977#define	I2O_SCSI_DSC_SCSI_TID_INVALID       0x39
978#define	I2O_SCSI_DSC_FUNCTION_UNAVAILABLE   0x3a
979#define	I2O_SCSI_DSC_NO_NEXUS               0x3b
980#define	I2O_SCSI_DSC_SCSI_IID_INVALID       0x3c
981#define	I2O_SCSI_DSC_CDB_RECEIVED           0x3d
982#define	I2O_SCSI_DSC_LUN_ALREADY_ENABLED    0x3e
983#define	I2O_SCSI_DSC_BUS_BUSY               0x3f
984#define	I2O_SCSI_DSC_QUEUE_FROZEN           0x40
985
986/*
987 * ================= SCSI peripheral class parameter groups =================
988 */
989
990#define	I2O_PARAM_SCSI_DEVICE_INFO	0x0000
991struct i2o_param_scsi_device_info {
992	u_int8_t	devicetype;
993	u_int8_t	flags;
994	u_int16_t	reserved0;
995	u_int32_t	identifier;
996	u_int8_t	luninfo[8];
997	u_int32_t	queuedepth;
998	u_int8_t	reserved1;
999	u_int8_t	negoffset;
1000	u_int8_t	negdatawidth;
1001	u_int8_t	reserved2;
1002	u_int64_t	negsyncrate;
1003} __packed;
1004
1005#endif	/* !defined _I2O_I2O_H_ */
1006