root/usr/src/uts/common/sys/mpt/mpi_init.h
/*
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef _SYS_MPI_INIT_H
#define _SYS_MPI_INIT_H

#ifdef  __cplusplus
extern "C" {
#endif

/*
 * SCSI Initiator Messages
 */

/*
 * SCSI IO messages and assocaited structures
 */
typedef struct msg_scsi_io_request {
        uint8_t                 TargetID;
        uint8_t                 Bus;
        uint8_t                 ChainOffset;
        uint8_t                 Function;
        uint8_t                 CDBLength;
        uint8_t                 SenseBufferLength;
        uint8_t                 Reserved;
        uint8_t                 MsgFlags;
        uint32_t                MsgContext;
        uint8_t                 LUN[8];
        uint32_t                Control;
        uint8_t                 CDB[16];
        uint32_t                DataLength;
        uint32_t                SenseBufferLowAddr;
        sge_io_union_t          SGL;
} msg_scsi_io_request_t;

/* SCSIO MsgFlags bits */

#define MPI_SCSIIO_MSGFLGS_SENSE_WIDTH          0x01
#define MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_32       0x00
#define MPI_SCSIIO_MSGFLGS_SENSE_WIDTH_64       0x01
#define MPI_SCSIIO_MSGFLGS_SENSE_LOCATION       0x02
#define MPI_SCSIIO_MSGFLGS_SENSE_LOC_HOST       0x00
#define MPI_SCSIIO_MSGFLGS_SENSE_LOC_IOC        0x02

/*
 * SCSIIO LUN fields
 */
#define MPI_SCSIIO_LUN_FIRST_LEVEL_ADDRESSING   0x0000FFFF
#define MPI_SCSIIO_LUN_SECOND_LEVEL_ADDRESSING  0xFFFF0000
#define MPI_SCSIIO_LUN_THIRD_LEVEL_ADDRESSING   0x0000FFFF
#define MPI_SCSIIO_LUN_FOURTH_LEVEL_ADDRESSING  0xFFFF0000
#define MPI_SCSIIO_LUN_LEVEL_1_WORD             0xFF00
#define MPI_SCSIIO_LUN_LEVEL_1_DWORD            0x0000FF00

/*
 * SCSIO Control bits
 */
#define MPI_SCSIIO_CONTROL_DATADIRECTION_MASK   0x03000000
#define MPI_SCSIIO_CONTROL_NODATATRANSFER       0x00000000
#define MPI_SCSIIO_CONTROL_WRITE                0x01000000
#define MPI_SCSIIO_CONTROL_READ                 0x02000000

#define MPI_SCSIIO_CONTROL_ADDCDBLEN_MASK       0x3C000000
#define MPI_SCSIIO_CONTROL_ADDCDBLEN_SHIFT      26

#define MPI_SCSIIO_CONTROL_TASKATTRIBUTE_MASK   0x00000700
#define MPI_SCSIIO_CONTROL_SIMPLEQ              0x00000000
#define MPI_SCSIIO_CONTROL_HEADOFQ              0x00000100
#define MPI_SCSIIO_CONTROL_ORDEREDQ             0x00000200
#define MPI_SCSIIO_CONTROL_ACAQ                 0x00000400
#define MPI_SCSIIO_CONTROL_UNTAGGED             0x00000500
#define MPI_SCSIIO_CONTROL_NO_DISCONNECT        0x00000700

#define MPI_SCSIIO_CONTROL_TASKMANAGE_MASK      0x00FF0000
#define MPI_SCSIIO_CONTROL_OBSOLETE             0x00800000
#define MPI_SCSIIO_CONTROL_CLEAR_ACA_RSV        0x00400000
#define MPI_SCSIIO_CONTROL_TARGET_RESET         0x00200000
#define MPI_SCSIIO_CONTROL_LUN_RESET_RSV        0x00100000
#define MPI_SCSIIO_CONTROL_RESERVED             0x00080000
#define MPI_SCSIIO_CONTROL_CLR_TASK_SET_RSV     0x00040000
#define MPI_SCSIIO_CONTROL_ABORT_TASK_SET       0x00020000
#define MPI_SCSIIO_CONTROL_RESERVED2            0x00010000


/*
 * SCSIIO reply structure
 */
typedef struct msg_scsi_io_reply {
        uint8_t                 TargetID;
        uint8_t                 Bus;
        uint8_t                 MsgLength;
        uint8_t                 Function;
        uint8_t                 CDBLength;
        uint8_t                 SenseBufferLength;
        uint8_t                 Reserved;
        uint8_t                 MsgFlags;
        uint32_t                MsgContext;
        uint8_t                 SCSIStatus;
        uint8_t                 SCSIState;
        uint16_t                IOCStatus;
        uint32_t                IOCLogInfo;
        uint32_t                TransferCount;
        uint32_t                SenseCount;
        uint32_t                ResponseInfo;
        uint16_t                TaskTag;
        uint16_t                Reserved1;
} msg_scsi_io_reply_t;

/*
 * SCSIIO Reply SCSIStatus values (SAM-2 status codes)
 */
