aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ida/idareg.h
blob: bfaee97681f8e3d97f97c6592440a847aba7315a (plain) (blame)
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
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
/*-
 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
 *
 * Copyright (c) 1999,2000 Jonathan Lemon
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $FreeBSD$
 */

/*
 * #defines and software structures for the Compaq RAID card
 */

/*
 * board register offsets for SMART-2 controllers
 */
#define	R_CMD_FIFO	0x04
#define	R_DONE_FIFO	0x08
#define	R_INT_MASK	0x0C
#define	R_STATUS	0x10
#define	R_INT_PENDING	0x14

/*
 * interrupt mask values for SMART series
 */
#define	INT_DISABLE	0x00
#define	INT_ENABLE	0x01

/*
 * board offsets for the 42xx series
 */
#define	R_42XX_STATUS	0x30
#define	R_42XX_INT_MASK	0x34
#define	R_42XX_REQUEST	0x40
#define	R_42XX_REPLY	0x44

/*
 * interrupt values for 42xx series
 */
#define	INT_ENABLE_42XX			0x00
#define	INT_DISABLE_42XX		0x08
#define	STATUS_42XX_INT_PENDING		0x08

/*
 * return status codes
 */
#define	SOFT_ERROR	0x02	/* Non-fatal error. */
#define	HARD_ERROR	0x04	/* Fatal error. */
#define	INVALID_ERROR	0x10	/* Invalid Request Block. */
#define	CMD_REJECTED	0x14

/*
 * command types
 */
#define	CMD_GET_LOG_DRV_INFO	0x10	/* Identify controller */
#define	CMD_GET_CTRL_INFO	0x11	/* Identify logical driver */
#define	CMD_SENSE_DRV_STATUS	0x12	/* Sense logical drive status */
#define	CMD_START_RECOVERY	0x13	/* Start recover */
#define	CMD_GET_PHYS_DRV_INFO	0x15	/* Identify physical drive */
#define	CMD_BLINK_DRV_LEDS	0x16	/* Blink drive tray LEDs */
#define	CMD_SENSE_DRV_LEDS	0x17	/* Sense Blinking drive tray LEDs */
#define	CMD_GET_LOG_DRV_EXT	0x18	/* Identify logical drive, Extended */
#define	CMD_READ		0x20	/* Read */
#define	CMD_WRITE		0x30	/* Write */
#define	CMD_WRITE_MEDIA		0x31	/* Write media */
#define	CMD_RESET_CTRL		0x40	/* Reset controller */
#define	CMD_DIAG_PASS_THRU	0x41	/* ??? */
#define	CMD_GET_CONFIG		0x50	/* Sense configuration */
#define	CMD_SET_CONFIG		0x51	/* Set configuration */

#define	CMD_BYPASS_VOL_STATE	0x52	/* ??? */
#define	CMD_SS_CREATE_VOL	0x53	/* ??? */
#define	CMD_CHANGE_CONFIG	0x54	/* ??? */
#define	CMD_SENSE_ORIG_CONF	0x55	/* ??? */
#define	CMD_REORDER_LOG_DRV	0x56	/* ??? */

#define	CMD_LABEL_LOG_DRV	0x57	/* Label logical drive */
#define	CMD_SS_TO_VOL		0x58	/* ??? */
#define	CMD_SET_SURFACE_DELAY	0x60	/* Set surface delay */
#define	CMD_SET_OVERHEAT_DELAY	0x61	/* ??? */
#define	CMD_SENSE_BUS_PARAMS	0x65	/* Sense bus parameters */
#define	CMD_SENSE_SUBSYS_INFO	0x66	/* Sense Subsystem Information */
#define	CMD_SENSE_SURFACE_ATS	0x70	/* Sense surface analysis task status */
#define	CMD_PASSTHROUGH		0x90	/* Pass-through operation */
#define	CMD_PASSTHROUGH_A	0x91	/* ??? */
#define	CMD_RESET_SCSI_DEV	0x94	/* Reset SCSI device */
#define	CMD_PAUSE_BG_ACT	0x98	/* Pause Background Activity */
#define	CMD_RESUME_BG_ACT	0x99	/* Resume Background Activity */
#define	CMD_START_FIRMWARE	0x99	/* for integrated RAID */
#define	CMD_SENSE_DRV_ERR_LOG	0xa6	/* Sense drive error log */
#define	CMD_START_CPM		0xa7	/* Start controller performance monitoring */
#define	CMD_SENSE_CP		0xa8	/* Sense controller performance */
#define	CMD_STOP_CPM		0xa9	/* Stop controller performance monitoring */
#define	CMD_FLUSH_CACHE		0xc2	/* Flush/disable write cache */
#define	CMD_COLLECT_BUFFER	0xd2	/* ??? */
#define	CMD_ACCEPT_MEDIA_EXCH	0xe0	/* Accept Media Exchange */	

