ispmbox.h revision 1.5 1 1.5 mjacob /* $NetBSD: ispmbox.h,v 1.5 1997/09/29 01:41:30 mjacob Exp $ */
2 1.1 cgd
3 1.1 cgd /*
4 1.1 cgd * Mailbox and Command Definitions for for Qlogic ISP SCSI adapters.
5 1.1 cgd *
6 1.2 cgd * Copyright (c) 1997 by Matthew Jacob
7 1.2 cgd * NASA/Ames Research Center
8 1.1 cgd * All rights reserved.
9 1.1 cgd *
10 1.1 cgd * Redistribution and use in source and binary forms, with or without
11 1.1 cgd * modification, are permitted provided that the following conditions
12 1.1 cgd * are met:
13 1.1 cgd * 1. Redistributions of source code must retain the above copyright
14 1.1 cgd * notice immediately at the beginning of the file, without modification,
15 1.1 cgd * this list of conditions, and the following disclaimer.
16 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright
17 1.1 cgd * notice, this list of conditions and the following disclaimer in the
18 1.1 cgd * documentation and/or other materials provided with the distribution.
19 1.1 cgd * 3. The name of the author may not be used to endorse or promote products
20 1.1 cgd * derived from this software without specific prior written permission.
21 1.1 cgd *
22 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
23 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
26 1.1 cgd * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1 cgd * SUCH DAMAGE.
33 1.1 cgd */
34 1.2 cgd
35 1.1 cgd #ifndef _ISPMBOX_H
36 1.1 cgd #define _ISPMBOX_H
37 1.1 cgd
38 1.1 cgd /*
39 1.1 cgd * Mailbox Command Opcodes
40 1.1 cgd */
41 1.1 cgd
42 1.1 cgd #define MBOX_NO_OP 0x0000
43 1.1 cgd #define MBOX_LOAD_RAM 0x0001
44 1.1 cgd #define MBOX_EXEC_FIRMWARE 0x0002
45 1.1 cgd #define MBOX_DUMP_RAM 0x0003
46 1.1 cgd #define MBOX_WRITE_RAM_WORD 0x0004
47 1.1 cgd #define MBOX_READ_RAM_WORD 0x0005
48 1.1 cgd #define MBOX_MAILBOX_REG_TEST 0x0006
49 1.1 cgd #define MBOX_VERIFY_CHECKSUM 0x0007
50 1.1 cgd #define MBOX_ABOUT_FIRMWARE 0x0008
51 1.1 cgd /* 9 */
52 1.1 cgd /* a */
53 1.1 cgd /* b */
54 1.1 cgd /* c */
55 1.1 cgd /* d */
56 1.1 cgd #define MBOX_CHECK_FIRMWARE 0x000e
57 1.1 cgd /* f */
58 1.1 cgd #define MBOX_INIT_REQ_QUEUE 0x0010
59 1.1 cgd #define MBOX_INIT_RES_QUEUE 0x0011
60 1.1 cgd #define MBOX_EXECUTE_IOCB 0x0012
61 1.1 cgd #define MBOX_WAKE_UP 0x0013
62 1.1 cgd #define MBOX_STOP_FIRMWARE 0x0014
63 1.1 cgd #define MBOX_ABORT 0x0015
64 1.1 cgd #define MBOX_ABORT_DEVICE 0x0016
65 1.1 cgd #define MBOX_ABORT_TARGET 0x0017
66 1.1 cgd #define MBOX_BUS_RESET 0x0018
67 1.1 cgd #define MBOX_STOP_QUEUE 0x0019
68 1.1 cgd #define MBOX_START_QUEUE 0x001a
69 1.1 cgd #define MBOX_SINGLE_STEP_QUEUE 0x001b
70 1.1 cgd #define MBOX_ABORT_QUEUE 0x001c
71 1.1 cgd #define MBOX_GET_DEV_QUEUE_STATUS 0x001d
72 1.1 cgd /* 1e */
73 1.1 cgd #define MBOX_GET_FIRMWARE_STATUS 0x001f
74 1.1 cgd #define MBOX_GET_INIT_SCSI_ID 0x0020
75 1.1 cgd #define MBOX_GET_SELECT_TIMEOUT 0x0021
76 1.1 cgd #define MBOX_GET_RETRY_COUNT 0x0022
77 1.1 cgd #define MBOX_GET_TAG_AGE_LIMIT 0x0023
78 1.1 cgd #define MBOX_GET_CLOCK_RATE 0x0024
79 1.1 cgd #define MBOX_GET_ACT_NEG_STATE 0x0025
80 1.1 cgd #define MBOX_GET_ASYNC_DATA_SETUP_TIME 0x0026
81 1.1 cgd #define MBOX_GET_SBUS_PARAMS 0x0027
82 1.1 cgd #define MBOX_GET_TARGET_PARAMS 0x0028
83 1.1 cgd #define MBOX_GET_DEV_QUEUE_PARAMS 0x0029
84 1.1 cgd /* 2a */
85 1.1 cgd /* 2b */
86 1.1 cgd /* 2c */
87 1.1 cgd /* 2d */
88 1.1 cgd /* 2e */
89 1.1 cgd /* 2f */
90 1.1 cgd #define MBOX_SET_INIT_SCSI_ID 0x0030
91 1.1 cgd #define MBOX_SET_SELECT_TIMEOUT 0x0031
92 1.1 cgd #define MBOX_SET_RETRY_COUNT 0x0032
93 1.1 cgd #define MBOX_SET_TAG_AGE_LIMIT 0x0033
94 1.1 cgd #define MBOX_SET_CLOCK_RATE 0x0034
95 1.1 cgd #define MBOX_SET_ACTIVE_NEG_STATE 0x0035
96 1.1 cgd #define MBOX_SET_ASYNC_DATA_SETUP_TIME 0x0036
97 1.1 cgd #define MBOX_SET_SBUS_CONTROL_PARAMS 0x0037
98 1.3 mjacob #define MBOX_SET_PCI_PARAMETERS 0x0037
99 1.1 cgd #define MBOX_SET_TARGET_PARAMS 0x0038
100 1.1 cgd #define MBOX_SET_DEV_QUEUE_PARAMS 0x0039
101 1.1 cgd /* 3a */
102 1.1 cgd /* 3b */
103 1.1 cgd /* 3c */
104 1.1 cgd /* 3d */
105 1.1 cgd /* 3e */
106 1.1 cgd /* 3f */
107 1.1 cgd #define MBOX_RETURN_BIOS_BLOCK_ADDR 0x0040
108 1.1 cgd #define MBOX_WRITE_FOUR_RAM_WORDS 0x0041
109 1.1 cgd #define MBOX_EXEC_BIOS_IOCB 0x0042
110 1.1 cgd
111 1.3 mjacob /* These are for the ISP2100 FC cards */
112 1.4 mjacob #define MBOX_GET_LOOP_ID 0x20
113 1.4 mjacob #define MBOX_EXEC_COMMAND_IOCB_A64 0x54
114 1.3 mjacob #define MBOX_INIT_FIRMWARE 0x60
115 1.3 mjacob #define MBOX_GET_INIT_CONTROL_BLOCK 0x61
116 1.3 mjacob #define MBOX_INIT_LIP 0x62
117 1.3 mjacob #define MBOX_GET_FC_AL_POSITION_MAP 0x63
118 1.3 mjacob #define MBOX_GET_PORT_DB 0x64
119 1.3 mjacob #define MBOX_CLEAR_ACA 0x65
120 1.3 mjacob #define MBOX_TARGET_RESET 0x66
121 1.3 mjacob #define MBOX_CLEAR_TASK_SET 0x67
122 1.3 mjacob #define MBOX_ABORT_TASK_SET 0x68
123 1.4 mjacob #define MBOX_GET_FW_STATE 0x69
124 1.3 mjacob
125 1.3 mjacob #define ISP2100_SET_PCI_PARAM 0x00ff
126 1.3 mjacob
127 1.1 cgd #define MBOX_BUSY 0x04
128 1.1 cgd
129 1.1 cgd typedef struct {
130 1.3 mjacob u_int16_t param[8];
131 1.1 cgd } mbreg_t;
132 1.1 cgd
133 1.1 cgd /*
134 1.1 cgd * Command Structure Definitions
135 1.1 cgd */
136 1.1 cgd
137 1.1 cgd typedef struct {
138 1.1 cgd u_int32_t ds_base;
139 1.1 cgd u_int32_t ds_count;
140 1.1 cgd } ispds_t;
141 1.1 cgd
142 1.1 cgd typedef struct {
143 1.1 cgd #if BYTE_ORDER == BIG_ENDIAN
144 1.1 cgd u_int8_t rqs_entry_count;
145 1.1 cgd u_int8_t rqs_entry_type;
146 1.1 cgd u_int8_t rqs_flags;
147 1.1 cgd u_int8_t rqs_seqno;
148 1.1 cgd #else
149 1.1 cgd u_int8_t rqs_entry_type;
150 1.1 cgd u_int8_t rqs_entry_count;
151 1.1 cgd u_int8_t rqs_seqno;
152 1.1 cgd u_int8_t rqs_flags;
153 1.1 cgd #endif
154 1.1 cgd } isphdr_t;
155 1.1 cgd
156 1.1 cgd /* RQS Flag definitions */
157 1.1 cgd #define RQSFLAG_CONTINUATION 0x01
158 1.1 cgd #define RQSFLAG_FULL 0x02
159 1.1 cgd #define RQSFLAG_BADHEADER 0x04
160 1.1 cgd #define RQSFLAG_BADPACKET 0x08
161 1.3 mjacob
162 1.1 cgd /* RQS entry_type definitions */
163 1.1 cgd #define RQSTYPE_REQUEST 1
164 1.1 cgd #define RQSTYPE_DATASEG 2
165 1.1 cgd #define RQSTYPE_RESPONSE 3
166 1.1 cgd #define RQSTYPE_MARKER 4
167 1.1 cgd #define RQSTYPE_CMDONLY 5
168 1.3 mjacob #define RQSTYPE_T2RQS 17
169 1.3 mjacob #define RQSTYPE_T3RQS 25
170 1.3 mjacob #define RQSTYPE_T1DSEG 10
171 1.1 cgd
172 1.1 cgd
173 1.1 cgd #define ISP_RQDSEG 4
174 1.1 cgd typedef struct {
175 1.1 cgd isphdr_t req_header;
176 1.1 cgd u_int32_t req_handle;
177 1.1 cgd #if BYTE_ORDER == BIG_ENDIAN
178 1.1 cgd u_int8_t req_target;
179 1.1 cgd u_int8_t req_lun_trn;
180 1.1 cgd #else
181 1.1 cgd u_int8_t req_lun_trn;
182 1.1 cgd u_int8_t req_target;
183 1.1 cgd #endif
184 1.1 cgd u_int16_t req_cdblen;
185 1.1 cgd #define req_modifier req_cdblen /* marker packet */
186 1.1 cgd u_int16_t req_flags;
187 1.1 cgd u_int16_t _res1;
188 1.1 cgd u_int16_t req_time;
189 1.1 cgd u_int16_t req_seg_count;
190 1.1 cgd u_int8_t req_cdb[12];
191 1.1 cgd ispds_t req_dataseg[ISP_RQDSEG];
192 1.1 cgd } ispreq_t;
193 1.1 cgd
194 1.3 mjacob #define ISP_RQDSEG_T2 3
195 1.3 mjacob typedef struct {
196 1.3 mjacob isphdr_t req_header;
197 1.3 mjacob u_int32_t req_handle;
198 1.3 mjacob #if BYTE_ORDER == BIG_ENDIAN
199 1.3 mjacob u_int8_t req_target;
200 1.3 mjacob u_int8_t req_lun_trn;
201 1.3 mjacob #else
202 1.3 mjacob u_int8_t req_lun_trn;
203 1.3 mjacob u_int8_t req_target;
204 1.3 mjacob #endif
205 1.3 mjacob u_int16_t _res1;
206 1.4 mjacob u_int16_t req_flags;
207 1.4 mjacob u_int16_t _res2;
208 1.3 mjacob u_int16_t req_time;
209 1.3 mjacob u_int16_t req_seg_count;
210 1.3 mjacob u_int32_t req_cdb[4];
211 1.3 mjacob u_int32_t req_totalcnt;
212 1.3 mjacob ispds_t req_dataseg[ISP_RQDSEG_T2];
213 1.3 mjacob } ispreqt2_t;
214 1.3 mjacob
215 1.1 cgd /* req_flag values */
216 1.1 cgd #define REQFLAG_NODISCON 0x0001
217 1.1 cgd #define REQFLAG_HTAG 0x0002
218 1.1 cgd #define REQFLAG_OTAG 0x0004
219 1.1 cgd #define REQFLAG_STAG 0x0008
220 1.1 cgd #define REQFLAG_TARGET_RTN 0x0010
221 1.1 cgd
222 1.1 cgd #define REQFLAG_NODATA 0x0000
223 1.1 cgd #define REQFLAG_DATA_IN 0x0020
224 1.1 cgd #define REQFLAG_DATA_OUT 0x0040
225 1.1 cgd #define REQFLAG_DATA_UNKNOWN 0x0060
226 1.1 cgd
227 1.1 cgd #define REQFLAG_DISARQ 0x0100
228 1.1 cgd
229 1.1 cgd typedef struct {
230 1.1 cgd isphdr_t req_header;
231 1.1 cgd u_int32_t req_handle;
232 1.1 cgd #if BYTE_ORDER == BIG_ENDIAN
233 1.1 cgd u_int8_t req_target;
234 1.1 cgd u_int8_t req_lun_trn;
235 1.1 cgd #else
236 1.1 cgd u_int8_t req_lun_trn;
237 1.1 cgd u_int8_t req_target;
238 1.1 cgd #endif
239 1.1 cgd u_int16_t req_cdblen;
240 1.1 cgd u_int16_t req_flags;
241 1.1 cgd u_int16_t _res1;
242 1.1 cgd u_int16_t req_time;
243 1.1 cgd u_int16_t req_seg_count;
244 1.1 cgd u_int8_t req_cdb[44];
245 1.1 cgd } ispextreq_t;
246 1.1 cgd
247 1.1 cgd #define ISP_CDSEG 7
248 1.1 cgd typedef struct {
249 1.1 cgd isphdr_t req_header;
250 1.1 cgd u_int32_t _res1;
251 1.1 cgd ispds_t req_dataseg[ISP_CDSEG];
252 1.1 cgd } ispcontreq_t;
253 1.1 cgd
254 1.1 cgd typedef struct {
255 1.1 cgd isphdr_t req_header;
256 1.1 cgd u_int32_t _res1;
257 1.1 cgd #if BYTE_ORDER == BIG_ENDIAN
258 1.1 cgd u_int8_t req_target;
259 1.1 cgd u_int8_t req_lun_trn;
260 1.1 cgd u_int8_t _res2;
261 1.1 cgd u_int8_t req_modifier;
262 1.1 cgd #else
263 1.1 cgd u_int8_t req_lun_trn;
264 1.1 cgd u_int8_t req_target;
265 1.1 cgd u_int8_t req_modifier;
266 1.1 cgd u_int8_t _res2;
267 1.1 cgd #endif
268 1.3 mjacob } ispmarkreq_t;
269 1.1 cgd
270 1.1 cgd #define SYNC_DEVICE 0
271 1.1 cgd #define SYNC_TARGET 1
272 1.1 cgd #define SYNC_ALL 2
273 1.1 cgd
274 1.1 cgd typedef struct {
275 1.1 cgd isphdr_t req_header;
276 1.1 cgd u_int32_t req_handle;
277 1.1 cgd u_int16_t req_scsi_status;
278 1.1 cgd u_int16_t req_completion_status;
279 1.1 cgd u_int16_t req_state_flags;
280 1.1 cgd u_int16_t req_status_flags;
281 1.1 cgd u_int16_t req_time;
282 1.1 cgd u_int16_t req_sense_len;
283 1.1 cgd u_int32_t req_resid;
284 1.1 cgd u_int8_t _res1[8];
285 1.1 cgd u_int8_t req_sense_data[32];
286 1.1 cgd } ispstatusreq_t;
287 1.1 cgd
288 1.3 mjacob /*
289 1.3 mjacob * For Qlogic 2100, the high order byte of SCSI status has
290 1.3 mjacob * additional meaning.
291 1.3 mjacob */
292 1.3 mjacob #define RQCS_RU 0x800 /* Residual Under */
293 1.3 mjacob #define RQCS_RO 0x400 /* Residual Over */
294 1.3 mjacob #define RQCS_SV 0x200 /* Sense Length Valid */
295 1.3 mjacob #define RQCS_RV 0x100 /* Residual Valid */
296 1.3 mjacob
297 1.3 mjacob /*
298 1.3 mjacob * Completion Status Codes.
299 1.3 mjacob */
300 1.1 cgd #define RQCS_COMPLETE 0x0000
301 1.1 cgd #define RQCS_INCOMPLETE 0x0001
302 1.1 cgd #define RQCS_DMA_ERROR 0x0002
303 1.1 cgd #define RQCS_TRANSPORT_ERROR 0x0003
304 1.1 cgd #define RQCS_RESET_OCCURRED 0x0004
305 1.1 cgd #define RQCS_ABORTED 0x0005
306 1.1 cgd #define RQCS_TIMEOUT 0x0006
307 1.1 cgd #define RQCS_DATA_OVERRUN 0x0007
308 1.1 cgd #define RQCS_COMMAND_OVERRUN 0x0008
309 1.1 cgd #define RQCS_STATUS_OVERRUN 0x0009
310 1.1 cgd #define RQCS_BAD_MESSAGE 0x000a
311 1.1 cgd #define RQCS_NO_MESSAGE_OUT 0x000b
312 1.1 cgd #define RQCS_EXT_ID_FAILED 0x000c
313 1.1 cgd #define RQCS_IDE_MSG_FAILED 0x000d
314 1.1 cgd #define RQCS_ABORT_MSG_FAILED 0x000e
315 1.1 cgd #define RQCS_REJECT_MSG_FAILED 0x000f
316 1.1 cgd #define RQCS_NOP_MSG_FAILED 0x0010
317 1.1 cgd #define RQCS_PARITY_ERROR_MSG_FAILED 0x0011
318 1.1 cgd #define RQCS_DEVICE_RESET_MSG_FAILED 0x0012
319 1.1 cgd #define RQCS_ID_MSG_FAILED 0x0013
320 1.1 cgd #define RQCS_UNEXP_BUS_FREE 0x0014
321 1.1 cgd #define RQCS_DATA_UNDERRUN 0x0015
322 1.3 mjacob /* 2100 Only Completion Codes */
323 1.3 mjacob #define RQCS_PORT_UNAVAILABLE 0x0028
324 1.3 mjacob #define RQCS_PORT_LOGGED_OUT 0x0029
325 1.3 mjacob #define RQCS_PORT_CHANGED 0x002A
326 1.3 mjacob #define RQCS_PORT_BUSY 0x002B
327 1.1 cgd
328 1.3 mjacob /*
329 1.3 mjacob * State Flags (not applicable to 2100)
330 1.3 mjacob */
331 1.1 cgd #define RQSF_GOT_BUS 0x0100
332 1.1 cgd #define RQSF_GOT_TARGET 0x0200
333 1.1 cgd #define RQSF_SENT_CDB 0x0400
334 1.5 mjacob #define RQSF_XFRD_DATA 0x0800
335 1.1 cgd #define RQSF_GOT_STATUS 0x1000
336 1.1 cgd #define RQSF_GOT_SENSE 0x2000
337 1.5 mjacob #define RQSF_XFER_COMPLETE 0x4000
338 1.1 cgd
339 1.3 mjacob /*
340 1.3 mjacob * Status Flags (not applicable to 2100)
341 1.3 mjacob */
342 1.1 cgd #define RQSTF_DISCONNECT 0x0001
343 1.1 cgd #define RQSTF_SYNCHRONOUS 0x0002
344 1.1 cgd #define RQSTF_PARITY_ERROR 0x0004
345 1.1 cgd #define RQSTF_BUS_RESET 0x0008
346 1.1 cgd #define RQSTF_DEVICE_RESET 0x0010
347 1.1 cgd #define RQSTF_ABORTED 0x0020
348 1.1 cgd #define RQSTF_TIMEOUT 0x0040
349 1.1 cgd #define RQSTF_NEGOTIATION 0x0080
350 1.3 mjacob
351 1.3 mjacob /*
352 1.3 mjacob * FC (ISP2100) specific data structures
353 1.3 mjacob */
354 1.3 mjacob
355 1.3 mjacob /*
356 1.3 mjacob * Initialization Control Block
357 1.3 mjacob */
358 1.3 mjacob typedef struct {
359 1.3 mjacob #if BYTE_ORDER == BIG_ENDIAN
360 1.3 mjacob u_int8_t _reserved0;
361 1.3 mjacob u_int8_t icb_version;
362 1.3 mjacob #else
363 1.3 mjacob u_int8_t icb_version;
364 1.3 mjacob u_int8_t _reserved0;
365 1.3 mjacob #endif
366 1.3 mjacob u_int16_t icb_fwoptions;
367 1.3 mjacob u_int16_t icb_maxfrmlen;
368 1.3 mjacob u_int16_t icb_maxalloc;
369 1.3 mjacob u_int16_t icb_execthrottle;
370 1.3 mjacob #if BYTE_ORDER == BIG_ENDIAN
371 1.3 mjacob u_int8_t icb_retry_delay;
372 1.3 mjacob u_int8_t icb_retry_count;
373 1.3 mjacob #else
374 1.3 mjacob u_int8_t icb_retry_count;
375 1.3 mjacob u_int8_t icb_retry_delay;
376 1.3 mjacob #endif
377 1.3 mjacob u_int16_t icb_nodename[4];
378 1.3 mjacob u_int16_t icb_hardaddr;
379 1.3 mjacob u_int16_t _reserved1[5];
380 1.3 mjacob u_int16_t icb_rqstout;
381 1.3 mjacob u_int16_t icb_rspnsin;
382 1.3 mjacob u_int16_t icb_rqstqlen;
383 1.3 mjacob u_int16_t icb_rsltqlen;
384 1.3 mjacob u_int16_t icb_rqstaddr[4];
385 1.3 mjacob u_int16_t icb_respaddr[4];
386 1.3 mjacob } isp_icb_t;
387 1.3 mjacob
388 1.3 mjacob #define ICB_DFLT_FRMLEN 1024
389 1.3 mjacob #define MAKE_NODE_NAME(isp, icbp) \
390 1.3 mjacob (icbp)->icb_nodename[0] = 0, (icbp)->icb_nodename[1] = 0x5355,\
391 1.3 mjacob (icbp)->icb_nodename[2] = 0x4E57, (icbp)->icb_nodename[3] = 0
392 1.1 cgd
393 1.1 cgd #endif /* _ISPMBOX_H */
394