2 * Copyright (c) 2001,2002 Søren Schmidt <sos@FreeBSD.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer,
10 * without modification, immediately at the beginning of the file.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 * $FreeBSD: src/sys/dev/pst/pst-iop.h,v 1.2.2.1 2002/08/18 12:32:36 sos Exp $
29 * $DragonFly: src/sys/dev/raid/pst/pst-iop.h,v 1.3 2006/08/03 18:40:47 swildner Exp $
33 MALLOC_DECLARE(M_PSTIOP
);
34 #define I2O_IOP_OUTBOUND_FRAME_COUNT 32
35 #define I2O_IOP_OUTBOUND_FRAME_SIZE 0x20
39 u_int32_t buf
[I2O_IOP_OUTBOUND_FRAME_SIZE
];
43 struct resource
*r_mem
;
44 struct resource
*r_irq
;
49 struct i2o_registers
*reg
;
50 struct i2o_status_get_reply
*status
;
52 struct i2o_lct_entry
*lct
;
55 struct intr_config_hook
*iop_delayed_attach
;
58 /* structure at start of IOP shared mem */
59 struct i2o_registers
{
60 volatile u_int32_t apic_select
;
61 volatile u_int32_t reserved0
;
62 volatile u_int32_t apic_winreg
;
63 volatile u_int32_t reserved1
;
64 volatile u_int32_t iqueue_reg0
;
65 volatile u_int32_t iqueue_reg1
;
66 volatile u_int32_t oqueue_reg0
;
67 volatile u_int32_t oqueue_reg1
;
68 volatile u_int32_t iqueue_event
;
69 volatile u_int32_t iqueue_intr_status
;
70 volatile u_int32_t iqueue_intr_mask
;
71 volatile u_int32_t oqueue_event
;
72 volatile u_int32_t oqueue_intr_status
;
73 volatile u_int32_t oqueue_intr_mask
;
74 #define I2O_OUT_INTR_QUEUE 0x08
75 #define I2O_OUT_INTR_BELL 0x04
76 #define I2O_OUT_INTR_MSG1 0x02
77 #define I2O_OUT_INTR_MSG0 0x01
79 volatile u_int64_t reserved2
;
80 volatile u_int32_t iqueue
;
81 volatile u_int32_t oqueue
;
82 volatile u_int64_t reserved3
;
83 volatile u_int64_t mac_addr
;
84 volatile u_int32_t ip_addr
;
85 volatile u_int32_t ip_mask
;
88 /* Scatter/Gather List management */
91 #define I2O_SGL_CNT_MASK 0xffffff
94 #define I2O_SGL_SIMPLE 0x10
95 #define I2O_SGL_PAGELIST 0x20
96 #define I2O_SGL_CHAIN 0x30
97 #define I2O_SGL_ATTRIBUTE 0x7c
98 #define I2O_SGL_BC0 0x01
99 #define I2O_SGL_BC1 0x02
100 #define I2O_SGL_DIR 0x04
101 #define I2O_SGL_LA 0x08
102 #define I2O_SGL_EOB 0x40
103 #define I2O_SGL_END 0x80
105 u_int32_t phys_addr
[1];
106 } __attribute__((packed
));
108 #define I2O_SGL_MAX_SEGS ((I2O_IOP_OUTBOUND_FRAME_SIZE - (8 + 2)) + 1)
110 /* i2o command codes */
111 #define I2O_UTIL_NOP 0x00
112 #define I2O_UTIL_PARAMS_GET 0x06
113 #define I2O_UTIL_CLAIM 0x09
114 #define I2O_UTIL_CONFIG_DIALOG 0x10
115 #define I2O_UTIL_EVENT_REGISTER 0x13
116 #define I2O_BSA_BLOCK_READ 0x30
117 #define I2O_BSA_BLOCK_WRITE 0x31
118 #define I2O_BSA_CACHE_FLUSH 0x37
119 #define I2O_EXEC_STATUS_GET 0xa0
120 #define I2O_EXEC_OUTBOUND_INIT 0xa1
121 #define I2O_EXEC_LCT_NOTIFY 0xa2
122 #define I2O_EXEC_SYSTAB_SET 0xa3
123 #define I2O_EXEC_IOP_RESET 0xbd
124 #define I2O_EXEC_SYS_ENABLE 0xd1
126 /* basic message layout */
127 struct i2o_basic_message
{
130 u_int8_t message_flags
;
131 u_int16_t message_size
;
132 u_int32_t target_address
:12;
133 u_int32_t initiator_address
:12;
134 u_int32_t function
:8;
135 u_int32_t initiator_context
;
136 u_int32_t transaction_context
;
137 } __attribute__((packed
));
139 /* basic reply layout */
140 struct i2o_single_reply
{
141 u_int8_t version_offset
;
142 u_int8_t message_flags
;
143 #define I2O_MESSAGE_FLAGS_STATIC 0x01
144 #define I2O_MESSAGE_FLAGS_64BIT 0x02
145 #define I2O_MESSAGE_FLAGS_MULTIPLE 0x10
146 #define I2O_MESSAGE_FLAGS_FAIL 0x20
147 #define I2O_MESSAGE_FLAGS_LAST 0x40
148 #define I2O_MESSAGE_FLAGS_REPLY 0x80
150 u_int16_t message_size
;
151 u_int32_t target_address
:12;
152 u_int32_t initiator_address
:12;
153 u_int32_t function
:8;
154 u_int32_t initiator_context
;
155 u_int32_t transaction_context
;
156 u_int16_t detailed_status
;
157 #define I2O_DETAIL_STATUS_SUCCESS 0x0000
158 #define I2O_DETAIL_STATUS_BAD_KEY 0x0002
159 #define I2O_DETAIL_STATUS_TCL_ERROR 0x0003
160 #define I2O_DETAIL_STATUS_REPLY_BUFFER_FULL 0x0004
161 #define I2O_DETAIL_STATUS_NO_SUCH_PAGE 0x0005
162 #define I2O_DETAIL_STATUS_INSUFFICIENT_RESOURCE_SOFT 0x0006
163 #define I2O_DETAIL_STATUS_INSUFFICIENT_RESOURCE_HARD 0x0007
164 #define I2O_DETAIL_STATUS_CHAIN_BUFFER_TOO_LARGE 0x0009
165 #define I2O_DETAIL_STATUS_UNSUPPORTED_FUNCTION 0x000a
166 #define I2O_DETAIL_STATUS_DEVICE_LOCKED 0x000b
167 #define I2O_DETAIL_STATUS_DEVICE_RESET 0x000c
168 #define I2O_DETAIL_STATUS_INAPPROPRIATE_FUNCTION 0x000d
169 #define I2O_DETAIL_STATUS_INVALID_INITIATOR_ADDRESS 0x000e
170 #define I2O_DETAIL_STATUS_INVALID_MESSAGE_FLAGS 0x000f
171 #define I2O_DETAIL_STATUS_INVALID_OFFSET 0x0010
172 #define I2O_DETAIL_STATUS_INVALID_PARAMETER 0x0011
173 #define I2O_DETAIL_STATUS_INVALID_REQUEST 0x0012
174 #define I2O_DETAIL_STATUS_INVALID_TARGET_ADDRESS 0x0013
175 #define I2O_DETAIL_STATUS_MESSAGE_TOO_LARGE 0x0014
176 #define I2O_DETAIL_STATUS_MESSAGE_TOO_SMALL 0x0015
177 #define I2O_DETAIL_STATUS_MISSING_PARAMETER 0x0016
178 #define I2O_DETAIL_STATUS_TIMEOUT 0x0017
179 #define I2O_DETAIL_STATUS_UNKNOWN_ERROR 0x0018
180 #define I2O_DETAIL_STATUS_UNKNOWN_FUNCTION 0x0019
181 #define I2O_DETAIL_STATUS_UNSUPPORTED_VERSION 0x001a
182 #define I2O_DETAIL_STATUS_DEVICE_BUSY 0x001b
183 #define I2O_DETAIL_STATUS_DEVICE_NOT_AVAILABLE 0x001c
185 u_int8_t retry_count
;
187 #define I2O_REPLY_STATUS_SUCCESS 0x00
188 #define I2O_REPLY_STATUS_ABORT_DIRTY 0x01
189 #define I2O_REPLY_STATUS_ABORT_NO_DATA_TRANSFER 0x02
190 #define I2O_REPLY_STATUS_ABORT_PARTIAL_TRANSFER 0x03
191 #define I2O_REPLY_STATUS_ERROR_DIRTY 0x04
192 #define I2O_REPLY_STATUS_ERROR_NO_DATA_TRANSFER 0x05
193 #define I2O_REPLY_STATUS_ERROR_PARTIAL_TRANSFER 0x06
194 #define I2O_REPLY_STATUS_PROCESS_ABORT_DIRTY 0x08
195 #define I2O_REPLY_STATUS_PROCESS_ABORT_NO_DATA_TRANSFER 0x09
196 #define I2O_REPLY_STATUS_PROCESS_ABORT_PARTIAL_TRANSFER 0x0a
197 #define I2O_REPLY_STATUS_TRANSACTION_ERROR 0x0b
198 #define I2O_REPLY_STATUS_PROGRESS_REPORT 0x80
201 } __attribute__((packed
));
203 struct i2o_fault_reply
{
204 u_int8_t version_offset
;
205 u_int8_t message_flags
;
206 u_int16_t message_size
;
207 u_int32_t target_address
:12;
208 u_int32_t initiator_address
:12;
209 u_int32_t function
:8;
210 u_int32_t initiator_context
;
211 u_int32_t transaction_context
;
212 u_int8_t lowest_version
;
213 u_int8_t highest_version
;
215 #define I2O_SEVERITY_FORMAT_ERROR 0x01
216 #define I2O_SEVERITY_PATH_ERROR 0x02
217 #define I2O_SEVERITY_PATH_STATE 0x04
218 #define I2O_SEVERITY_CONGESTION 0x08
220 u_int8_t failure_code
;
221 #define I2O_FAILURE_CODE_TRANSPORT_SERVICE_SUSPENDED 0x81
222 #define I2O_FAILURE_CODE_TRANSPORT_SERVICE_TERMINATED 0x82
223 #define I2O_FAILURE_CODE_TRANSPORT_CONGESTION 0x83
224 #define I2O_FAILURE_CODE_TRANSPORT_FAIL 0x84
225 #define I2O_FAILURE_CODE_TRANSPORT_STATE_ERROR 0x85
226 #define I2O_FAILURE_CODE_TRANSPORT_TIME_OUT 0x86
227 #define I2O_FAILURE_CODE_TRANSPORT_ROUTING_FAILURE 0x87
228 #define I2O_FAILURE_CODE_TRANSPORT_INVALID_VERSION 0x88
229 #define I2O_FAILURE_CODE_TRANSPORT_INVALID_OFFSET 0x89
230 #define I2O_FAILURE_CODE_TRANSPORT_INVALID_MSG_FLAGS 0x8A
231 #define I2O_FAILURE_CODE_TRANSPORT_FRAME_TOO_SMALL 0x8B
232 #define I2O_FAILURE_CODE_TRANSPORT_FRAME_TOO_LARGE 0x8C
233 #define I2O_FAILURE_CODE_TRANSPORT_INVALID_TARGET_ID 0x8D
234 #define I2O_FAILURE_CODE_TRANSPORT_INVALID_INITIATOR_ID 0x8E
235 #define I2O_FAILURE_CODE_TRANSPORT_INVALID_INITIATOR_CONTEXT 0x8F
236 #define I2O_FAILURE_CODE_TRANSPORT_UNKNOWN_FAILURE 0xFF
238 u_int32_t failing_iop_id
:12;
239 u_int32_t reserved
:4;
240 u_int32_t failing_host_unit_id
:16;
242 u_int64_t preserved_mfa
;
243 } __attribute__((packed
));
245 struct i2o_exec_iop_reset_message
{
246 u_int8_t version_offset
;
247 u_int8_t message_flags
;
248 u_int16_t message_size
;
249 u_int32_t target_address
:12;
250 u_int32_t initiator_address
:12;
251 u_int32_t function
:8;
252 u_int8_t reserved
[16];
253 u_int32_t status_word_low_addr
;
254 u_int32_t status_word_high_addr
;
255 } __attribute__((packed
));
257 struct i2o_exec_status_get_message
{
258 u_int8_t version_offset
;
259 u_int8_t message_flags
;
260 u_int16_t message_size
;
261 u_int32_t target_address
:12;
262 u_int32_t initiator_address
:12;
263 u_int32_t function
:8;
264 u_int8_t reserved
[16];
265 u_int32_t reply_buf_low_addr
;
266 u_int32_t reply_buf_high_addr
;
267 u_int32_t reply_buf_length
;
268 } __attribute__((packed
));
270 struct i2o_status_get_reply
{
271 u_int16_t organization_id
;
274 u_int32_t reserved1
:4;
275 u_int32_t host_unit_id
:16;
276 u_int32_t segment_number
:12;
277 u_int32_t i2o_version
:4;
278 u_int32_t iop_state
:8;
279 #define I2O_IOP_STATE_INITIALIZING 0x01
280 #define I2O_IOP_STATE_RESET 0x02
281 #define I2O_IOP_STATE_HOLD 0x04
282 #define I2O_IOP_STATE_READY 0x05
283 #define I2O_IOP_STATE_OPERATIONAL 0x08
284 #define I2O_IOP_STATE_FAILED 0x10
285 #define I2O_IOP_STATE_FAULTED 0x11
287 u_int32_t messenger_type
:8;
288 u_int16_t inbound_mframe_size
;
291 u_int32_t max_inbound_mframes
;
292 u_int32_t current_ibound_mframes
;
293 u_int32_t max_outbound_mframes
;
294 u_int8_t product_idstring
[24];
295 u_int32_t expected_lct_size
;
296 u_int32_t iop_capabilities
;
297 u_int32_t desired_private_memsize
;
298 u_int32_t current_private_memsize
;
299 u_int32_t current_private_membase
;
300 u_int32_t desired_private_iosize
;
301 u_int32_t current_private_iosize
;
302 u_int32_t current_private_iobase
;
303 u_int8_t reserved3
[3];
305 } __attribute__((packed
));
307 struct i2o_exec_init_outqueue_message
{
308 u_int8_t version_offset
;
309 u_int8_t message_flags
;
310 u_int16_t message_size
;
311 u_int32_t target_address
:12;
312 u_int32_t initiator_address
:12;
313 u_int32_t function
:8;
314 u_int32_t initiator_context
;
315 u_int32_t transaction_context
;
316 u_int32_t host_pagesize
;
319 u_int16_t queue_framesize
;
320 struct i2o_sgl sgl
[2];
321 } __attribute__((packed
));
323 #define I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS 0x01
324 #define I2O_EXEC_OUTBOUND_INIT_REJECTED 0x02
325 #define I2O_EXEC_OUTBOUND_INIT_FAILED 0x03
326 #define I2O_EXEC_OUTBOUND_INIT_COMPLETE 0x04
328 struct i2o_exec_systab_set_message
{
329 u_int8_t version_offset
;
330 u_int8_t message_flags
;
331 u_int16_t message_size
;
332 u_int32_t target_address
:12;
333 u_int32_t initiator_address
:12;
334 u_int32_t function
:8;
335 u_int32_t initiator_context
;
336 u_int32_t transaction_context
;
338 #define I2O_EXEC_SYS_TAB_IOP_ID_LOCAL_IOP 0x000
339 #define I2O_EXEC_SYS_TAB_IOP_ID_LOCAL_HOST 0x001
340 #define I2O_EXEC_SYS_TAB_IOP_ID_UNKNOWN_IOP 0xfff
342 u_int32_t reserved1
:4;
343 u_int32_t host_unit_id
:16;
344 #define I2O_EXEC_SYS_TAB_HOST_UNIT_ID_LOCAL_UNIT 0x0000
345 #define I2O_EXEC_SYS_TAB_HOST_UNIT_ID_UNKNOWN_UNIT 0xffff
347 u_int32_t segment_number
:12;
348 #define I2O_EXEC_SYS_TAB_SEG_NUMBER_LOCAL_SEGMENT 0x000
349 #define I2O_EXEC_SYS_TAB_SEG_NUMBER_UNKNOWN_SEGMENT 0xfff
351 u_int32_t reserved2
:4;
352 u_int32_t reserved3
:8;
353 struct i2o_sgl sgl
[3];
354 } __attribute__((packed
));
356 struct i2o_exec_systab
{
359 #define I2O_RESOURCE_MANAGER_VERSION 0
364 u_int16_t organization_id
;
367 u_int32_t reserved4
:20;
368 u_int32_t segment_number
:12;
369 u_int32_t i2o_version
:4;
370 u_int32_t iop_state
:8;
371 u_int32_t messenger_type
:8;
372 u_int16_t inbound_mframe_size
;
374 u_int32_t last_changed
;
375 u_int32_t iop_capabilities
;
376 u_int64_t messenger_info
;
377 } __attribute__((packed
));
379 struct i2o_exec_get_lct_message
{
380 u_int8_t version_offset
;
381 u_int8_t message_flags
;
382 u_int16_t message_size
;
383 u_int32_t target_address
:12;
384 u_int32_t initiator_address
:12;
385 u_int32_t function
:8;
386 u_int32_t initiator_context
;
387 u_int32_t transaction_context
;
389 u_int32_t last_change_id
;
391 } __attribute__((packed
));
393 #define I2O_TID_IOP 0x000
394 #define I2O_TID_HOST 0x001
395 #define I2O_TID_NONE 0xfff
397 struct i2o_lct_entry
{
398 u_int32_t entry_size
:16;
399 u_int32_t local_tid
:12;
400 u_int32_t reserved
:4;
402 u_int32_t device_flags
;
404 #define I2O_CLASS_EXECUTIVE 0x000
405 #define I2O_CLASS_DDM 0x001
406 #define I2O_CLASS_RANDOM_BLOCK_STORAGE 0x010
407 #define I2O_CLASS_SEQUENTIAL_STORAGE 0x011
408 #define I2O_CLASS_LAN 0x020
409 #define I2O_CLASS_WAN 0x030
410 #define I2O_CLASS_FIBRE_CHANNEL_PORT 0x040
411 #define I2O_CLASS_FIBRE_CHANNEL_PERIPHERAL 0x041
412 #define I2O_CLASS_SCSI_PERIPHERAL 0x051
413 #define I2O_CLASS_ATE_PORT 0x060
414 #define I2O_CLASS_ATE_PERIPHERAL 0x061
415 #define I2O_CLASS_FLOPPY_CONTROLLER 0x070
416 #define I2O_CLASS_FLOPPY_DEVICE 0x071
417 #define I2O_CLASS_BUS_ADAPTER_PORT 0x080
418 #define I2O_CLASS_MATCH_ANYCLASS 0xffffffff
420 u_int32_t class_version
:4;
421 u_int32_t class_org
:16;
423 #define I2O_SUBCLASS_i960 0x001
424 #define I2O_SUBCLASS_HDM 0x020
425 #define I2O_SUBCLASS_ISM 0x021
427 u_int32_t user_tid
:12;
428 u_int32_t parent_tid
:12;
429 u_int32_t bios_info
:8;
430 u_int8_t identity_tag
[8];
431 u_int32_t event_capabilities
;
432 } __attribute__((packed
));
434 #define I2O_LCT_ENTRYSIZE (sizeof(struct i2o_lct_entry)/sizeof(u_int32_t))
436 struct i2o_get_lct_reply
{
437 u_int32_t table_size
:16;
438 u_int32_t boot_device
:12;
439 u_int32_t lct_version
:4;
441 u_int32_t current_change_id
;
442 struct i2o_lct_entry entry
[1];
443 } __attribute__((packed
));
445 struct i2o_util_get_param_message
{
446 u_int8_t version_offset
;
447 u_int8_t message_flags
;
448 u_int16_t message_size
;
449 u_int32_t target_address
:12;
450 u_int32_t initiator_address
:12;
451 u_int32_t function
:8;
452 u_int32_t initiator_context
;
453 u_int32_t transaction_context
;
454 u_int32_t operation_flags
;
455 struct i2o_sgl sgl
[2];
456 } __attribute__((packed
));
458 struct i2o_get_param_template
{
460 #define I2O_PARAMS_OPERATION_FIELD_GET 0x0001
461 #define I2O_PARAMS_OPERATION_LIST_GET 0x0002
462 #define I2O_PARAMS_OPERATION_MORE_GET 0x0003
463 #define I2O_PARAMS_OPERATION_SIZE_GET 0x0004
464 #define I2O_PARAMS_OPERATION_TABLE_GET 0x0005
465 #define I2O_PARAMS_OPERATION_FIELD_SET 0x0006
466 #define I2O_PARAMS_OPERATION_LIST_SET 0x0007
467 #define I2O_PARAMS_OPERATION_ROW_ADD 0x0008
468 #define I2O_PARAMS_OPERATION_ROW_DELETE 0x0009
469 #define I2O_PARAMS_OPERATION_TABLE_CLEAR 0x000A
472 #define I2O_BSA_DEVICE_INFO_GROUP_NO 0x0000
473 #define I2O_BSA_OPERATIONAL_CONTROL_GROUP_NO 0x0001
474 #define I2O_BSA_POWER_CONTROL_GROUP_NO 0x0002
475 #define I2O_BSA_CACHE_CONTROL_GROUP_NO 0x0003
476 #define I2O_BSA_MEDIA_INFO_GROUP_NO 0x0004
477 #define I2O_BSA_ERROR_LOG_GROUP_NO 0x0005
479 #define I2O_UTIL_PARAMS_DESCRIPTOR_GROUP_NO 0xF000
480 #define I2O_UTIL_PHYSICAL_DEVICE_TABLE_GROUP_NO 0xF001
481 #define I2O_UTIL_CLAIMED_TABLE_GROUP_NO 0xF002
482 #define I2O_UTIL_USER_TABLE_GROUP_NO 0xF003
483 #define I2O_UTIL_PRIVATE_MESSAGE_EXTENSIONS_GROUP_NO 0xF005
484 #define I2O_UTIL_AUTHORIZED_USER_TABLE_GROUP_NO 0xF006
485 #define I2O_UTIL_DEVICE_IDENTITY_GROUP_NO 0xF100
486 #define I2O_UTIL_DDM_IDENTITY_GROUP_NO 0xF101
487 #define I2O_UTIL_USER_INFORMATION_GROUP_NO 0xF102
488 #define I2O_UTIL_SGL_OPERATING_LIMITS_GROUP_NO 0xF103
489 #define I2O_UTIL_SENSORS_GROUP_NO 0xF200
491 u_int16_t field_count
;
493 } __attribute__((packed
));
495 struct i2o_get_param_operation
{
496 u_int16_t operation_count
;
498 struct i2o_get_param_template operation
[1];
499 } __attribute__((packed
));
501 struct i2o_get_param_reply
{
502 u_int16_t result_count
;
504 u_int16_t block_size
;
505 u_int8_t block_status
;
506 u_int8_t error_info_size
;
508 } __attribute__((packed
));
510 struct i2o_device_identity
{
515 u_int8_t product
[16];
516 u_int8_t description
[16];
517 u_int8_t revision
[8];
519 u_int8_t serial
[256];
520 } __attribute__((packed
));
522 struct i2o_bsa_device
{
523 u_int8_t device_type
;
525 u_int16_t power_state
;
526 u_int32_t block_size
;
528 u_int32_t capabilities
;
530 } __attribute__((packed
));
532 struct i2o_util_claim_message
{
533 u_int8_t version_offset
;
534 u_int8_t message_flags
;
535 u_int16_t message_size
;
536 u_int32_t target_address
:12;
537 u_int32_t initiator_address
:12;
538 u_int32_t function
:8;
539 u_int32_t initiator_context
;
540 u_int32_t transaction_context
;
541 u_int16_t claim_flags
;
544 } __attribute__((packed
));
546 struct i2o_util_event_register_message
{
547 u_int8_t version_offset
;
548 u_int8_t message_flags
;
549 u_int16_t message_size
;
550 u_int32_t target_address
:12;
551 u_int32_t initiator_address
:12;
552 u_int32_t function
:8;
553 u_int32_t initiator_context
;
554 u_int32_t transaction_context
;
555 u_int32_t event_mask
;
556 } __attribute__((packed
));
558 struct i2o_util_event_reply_message
{
559 u_int8_t version_offset
;
560 u_int8_t message_flags
;
561 u_int16_t message_size
;
562 u_int32_t target_address
:12;
563 u_int32_t initiator_address
:12;
564 u_int32_t function
:8;
565 u_int32_t initiator_context
;
566 u_int32_t transaction_context
;
567 u_int32_t event_mask
;
568 u_int32_t event_data
[1];
569 } __attribute__((packed
));
571 struct i2o_util_config_dialog_message
{
572 u_int8_t version_offset
;
573 u_int8_t message_flags
;
574 u_int16_t message_size
;
575 u_int32_t target_address
:12;
576 u_int32_t initiator_address
:12;
577 u_int32_t function
:8;
578 u_int32_t initiator_context
;
579 u_int32_t transaction_context
;
580 u_int32_t page_number
;
581 struct i2o_sgl sgl
[2];
582 } __attribute__((packed
));
584 struct i2o_bsa_rw_block_message
{
585 u_int8_t version_offset
;
586 u_int8_t message_flags
;
587 u_int16_t message_size
;
588 u_int32_t target_address
:12;
589 u_int32_t initiator_address
:12;
590 u_int32_t function
:8;
591 u_int32_t initiator_context
;
592 u_int32_t transaction_context
;
593 u_int16_t control_flags
;
594 u_int8_t time_multiplier
;
595 u_int8_t fetch_ahead
;
599 } __attribute__((packed
));
601 struct i2o_bsa_cache_flush_message
{
602 u_int8_t version_offset
;
603 u_int8_t message_flags
;
604 u_int16_t message_size
;
605 u_int32_t target_address
:12;
606 u_int32_t initiator_address
:12;
607 u_int32_t function
:8;
608 u_int32_t initiator_context
;
609 u_int32_t transaction_context
;
610 u_int16_t control_flags
;
611 u_int8_t time_multiplier
;
613 } __attribute__((packed
));
616 int iop_init(struct iop_softc
*);
617 void iop_attach(struct iop_softc
*);
618 void iop_intr(void *);
619 int iop_reset(struct iop_softc
*);
620 int iop_init_outqueue(struct iop_softc
*);
621 int iop_get_lct(struct iop_softc
*);
622 struct i2o_get_param_reply
*iop_get_util_params(struct iop_softc
*,int,int,int);
623 u_int32_t
iop_get_mfa(struct iop_softc
*);
624 void iop_free_mfa(struct iop_softc
*, int);
625 int iop_queue_wait_msg(struct iop_softc
*, int, struct i2o_basic_message
*);
626 int iop_create_sgl(struct i2o_basic_message
*, caddr_t
, int, int);
628 /* global prototypes */
629 int pst_add_raid(struct iop_softc
*, struct i2o_lct_entry
*);