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