Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[dragonfly.git] / sys / dev / disk / isp / isp_target.h
1 /* $FreeBSD: src/sys/dev/isp/isp_target.h,v 1.3.4.13 2002/07/29 04:25:59 mjacob Exp $ */
2 /* $DragonFly: src/sys/dev/disk/isp/isp_target.h,v 1.2 2003/06/17 04:28:27 dillon Exp $ */
3 /*
4  * Qlogic Target Mode Structure and Flag Definitions
5  *
6  * Copyright (c) 1997, 1998
7  * Patrick Stirling
8  * pms@psconsult.com
9  * All rights reserved.
10  *
11  * Additional Copyright (c) 1999, 2000, 2001
12  * Matthew Jacob
13  * mjacob@feral.com
14  * All rights reserved.
15  *
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions
19  * are met:
20  * 1. Redistributions of source code must retain the above copyright
21  *    notice immediately at the beginning of the file, without modification,
22  *    this list of conditions, and the following disclaimer.
23  * 2. The name of the author may not be used to endorse or promote products
24  *    derived from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
30  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  *
36  */
37 #ifndef _ISP_TARGET_H
38 #define _ISP_TARGET_H
39
40 /*
41  * Defines for all entry types
42  */
43 #define QLTM_SVALID     0x80
44 #define QLTM_SENSELEN   18
45
46 /*
47  * Structure for Enable Lun and Modify Lun queue entries
48  */
49 typedef struct {
50         isphdr_t        le_header;
51         u_int32_t       le_reserved;
52         u_int8_t        le_lun;
53         u_int8_t        le_rsvd;
54         u_int8_t        le_ops;         /* Modify LUN only */
55         u_int8_t        le_tgt;         /* Not for FC */
56         u_int32_t       le_flags;       /* Not for FC */
57         u_int8_t        le_status;
58         u_int8_t        le_reserved2;
59         u_int8_t        le_cmd_count;
60         u_int8_t        le_in_count;
61         u_int8_t        le_cdb6len;     /* Not for FC */
62         u_int8_t        le_cdb7len;     /* Not for FC */
63         u_int16_t       le_timeout;
64         u_int16_t       le_reserved3[20];
65 } lun_entry_t;
66
67 /*
68  * le_flags values
69  */
70 #define LUN_TQAE        0x00000002      /* bit1  Tagged Queue Action Enable */
71 #define LUN_DSSM        0x01000000      /* bit24 Disable Sending SDP Message */
72 #define LUN_DISAD       0x02000000      /* bit25 Disable autodisconnect */
73 #define LUN_DM          0x40000000      /* bit30 Disconnects Mandatory */
74
75 /*
76  * le_ops values
77  */
78 #define LUN_CCINCR      0x01    /* increment command count */
79 #define LUN_CCDECR      0x02    /* decrement command count */
80 #define LUN_ININCR      0x40    /* increment immed. notify count */
81 #define LUN_INDECR      0x80    /* decrement immed. notify count */
82
83 /*
84  * le_status values
85  */
86 #define LUN_OK          0x01    /* we be rockin' */
87 #define LUN_ERR         0x04    /* request completed with error */
88 #define LUN_INVAL       0x06    /* invalid request */
89 #define LUN_NOCAP       0x16    /* can't provide requested capability */
90 #define LUN_ENABLED     0x3E    /* LUN already enabled */
91
92 /*
93  * Immediate Notify Entry structure
94  */
95 #define IN_MSGLEN       8       /* 8 bytes */
96 #define IN_RSVDLEN      8       /* 8 words */
97 typedef struct {
98         isphdr_t        in_header;
99         u_int32_t       in_reserved;
100         u_int8_t        in_lun;         /* lun */
101         u_int8_t        in_iid;         /* initiator */
102         u_int8_t        in_reserved2;
103         u_int8_t        in_tgt;         /* target */
104         u_int32_t       in_flags;
105         u_int8_t        in_status;
106         u_int8_t        in_rsvd2;
107         u_int8_t        in_tag_val;     /* tag value */
108         u_int8_t        in_tag_type;    /* tag type */
109         u_int16_t       in_seqid;       /* sequence id */
110         u_int8_t        in_msg[IN_MSGLEN];      /* SCSI message bytes */
111         u_int16_t       in_reserved3[IN_RSVDLEN];
112         u_int8_t        in_sense[QLTM_SENSELEN];/* suggested sense data */
113 } in_entry_t;
114
115 typedef struct {
116         isphdr_t        in_header;
117         u_int32_t       in_reserved;
118         u_int8_t        in_lun;         /* lun */
119         u_int8_t        in_iid;         /* initiator */
120         u_int16_t       in_scclun;
121         u_int32_t       in_reserved2;
122         u_int16_t       in_status;
123         u_int16_t       in_task_flags;
124         u_int16_t       in_seqid;       /* sequence id */
125 } in_fcentry_t;
126
127 /*
128  * Values for the in_status field
129  */
130 #define IN_REJECT       0x0D    /* Message Reject message received */
131 #define IN_RESET        0x0E    /* Bus Reset occurred */
132 #define IN_NO_RCAP      0x16    /* requested capability not available */
133 #define IN_IDE_RECEIVED 0x33    /* Initiator Detected Error msg received */
134 #define IN_RSRC_UNAVAIL 0x34    /* resource unavailable */
135 #define IN_MSG_RECEIVED 0x36    /* SCSI message received */
136 #define IN_ABORT_TASK   0x20    /* task named in RX_ID is being aborted (FC) */
137 #define IN_PORT_LOGOUT  0x29    /* port has logged out (FC) */
138 #define IN_PORT_CHANGED 0x2A    /* port changed */
139 #define IN_GLOBAL_LOGO  0x2E    /* all ports logged out */
140 #define IN_NO_NEXUS     0x3B    /* Nexus not established */
141
142 /*
143  * Values for the in_task_flags field- should only get one at a time!
144  */
145 #define TASK_FLAGS_ABORT_TASK           (1<<9)
146 #define TASK_FLAGS_CLEAR_TASK_SET       (1<<10)
147 #define TASK_FLAGS_TARGET_RESET         (1<<13)
148 #define TASK_FLAGS_CLEAR_ACA            (1<<14)
149 #define TASK_FLAGS_TERMINATE_TASK       (1<<15)
150
151 #ifndef MSG_ABORT_TAG
152 #define MSG_ABORT_TAG           0x06
153 #endif
154 #ifndef MSG_CLEAR_QUEUE
155 #define MSG_CLEAR_QUEUE         0x0e
156 #endif
157 #ifndef MSG_BUS_DEV_RESET
158 #define MSG_BUS_DEV_RESET       0x0b
159 #endif
160 #ifndef MSG_REL_RECOVERY
161 #define MSG_REL_RECOVERY        0x10
162 #endif
163 #ifndef MSG_TERM_IO_PROC
164 #define MSG_TERM_IO_PROC        0x11
165 #endif
166
167
168 /*
169  * Notify Acknowledge Entry structure
170  */
171 #define NA_RSVDLEN      22
172 typedef struct {
173         isphdr_t        na_header;
174         u_int32_t       na_reserved;
175         u_int8_t        na_lun;         /* lun */
176         u_int8_t        na_iid;         /* initiator */
177         u_int8_t        na_reserved2;
178         u_int8_t        na_tgt;         /* target */
179         u_int32_t       na_flags;
180         u_int8_t        na_status;
181         u_int8_t        na_event;
182         u_int16_t       na_seqid;       /* sequence id */
183         u_int16_t       na_reserved3[NA_RSVDLEN];
184 } na_entry_t;
185
186 /*
187  * Value for the na_event field
188  */
189 #define NA_RST_CLRD     0x80    /* Clear an async event notification */
190 #define NA_OK           0x01    /* Notify Acknowledge Succeeded */
191 #define NA_INVALID      0x06    /* Invalid Notify Acknowledge */
192
193 #define NA2_RSVDLEN     21
194 typedef struct {
195         isphdr_t        na_header;
196         u_int32_t       na_reserved;
197         u_int8_t        na_lun;         /* lun */
198         u_int8_t        na_iid;         /* initiator */
199         u_int16_t       na_scclun;
200         u_int16_t       na_flags;
201         u_int16_t       na_reserved2;
202         u_int16_t       na_status;
203         u_int16_t       na_task_flags;
204         u_int16_t       na_seqid;       /* sequence id */
205         u_int16_t       na_reserved3[NA2_RSVDLEN];
206 } na_fcentry_t;
207 #define NAFC_RCOUNT     0x80    /* increment resource count */
208 #define NAFC_RST_CLRD   0x20    /* Clear LIP Reset */
209 /*
210  * Accept Target I/O Entry structure
211  */
212 #define ATIO_CDBLEN     26
213
214 typedef struct {
215         isphdr_t        at_header;
216         u_int16_t       at_reserved;
217         u_int16_t       at_handle;
218         u_int8_t        at_lun;         /* lun */
219         u_int8_t        at_iid;         /* initiator */
220         u_int8_t        at_cdblen;      /* cdb length */
221         u_int8_t        at_tgt;         /* target */
222         u_int32_t       at_flags;
223         u_int8_t        at_status;      /* firmware status */
224         u_int8_t        at_scsi_status; /* scsi status */
225         u_int8_t        at_tag_val;     /* tag value */
226         u_int8_t        at_tag_type;    /* tag type */
227         u_int8_t        at_cdb[ATIO_CDBLEN];    /* received CDB */
228         u_int8_t        at_sense[QLTM_SENSELEN];/* suggested sense data */
229 } at_entry_t;
230
231 /*
232  * at_flags values
233  */
234 #define AT_NODISC       0x00008000      /* disconnect disabled */
235 #define AT_TQAE         0x00000002      /* Tagged Queue Action enabled */
236
237 /*
238  * at_status values
239  */
240 #define AT_PATH_INVALID 0x07    /* ATIO sent to firmware for disabled lun */
241 #define AT_RESET        0x0E    /* SCSI Bus Reset Occurred */
242 #define AT_PHASE_ERROR  0x14    /* Bus phase sequence error */
243 #define AT_NOCAP        0x16    /* Requested capability not available */
244 #define AT_BDR_MSG      0x17    /* Bus Device Reset msg received */
245 #define AT_CDB          0x3D    /* CDB received */
246
247 /*
248  * Macros to create and fetch and test concatenated handle and tag value macros
249  */
250
251 #define AT_MAKE_TAGID(tid, aep)                                         \
252         tid = ((aep)->at_handle << 16);                                 \
253         if ((aep)->at_flags & AT_TQAE)                                  \
254                 (tid) |= ((aep)->at_tag_val + 1)
255
256 #define CT_MAKE_TAGID(tid, ct)                                          \
257         tid = ((ct)->ct_fwhandle << 16);                                \
258         if ((ct)->ct_flags & CT_TQAE)                                   \
259                 (tid) |= ((ct)->ct_tag_val + 1)
260
261 #define AT_HAS_TAG(val)         ((val) & 0xffff)
262 #define AT_GET_TAG(val)         AT_HAS_TAG(val) - 1
263 #define AT_GET_HANDLE(val)      ((val) >> 16)
264
265 /*
266  * Accept Target I/O Entry structure, Type 2
267  */
268 #define ATIO2_CDBLEN    16
269
270 typedef struct {
271         isphdr_t        at_header;
272         u_int32_t       at_reserved;
273         u_int8_t        at_lun;         /* lun or reserved */
274         u_int8_t        at_iid;         /* initiator */
275         u_int16_t       at_rxid;        /* response ID */
276         u_int16_t       at_flags;
277         u_int16_t       at_status;      /* firmware status */
278         u_int8_t        at_reserved1;
279         u_int8_t        at_taskcodes;
280         u_int8_t        at_taskflags;
281         u_int8_t        at_execodes;
282         u_int8_t        at_cdb[ATIO2_CDBLEN];   /* received CDB */
283         u_int32_t       at_datalen;             /* allocated data len */
284         u_int16_t       at_scclun;              /* SCC Lun or reserved */
285         u_int16_t       at_wwpn[4];             /* WWPN of initiator */
286         u_int16_t       at_reserved2[6];
287         u_int16_t       at_oxid;
288 } at2_entry_t;
289
290 #define ATIO2_WWPN_OFFSET       0x2A
291 #define ATIO2_OXID_OFFSET       0x3E
292
293 #define ATIO2_TC_ATTR_MASK      0x7
294 #define ATIO2_TC_ATTR_SIMPLEQ   0
295 #define ATIO2_TC_ATTR_HEADOFQ   1
296 #define ATIO2_TC_ATTR_ORDERED   2
297 #define ATIO2_TC_ATTR_ACAQ      4
298 #define ATIO2_TC_ATTR_UNTAGGED  5
299
300 /*
301  * Continue Target I/O Entry structure
302  * Request from driver. The response from the
303  * ISP firmware is the same except that the last 18
304  * bytes are overwritten by suggested sense data if
305  * the 'autosense valid' bit is set in the status byte.
306  */
307 typedef struct {
308         isphdr_t        ct_header;
309         u_int16_t       ct_reserved;
310 #define ct_syshandle    ct_reserved     /* we use this */
311         u_int16_t       ct_fwhandle;    /* required by f/w */
312         u_int8_t        ct_lun; /* lun */
313         u_int8_t        ct_iid; /* initiator id */
314         u_int8_t        ct_reserved2;
315         u_int8_t        ct_tgt; /* our target id */
316         u_int32_t       ct_flags;
317         u_int8_t        ct_status;      /* isp status */
318         u_int8_t        ct_scsi_status; /* scsi status */
319         u_int8_t        ct_tag_val;     /* tag value */
320         u_int8_t        ct_tag_type;    /* tag type */
321         u_int32_t       ct_xfrlen;      /* transfer length */
322         u_int32_t       ct_resid;       /* residual length */
323         u_int16_t       ct_timeout;
324         u_int16_t       ct_seg_count;
325         /*
326          * This is so we can share tag name space with
327          * CTIO{2,3,4} with the minimum of pain.
328          */
329         union {
330                 ispds_t         ct_a[ISP_RQDSEG];
331         } _u;
332 #define ct_dataseg      _u.ct_a
333 } ct_entry_t;
334
335 /*
336  * For some of the dual port SCSI adapters, port (bus #) is reported
337  * in the MSbit of ct_iid. Bit fields are a bit too awkward here.
338  *
339  * Note that this does not apply to FC adapters at all which can and
340  * do report IIDs between 129 && 255 (these represent devices that have
341  * logged in across a SCSI fabric).
342  */
343 #define GET_IID_VAL(x)          (x & 0x3f)
344 #define GET_BUS_VAL(x)          ((x >> 7) & 0x1)
345 #define SET_IID_VAL(y, x)       y = ((y & ~0x3f) | (x & 0x3f))
346 #define SET_BUS_VAL(y, x)       y = ((y & 0x3f) | ((x & 0x1) << 7))
347
348 /*
349  * ct_flags values
350  */
351 #define CT_TQAE         0x00000002      /* bit  1, Tagged Queue Action enable */
352 #define CT_DATA_IN      0x00000040      /* bits 6&7, Data direction */
353 #define CT_DATA_OUT     0x00000080      /* bits 6&7, Data direction */
354 #define CT_NO_DATA      0x000000C0      /* bits 6&7, Data direction */
355 #define CT_CCINCR       0x00000100      /* bit 8, autoincrement atio count */
356 #define CT_DATAMASK     0x000000C0      /* bits 6&7, Data direction */
357 #define CT_INISYNCWIDE  0x00004000      /* bit 14, Do Sync/Wide Negotiation */
358 #define CT_NODISC       0x00008000      /* bit 15, Disconnects disabled */
359 #define CT_DSDP         0x01000000      /* bit 24, Disable Save Data Pointers */
360 #define CT_SENDRDP      0x04000000      /* bit 26, Send Restore Pointers msg */
361 #define CT_SENDSTATUS   0x80000000      /* bit 31, Send SCSI status byte */
362
363 /*
364  * ct_status values
365  * - set by the firmware when it returns the CTIO
366  */
367 #define CT_OK           0x01    /* completed without error */
368 #define CT_ABORTED      0x02    /* aborted by host */
369 #define CT_ERR          0x04    /* see sense data for error */
370 #define CT_INVAL        0x06    /* request for disabled lun */
371 #define CT_NOPATH       0x07    /* invalid ITL nexus */
372 #define CT_INVRXID      0x08    /* (FC only) Invalid RX_ID */
373 #define CT_DATA_OVER    0x09    /* (FC only) Data Overrun */
374 #define CT_RSELTMO      0x0A    /* reselection timeout after 2 tries */
375 #define CT_TIMEOUT      0x0B    /* timed out */
376 #define CT_RESET        0x0E    /* SCSI Bus Reset occurred */
377 #define CT_PARITY       0x0F    /* Uncorrectable Parity Error */
378 #define CT_BUS_ERROR    0x10    /* (FC Only) DMA PCI Error */
379 #define CT_PANIC        0x13    /* Unrecoverable Error */
380 #define CT_PHASE_ERROR  0x14    /* Bus phase sequence error */
381 #define CT_BDR_MSG      0x17    /* Bus Device Reset msg received */
382 #define CT_DATA_UNDER   0x15    /* (FC only) Data Underrun */
383 #define CT_TERMINATED   0x19    /* due to Terminate Transfer mbox cmd */
384 #define CT_PORTNOTAVAIL 0x28    /* port not available */
385 #define CT_LOGOUT       0x29    /* port logout */
386 #define CT_PORTCHANGED  0x2A    /* port changed */
387 #define CT_IDE          0x33    /* Initiator Detected Error */
388 #define CT_NOACK        0x35    /* Outstanding Immed. Notify. entry */
389
390 /*
391  * When the firmware returns a CTIO entry, it may overwrite the last
392  * part of the structure with sense data. This starts at offset 0x2E
393  * into the entry, which is in the middle of ct_dataseg[1]. Rather
394  * than define a new struct for this, I'm just using the sense data
395  * offset.
396  */
397 #define CTIO_SENSE_OFFSET       0x2E
398
399 /*
400  * Entry length in u_longs. All entries are the same size so
401  * any one will do as the numerator.
402  */
403 #define UINT32_ENTRY_SIZE       (sizeof(at_entry_t)/sizeof(u_int32_t))
404
405 /*
406  * QLA2100 CTIO (type 2) entry
407  */
408 #define MAXRESPLEN      26
409 typedef struct {
410         isphdr_t        ct_header;
411         u_int16_t       ct_reserved;
412         u_int16_t       ct_fwhandle;    /* just to match CTIO */
413         u_int8_t        ct_lun;         /* lun */
414         u_int8_t        ct_iid;         /* initiator id */
415         u_int16_t       ct_rxid;        /* response ID */
416         u_int16_t       ct_flags;
417         u_int16_t       ct_status;      /* isp status */
418         u_int16_t       ct_timeout;
419         u_int16_t       ct_seg_count;
420         u_int32_t       ct_reloff;      /* relative offset */
421         int32_t         ct_resid;       /* residual length */
422         union {
423                 /*
424                  * The three different modes that the target driver
425                  * can set the CTIO{2,3,4} up as.
426                  *
427                  * The first is for sending FCP_DATA_IUs as well as
428                  * (optionally) sending a terminal SCSI status FCP_RSP_IU.
429                  *
430                  * The second is for sending SCSI sense data in an FCP_RSP_IU.
431                  * Note that no FCP_DATA_IUs will be sent.
432                  *
433                  * The third is for sending FCP_RSP_IUs as built specifically
434                  * in system memory as located by the isp_dataseg.
435                  */
436                 struct {
437                         u_int32_t _reserved;
438                         u_int16_t _reserved2;
439                         u_int16_t ct_scsi_status;
440                         u_int32_t ct_xfrlen;
441                         union {
442                                 ispds_t ct_a[ISP_RQDSEG_T2];    /* CTIO2 */
443                                 ispds64_t ct_b[ISP_RQDSEG_T3];  /* CTIO3 */
444                                 ispdslist_t ct_c;               /* CTIO4 */
445                         } _u;
446 #define ct_dataseg      _u.ct_a
447 #define ct_dataseg64    _u.ct_b
448 #define ct_dslist       _u.ct_c
449                 } m0;
450                 struct {
451                         u_int16_t _reserved;
452                         u_int16_t _reserved2;
453                         u_int16_t ct_senselen;
454                         u_int16_t ct_scsi_status;
455                         u_int16_t ct_resplen;
456                         u_int8_t  ct_resp[MAXRESPLEN];
457                 } m1;
458                 struct {
459                         u_int32_t _reserved;
460                         u_int16_t _reserved2;
461                         u_int16_t _reserved3;
462                         u_int32_t ct_datalen;
463                         ispds_t ct_fcp_rsp_iudata;
464                 } m2;
465                 /*
466                  * CTIO2 returned from F/W...
467                  */
468                 struct {
469                         u_int32_t _reserved[4];
470                         u_int16_t ct_scsi_status;
471                         u_int8_t  ct_sense[QLTM_SENSELEN];
472                 } fw;
473         } rsp;
474 } ct2_entry_t;
475
476 /*
477  * ct_flags values for CTIO2
478  */
479 #define CT2_FLAG_MMASK  0x0003
480 #define CT2_FLAG_MODE0  0x0000
481 #define CT2_FLAG_MODE1  0x0001
482 #define CT2_FLAG_MODE2  0x0002
483 #define CT2_DATA_IN     CT_DATA_IN
484 #define CT2_DATA_OUT    CT_DATA_OUT
485 #define CT2_NO_DATA     CT_NO_DATA
486 #define CT2_DATAMASK    CT_DATAMASK
487 #define CT2_CCINCR      0x0100
488 #define CT2_FASTPOST    0x0200
489 #define CT2_SENDSTATUS  0x8000
490
491 /*
492  * ct_status values are (mostly) the same as that for ct_entry.
493  */
494
495 /*
496  * ct_scsi_status values- the low 8 bits are the normal SCSI status
497  * we know and love. The upper 8 bits are validity markers for FCP_RSP_IU
498  * fields.
499  */
500 #define CT2_RSPLEN_VALID        0x0100
501 #define CT2_SNSLEN_VALID        0x0200
502 #define CT2_DATA_OVER           0x0400
503 #define CT2_DATA_UNDER          0x0800
504
505 /*
506  * Debug macros
507  */
508
509 #define ISP_TDQE(isp, msg, idx, arg)    \
510     if (isp->isp_dblev & ISP_LOGTDEBUG2) isp_print_qentry(isp, msg, idx, arg)
511
512 #ifdef  ISP_TARGET_FUNCTIONS
513 /*
514  * The functions below are for the publicly available
515  * target mode functions that are internal to the Qlogic driver.
516  */
517
518 /*
519  * This function handles new response queue entry appropriate for target mode.
520  */
521 int isp_target_notify(struct ispsoftc *, void *, u_int16_t *);
522
523 /*
524  * Enable/Disable/Modify a logical unit.
525  * (softc, cmd, bus, tgt, lun, cmd_cnt, inotify_cnt, opaque)
526  */
527 #define DFLT_CMND_CNT   0xfe    /* unmonitored */
528 #define DFLT_INOT_CNT   16
529 int isp_lun_cmd(struct ispsoftc *, int, int, int, int, int, int, u_int32_t);
530
531 /*
532  * General request queue 'put' routine for target mode entries.
533  */
534 int isp_target_put_entry(struct ispsoftc *isp, void *);
535
536 /*
537  * General routine to put back an ATIO entry-
538  * used for replenishing f/w resource counts.
539  * The argument is a pointer to a source ATIO
540  * or ATIO2.
541  */
542 int isp_target_put_atio(struct ispsoftc *, void *);
543
544 /*
545  * General routine to send a final CTIO for a command- used mostly for
546  * local responses.
547  */
548 int isp_endcmd(struct ispsoftc *, void *, u_int32_t, u_int16_t);
549 #define ECMD_SVALID     0x100
550
551 /*
552  * Handle an asynchronous event
553  *
554  * Return nonzero if the interrupt that generated this event has been dismissed.
555  */
556
557 int isp_target_async(struct ispsoftc *, int, int);
558 #endif
559 #endif  /* _ISP_TARGET_H */