/*
 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_MPI_INIT_H
#define	_SYS_MPI_INIT_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#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 */