i2oexec.h revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* *****************************************************************************
*
* All software on this website is made available under the following terms and
* conditions. By downloading this software, you agree to abide by these terms
* and conditions with respect to this software.
*
* I2O SIG All rights reserved.
*
* These header files are provided, pursuant to your I2O SIG membership
* agreement, free of charge on an as-is basis without warranty of any kind,
* either express or implied, including but not limited to, implied warranties
* or merchantability and fitness for a particular purpose. I2O SIG does not
* warrant that this program will meet the user's requirements or that the
* operation of these programs will be uninterrupted or error-free.
* Acceptance and use of this program constitutes the user's understanding
* that he will have no recourse to I2O SIG for any actual or consequential
* damages including, but not limited to, loss profits arising out of use
* or inability to use this program.
*
* Member is permitted to create derivative works to this header-file program.
* However, all copies of the program and its derivative works must contain the
* I2O SIG copyright notice.
*
* *****************************************************************************
*/
/*
* ********************************************************************
* I2OExec.h -- I2O Executive Class Message definition file
*
* This file contains information presented in Chapter 4 of the I2O(tm)
* Specification.
* ********************************************************************
*/
/*
* Copyright (c) 1998 by Sun Microsystems, Inc.
* All rights reserved.
*/
#ifndef _SYS_I2OEXEC_H
#define _SYS_I2OEXEC_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/i2o/i2omsg.h> /* the Base Message file */
#include <sys/i2o/i2outil.h>
#include <sys/types.h>
#define I2OEXEC_REV 1_5_4 /* I2OExec header file revision string */
/*
* ****************************************************************************
* NOTES:
*
* Gets, reads, receives, etc. are all even numbered functions.
* Sets, writes, sends, etc. are all odd numbered functions.
* Functions that both send and receive data can be either but an attempt
* is made to use the function number that indicates the greater transfer
* amount. Functions that do not send or receive data use odd function
* numbers.
*
* Some functions are synonyms like read, receive and send, write.
*
* All common functions will have a code of less than 0x80.
* Unique functions to a class will start at 0x80.
* Executive Functions start at 0xA0.
*
* Utility Message function codes range from 0 - 0x1f
* Base Message function codes range from 0x20 - 0xfe
* Private Message function code is 0xff.
* *****************************************************************************
*/
/* I2O Executive Function Codes. */
#define I2O_EXEC_ADAPTER_ASSIGN 0xB3
#define I2O_EXEC_ADAPTER_READ 0xB2
#define I2O_EXEC_ADAPTER_RELEASE 0xB5
#define I2O_EXEC_BIOS_INFO_SET 0xA5
#define I2O_EXEC_BOOT_DEVICE_SET 0xA7
#define I2O_EXEC_CONFIG_VALIDATE 0xBB
#define I2O_EXEC_CONN_SETUP 0xCA
#define I2O_EXEC_DDM_DESTROY 0xB1
#define I2O_EXEC_DDM_ENABLE 0xD5
#define I2O_EXEC_DDM_QUIESCE 0xC7
#define I2O_EXEC_DDM_RESET 0xD9
#define I2O_EXEC_DDM_SUSPEND 0xAF
#define I2O_EXEC_DEVICE_ASSIGN 0xB7
#define I2O_EXEC_DEVICE_RELEASE 0xB9
#define I2O_EXEC_HRT_GET 0xA8
#define I2O_EXEC_IOP_CLEAR 0xBE
#define I2O_EXEC_IOP_CONNECT 0xC9
#define I2O_EXEC_IOP_RESET 0xBD
#define I2O_EXEC_LCT_NOTIFY 0xA2
#define I2O_EXEC_OUTBOUND_INIT 0xA1
#define I2O_EXEC_PATH_ENABLE 0xD3
#define I2O_EXEC_PATH_QUIESCE 0xC5
#define I2O_EXEC_PATH_RESET 0xD7
#define I2O_EXEC_STATIC_MF_CREATE 0xDD
#define I2O_EXEC_STATIC_MF_RELEASE 0xDF
#define I2O_EXEC_STATUS_GET 0xA0
#define I2O_EXEC_SW_DOWNLOAD 0xA9
#define I2O_EXEC_SW_UPLOAD 0xAB
#define I2O_EXEC_SW_REMOVE 0xAD
#define I2O_EXEC_SYS_ENABLE 0xD1
#define I2O_EXEC_SYS_MODIFY 0xC1
#define I2O_EXEC_SYS_QUIESCE 0xC3
#define I2O_EXEC_SYS_TAB_SET 0xA3
/* I2O Get Status State values */
#define I2O_IOP_STATE_INITIALIZING 0x01
#define I2O_IOP_STATE_RESET 0x02
#define I2O_IOP_STATE_HOLD 0x04
#define I2O_IOP_STATE_READY 0x05
#define I2O_IOP_STATE_OPERATIONAL 0x08
#define I2O_IOP_STATE_FAILED 0x10
#define I2O_IOP_STATE_FAULTED 0x11
/* Event Indicator Assignments for the Executive Class. */
#define I2O_EVENT_IND_RESOURCE_LIMIT 0x00000001
#define I2O_EVENT_IND_CONNECTION_FAIL 0x00000002
#define I2O_EVENT_IND_ADAPTER_FAULT 0x00000004
#define I2O_EVENT_IND_POWER_FAIL 0x00000008
#define I2O_EVENT_IND_RESET_PENDING 0x00000010
#define I2O_EVENT_IND_RESET_IMMINENT 0x00000020
#define I2O_EVENT_IND_HARDWARE_FAIL 0x00000040
#define I2O_EVENT_IND_XCT_CHANGE 0x00000080
#define I2O_EVENT_IND_NEW_LCT_ENTRY 0x00000100
#define I2O_EVENT_IND_MODIFIED_LCT 0x00000200
#define I2O_EVENT_IND_DDM_AVAILABILITY 0x00000400
/* Resource Limit Event Data */
#define I2O_EVENT_RESOURCE_LIMIT_LOW_MEMORY 0x00000001
#define I2O_EVENT_RESOURCE_LIMIT_INBOUND_POOL_LOW 0x00000002
#define I2O_EVENT_RESOURCE_LIMIT_OUTBOUND_POOL_LOW 0x00000004
/* Connection Fail Event Data */
#define I2O_EVENT_CONNECTION_FAIL_REPOND_NORMAL 0x00000000
#define I2O_EVENT_CONNECTION_FAIL_NOT_REPONDING 0x00000001
#define I2O_EVENT_CONNECTION_FAIL_NO_AVAILABLE_FRAMES 0x00000002
/* Reset Pending Event Data */
#define I2O_EVENT_RESET_PENDING_POWER_LOSS 0x00000001
#define I2O_EVENT_RESET_PENDING_CODE_VIOLATION 0x00000002
/* Reset Imminent Event Data */
#define I2O_EVENT_RESET_IMMINENT_UNKNOWN_CAUSE 0x00000000
#define I2O_EVENT_RESET_IMMINENT_POWER_LOSS 0x00000001
#define I2O_EVENT_RESET_IMMINENT_CODE_VIOLATION 0x00000002
#define I2O_EVENT_RESET_IMMINENT_PARITY_ERROR 0x00000003
#define I2O_EVENT_RESET_IMMINENT_CODE_EXCEPTION 0x00000004
#define I2O_EVENT_RESET_IMMINENT_WATCHDOG_TIMEOUT 0x00000005
/* Hardware Fail Event Data */
#define I2O_EVENT_HARDWARE_FAIL_UNKNOWN_CAUSE 0x00000000
#define I2O_EVENT_HARDWARE_FAIL_CPU_FAILURE 0x00000001
#define I2O_EVENT_HARDWARE_FAIL_MEMORY_FAULT 0x00000002
#define I2O_EVENT_HARDWARE_FAIL_DMA_FAILURE 0x00000003
#define I2O_EVENT_HARDWARE_FAIL_IO_BUS_FAILURE 0x00000004
/* DDM Availability Event Data */
#define I2O_EVENT_DDM_AVAILIBILITY_RESPOND_NORMAL 0x00000000
#define I2O_EVENT_DDM_AVAILIBILITY_CONGESTED 0x00000001
#define I2O_EVENT_DDM_AVAILIBILITY_NOT_RESPONDING 0x00000002
#define I2O_EVENT_DDM_AVAILIBILITY_PROTECTION_VIOLATION 0x00000003
#define I2O_EVENT_DDM_AVAILIBILITY_CODE_VIOLATION 0x00000004
#define I2O_OPERATION_FLAG_ASSIGN_PERMANENT 0x01
/* ExecAdapterAssign Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_adapter_assign_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t DdmTID:12;
uint32_t reserved:12;
uint32_t OperationFlags:8;
} s;
uint32_t w;
} u1;
i2o_hrt_entry_t HRTEntry;
} i2o_exec_adappter_assign_message_t;
/* macros to access the bit fields in exec adapter assign message */
#define get_i2o_exec_adapter_DdmTID(mp, hdl) \
(mp)->u1.s.DdmTID
#define put_i2o_exec_adapter_DdmTID(mp, id, hdl) \
((mp)->u1.s.DdmTID = (id))
#define get_i2o_exec_adapter_OperationFlags(mp, hdl) \
(mp)->u1.s.OperationFlags
#define put_i2o_exec_adapter_OperationFlags(mp, n, hdl) \
((mp)->u1.s.OperationFlags = (n))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_adapter_assign_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t OperationFlags:8;
uint32_t reserved:12;
uint32_t DdmTID:12;
} s;
uint32_t w;
} u1;
i2o_hrt_entry_t HRTEntry;
} i2o_exec_adappter_assign_message_t;
/* macros to access the bit fields in exec adapter assign message */
#define get_i2o_exec_adapter_OperationFlags(mp, hdl) \
(mp)->u1.s.OperationFlags
#define put_i2o_exec_adapter_OperatonFlags(mp, n, hdl) \
((mp)->u1.s.OperationFlags = (n))
#define get_i2o_exec_adapter_DdmTID(mp, hdl) \
(ddi_get32(hdl, &(mp)->u1.w) & 0xFFF)
#define put_i2o_exec_adapter_DdmTID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u1.w, \
(ddi_get32(hdl, &(mp)->u1.w) & ~0xFFF) | ((id) & 0xFFF))
#endif
#define I2O_REQUEST_FLAG_CONFIG_REGISTER 0x00000000
#define I2O_REQUEST_FLAG_IO_REGISTER 0x00000001
#define I2O_REQUEST_FLAG_ADAPTER_MEMORY 0x00000002
/* ExecAdapterRead Function Message Frame structure. */
typedef struct i2o_exec_adapter_read_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
uint32_t AdapterID;
uint32_t RequestFlags;
uint32_t Offset;
uint32_t Length;
i2o_sg_element_t SGL;
} i2o_exec_adapter_read_message_t;
#define I2O_OPERATION_FLAG_RELEASE_PERMANENT 0x01
/* ExecAdapterRelease Function Message Frame structure. */
typedef struct i2o_exec_dapater_release_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
uint8_t reserved[3];
uint8_t OperationFlags;
i2o_hrt_entry_t HRTEntry;
} i2o_exec_adapter_release_message_t;
/* ExecBiosInfoSet Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_bios_info_set_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t DeviceTID:12;
uint32_t reserved:12;
uint32_t BiosInfo:8;
} s;
uint32_t w;
} u1;
} i2o_exec_bios_info_set_message_t;
/* macros to access the bit fields in exec bios info set message structure */
#define get_i2o_exec_bios_DeviceTID(mp, hdl) \
(mp)->u1.s.DeviceTID
#define put_i2o_exec_bios_DeviceTID(mp, id, hdl) \
((mp)->u1.s.DeviceTID = (id))
#define get_i2o_exec_BiosInfo(mp, hdl) \
(mp)->u1.s.BiosInfo
#define put_i2o_exec_BiosInfo(mp, n, hdl) \
((mp)->u1.s.BiosInfo = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_bios_info_set_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t BiosInfo:8;
uint32_t reserved:12;
uint32_t DeviceTID:12;
} s;
uint32_t w;
} u1;
} i2o_exec_bios_info_set_message_t;
/* macros to access the bit fields in exec bios info set message structure */
#define get_i2o_exec_BiosInfo(mp, hdl) \
(mp)->u1.s.BiosInfo
#define put_i2o_exec_BiosInfo(mp, n, hdl) \
((mp)->u1.s.BiosInfo = (n))
#define get_i2o_exec_bios_DeviceID(mp, hdl) \
(ddi_get32(hdl, &(mp)->u1.w) & 0xFFF)
#define put_i2o_exec_bios_DeviceID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u1.w, \
(ddi_get32(hdl, &(mp)->u1.w) & ~0xFFF) | ((id) & 0xFFF))
#endif
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
/* ExecBootDeviceSet Function Message Frame structure. */
typedef struct i2o_exec_boot_device_set_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t BootDevice:12;
uint32_t reserved:20;
} s;
uint32_t w;
} u1;
} i2o_exec_boot_device_set_message_t;
/* macros to access the bit fields in exec boot set message structure */
#define get_i2o_exec_boot_BootDevice(mp, hdl) \
(mp)->u1.s.BootDevice
#define put_i2o_exec_boot_BootDevice(mp, id, hdl) \
((mp)->u1.s.BootDevice = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_boot_device_set_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t reserved:20;
uint32_t BootDevice:12;
} s;
uint32_t w;
} u1;
} i2o_exec_boot_device_set_message_t;
#define get_i2o_exec_boot_BootDevice(mp, hdl) \
(ddi_get32(hdl, &(mp)->u1.w) & 0xFFF)
#define put_i2o_exec_boot_BootDevice(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u1.w, \
(ddi_get32(hdl, &(mp)->u1.w) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* ExecConfigValidate Function Message Frame structure. */
typedef struct i2o_exec_config_validate_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
} i2o_exec_config_validate_message_t;
/* ExecConnSetup Requestor */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_alias_connect_setup {
union {
struct {
uint32_t IOP1AliasForTargetDevice:12;
uint32_t IOP2AliasForInitiatorDevice:12;
uint32_t reserved:8;
} s;
uint32_t w;
} u1;
} i2o_alias_connect_setup_t;
/* macros to access the bit fields in alias connect setup structure */
#define get_i2o_exec_setup_IOP1AliasForTargetDevice(mp, hdl) \
(mp)->u1.s.IOP1AliasForTargetDevice
#define put_i2o_exec_setup_IOP1AliasForTargetDevice(mp, id, hdl) \
((mp)->u1.s.IOP1AliasForTargetDevice = (id))
#define get_i2o_exec_setup_IOP2AliasForInitiatorDevice(mp, hdl) \
(mp)->u1.s.IOP2AliasForInitiatorDevice
#define put_i2o_exec_setup_IOP2AliasForInitiatortDevice(mp, n, hdl) \
((mp)->u1.s.IOP2AliasForInitiatortDevice = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_alias_connect_setup {
union {
struct {
uint32_t reserved:8;
uint32_t IOP2AliasForInitiatorDevice:12;
uint32_t IOP1AliasForTargetDevice:12;
} s;
uint32_t w;
} u1;
} i2o_alias_connect_setup_t;
/* macros to access the bit fields in alias connect setup structure */
#define get_i2o_exec_setup_IOP2ForInitiatorDevice(mp, hdl) \
((ddi_get32(hdl, &(mp)->u1.w) >> 12) & 0xFFF)
#define put_i2o_exec_setup_IOP2ForInitiatorDevice(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u1.w, (ddi_get32(hdl, &(mp)->u.w) & \
~0xFFF000) | (((id) & 0xFFF) << 12))
#define get_i2o_exec_setup_IOP1AliasForTargetDevice(mp, hdl) \
(ddi_get32(hdl, &(mp)->u1.w) & 0xFFF)
#define put_i2o_exec_setup_IOP1AliasForTargetDevice(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u1.w, \
(ddi_get32(hdl, &(mp)->u1.w) & ~0xFFF) | ((id) & 0xFFF))
#endif
#define I2O_OPERATION_FLAG_PEER_TO_PEER_BIDIRECTIONAL 0x01
/* ExecConnSetup Object */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_object_connect_setup {
union {
struct {
uint32_t TargetDevice:12;
uint32_t InitiatorDevice:12;
uint32_t OperationFlags:8;
} s;
uint32_t w;
} u1;
} i2o_object_connect_setup_t;
/* macros to access the bit fields in object connect setup structure */
#define get_i2o_exec_setup_TargetDevice(mp, hdl) \
(mp)->u1.s.TargetDevice
#define put_i2o_exec_setup_TargetDevice(mp, id, hdl) \
((mp)->u1.s.TargetDevice = (id))
#define get_i2o_exec_setup_InitiatorDevice(mp, hdl) \
(mp)->u1.s.InitiatorDevice
#define put_i2o_exec_setup_InitiatorDevice(mp, n, hdl) \
((mp)->u1.s.InitiatorDevice = (id))
#define get_i2o_exec_setup_OperationFlags(mp, hdl) \
(mp)->u1.s.OpetationFlags
#define put_i2o_exec_setup_OperationFlags(mp, id, hdl) \
((mp)->u1.s.OperationFlags = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_object_connect_setup {
union {
struct {
uint32_t OperationFlags:8;
uint32_t InitiatorDevice:12;
uint32_t TargetDevice:12;
} s;
uint32_t w;
} u1;
} i2o_object_connect_setup_t;
/* macros to access the bit fields in object connect setup structure */
#define get_i2o_exec_setup_OperationFlags(mp, hdl) \
(mp)->u1.s.OperationFlags
#define put_i2o_exec_setup_OperationFlags(mp, n, hdl) \
((mp)->u1.s.OperationFlags = (n))
#define get_i2o_exec_setup_InitiatorDevice(mp, hdl) \
((ddi_get32(hdl, &(mp)->u1.w) >> 12) & 0xFFF)
#define put_i2o_exec_setup_InitiatorDevice(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u1.w, (ddi_get32(hdl, &(mp)->u.w) & \
~0xFFF000) | (((id) & 0xFFF) << 12))
#define get_i2o_exec_setup_TargetDevice(mp, hdl) \
(ddi_get32(hdl, &(mp)->u1.w) & 0xFFF)
#define put_i2o_exec_setup_TargetDevice(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u1.w, \
(ddi_get32(hdl, &(mp)->u1.w) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* ExecConnSetup Function Message Frame structure. */
typedef struct i2o_exec_conn_setup_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
i2o_object_connect_setup_t ObjectInfo;
i2o_alias_connect_setup_t AliasInfo;
uint16_t IOP2InboundMFrameSize;
uint16_t reserved;
uint32_t MessageClass;
} i2o_exec_conn_setup_message_t;
/* ExecConnSetup Object Reply */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_object_connect_reply {
union {
struct {
uint32_t TargetDevice:12;
uint32_t InitiatorDevice:12;
uint32_t ReplyStatusCode:8;
} s;
uint32_t w;
} u1;
} i2o_object_connect_reply_t;
/* macros to access the bit fields in object connect reply structure */
#define get_connect_reply_TargetDevice(mp, hdl) \
(mp)->u1.s.TargetDevice
#define get_connect_reply_InitiatorDevice(mp, hdl) \
(mp)->u1.s.InitiatorDevice
#define get_connect_reply_RepluStatus(mp, hdl) \
(mp)->u1.s.ReplyStatusCode
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_object_connect_reply {
union {
struct {
uint32_t ReplyStatusCode:8;
uint32_t InitiatorDevice:12;
uint32_t TargetDevice:12;
} s;
uint32_t w;
} u1;
} i2o_object_connect_reply_t;
/* macros to access the bit fields in object connect reply structure */
#define get_connect_reply_ReplyStatusCode(mp, hdl) \
(mp)->u1.s.ReplyStatusCode
#define get_connect_reply_InitiatorDevice(mp, hdl) \
((ddi_get32(hdl, &(mp)->u1.w) >> 12) & 0xFFF)
#define get_connect_reply_TargetDevice(mp, hdl) \
(ddi_get32(hdl, &(mp)->u1.w) & 0xFFF)
#endif
/* ExecConnSetup reply structure. */
typedef struct i2o_exec_conn_setup_reply {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
i2o_object_connect_reply_t ObjectInfo;
i2o_alias_connect_setup_t AliasInfo;
uint16_t IOP2InboundMFrameSize;
uint16_t reserved;
} i2o_exec_conn_setup_reply_t;
/* ExecDdmDestroy Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_ddm_destroy_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t DdmTID:12;
uint32_t reserved:20;
} s;
uint32_t w;
} u1;
} i2o_exec_ddm_destroy_message_t;
/* macros to access the bit fields in exec ddm destroy message structure */
#define get_i2o_exec_ddm_destroy_DdmTID(mp, hdl) \
(mp)->u1.s.DdmTID
#define put_i2o_exec_ddm_destroy_DdmTID(mp, id, hdl) \
((mp)->u1.s.DdmTID = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_ddm_destroy_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t reserved:20;
uint32_t DdmTID:12;
} s;
uint32_t w;
} u1;
} i2o_exec_ddm_destroy_message_t;
/* macros to access the bit fields in exec ddm destroy message structure */
#define get_i2o_exec_ddm_destroy_DdmTID(mp, hdl) \
(ddi_get32(hdl, &(mp)->u1.w) & 0xFFF)
#define put_i2o_exec_ddm_destroy_DdmTID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u1.w, \
(ddi_get32(hdl, &(mp)->u1.w) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* ExecDdmEnable Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_ddm_enable_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t DeviceTID:12;
uint32_t reserved1:20;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t IOP_ID:12;
uint16_t reserved:4;
} s3;
uint16_t h1;
} u3;
uint16_t HostUnitID;
} i2o_exec_ddm_enable_message_t;
/* macros to access the bit fields in exec ddm enable message structure */
#define get_i2o_exec_ddm_enable_DeviceTID(mp, hdl) \
(mp)->u2.s2.DeviceTID
#define put_i2o_exec_ddm_enable_DeviceTID(mp, id, hdl) \
((mp)->u2.s2.DeviceTID = (id))
#define get_i2o_exec_ddm_enable_IOP_ID(mp, hdl) \
(mp)->u3.s3.IOP_ID
#define put_i2o_exec_ddm_enable_IOP_ID(mp, id, hdl) \
((mp)->u3.s3.IOP_ID = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_ddm_enable_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t reserved1:20;
uint32_t DeviceTID:12;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t reserved:4;
uint16_t IOP_ID:12;
} s3;
uint16_t h1;
} u3;
uint16_t HostUnitID;
} i2o_exec_ddm_enable_message_t;
/* macros to access the bit fields in exec ddm enable message structure */
#define get_i2o_exec_ddm_enable_DeviceTID(mp, hdl) \
(ddi_get32(hdl, &(mp)->u2.w2) & 0xFFF)
#define put_i2o_exec_ddm_enable_DeviceTID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, \
(ddi_get32(hdl, &(mp)->u2.w2) & ~0xFFF) | ((id) & 0xFFF))
#define get_i2o_exec_ddm_enable_IOP_ID(p, hdl) \
(ddi_get16(hdl, &(p)->u3.h1) & 0xFFF)
#define put_i2o_exec_ddm_enable_IOP_ID(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u3.h1, \
(ddi_get16(hdl, &(mp)->u3.h1) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* ExecDdmQuiesce Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_ddm_quiesce_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t DeviceTID:12;
uint32_t reserved1:20;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t IOP_ID:12;
uint16_t reserved:4;
} s3;
uint16_t h1;
} u3;
uint16_t HostUnitID;
} i2o_exec_ddm_quiesce_message_t;
/* macros to access the bit fields in exec ddm quiesce message structure */
#define get_i2o_exec_ddm_quiesce_DeviceTID(mp, hdl) \
(mp)->u2.s2.DeviceTID
#define put_i2o_exec_ddm_quiesce_DeviceTID(mp, id, hdl) \
((mp)->u2.s2.DeviceTID = (id))
#define get_i2o_exec_ddm_quiesce_IOP_ID(mp, hdl) \
(mp)->u3.s3.IOP_ID
#define put_i2o_exec_ddm_quiesce_IOP_ID(mp, id, hdl) \
((mp)->u3.s3.IOP_ID = (id))
#endif
/* ExecDdmQuiesce Function Message Frame structure. */
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_ddm_quiesce_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t reserved1:20;
uint32_t DeviceTID:12;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t reserved:4;
uint16_t IOP_ID:12;
} s3;
uint16_t h1;
} u3;
uint16_t HostUnitID;
} i2o_exec_ddm_quiesce_message_t;
/* macros to access the bit fields in exec ddm quiesce message structure */
#define get_i2o_exec_ddm_quiesce_DeviceTID(mp, hdl) \
(ddi_get32(hdl, &(mp)->u2.w2) & 0xFFF)
#define put_i2o_exec_ddm_quiesce_DeviceTID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, \
(ddi_get32(hdl, &(mp)->u2.w2) & ~0xFFF) | ((id) & 0xFFF))
#define get_i2o_exec_ddm_quiesce_IOP_ID(p, hdl) \
(ddi_get16(hdl, &(p)->u3.h1) & 0xFFF)
#define put_i2o_exec_ddm_quiesce_IOP_ID(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u3.h1, \
(ddi_get16(hdl, &(mp)->u3.h1) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* ExecDdmReset Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_ddm_reset_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t DeviceTID:12;
uint32_t reserved1:20;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t IOP_ID:12;
uint16_t reserved:4;
} s3;
uint16_t h1;
} u3;
uint16_t HostUnitID;
} i2o_exec_ddm_reset_message_t;
/* macros to access the bit fields in exec ddm reset message structure */
#define get_i2o_exec_ddm_reset_DeviceTID(mp, hdl) \
(mp)->u2.s2.DeviceTID
#define put_i2o_exec_ddm_reset_DeviceTID(mp, id, hdl) \
((mp)->u2.s2.DeviceTID = (id))
#define get_i2o_exec_ddm_reset_IOP_ID(mp, hdl) \
(mp)->u3.s3.IOP_ID
#define put_i2o_exec_ddm_resetquiesce_IOP_ID(mp, id, hdl) \
((mp)->u3.s3.IOP_ID = (id))
#endif
/* ExecDdmReset Function Message Frame structure. */
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_ddm_reset_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t reserved1:20;
uint32_t DeviceTID:12;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t reserved:4;
uint16_t IOP_ID:12;
} s3;
uint16_t h1;
} u3;
uint16_t HostUnitID;
} i2o_exec_ddm_reset_message_t;
/* macros to access the bit fields in exec ddm reset message structure */
#define get_i2o_exec_ddm_reset_DeviceTID(mp, hdl) \
(ddi_get32(hdl, &(mp)->u2.w2) & 0xFFF)
#define put_i2o_exec_ddm_reset_DeviceTID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, \
(ddi_get32(hdl, &(mp)->u2.w2) & ~0xFFF) | ((id) & 0xFFF))
#define get_i2o_exec_ddm_reset_IOP_ID(p, hdl) \
(ddi_get16(hdl, &(p)->u3.h1) & 0xFFF)
#define put_i2o_exec_ddm_reset_IOP_ID(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u3.h1, \
(ddi_get16(hdl, &(mp)->u3.h1) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* ExecDdmSuspend Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_ddm_suspend_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t DdmTID:12;
uint32_t reserved:20;
} s;
uint32_t w;
} u1;
} i2o_exec_ddm_suspend_message_t;
/* macros to access the bit fields in exec ddm suspend message structure */
#define get_i2o_exec_ddm_suspend_DdmTID(mp, hdl) \
(mp)->u1.s.DdmTID
#define put_i2o_exec_ddm_suspend_DdmTID(mp, id, hdl) \
((mp)->u1.s.DdmTID = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_ddm_suspend_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t reserved:20;
uint32_t DdmTID:12;
} s;
uint32_t w;
} u1;
} i2o_exec_ddm_suspend_message_t;
/* macros to access the bit fields in exec ddm suspend message structure */
#define get_i2o_exec_ddm_suspend_DdmTID(mp, hdl) \
(ddi_get32(hdl, &(mp)->u1.w) & 0xFFF)
#define put_i2o_exec_ddm_suspend_DdmTID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u1.w, \
(ddi_get32(hdl, &(mp)->u1.w) & ~0xFFF) | ((id) & 0xFFF))
#endif
#define I2O_OPERATION_FLAG_ASSIGN_PERMANENT 0x01
/* ExecDeviceAssign Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_device_assign_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t DeviceTID:12;
uint32_t DdmTID:12;
uint32_t OperationFlags:8;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t IOP_ID:12;
uint16_t reserved:4;
} s3;
uint16_t h1;
} u3;
uint16_t HostUnitID;
} i2o_exec_device_assign_message_t;
/* macros to access the bit fields in device assign message structure */
#define get_i2o_exec_device_assign_DeviceTID(mp, hdl) \
(mp)->u2.s2.DeviceTID
#define put_i2o_exec_device_assign_DeviceTID(mp, id, hdl) \
((mp)->u2.s2.DeviceTID = (id))
#define get_i2o_exec_device_assign_DdmTID(mp, hdl) \
(mp)->u2.s2.DdmTID
#define put_i2o_exec_device_assign_DdmTID(mp, n, hdl) \
((mp)->u2.s2.DdmTID = (id))
#define get_i2o_exec_device_assign_OperationFlags(mp, hdl) \
(mp)->u2.s2.OpetationFlags
#define put_i2o_exec_device_assign_OperationFlags(mp, id, hdl) \
((mp)->u2.s2.OperationFlags = (id))
#define get_i2o_exec_device_assign_IOP_ID(mp, hdl) \
(mp)->u3.s3.IOP_ID
#define put_i2o_exec_device_assign_IOP_ID(mp, id, hdl) \
((mp)->u3.s3.IOP_ID = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_device_assign_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t OperationFlags:8;
uint32_t DdmTID:12;
uint32_t DeviceTID:12;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t reserved:4;
uint16_t IOP_ID:12;
} s3;
uint16_t h1;
} u3;
uint16_t HostUnitID;
} i2o_exec_device_assign_message_t;
/* macros to access the bit fields in device assign message structure */
#define get_i2o_exec_device_assign_OperationFlags(mp, hdl) \
(mp)->u2.s2.OperationFlags
#define put_i2o_exec_device_assign_OperationFlags(mp, n, hdl) \
((mp)->u2.s2.OperationFlags = (n))
#define get_i2o_exec_device_assign_DdmTID(mp, hdl) \
((ddi_get32(hdl, &(mp)->u2.w2) >> 12) & 0xFFF)
#define put_i2o_exec_device_assign_DdmTID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, (ddi_get32(hdl, &(mp)->u2.w2) & \
~0xFFF000) | (((id) & 0xFFF) << 12))
#define get_i2o_exec_device_assign_DeviceTID(mp, hdl) \
(ddi_get32(hdl, &(mp)->u2.w2) & 0xFFF)
#define put_i2o_exec_device_assign_DeviceTID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, \
(ddi_get32(hdl, &(mp)->u2.w2) & ~0xFFF) | ((id) & 0xFFF))
#define get_i2o_exec_device_assign_IOP_ID(p, hdl) \
(ddi_get16(hdl, &(p)->u3.h1) & 0xFFF)
#define put_i2o_exec_device_assign_IOP_ID(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u3.h1, \
(ddi_get16(hdl, &(mp)->u3.h1) & ~0xFFF) | ((id) & 0xFFF))
#endif
#define I2O_OPERATION_FLAG_RELEASE_PERMANENT 0x01
/* ExecDeviceRelease Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_device_release_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t DeviceTID:12;
uint32_t DdmTID:12;
uint32_t OperationFlags:8;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t IOP_ID:12;
uint16_t reserved:4;
} s3;
uint16_t h1;
} u3;
uint16_t HostUnitID;
} i2o_exec_device_release_message_t;
/* macros to access the bit fields in device release message structure */
#define get_i2o_exec_device_release_DeviceTID(mp, hdl) \
(mp)->u2.s2.DeviceTID
#define put_i2o_exec_device_release_DeviceTID(mp, id, hdl) \
((mp)->u2.s2.DeviceTID = (id))
#define get_i2o_exec_device_release_DdmTID(mp, hdl) \
(mp)->u2.s2.DdmTID
#define put_i2o_exec_device_release_DdmTID(mp, n, hdl) \
((mp)->u2.s2.DdmTID = (id))
#define get_i2o_exec_device_release_OperationFlags(mp, hdl) \
(mp)->u2.s2.OpetationFlags
#define put_i2o_exec_device_release_OperationFlags(mp, id, hdl) \
((mp)->u2.s2.OperationFlags = (id))
#define get_i2o_exec_device_release_IOP_ID(mp, hdl) \
(mp)->u3.s3.IOP_ID
#define put_i2o_exec_device_release_IOP_ID(mp, id, hdl) \
((mp)->u3.s3.IOP_ID = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_device_release_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t OperationFlags:8;
uint32_t DdmTID:12;
uint32_t DeviceTID:12;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t reserved:4;
uint16_t IOP_ID:12;
} s3;
uint16_t h1;
} u3;
uint16_t HostUnitID;
} i2o_exec_device_release_message_t;
/* macros to access the bit fields in device assign message structure */
#define get_i2o_exec_device_release_OperationFlags(mp, hdl) \
(mp)->u2.s2.OperationFlags
#define put_i2o_exec_device_release_OperationFlags(mp, n, hdl) \
((mp)->u2.s2.OperationFlags = (n))
#define get_i2o_exec_device_release_DdmTID(mp, hdl) \
((ddi_get32(hdl, &(mp)->u2.w2) >> 12) & 0xFFF)
#define put_i2o_exec_device_release_DdmTID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, (ddi_get32(hdl, &(mp)->u2.w2) & \
~0xFFF000) | (((id) & 0xFFF) << 12))
#define get_i2o_exec_device_release_DeviceTID(mp, hdl) \
(ddi_get32(hdl, &(mp)->u2.w2) & 0xFFF)
#define put_i2o_exec_device_release_DeviceTID(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, \
(ddi_get32(hdl, &(mp)->u2.w2) & ~0xFFF) | ((id) & 0xFFF))
#define get_i2o_exec_device_release_IOP_ID(p, hdl) \
(ddi_get16(hdl, &(p)->u3.h1) & 0xFFF)
#define put_i2o_exec_device_release_IOP_ID(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u3.h1, \
(ddi_get16(hdl, &(mp)->u3.h1) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* HRT Entry Structure defined in I2OMSG.H */
/* ExecHrtGet Function Message Frame structure. */
typedef struct i2o_exec_hrt_get_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
i2o_sg_element_t SGL;
} i2o_exec_hrt_get_message_t;
/* ExecIopClear Function Message Frame structure. */
typedef struct i2o_exec_iop_clear_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
} i2o_exec_iop_clear_message_t;
/* ExecIopConnect Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_iop_connect_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t reserved:24;
uint32_t IOP1MsgerType:8;
} s2;
uint32_t w2;
} u2;
uint16_t IOP1InboundMFrameSize;
union {
struct {
uint16_t IOP1AliasForIOP2:12;
uint16_t reserved1:4;
} s3;
uint16_t h2;
} u3;
union {
struct {
uint16_t IOP_ID1:12;
uint16_t reserved2:4;
} s4;
uint16_t h1;
} u4;
uint16_t HostUnitID1;
} i2o_exec_iop_connect_message_t;
/* macros to access the bit fields in exec iop connect message structure */
#define get_i2o_exec_iop_connect_IOP1MsgerType(p, hdl) \
(mp)->u2.s2.IOP1MsgerType
#define put_i2o_exec_iop_connect_IOP1MsgerType(mp, id, hdl) \
((mp)->u2.s2.IOP1MsgerType = (id))
#define get_i2o_exec_iop_connect_IOP1AliasForIOP2(p, hdl) \
(mp)->u3.s3.IOP1AliasForIOP2
#define put_i2o_exec_iop_connect_IOP1AliasForIOP2(mp, id, hdl) \
((mp)->u3.s3.IOP1AliasForIOP2 = (id))
#define get_i2o_exec_iop_connect_IOP_ID1(p, hdl) \
(mp)->u4.s4.IOP_ID1
#define put_i2o_exec_iop_connect_IOP_ID1(mp, id, hdl) \
((mp)->u4.s4.IOP_ID1 = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_iop_connect_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint32_t IOP1MsgerType:8;
uint32_t reserved:24;
} s2;
uint32_t w2;
} u2;
uint16_t IOP1InboundMFrameSize;
union {
struct {
uint16_t reserved1:8;
uint16_t IOP1AliasForIOP2:12;
} s3;
uint16_t h2;
} u3;
union {
struct {
uint16_t reserved2:4;
uint16_t IOP_ID1:12;
} s4;
uint16_t h1;
} u4;
uint16_t HostUnitID1;
} i2o_exec_iop_connect_message_t;
/* macros to access the bit fields in exec iop connect message structure */
#define get_i2o_exec_iop_connect_IOP1MsgerType(p, hdl) \
((ddi_get32(hdl, &(p)->u2.w2) >> 24) & 0xFF)
#define put_i2o_exec_iop_connect_IOP1MsgerType(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, \
(ddi_get32(hdl, &(mp)->u2.w2) & ~0xFF) | (((id) & 0xFF) << 24))
#define get_i2o_exec_iop_connect_IOP1AliasForIOP2(p, hdl) \
(ddi_get16(hdl, &(p)->u3.h2) & 0xFFF)
#define put_i2o_exec_iop_connect_IOP1AliasForIOP2(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u3.h2, \
(ddi_get16(hdl, &(mp)->u3.h2) & ~0xFFF) | ((id) & 0xFFF))
#define get_i2o_exec_iop_connect_IOP_ID1(p, hdl) \
(ddi_get32(hdl, &(p)->u4.h1) & 0xFFF)
#define put_i2o_exec_iop_connect_IOP_ID1(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u4.h1, \
(ddi_get16(hdl, &(mp)->u4.h1) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* ExecIopConnect reply structure */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_iop_connect_iop_reply {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
uint16_t DetailedStatusCode;
uint8_t reserved;
uint8_t ReqStatus;
uint16_t IOP2InboundMFrameSize;
union {
struct {
uint16_t IOP2AliasForIOP1:12;
uint16_t reserved1:4;
} s3;
uint16_t h2;
} u3;
union {
struct {
uint16_t IOP_ID2:12;
uint16_t reserved2:4;
} s4;
uint16_t w4;
} u4;
uint16_t HostUnitID2;
} i2o_exec_iop_connect_reply_t;
/* macros to access the bit fields in exec iop connect reply structure */
#define get_i2o_exec_iop_connect_reply_IOP2AliasForIOP1(p, hdl) \
(mp)->u3.s3.IOP2AliasForIOP1
#define put_i2o_exec_iop_connect_reply_IOP2AliasForIOP1(mp, id, hdl) \
((mp)->u3.s3.IOP2AliasForIOP1 = (id))
#define get_i2o_exec_iop_connect_reply_IOP_ID2(p, hdl) \
(mp)->u4.s4.IOP_ID2
#define put_i2o_exec_iop_connect_reply_IOP_ID2(mp, id, hdl) \
((mp)->u4.s4.IOP_ID2 = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_iop_connect_iop_reply {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
uint16_t DetailedStatusCode;
uint8_t reserved;
uint8_t ReqStatus;
uint16_t IOP2InboundMFrameSize;
union {
struct {
uint16_t reserved1:8;
uint16_t IOP2AliasForIOP1:12;
} s3;
uint16_t h2;
} u3;
union {
struct {
uint16_t reserved2:4;
uint16_t IOP_ID2:12;
} s4;
uint16_t h1;
} u4;
uint16_t HostUnitID2;
} i2o_exec_iop_connect_reply_t;
/* macros to access the bit fields in exec iop connect reply structure */
#define get_i2o_exec_iop_connect_reply_IOP2AliasForIOP1(p, hdl) \
(ddi_get16(hdl, &(p)->u3.h2) & 0xFFF)
#define put_i2o_exec_iop_connect_reply_IOP2AliasForIOP1(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u3.h2, \
(ddi_get16(hdl, &(mp)->u3.h2) & ~0xFFF) | ((id) & 0xFFF))
#define get_i2o_exec_iop_connect_reply_IOP_ID2(p, hdl) \
(ddi_get32(hdl, &(p)->u4.h1) & 0xFFF)
#define put_i2o_exec_iop_connect_reply_IOP_ID2(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u4.h1, \
(ddi_get16(hdl, &(mp)->u4.h1) & ~0xFFF) | ((id) & 0xFFF))
#endif
#define I2O_EXEC_IOP_RESET_RESERVED_SZ 16
#define I2O_EXEC_IOP_RESET_IN_PROGRESS 0x01
#define I2O_EXEC_IOP_RESET_REJECTED 0x02
#define I2O_EXEC_IOP_RESET_STATUS_RESERVED_SZ 3
typedef struct i2o_exec_iop_reset_status {
volatile uint8_t ResetStatus;
uint8_t reserved[I2O_EXEC_IOP_RESET_STATUS_RESERVED_SZ];
} i2o_exec_iop_reset_status_t;
/* ExecIopReset Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_iop_reset_message {
uint8_t VersionOffset;
uint8_t MsgFlags;
uint16_t MessageSize;
union {
struct {
uint32_t TargetAddress:12;
uint32_t InitiatorAddress:12;
uint32_t Function:8;
} s2;
uint32_t w2;
} u2;
uint8_t Reserved[I2O_EXEC_IOP_RESET_RESERVED_SZ];
uint32_t StatusWordLowAddress;
uint32_t StatusWordHighAddress;
} i2o_exec_iop_reset_message_t;
/* macros to access the bit fields in iop reset message */
#define get_i2o_exec_reset_TargetAddress(mp, hdl) \
(mp)->u2.s2.TargetAddress
#define put_i2o_exec_reset_TargetAddress(mp, id, hdl) \
((mp)->u2.s2.TargetAddress = (id))
#define get_i2o_exec_reset_InitiatorAddress(mp, hdl) \
(mp)->u2.s2.InitiatorAddress
#define put_i2o_exec_reset_InitiatorAddress(mp, id, hdl) \
((mp)->u2.s2.InitiatorAddress = (id))
#define get_i2o_exec_reset_Function(mp, hdl) \
(mp)->u2.s2.Function
#define put_i2o_exec_reset_Function(mp, n, hdl) \
((mp)->u2.s2.Function = (n))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_iop_reset_message {
uint8_t VersionOffset;
uint8_t MsgFlags;
uint16_t MessageSize;
union {
struct {
uint32_t Function:8;
uint32_t InitiatorAddress:12;
uint32_t TargetAddress:12;
} s2;
uint32_t w2;
} u2;
uint8_t Reserved[I2O_EXEC_IOP_RESET_RESERVED_SZ];
uint32_t StatusWordLowAddress;
uint32_t StatusWordHighAddress;
} i2o_exec_iop_reset_message_t;
/* macros to access the bit fields in iop reset message */
#define get_i2o_exec_reset_Function(mp, hdl) \
(mp)->u2.s2.Function
#define put_i2o_exec_reset_Function(mp, n, hdl) \
((mp)->u2.s2.Function = (n))
#define get_i2o_exec_reset_TargetAddress(mp, hdl) \
(ddi_get32(hdl, &(mp)->u2.w2) & 0xFFF)
#define put_i2o_exec_reset_TargetAddress(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, \
(ddi_get32(hdl, &(mp)->u2.w2) & ~0xFFF) | ((id) & 0xFFF))
#define get_i2o_exec_reset_InitiatorAddress(mp, hdl) \
((ddi_get32(hdl, &(mp)->u2.w2) >> 12) & 0xFFF)
#define put_i2o_exec_reset_InitiatorAddress(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, (ddi_get32(hdl, &(mp)->u2.w2) & \
~0xFFF000) | (((id) & 0xFFF) << 12))
#endif
/* LCT Entry Structure defined in I2OMSG.H */
/* ExecLCTNotify Function Message Frame structure. */
typedef struct i2o_exec_lct_notify_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
uint32_t ClassIdentifier;
uint32_t LastReportedChangeIndicator;
i2o_sg_element_t SGL;
} i2o_exec_lct_notify_message_t;
/* ExecOutboundInit Function Message Frame structure. */
typedef struct i2o_exec_outbound_init_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
uint32_t HostPageFrameSize;
uint8_t InitCode;
uint8_t reserved;
uint16_t OutboundMFrameSize;
i2o_sg_element_t SGL;
} i2o_exec_outbound_init_message_t;
#define I2O_EXEC_OUTBOUND_INIT_IN_PROGRESS 0x01
#define I2O_EXEC_OUTBOUND_INIT_REJECTED 0x02
#define I2O_EXEC_OUTBOUND_INIT_FAILED 0x03
#define I2O_EXEC_OUTBOUND_INIT_COMPLETE 0x04
#define I2O_EXEC_OUTBOUND_INIT_RESERVED_SZ 3
typedef struct i2o_exec_outbound_init_status {
uint8_t InitStatus;
uint8_t reserved[I2O_EXEC_OUTBOUND_INIT_RESERVED_SZ];
} i2o_exec_outbound_init_status_t;
typedef struct i2o_exec_outbound_init_reclaim_list {
uint32_t MFACount;
uint32_t MFAReleaseCount;
uint32_t MFAAddress[1];
} i2o_exec_outbound_init_reclaim_list_t;
/* ExecPathEnable Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_path_enable_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint16_t IOP_ID:12;
uint16_t reserved:4;
} s2;
uint16_t h1;
} u2;
uint16_t HostUnitID;
} i2o_exec_path_enable_message_t;
/* macros to access the bit fields in exec path enable message structure */
#define get_i2o_exec_path_enable_IOP_ID(mp, hdl) \
(mp)->u2.s2.IOP_ID
#define put_i2o_exec_path_enable_IOP_ID(mp, id, hdl) \
((mp)->u2.s2.IOP_ID = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_path_enable_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint16_t reserved:4;
uint16_t IOP_ID:12;
} s2;
uint16_t h1;
} u2;
uint16_t HostUnitID;
} i2o_exec_path_enable_message_t;
/* macros to access the bit fields in exec path enable message structure */
#define get_i2o_exec_path_enable_IOP_ID(p, hdl) \
(ddi_get32(hdl, &(p)->u2.h1) & 0xFFF)
#define put_i2o_exec_path_enable_IOP_ID(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u2.h1, \
(ddi_get16(hdl, &(mp)->u2.h1) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* ExecPathQuiesce Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_path_quiesce_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint16_t IOP_ID:12;
uint16_t reserved:4;
} s2;
uint16_t h1;
} u2;
uint16_t HostUnitID;
} i2o_exec_path_quiesce_message_t;
/* macros to access the bit fields in exec path quiesce message structure */
#define get_i2o_exec_path_quiesce_IOP_ID(mp, hdl) \
(mp)->u2.s2.IOP_ID
#define put_i2o_exec_path_quiesce_IOP_ID(mp, id, hdl) \
((mp)->u2.s2.IOP_ID = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_path_quiesce_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint16_t reserved:4;
uint16_t IOP_ID:12;
} s2;
uint16_t h1;
} u2;
uint16_t HostUnitID;
} i2o_exec_path_quiesce_message_t;
/* macros to access the bit fields in exec path quiesce message structure */
#define get_i2o_exec_path_quiesce_IOP_ID(p, hdl) \
(ddi_get16(hdl, &(p)->u2.h1) & 0xFFF)
#define put_i2o_exec_path_quiesce_IOP_ID(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u2.h1, \
(ddi_get16(hdl, &(mp)->u2.h1) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* ExecPathReset Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_path_reset_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint16_t IOP_ID:12;
uint16_t reserved:4;
} s2;
uint16_t h1;
} u2;
uint16_t HostUnitID;
} i2o_exec_path_reset_message_t;
/* macros to access the bit fields in exec path reset message structure */
#define get_i2o_exec_path_reset_IOP_ID(mp, hdl) \
(mp)->u2.s2.IOP_ID
#define put_i2o_exec_path_reset_IOP_ID(mp, id, hdl) \
((mp)->u2.s2.IOP_ID = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_path_reset_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint16_t reserved:4;
uint16_t IOP_ID:12;
} s2;
uint16_t h1;
} u2;
uint16_t HostUnitID;
} i2o_exec_path_reset_message_t;
/* macros to access the bit fields in exec path reset message structure */
#define get_i2o_exec_path_reset_IOP_ID(p, hdl) \
(ddi_get16(hdl, &(p)->u2.h1) & 0xFFF)
#define put_i2o_exec_path_reset_IOP_ID(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u2.h1, \
(ddi_get16(hdl, &(mp)->u2.h1) & ~0xFFF) | ((id) & 0xFFF))
#endif
#define I2O_EXEC_STATIC_MF_CREATE_RESERVED_SZ 3
/* ExecStaticMfCreate Message Frame structure */
typedef struct i2o_exec_static_mf_create_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
uint8_t MaxOutstanding;
uint8_t reserved[I2O_EXEC_STATIC_MF_CREATE_RESERVED_SZ];
i2o_message_frame_t StaticMessageFrame;
} i2o_exec_static_mf_create_message_t;
/* ExecStaticMfCreate Message Frame reply */
typedef struct i2o_exec_static_mf_create_reply {
i2o_single_reply_message_frame_t StdReplyFrame;
i2o_message_frame_t StaticMFA;
} i2o_exec_static_mf_create_reply_t;
/* ExecStaticMfRelease Message Frame structure */
typedef struct i2o_exec_static_mf_release_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
i2o_message_frame_t StaticMFA;
} i2o_exec_static_mf_release_message_t;
#define I2O_EXEC_STATUS_GET_RESERVED_SZ 16
/* ExecStatusGet Function Message Frame structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_status_get_message {
uint8_t VersionOffset;
uint8_t MsgFlags;
uint16_t MessageSize;
union {
struct {
uint32_t Function:8;
uint32_t InitiatorAddress:12;
uint32_t TargetAddress:12;
} s2;
uint32_t w2;
} u2;
uint8_t Reserved[I2O_EXEC_STATUS_GET_RESERVED_SZ];
uint32_t ReplyBufferAddressLow;
uint32_t ReplyBufferAddressHigh;
uint32_t ReplyBufferLength;
} i2o_exec_status_get_message_t;
/* macros to access the bit fields in i2o exec status get message */
#define get_i2o_exec_status_TargetAddress(mp, hdl) \
(mp)->u2.s2.TargetAddress
#define put_i2o_exec_status_TargetAddress(mp, id, hdl) \
((mp)->u2.s2.TargetAddress = (id))
#define get_i2o_exec_status_InitiatorAddress(mp, hdl) \
(mp)->u2.s2.InitiatorAddress
#define put_i2o_exec_status_InitiatorAddress(mp, id, hdl) \
((mp)->u2.s2.InitiatorAddress = (id))
#define get_i2o_exec_status_Function(mp, hdl) \
(mp)->u2.s2.Function
#define put_i2o_exec_status_Function(mp, n, hdl) \
((mp)->u2.s2.Function = (n))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_status_get_message {
uint8_t VersionOffset;
uint8_t MsgFlags;
uint16_t MessageSize;
union {
struct {
uint32_t Function:8;
uint32_t InitiatorAddress:12;
uint32_t TargetAddress:12;
} s2;
uint32_t w2;
} u2;
uint8_t Reserved[I2O_EXEC_STATUS_GET_RESERVED_SZ];
uint32_t ReplyBufferAddressLow;
uint32_t ReplyBufferAddressHigh;
uint32_t ReplyBufferLength;
} i2o_exec_status_get_message_t;
/* macros to access the bit fields in i2o exec status get message */
#define get_i2o_exec_status_Function(mp, hdl) \
(mp)->u2.s2.Function
#define put_i2o_exec_status_Function(mp, n, hdl) \
((mp)->u2.s2.Function = (n))
#define get_i2o_exec_status_TargetAddress(mp, hdl) \
(ddi_get32(hdl, &(mp)->u2.w2) & 0xFFF)
#define put_i2o_exec_status_TargetAddress(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, \
(ddi_get32(hdl, &(mp)->u2.w2) & ~0xFFF) | ((id) & 0xFFF))
#define get_i2o_exec_status_InitiatorAddress(mp, hdl) \
((ddi_get32(hdl, &(mp)->u2.w2) >> 12) & 0xFFF)
#define put_i2o_exec_status_InitiatorAddress(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u2.w2, (ddi_get32(hdl, &(mp)->u2.w2) & \
~0xFFF000) | (((id) & 0xFFF) << 12))
#endif
#define I2O_IOP_STATUS_PROD_ID_STR_SZ 24
#define I2O_EXEC_STATUS_GET_REPLY_RESERVED_SZ 6
/* ExecStatusGet reply Structure */
#define I2O_IOP_CAP_CONTEXT_32_ONLY 0x00000000
#define I2O_IOP_CAP_CONTEXT_64_ONLY 0x00000001
#define I2O_IOP_CAP_CONTEXT_32_64_NOT_CURRENTLY 0x00000002
#define I2O_IOP_CAP_CONTEXT_32_64_CURRENTLY 0x00000003
#define I2O_IOP_CAP_CURRENT_CONTEXT_NOT_CONFIG 0x00000000
#define I2O_IOP_CAP_CURRENT_CONTEXT_32_ONLY 0x00000004
#define I2O_IOP_CAP_CURRENT_CONTEXT_64_ONLY 0x00000008
#define I2O_IOP_CAP_CURRENT_CONTEXT_32_64 0x0000000C
#define I2O_IOP_CAP_INBOUND_PEER_SUPPORT 0x00000010
#define I2O_IOP_CAP_OUTBOUND_PEER_SUPPORT 0x00000020
#define I2O_IOP_CAP_PEER_TO_PEER_SUPPORT 0x00000040
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_status_get_reply {
uint16_t OrganizationID;
uint16_t reserved;
union {
struct {
uint16_t IOP_ID:12;
uint16_t reserved1:4;
} s2;
uint16_t h1;
} u2;
uint16_t HostUnitID;
union {
struct {
uint16_t SegmentNumber:12;
uint16_t I2oVersion:4;
} s3;
uint16_t h1;
} u3;
uint8_t IopState;
uint8_t MessengerType;
uint16_t InboundMFrameSize;
uint8_t InitCode;
uint8_t reserved2;
uint32_t MaxInboundMFrames;
uint32_t CurrentInboundMFrames;
uint32_t MaxOutboundMFrames;
uint8_t ProductIDString[I2O_IOP_STATUS_PROD_ID_STR_SZ];
uint32_t ExpectedLCTSize;
uint32_t IopCapabilities;
uint32_t DesiredPrivateMemSize;
uint32_t CurrentPrivateMemSize;
uint32_t CurrentPrivateMemBase;
uint32_t DesiredPrivateIOSize;
uint32_t CurrentPrivateIOSize;
uint32_t CurrentPrivateIOBase;
uint8_t reserved3[3];
volatile uint8_t SyncByte;
} i2o_exec_status_get_reply_t;
#define get_i2o_exec_status_reply_IOP_ID(p, hdl) (p)->u2.s2.IOP_ID
#define get_i2o_exec_status_reply_SegmentNumber(p, hdl)(p)->u3.s3.SegmentNumber
#define get_i2o_exec_status_reply_I2oVersion(p, hdl)(p)->u3.s3.I2oVersion
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_status_get_reply {
uint16_t OrganizationID;
uint16_t reserved;
union {
struct {
uint16_t reserved1:4;
uint16_t IOP_ID:12;
} s2;
uint16_t h1;
} u2;
uint16_t HostUnitID;
union {
struct {
uint16_t I2oVersion:4;
uint16_t SegmentNumber:12;
} s3;
uint16_t h1;
} u3;
uint8_t IopState;
uint8_t MessengerType;
uint16_t InboundMFrameSize;
uint8_t InitCode;
uint8_t reserved2;
uint32_t MaxInboundMFrames;
uint32_t CurrentInboundMFrames;
uint32_t MaxOutboundMFrames;
uint8_t ProductIDString[I2O_IOP_STATUS_PROD_ID_STR_SZ];
uint32_t ExpectedLCTSize;
uint32_t IopCapabilities;
uint32_t DesiredPrivateMemSize;
uint32_t CurrentPrivateMemSize;
uint32_t CurrentPrivateMemBase;
uint32_t DesiredPrivateIOSize;
uint32_t CurrentPrivateIOSize;
uint32_t CurrentPrivateIOBase;
uint8_t reserved3[3];
uint8_t SyncByte;
} i2o_exec_status_get_reply_t;
#define get_i2o_exec_status_reply_IOP_ID(p, hdl) \
(ddi_get16(hdl, &(p)->u2.h1) & 0xFFF)
#define get_i2o_exec_status_reply_I2oVersion(p, hdl) \
(ddi_get16(hdl, &(p)->u3.h1) >> 4)
#define get_i2o_exec_staus_reply_SegmentNumber(p, hdl) \
(ddi_get16(hdl, &(p)->u3.h1) & 0xFFF)
#endif
#define I2O_EXEC_SW_DOWNLOAD_FLAG_LOAD_MEMORY 0x00
#define I2O_EXEC_SW_DOWNLOAD_FLAG_PERMANENT_STORE 0x01
#define I2O_EXEC_SW_DOWNLOAD_FLAG_EXPERIMENTAL 0x00
#define I2O_EXEC_SW_DOWNLOAD_FLAG_OVERRIDE 0x02
#define I2O_EXEC_SW_TYPE_DDM 0x01
#define I2O_EXEC_SW_TYPE_DDM_MPB 0x02
#define I2O_EXEC_SW_TYPE_DDM_CONFIG_TABLE 0x03
#define I2O_EXEC_SW_TYPE_IRTOS 0x11
#define I2O_EXEC_SW_TYPE_IRTOS_PRIVATE_MODULE 0x12
#define I2O_EXEC_SW_TYPE_IRTOS_DIALOG_TABLE 0x13
#define I2O_EXEC_SW_TYPE_IOP_PRIVATE_MODULE 0x22
#define I2O_EXEC_SW_TYPE_IOP_DIALOG_TABLE 0x23
/* I2O ExecSwDownload/Upload/Remove SwID Structure */
typedef struct i2o_sw_id {
uint16_t ModuleID;
uint16_t OrganizationID;
} i2o_sw_id_t;
/* ExecSwDownload Function Message Frame structure. */
typedef struct i2o_exec_sw_donwload_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
uint8_t CurrentFragment;
uint8_t TotalFragments;
uint8_t SwType;
uint8_t DownloadFlags;
uint32_t SWSize;
i2o_sw_id_t SwID;
i2o_sg_element_t SGL;
} i2o_exec_sw_download_message_t;
/* ExecSwUpload Function Message Frame structure. */
typedef struct i2o_exec_sw_upload_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
uint8_t CurrentFragment;
uint8_t TotalFragments;
uint8_t SwType;
uint8_t UploadFlags;
uint32_t SWSize;
i2o_sw_id_t SwID;
i2o_sg_element_t SGL;
} i2o_exec_sw_upload_message_t;
/* ExecSwRemove Function Message Frame structure. */
typedef struct i2o_exec_sw_remove_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
uint16_t reserved;
uint8_t SwType;
uint8_t RemoveFlags;
uint32_t SWSize;
i2o_sw_id_t SwID;
} i2o_exec_sw_remove_message_t;
/* ExecSysEnable Function Message Frame structure. */
typedef struct i2o_exec_sys_enable_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
} i2o_exec_sys_enable_message_t;
/* ExecSysModify Function Message Frame structure. */
typedef struct i2o_exec_sys_modify_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
i2o_sg_element_t SGL;
} i2o_exec_sys_modify_message_t;
/* ExecSysQuiesce Function Message Frame structure. */
typedef struct i2o_exec_sys_quiesce_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
} i2o_exec_sys_quiesce_message_t;
/* ExecSysTabSet (System Table) Function Message Frame structure. */
#define I2O_EXEC_SYS_TAB_IOP_ID_LOCAL_IOP 0x000
#define I2O_EXEC_SYS_TAB_IOP_ID_LOCAL_HOST 0x001
#define I2O_EXEC_SYS_TAB_IOP_ID_UNKNOWN_IOP 0xFFF
#define I2O_EXEC_SYS_TAB_HOST_UNIT_ID_LOCAL_UNIT 0x0000
#define I2O_EXEC_SYS_TAB_HOST_UNIT_ID_UNKNOWN_UNIT 0xffff
#define I2O_EXEC_SYS_TAB_SEG_NUMBER_LOCAL_SEGMENT 0x000
#define I2O_EXEC_SYS_TAB_SEG_NUMBER_UNKNOWN_SEGMENT 0xfff
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_exec_sys_tab_set_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint16_t IOP_ID:12;
uint16_t reserved:4;
} s2;
uint16_t h1;
} u2;
uint16_t HostUnitID;
union {
struct {
uint32_t SegmentNumber:12;
uint32_t reserved1:20;
} s3;
uint32_t w3;
} u3;
i2o_sg_element_t SGL;
} i2o_exec_sys_tab_set_message_t;
/* macros to access the bit fields in exec ddm enable message structure */
#define get_i2o_exec_sys_tab_set_IOP_ID(mp, hdl) \
(mp)->u2.s2.IOP_ID
#define put_i2o_exec_sys_tab_set_IOP_ID(mp, id, hdl) \
((mp)->u2.s2.IOP_ID = (id))
#define get_i2o_exec_sys_tab_set_SegmentNumber(mp, hdl) \
(mp)->u3.s3.SegmentNumber
#define put_i2o_exec_sys_tab_set_SegmentNumber(mp, id, hdl) \
((mp)->u3.s3.SegmentNumber = (id))
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_exec_sys_tab_set_message {
i2o_message_frame_t StdMessageFrame;
i2o_transaction_context_t TransactionContext;
union {
struct {
uint16_t reserved:4;
uint16_t IOP_ID:12;
} s2;
uint16_t h1;
} u2;
uint16_t HostUnitID;
union {
struct {
uint32_t reserved1:20;
uint32_t SegmentNumnber:12;
} s3;
uint32_t w3;
} u3;
i2o_sg_element_t SGL;
} i2o_exec_sys_tab_set_message_t;
/* macros to access the bit fields in exec ddm enable message structure */
#define get_i2o_exec_sys_tab_set_IOP_ID(p, hdl) \
(ddi_get16(hdl, &(p)->u2.h1) & 0xFFF)
#define put_i2o_exec_sys_tab_set_IOP_ID(mp, id, hdl) \
ddi_put16(hdl, &(mp)->u2.h1, \
(ddi_get16(hdl, &(mp)->u2.h1) & ~0xFFF) | ((id) & 0xFFF))
#define get_i2o_exec_sys_tab_set_SegmentNumber(mp, hdl) \
(ddi_get32(hdl, &(mp)->u3.w3) & 0xFFF)
#define put_i2o_exec_sys_tab_set_SegmentNumber(mp, id, hdl) \
ddi_put32(hdl, &(mp)->u3.w3, \
(ddi_get32(hdl, &(mp)->u3.w3) & ~0xFFF) | ((id) & 0xFFF))
#endif
/* ExecSysTabSet (System Table) Header Reply structure. */
#define I2O_SET_SYSTAB_RESERVED_SZ 8
typedef struct i2o_set_systab_header {
uint8_t NumberEntries;
uint8_t SysTabVersion;
uint16_t reserved;
uint32_t CurrentChangeIndicator;
uint8_t reserved1[I2O_SET_SYSTAB_RESERVED_SZ];
/* I2O_SYSTAB_ENTRY SysTabEntry[1]; */
} i2o_set_systab_header_t;
#define I2O_RESOURCE_MANAGER_VERSION 0
typedef struct i2o_messenger_info {
uint32_t InboundMessagePortAddressLow;
uint32_t InboundMessagePortAddressHigh;
} i2o_messenger_info_t;
/* ExecSysTabSet IOP Descriptor Entry structure. */
#if defined(_BIT_FIELDS_LTOH) && defined(_LITTLE_ENDIAN)
typedef struct i2o_iop_entry {
uint16_t OrganizationID;
uint16_t reserved;
union {
struct {
uint32_t IOP_ID:12;
uint32_t reserved1:20;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t SegmentNumber:12;
uint16_t I2oVersion:4;
} s3;
uint16_t h1;
} u3;
uint8_t IopState;
uint8_t MessengerType;
uint16_t InboundMessageFrameSize;
uint16_t reserved2;
uint32_t LastChanged;
uint32_t IopCapabilities;
i2o_messenger_info_t MessengerInfo;
} i2o_iop_entry_t;
#define get_i2o_iop_entry_IOP_ID(mp, hdl) \
((mp)->u2.s2.IOP_ID)
#define put_i2o_iop_entry_IOP_ID(mp, v, hdl) \
((mp)->u2.s2.IOP_ID) = (v)
#define get_i2o_iop_entry_SegmentNumber(mp, hdl) \
((mp)->u3.s3.SegmentNumber)
#define put_i2o_iop_entry_SegmentNumber(mp, v, hdl) \
((mp)->u3.s3.SegmentNumber) = (v)
#define get_i2o_iop_entry_I2oVersion(mp, hdl) \
((mp)->u3.s3.I2oVersion)
#define put_i2o_iop_entry_I2oVersion(mp, v, hdl) \
((mp)->u3.s3.I2oVersion) = (v)
#endif
#if defined(_BIT_FIELDS_HTOL) && defined(_BIG_ENDIAN)
typedef struct i2o_iop_entry {
uint16_t OrganizationID;
uint16_t reserved;
union {
struct {
uint32_t reserved1:20;
uint32_t IOP_ID:12;
} s2;
uint32_t w2;
} u2;
union {
struct {
uint16_t I2oVersion:4;
uint16_t SegmentNumber:12;
} s3;
uint16_t h1;
} u3;
uint8_t IopState;
uint8_t MessengerType;
uint16_t InboundMessageFrameSize;
uint16_t reserved2;
uint32_t LastChanged;
uint32_t IopCapabilities;
i2o_messenger_info_t MessengerInfo;
} i2o_iop_entry_t;
#define get_i2o_iop_entry_IOP_ID(mp, hdl) \
(ddi_get32(hdl, &(mp)->u2.w2) & 0xFFF)
#define put_i2o_iop_entry_IOP_ID(mp, v, hdl) \
(ddi_put32(hdl, &(mp)->u2.w2) & 0xFFF, (v))
#define get_i2o_iop_entry_SegmentNumber(mp, hdl) \
(ddi_get16(hdl, &(mp)->u3.h1) & 0xFFF)
#define put_i2o_iop_entry_SegmentNumber(mp, v, hdl) \
(ddi_put16(hdl, &(mp)->u3.h1) & 0xFFF, (v))
#define get_i2o_iop_entry_I2oVersion(mp, hdl) \
((ddi_get16(hdl, &(mp)->u3.h1) >> 12) & 0xF)
#define put_i2o_iop_entry_I2oVersion(mp, v, hdl) \
((ddi_put16(hdl, &(mp)->u3.h1) >> 12) & 0xF, (v))
#endif
/* ************************************************************************** */
/* Executive Parameter Groups */
/* ************************************************************************** */
#define I2O_EXEC_IOP_HARDWARE_GROUP_NO 0x0000
#define I2O_EXEC_IOP_MESSAGE_IF_GROUP_NO 0x0001
#define I2O_EXEC_EXECUTING_ENVIRONMENT_GROUP_NO 0x0002
#define I2O_EXEC_EXECUTING_DDM_LIST_GROUP_NO 0x0003
#define I2O_EXEC_DRIVER_STORE_GROUP_NO 0x0004
#define I2O_EXEC_DRIVER_STORE_TABLE_GROUP_NO 0x0005
#define I2O_EXEC_IOP_BUS_ATTRIBUTES_GROUP_NO 0x0006
#define I2O_EXEC_IOP_SW_ATTRIBUTES_GROUP_NO 0x0007
#define I2O_EXEC_HARDWARE_RESOURCE_TABLE_GROUP_NO 0x0100
#define I2O_EXEC_LCT_SCALAR_GROUP_NO 0x0101
#define I2O_EXEC_LCT_TABLE_GROUP_NO 0x0102
#define I2O_EXEC_SYSTEM_TABLE_GROUP_NO 0x0103
#define I2O_EXEC_EXTERNAL_CONN_TABLE_GROUP_NO 0x0104
/* EXEC Group 0000h - IOP Hardware Parameter Group */
/* IOP HardWare Capabilities defines */
#define I2O_IOP_HW_CAP_SELF_BOOT 0x00000001
#define I2O_IOP_HW_CAP_IRTOS_UPGRADEABLE 0x00000002
#define I2O_IOP_HW_CAP_DOWNLOADABLE_DDM 0x00000004
#define I2O_IOP_HW_CAP_INSTALLABLE_DDM 0x00000008
#define I2O_IOP_HW_CAP_BATTERY_BACKUP_RAM 0x00000010
/* IOP Processor Type defines */
#define I2O_IOP_PROC_TYPE_INTEL_80960 0x00
#define I2O_IOP_PROC_TYPE_AMD_29000 0x01
#define I2O_IOP_PROC_TYPE_MOTOROLA_68000 0x02
#define I2O_IOP_PROC_TYPE_ARM 0x03
#define I2O_IOP_PROC_TYPE_MIPS 0x04
#define I2O_IOP_PROC_TYPE_SPARC 0x05
#define I2O_IOP_PROC_TYPE_POWER_PC 0x06
#define I2O_IOP_PROC_TYPE_ALPHA 0x07
#define I2O_IOP_PROC_TYPE_INTEL_X86 0x08
#define I2O_IOP_PROC_TYPE_OTHER 0xFF
typedef struct i2o_exec_iop_hardware_scalar {
uint16_t I2oVendorID;
uint16_t ProductID;
uint32_t ProcessorMemory;
uint32_t PermMemory;
uint32_t HWCapabilities;
uint8_t ProcessorType;
uint8_t ProcessorVersion;
} i2o_exec_iop_hardware_scalar_t;
/* EXEC Group 0001h - IOP Message Interface Parameter Group */
/* InitCode defines */
#define I2O_MESSAGE_IF_INIT_CODE_NO_OWNER 0x00
#define I2O_MESSAGE_IF_INIT_CODE_BIOS 0x10
#define I2O_MESSAGE_IF_INIT_CODE_OEM_BIOS_EXTENSION 0x20
#define I2O_MESSAGE_IF_INIT_CODE_ROM_BIOS_EXTENSION 0x30
#define I2O_MESSAGE_IF_INIT_CODE_OS 0x80
typedef struct i2o_exec_iop_message_if_scalar {
uint32_t InboundFrameSize;
uint32_t InboundSizeTarget;
uint32_t InboundMax;
uint32_t InboundTarget;
uint32_t InboundPoolCount;
uint32_t InboundCurrentFree;
uint32_t InboundCurrentPost;
uint16_t StaticCount;
uint16_t StaticInstanceCount;
uint16_t StaticLimit;
uint16_t StaticInstanceLimit;
uint32_t OutboundFrameSize;
uint32_t OutboundMax;
uint32_t OutboundMaxTarget;
uint32_t OutboundCurrentFree;
uint32_t OutboundCurrentPost;
uint8_t InitCode;
} i2o_exec_iop_message_if_scalar_t;
/* EXEC Group 0002h - Executing Environment Parameter Group */
typedef struct i2o_exec_execute_environment_scalar {
uint32_t MemTotal;
uint32_t MemFree;
uint32_t PageSize;
uint32_t EventQMax;
uint32_t EventQCurrent;
uint32_t DDMLoadMax;
} i2o_exec_execute_environment_scalar_t;
/* EXEC Group 0003h - Executing DDM's Parameter Group */
/* ModuleType Defines */
#define I2O_EXEC_DDM_MODULE_TYPE_OTHER 0x00
#define I2O_EXEC_DDM_MODULE_TYPE_DOWNLOAD 0x01
#define I2O_EXEC_DDM_MODULE_TYPE_EMBEDDED 0x22
typedef struct i2o_exec_execute_ddm_table {
uint16_t DdmTID;
uint8_t ModuleType;
uint8_t reserved;
uint16_t I2oVendorID;
uint16_t ModuleID;
uint8_t ModuleName[I2O_MODULE_NAME_SZ];
uint32_t ModuleVersion;
uint32_t DataSize;
uint32_t CodeSize;
} i2o_exec_execute_ddm_table_t;
/* EXEC Group 0004h - Driver Store Environment Parameter Group */
typedef struct i2o_exec_driver_store_scalar {
uint32_t ModuleLimit;
uint32_t ModuleCount;
uint32_t CurrentSpace;
uint32_t FreeSpace;
} i2o_exec_driver_store_scalar_t;
/* EXEC Group 0005h - Driver Store Parameter Group */
typedef struct i2o_exec_driver_store_table {
uint16_t StoredDdmIndex;
uint8_t ModuleType;
uint8_t reserved;
uint16_t I2oVendorID;
uint16_t ModuleID;
uint8_t ModuleName[I2O_MODULE_NAME_SZ];
uint32_t ModuleVersion;
uint16_t DateDay;
uint16_t DateMonth;
uint32_t DateYear;
uint32_t ModuleSize;
uint32_t MpbSize;
uint32_t ModuleFlags;
} i2o_exec_driver_store_table_t;
/* EXEC Group 0006h - IOP's Bus Attributes Parameter Group */
#define I2O_EXEC_IOP_BUS_ATTRIB_SYSTEM_BUS 0x00
#define I2O_EXEC_IOP_BUS_ATTRIB_BRIDGED_SYSTEM_BUS 0x01
#define I2O_EXEC_IOP_BUS_ATTRIB_PRIVATE 0x02
typedef struct i2o_exec_iop_bus_attribute_table {
uint32_t BusID;
uint8_t BusType;
uint8_t MaxAdapters;
uint8_t AdapterCount;
uint8_t BusAttributes;
} i2o_exec_iop_bus_attribute_table_t;
/* EXEC Group 0007h - IOP's Bus Attributes Parameter Group */
#define I2O_EXEC_IOP_SW_CAP_IRTOS_I2O_COMPLIANT 0x00000001
#define I2O_EXEC_IOP_SW_CAP_IRTOS_UPGRADEABLE 0x00000002
#define I2O_EXEC_IOP_SW_CAP_DOWNLOADABLE_DDM 0x00000004
#define I2O_EXEC_IOP_SW_CAP_INSTALLABLE_DDM 0x00000008
typedef struct i2o_exec_iop_sw_attributes_scalar {
uint16_t I2oVendorID;
uint16_t ProductID;
uint32_t CodeSize;
uint32_t SWCapabilities;
} i2o_exec_iop_sw_attributes_scalar_t;
/* EXEC Group 0100h - Hardware Resource Table Parameter Group */
typedef struct i2o_exec_hardware_resource_table {
uint32_t AdapterID;
uint16_t StateInfo; /* AdapterState plus Local TID */
uint8_t BusNumber;
uint8_t BusType;
u_longlong_t PhysicalLocation;
uint32_t MemorySpace;
uint32_t IoSpace;
} i2o_exec_hardware_resource_table_t;
/* EXEC Group 0101h - Logical Configuration Table Scalar Parameter Group */
typedef struct i2o_exec_lct_scalar {
uint16_t BootDevice;
uint32_t IopFlags;
uint32_t CurrentChangeIndicator;
} i2o_exec_lct_scalar_t;
/* EXEC Group 0102h - Logical Configuration Table Parameter Group */
typedef struct i2o_exec_lct_table {
uint16_t LocalTID;
uint16_t UserTID;
uint16_t ParentTID;
uint16_t DdmTID;
uint32_t ChangeIndicator;
uint32_t DeviceFlags;
uint32_t ClassID;
uint32_t SubClass;
uint8_t IdentityTag[I2O_IDENTITY_TAG_SZ];
uint32_t EventCapabilities;
uint8_t BiosInfo;
} i2o_exec_lct_table_t;
/* EXEC Group 0103h - System Table Parameter Group */
#define I2O_MESSENGER_TYPE_MEMORY_MAPPED_MESSAGE_UNIT 0x0
typedef struct i2o_exec_system_table {
uint16_t IOP_ID;
uint16_t OrganizationID;
uint16_t SegmentNumber;
uint8_t Version;
uint8_t IopState;
uint8_t MessengerType;
uint8_t reserved;
uint32_t InboundMessagePortAddress;
uint16_t InboundMessageFrameSize;
uint32_t IopCapabilities;
i2o_messenger_info_t MessengerInfo;
} i2o_exec_system_table_t;
/* EXEC Group 0104h - External Connection Table Parameter Group */
#define I2O_EXEC_XCT_FLAGS_REMOTE_IOP_CREATED_CONNECTION 0x00
#define I2O_EXEC_XCT_FLAGS_THIS_IOP_CREATED_CONNECTION 0x01
typedef struct i2o_exec_external_connection_table {
uint16_t LocalAliasTID;
uint16_t RemoteTID;
uint16_t RemoteIOP;
uint16_t RemoteUnitID;
uint8_t Flags;
uint8_t reserved;
} i2o_exec_external_connection_table_t;
#ifdef __cplusplus
}
#endif
#endif /* _SYS_I2OEXEC_H */