summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/io/cpqary3/cpqary3_scsi.h
blob: 515c5683693bd66bae0104736796c01ba71c4f53 (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
229
230
231
232
233
234
235
/*
 * This file and its contents are supplied under the terms of the
 * Common Development and Distribution License ("CDDL"), version 1.0.
 * You may only use this file in accordance with the terms of version
 * 1.0 of the CDDL.
 *
 * A full copy of the text of the CDDL should have accompanied this
 * source.  A copy of the CDDL is also available via the Internet at
 * http://www.illumos.org/license/CDDL.
 */

/*
 * Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
 */

#ifndef	_CPQARY3_SCSI_H
#define	_CPQARY3_SCSI_H

#include <sys/types.h>
#include "cpqary3_ciss.h"

#ifdef	__cplusplus
extern "C" {
#endif

/* CISS LUN Addressing MODEs */
#define	PERIPHERIAL_DEV_ADDR 			0x0
#define	LOGICAL_VOL_ADDR 				0x1
#define	MASK_PERIPHERIAL_DEV_ADDR 		0x3
#define	CISS_PHYS_MODE 					0x0

/*
 * Definitions for compatibility with the old array BMIC interface
 * CISS_OPCODE_RLL IS THE OPCODE FOR THE Report Logical Luns command
 */
#define	ARRAY_READ				0x26
#define	ARRAY_WRITE				0x27
#define	CISS_NEW_READ				0xC0
#define	CISS_NEW_WRITE				0xC1
#define	CISS_OPCODE_RLL				0xC2
#define	CISS_OPCODE_RPL				0xC3
#define	CISS_NO_TIMEOUT				0x0

/*
 * BMIC commands
 */
#define	CISS_FLUSH_CACHE			0xC2
#define	BMIC_IDENTIFY_LOGICAL_DRIVE		0x10
#define	BMIC_SENSE_LOGICAL_DRIVE_STATUS		0x12

#define	CISS_MSG_ABORT				0x0
#define	CISS_ABORT_TASK				0x0
#define	CISS_ABORT_TASKSET			0x1
#define	CISS_CTLR_INIT 				0xffff0000

#define	CISS_MSG_RESET				0x1
#define	CISS_RESET_CTLR				0x0
#define	CISS_RESET_TGT				0x3

/*
 * The Controller SCSI ID is 7. Hence, when ever the OS issues a command
 * for a target with ID greater than 7, the intended Logical Drive is
 * actually one less than the issued ID.
 * So, the allignment.
 * The Mapping from OS to the HBA is as follows:
 *	OS Target IDs		HBA taret IDs
 *		0 - 6				0 - 6
 *		7					- (Controller)
 *		8 - 32				7 - 31
 */

#define	CPQARY3_TGT_ALIGNMENT			0x1
#define	CPQARY3_LEN_TAGINUSE			0x4

#define	CPQARY3_CDBLEN_12				12
#define	CPQARY3_CDBLEN_16				16

/*
 * possible values to fill in the cmdpvt_flag member
 * in the cpqary3_cmdpvt_t structure
 */
#define	CPQARY3_TIMEOUT			1
#define	CPQARY3_CV_TIMEOUT		2
#define	CPQARY3_RESET			4
#define	CPQARY3_SYNC_SUBMITTED		8
#define	CPQARY3_SYNC_TIMEOUT		16

#define	CPQARY3_INTR_ENABLE 		1
#define	CPQARY3_INTR_DISABLE 		2

#define	CPQARY3_LOCKUP_INTR_ENABLE 	1
#define	CPQARY3_LOCKUP_INTR_DISABLE 	2

#define	CPQARY3_COALESCE_DELAY		0x0
#define	CPQARY3_COALESCE_COUNT		0x00000001l

#define	CPQARY3_NO_MUTEX 		0
#define	CPQARY3_HOLD_SW_MUTEX		1

/* Completed With NO Error */
#define	CPQARY3_OSCMD_SUCCESS		0x0
#define	CPQARY3_SELFCMD_SUCCESS		0x2
#define	CPQARY3_NOECMD_SUCCESS		0x4
#define	CPQARY3_SYNCCMD_SUCCESS		0x6

/* Completed With ERROR */
#define	CPQARY3_OSCMD_FAILURE		0x1
#define	CPQARY3_SELFCMD_FAILURE		0x3
#define	CPQARY3_NOECMD_FAILURE		0x5
#define	CPQARY3_SYNCCMD_FAILURE		0x7

/* Fatal SCSI Status */
#define	SCSI_CHECK_CONDITION			0x2
#define	SCSI_COMMAND_TERMINATED			0x22

#pragma pack(1)

typedef struct flushcache {
	uint16_t	disable_flag;
	uint8_t		reserved[510];
} flushcache_buf_t;

typedef struct each_logical_lun_data {
	uint32_t	logical_id:30;
	uint32_t	mode:2;
	uint8_t		reserved[4];
} each_ll_data_t;

typedef struct rll_data {
	uint8_t			lunlist_byte3;
	uint8_t			lunlist_byte2;
	uint8_t			lunlist_byte1;
	uint8_t			lunlist_byte0;
	uint32_t		reserved;
	each_ll_data_t	ll_data[MAX_LOGDRV];
} rll_data_t;

typedef struct each_physical_lun_data {
	uint32_t	    DevID;
	uint32_t	    SecLevel;
} each_pl_data_t;

typedef struct rpl_data {
	uint8_t			lunlist_byte3;
	uint8_t			lunlist_byte2;
	uint8_t			lunlist_byte1;
	uint8_t			lunlist_byte0;
	uint32_t		reserved;
	PhysDevAddr_t	pl_data[CPQARY3_MAX_TGT];
} rpl_data_t;


/*
 * Format of the data returned for the IDENTIFY LOGICAL DRIVE Command
 */

typedef struct Identify_Logical_Drive {
	uint16_t	block_size_in_bytes;
	uint32_t	blocks_available;
	uint16_t	cylinders;
	uint8_t		heads;
	uint8_t		general[11];
	uint8_t		sectors;
	uint8_t		checksum;
	uint8_t		fault_tolerance;
	uint8_t		reserved;
	uint8_t		bios_disable_flag;
	uint8_t		reserved1;
	uint32_t	logical_drive_identifier;
	uint8_t		logical_drive_label[64];
	uint8_t		reserved3[418];
} IdLogDrive;

/* FORMAT */
typedef struct Identify_Ld_Status {
	uint8_t		status;			/* Logical Drive Status */
	uint32_t	failure_map;		/* Drive Failure Map */
	uint16_t	read_error_count[32];	/* read error count */
	uint16_t	write_error_count[32];	/* write error count */
	uint8_t		drive_error_data[256];	/* drive error data */
	uint8_t		drq_time_out_count[32];	/* drq timeout count */
	uint32_t	blocks_left_to_recover;	/* blocks yet to recover */
	uint8_t		drive_recovering;	/* drive recovering */
	uint16_t	remap_count[32];	/* remap count */
	uint32_t	replacement_drive_map;	/* replacement drive map */
	uint32_t	active_spare_map;	/* active spare map */
	uint8_t		spare_status;		/* spare status */
	uint8_t		spare_to_replace_map[32];
	uint32_t	replace_ok_map;		/* Marked ok but no rebuild */
	uint8_t		media_exchanged;	/* Media exchanged (see 0xE0) */
	uint8_t		cache_failure;		/* volume failed cache fail */
	uint8_t		expand_failure;		/* volume failed for failure */
	uint8_t		unit_flags;		/* SMART-2 only */

	/*
	 * The following fields are for firmware supporting > 7 drives per
	 * SCSI bus. The "Drives Per SCSI Bus" indicates how many bits /
	 * words (in case of remap count) correspond to each drive.
	 */
	uint16_t	big_failure_map[8];	/* Big Drive Failure Map */
	uint16_t	big_remap_cnt[128];	/* Big Drive Remap  Count */
	uint16_t	big_replace_map[8];	/* Big Replacement Drive Map */
	uint16_t	big_spare_map[8];	/* Big spare drive map */
	uint8_t		big_spare_replace_map[128]; /* Big spare replace map */
	uint16_t	big_replace_ok_map[8];	/* Big replaced marked OK map */
	uint8_t		big_drive_rebuild;	/* Drive Rebuilding - Drive # */
	uint8_t		reserved[36];
} SenseLdStatus;
/* FORMAT */

/*
 * SCSI Command Opcodes
 */
#define	SCSI_READ_6		0x08	/* READ  - 6  byte command */
#define	SCSI_READ_10		0x28	/* READ  - 10 byte command */
#define	SCSI_READ_12		0xA8	/* READ  - 12 byte command */
#define	SCSI_WRITE_6		0x0A	/* WRITE - 6  byte command */
#define	SCSI_WRITE_10		0x2A	/* WRITE - 10 byte command */
#define	SCSI_WRITE_12		0xAA	/* WRITE - 12 byte command */

/*
 * SCSI Opcodes Not supported by FW
 *
 */
#define	SCSI_LOG_SENSE			0x4D	/* LOG SENSE */
#define	SCSI_MODE_SELECT		0x15	/* LOG SENSE */
#define	SCSI_PERSISTENT_RESERVE_IN	0x5E	/* PERSISTENT RESERVE IN */

#pragma pack()

#ifdef	__cplusplus
}
#endif

#endif	/* _CPQARY3_SCSI_H */