#define	CMD_FLASH_READ		0xf6	/* Read FLASH */
#define	CMD_FLASH_WRITE		0xf7	/* Write FLASH */

/* logical drive parameter table */
struct ida_drive_param {
	u_int16_t	ncylinders;
	u_int8_t	nheads;
	u_int8_t	signature;
	u_int8_t	psectors;
	u_int16_t	wprecomp;
	u_int8_t	max_acc;
	u_int8_t	control;
	u_int16_t	pcylinders;
	u_int8_t	ptracks;
	u_int16_t	landing_zone;
	u_int8_t	nsectors;
	u_int8_t	checksum;
} __packed;

#define	IDA_RAID0	0	/* No fault tolerance. */
#define	IDA_RAID4	1	/* Data Guard */
#define	IDA_RAID1	2	/* Mirroring */
#define	IDA_RAID5	3	/* Distributed Data Guard */

/*
 * CMD_GET_LOG_DRV_INFO (0x10)
 * Identify Logical Drive
 */
struct ida_drive_info {
	u_int16_t	secsize;	/* block size in bytes */
	u_int32_t	secperunit;	/* blocks available */
	struct ida_drive_param	dp;	/* logical drive parameter table */
	u_int8_t	mirror;		/* fault tolerance */
	u_int8_t	reserved;
	u_int8_t	bios_disable;
} __packed;

/*
 * CMD_GET_LOG_DRV_EXT (0x18)
 * Identify Logical Drive, Extended
 */
struct ida_drive_info_ext {
	u_int16_t	secsize;	/* block size in bytes */
	u_int32_t	secperunit;	/* blocks available */
	struct ida_drive_param	dp;	/* logical drive parameter table */
	u_int8_t	mirror;		/* fault tolerance */
	u_int8_t	reserved;
	u_int8_t	bios_disable;
	u_int32_t	ld_id;		/* Logical drive identifier */
	u_int8_t	ld_label[64];	/* Logical drive label */
} __packed;

/*
 * CMD_GET_CTRL_INFO (0x11)
 * Identify Controller
 */
struct ida_controller_info {
	u_int8_t	num_drvs;	/* Number of configured logical drives */
	u_int32_t	signature;	/* Configuration signature */
	u_int8_t	firm_rev[4];	/* ASCII firmware revision */
	u_int8_t	rom_rev[4];	/* ROM firmware revision */
	u_int8_t	hw_rev;		/* Revision level of the hardware */
	u_int32_t	bb_rev;
	u_int32_t	dp_map;		/* Drive present bit map */
	u_int32_t	ed_map;		/* External drive bit map */
	u_int32_t	board_id;
	u_int8_t	cfg_error;
	u_int32_t	nd_map;		/* Non-disk map */
	u_int8_t	bad_ram_addr;
	u_int8_t	cpu_rev;
	u_int8_t	pdpi_rev;
	u_int8_t	epic_rev;
	u_int8_t	wcxc_rev;
	u_int8_t	mkt_rev;	/* Marketing revision */
	u_int8_t	cflag;		/* Controller flags */
#define	IDA_CI_CFLAG_7DPB	(1<<3)
#define	IDA_CI_CFLAG_BIGMAP	(1<<7)
	u_int8_t	hflag;
	u_int8_t	expand_dis;
	u_int8_t	scsi_cc;	/* SCSI chip count */
	u_int32_t	max_req_blocks;
	u_int32_t	cclock;		/* Controller Clock */
	u_int8_t	dp_scsi;	/* Drives per SCSI bus */
	u_int16_t	big_dp_map[8];	/* Big drive present bit map */
	u_int16_t	big_ed_map[8];	/* Big external drive bit map */
	u_int16_t	big_nd_map[8];	/* Big non-disk map */
	u_int16_t	task_flags;
	u_int8_t	icl_bus;
	u_int8_t	red_modes;
	u_int8_t	cur_red_mode;
	u_int8_t	red_ctlr_stat;
	u_int8_t	red_fail_reason;
	u_int8_t	reserved[403];
} __packed;

/*
 * CMD_SENSE_DRV_STATUS (0x12)
 * Sense logical drive status
 */
