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