#define MPI_SCSI_STATUS_SUCCESS                 0x00
#define MPI_SCSI_STATUS_CHECK_CONDITION         0x02
#define MPI_SCSI_STATUS_CONDITION_MET           0x04
#define MPI_SCSI_STATUS_BUSY                    0x08
#define MPI_SCSI_STATUS_INTERMEDIATE            0x10
#define MPI_SCSI_STATUS_INTERMEDIATE_CONDMET    0x14
#define MPI_SCSI_STATUS_RESERVATION_CONFLICT    0x18
#define MPI_SCSI_STATUS_COMMAND_TERMINATED      0x22
#define MPI_SCSI_STATUS_TASK_SET_FULL           0x28
#define MPI_SCSI_STATUS_ACA_ACTIVE              0x30

/*
 * SCSIIO Reply SCSIState values
 */
#define MPI_SCSI_STATE_AUTOSENSE_VALID          0x01
#define MPI_SCSI_STATE_AUTOSENSE_FAILED         0x02
#define MPI_SCSI_STATE_NO_SCSI_STATUS           0x04
#define MPI_SCSI_STATE_TERMINATED               0x08
#define MPI_SCSI_STATE_RESPONSE_INFO_VALID      0x10
#define MPI_SCSI_STATE_QUEUE_TAG_REJECTED       0x20

/*
 * SCSIIO Reply ResponseInfo values
 * (FCP-1 RSP_CODE values and SPI-3 Packetized Failure codes)
 */
#define MPI_SCSI_RSP_INFO_FUNCTION_COMPLETE     0x00000000
#define MPI_SCSI_RSP_INFO_FCP_BURST_LEN_ERROR   0x01000000
#define MPI_SCSI_RSP_INFO_CMND_FIELDS_INVALID   0x02000000
#define MPI_SCSI_RSP_INFO_FCP_DATA_RO_ERROR     0x03000000
#define MPI_SCSI_RSP_INFO_TASK_MGMT_UNSUPPORTED 0x04000000
#define MPI_SCSI_RSP_INFO_TASK_MGMT_FAILED      0x05000000
#define MPI_SCSI_RSP_INFO_SPI_LQ_INVALID_TYPE   0x06000000

/*
 * SCSI Task Management messages
 */
typedef struct msg_scsi_task_mgmt {
        uint8_t                 TargetID;
        uint8_t                 Bus;
        uint8_t                 ChainOffset;
        uint8_t                 Function;
        uint8_t                 Reserved;
        uint8_t                 TaskType;
        uint8_t                 Reserved1;
        uint8_t                 MsgFlags;
        uint32_t                MsgContext;
        uint8_t                 LUN[8];
        uint32_t                Reserved2[7];
        uint32_t                TaskMsgContext;
} msg_scsi_task_mgmt_t;

/*
 * TaskType values
 */
#define MPI_SCSITASKMGMT_TASKTYPE_ABORT_TASK            0x00000001
#define MPI_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET         0x00000002
#define MPI_SCSITASKMGMT_TASKTYPE_TARGET_RESET          0x00000003
#define MPI_SCSITASKMGMT_TASKTYPE_RESET_BUS             0x00000004
#define MPI_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET    0x00000005

/*
 * MsgFlags bits
 */
#define MPI_SCSITASKMGMT_MSGFLAGS_TARGET_RESET_OPTION   0x00000000
#define MPI_SCSITASKMGMT_MSGFLAGS_LIP_RESET_OPTION      0x00000002
#define MPI_SCSITASKMGMT_MSGFLAGS_LIPRESET_RESET_OPTION 0x00000004

/* SCSI Task Management Reply */

typedef struct msg_scsi_task_mgmt_reply {
        uint8_t                 TargetID;
        uint8_t                 Bus;
        uint8_t                 MsgLength;
        uint8_t                 Function;
        uint8_t                 Reserved;
        uint8_t                 TaskType;
        uint8_t                 Reserved1;
        uint8_t                 MsgFlags;
        uint32_t                MsgContext;
        uint8_t                 Reserved2[2];
        uint16_t                IOCStatus;
        uint32_t                IOCLogInfo;
        uint32_t                TerminationCount;
} msg_scsi_task_mgmt_reply_t;

/*
 * SCSI enclosure processor messages
 */
typedef struct msg_sep_request {
        uint8_t                 TargetID;
        uint8_t                 Bus;
        uint8_t                 ChainOffset;
        uint8_t                 Function;
        uint8_t                 Action;
        uint8_t                 Reserved1;
        uint8_t                 Reserved2;
        uint8_t                 MsgFlags;
        uint32_t                MsgContext;
        uint32_t                SlotStatus;
} msg_sep_request_t;

#define MPI_SEP_REQ_ACTION_WRITE_STATUS                 0x00
#define MPI_SEP_REQ_ACTION_READ_STATUS                  0x01

#define MPI_SEP_REQ_SLOTSTATUS_NO_ERROR                 0x00000001
#define MPI_SEP_REQ_SLOTSTATUS_DEV_FAULTY               0x00000002
#define MPI_SEP_REQ_SLOTSTATUS_DEV_REBUILDING           0x00000004

#ifdef  __cplusplus
}
#endif

#endif  /* _SYS_MPI_INIT_H */