summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/mpt/mpi_init.h
blob: 3e5cd7fc32aa92155c04522ff06b5028ad0740dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
/*
 * 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 */