struct ida_drive_status {
	u_int8_t	status;
	u_int32_t	failure_map;
	u_int16_t	read_err[32];
	u_int16_t	write_error[32];
	u_int8_t	reserved0[288];
	u_int32_t	secrecover;
	u_int8_t	rebuilding;
	u_int16_t	remap_cnt[32];
	u_int32_t	repl_map;
	u_int32_t	spare_map;
	u_int8_t	spare_status;
	u_int8_t	spare_repl_map[32];
	u_int32_t	repl_ok_map;
	u_int8_t	media_exchange;
	u_int8_t	cache_failure;
	u_int8_t	expand_failure;
	u_int8_t	unit_flags;
	u_int16_t	big_failure_map[8];
	u_int16_t	big_remap_cnt[128];
	u_int16_t	big_repl_map[8];
	u_int16_t	big_act_spare_map[8];
	u_int8_t	big_spare_repl_map[128];
	u_int16_t	big_repl_ok_map[8];
	u_int8_t	big_rebuilding;
	u_int8_t	reserved1[36];
} __packed;

/*
 * CMD_GET_PHYS_DRV_INFO (0x15)
 * Identify Physical Drive
 */
struct ida_phys_drv_info {
	u_int8_t	scsi_bus;	/* SCSI Bus */
	u_int8_t	scsi_id;	/* SCSI ID */
	u_int16_t	blksize;	/* block size in bytes */
	u_int32_t	blkcount;	/* total blocks */
	u_int32_t	blkreserved;	/* reserved blocks */
	u_int8_t	drv_model[40];	/* drive model */
	u_int8_t	drv_serial[40];	/* drive serial number */
	u_int8_t	drv_fwrev[8];	/* drive firmware revision */
	u_int8_t	scsi_inq;	/* SCSI inquiry bits */
	u_int8_t	cpq_drv_stmp;
	u_int8_t	last_fail;
	u_int8_t	pd_flags;	/* physical drive flags */
#define	PDF_DISK_PRESENT	0x01
#define	PDF_NONDISK_PRESENT	0x02
#define	PDF_WIDE_ENABLED	0x04
#define	PDF_SYNC		0x08
#define	PDF_NARROW_TRAY		0x10
#define	PDF_WIDEFAIL		0x20
#define	PDF_ULTRA		0x40
#define	PDF_ULTRA2		0x80
	u_int8_t	mpd_flags;	/* more physical drive flags */
#define	MPDF_SMART_SUPPORT	0x01	/* S.M.A.R.T supported */
#define	MPDF_SMART_ERRORS	0x02	/* S.M.A.R.T errors recorded */
#define	MPDF_SMART_ENABLED	0x04	/* S.M.A.R.T predictive failure is enabled */
#define	MPDF_SMART_ERR_RESET	0x08	/* S.M.A.R.T errors recorded since last reset */
#define	MPDF_DRIVE_EXTERNAL	0x10	/* Connected to external connector. */
#define	MPDF_DRIVE_CONF_LVOL	0x20	/* Configured as part of a logical volume */
#define	MPDF_DRIVE_CONF_SPARE	0x40	/* Configured as a spare */
#define	MPDF_DRIVE_WCE		0x80	/* Drive WCE set on spinup */
	u_int8_t	scsi_lun;
	u_int8_t	ympd_flags;	/* yet more physical drive flags */
#define	YMPDF_DRIVE_WCE_SET	0x40	/* WCE currently set */
#define	YMPDF_DRIVE_WCE_CHNG	0x80	/* WCE changeable */
	u_int8_t	reserved;
	u_int32_t	spi_speed_rules;
	u_int8_t	phys_con[2];	/* Physical Connector */
	u_int8_t	phys_box;	/* Physical Box on Bus */
	u_int8_t	phys_bay;	/* Physical Bay in Box */
} __packed;

/*
 * CMD_BLINK_DRV_LEDS (0x16)
 * Blink Drive Tray LEDs
 *
 * CMD_SENSE_DRV_LEDS (0x17)
 * Sense Blinking Drive Tray LEDs
 */
struct ida_blink_drv_leds {
	u_int32_t	bd;		/* Blink duration (in 10ths sec) */
	u_int32_t	bte;		/* Blink time elapsed (sense only) */
	u_int8_t	bse[256];	/* Blink/seek enable */
	u_int8_t	reserved1[248];
} __packed;

/*
 * CMD_LABEL_LOG_DRV (0x57)
 * Label Logical Drive
 */
struct ida_label_logical {
	u_int32_t	ld_id;		/* Logical drive identifier */
	u_int8_t	ld_label[64];	/* Logical drive label */
} __packed;