1 /* $FreeBSD: src/sys/cam/scsi/scsi_low.h,v 1.1.2.4 2001/07/22 00:21:41 non Exp $ */
2 /* $DragonFly: src/sys/bus/cam/scsi/scsi_low.h,v 1.6 2004/09/17 01:50:06 joerg Exp $ */
3 /* $NecBSD: scsi_low.h,v 1.24.10.5 2001/06/26 07:31:46 honda Exp $ */
6 #define SCSI_LOW_DIAGNOSTIC
7 #define SCSI_LOW_ALT_QTAG_ALLOCATE
10 * [NetBSD for NEC PC-98 series]
11 * Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2001
12 * NetBSD/pc98 porting staff. All rights reserved.
13 * Copyright (c) 1995, 1996, 1997, 1998, 1999, 2000, 2001
14 * Naofumi HONDA. All rights reserved.
16 * [Ported for FreeBSD CAM]
17 * Copyright (c) 2000, 2001
18 * MITSUNAGA Noriaki, NOKUBI Hirotaka and TAKAHASHI Yoshihiro.
19 * All rights reserved.
21 * Redistribution and use in source and binary forms, with or without
22 * modification, are permitted provided that the following conditions
24 * 1. Redistributions of source code must retain the above copyright
25 * notice, this list of conditions and the following disclaimer.
26 * 2. Redistributions in binary form must reproduce the above copyright
27 * notice, this list of conditions and the following disclaimer in the
28 * documentation and/or other materials provided with the distribution.
29 * 3. The name of the author may not be used to endorse or promote products
30 * derived from this software without specific prior written permission.
32 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
33 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
34 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
35 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
36 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
41 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 * POSSIBILITY OF SUCH DAMAGE.
48 #define SCSI_LOW_INTERFACE_CAM
50 #include <sys/device_port.h>
51 #include <bus/cam/cam.h>
52 #include <bus/cam/cam_ccb.h>
53 #include <bus/cam/cam_sim.h>
54 #include <bus/cam/cam_xpt_sim.h>
55 #include <bus/cam/cam_debug.h>
57 #include "scsi_dvcfg.h"
58 #include <i386/isa/ccbque.h>
61 #define SCSI_LOW_DEBUGGER(dev) Debugger((dev))
62 #define SCSI_LOW_DELAY(mu) DELAY((mu))
63 #define SCSI_LOW_SPLSCSI splcam
64 #define SCSI_LOW_BZERO(pt, size) bzero((pt), (size))
66 typedef struct scsi_sense_data scsi_low_osdep_sense_data_t;
68 struct scsi_low_osdep_interface {
69 DEVPORT_DEVICE si_dev;
72 struct cam_path *path;
76 struct callout_handle engage_ch;
77 struct callout_handle timeout_ch;
78 #ifdef SCSI_LOW_POWFUNC
79 struct callout_handle recover_ch;
83 struct scsi_low_osdep_targ_interface {
86 struct scsi_low_osdep_lun_interface {
89 /******** os depend interface functions *************/
91 struct scsi_low_softc;
92 #define SCSI_LOW_TIMEOUT_STOP 0
93 #define SCSI_LOW_TIMEOUT_START 1
94 #define SCSI_LOW_TIMEOUT_CH_IO 0
95 #define SCSI_LOW_TIMEOUT_CH_ENGAGE 1
96 #define SCSI_LOW_TIMEOUT_CH_RECOVER 2
98 struct scsi_low_osdep_funcs {
99 int (*scsi_low_osdep_attach) \
100 (struct scsi_low_softc *);
101 int (*scsi_low_osdep_world_start) \
102 (struct scsi_low_softc *);
103 int (*scsi_low_osdep_dettach) \
104 (struct scsi_low_softc *);
105 int (*scsi_low_osdep_ccb_setup) \
106 (struct scsi_low_softc *, struct slccb *);
107 int (*scsi_low_osdep_done) \
108 (struct scsi_low_softc *, struct slccb *);
109 void (*scsi_low_osdep_timeout) \
110 (struct scsi_low_softc *, int, int);
113 /*================================================
114 * Generic Scsi Low header file
115 * (All os depend structures should be above!)
116 ================================================*/
117 /*************************************************
118 * Scsi low definitions
119 *************************************************/
120 #define SCSI_LOW_SYNC DVF_SCSI_SYNC
121 #define SCSI_LOW_DISC DVF_SCSI_DISC
122 #define SCSI_LOW_WAIT DVF_SCSI_WAIT
123 #define SCSI_LOW_LINK DVF_SCSI_LINK
124 #define SCSI_LOW_QTAG DVF_SCSI_QTAG
125 #define SCSI_LOW_NOPARITY DVF_SCSI_NOPARITY
126 #define SCSI_LOW_SAVESP DVF_SCSI_SAVESP
127 #define SCSI_LOW_DEFCFG DVF_SCSI_DEFCFG
128 #define SCSI_LOW_BITS DVF_SCSI_BITS
130 #define SCSI_LOW_PERIOD(n) DVF_SCSI_PERIOD(n)
131 #define SCSI_LOW_OFFSET(n) DVF_SCSI_OFFSET(n)
133 /* host scsi id and targets macro */
134 #ifndef SCSI_LOW_NTARGETS
135 #define SCSI_LOW_NTARGETS 8
136 #endif /* SCSI_LOW_NTARGETS */
137 #define SCSI_LOW_NCCB 128
139 #define SCSI_LOW_MAX_RETRY 3
140 #define SCSI_LOW_MAX_SELECTION_RETRY 10
142 /* timeout control macro */
143 #define SCSI_LOW_TIMEOUT_HZ 10
144 #define SCSI_LOW_MIN_TOUT 12
145 #define SCSI_LOW_TIMEOUT_CHECK_INTERVAL 1
146 #define SCSI_LOW_POWDOWN_TC 15
147 #define SCSI_LOW_MAX_PHCHANGES 256
148 #define SCSI2_RESET_DELAY 5000000
151 #define SCSI_LOW_MAX_MSGLEN 32
152 #define SCSI_LOW_MSG_LOG_DATALEN 8
154 /*************************************************
156 *************************************************/
165 u_int8_t scp_direction;
166 #define SCSI_LOW_RWUNK (-1)
167 #define SCSI_LOW_WRITE 0
168 #define SCSI_LOW_READ 1
170 u_int8_t scp_spare[2];
173 /*************************************************
174 * Command Control Block Structure
175 *************************************************/
176 typedef int scsi_low_tag_t;
179 #define SCSI_LOW_UNKLUN ((u_int) -1)
180 #define SCSI_LOW_UNKTAG ((scsi_low_tag_t) -1)
183 TAILQ_ENTRY(slccb) ccb_chain;
185 void *osdep; /* os depend structure */
187 struct targ_info *ti; /* targ_info */
188 struct lun_info *li; /* lun info */
189 struct buf *bp; /* io bufs */
191 scsi_low_tag_t ccb_tag; /* effective qtag */
192 scsi_low_tag_t ccb_otag; /* allocated qtag */
194 /*****************************************
195 * Scsi data pointers (original and saved)
196 *****************************************/
197 struct sc_p ccb_scp; /* given */
198 struct sc_p ccb_sscp; /* saved scsi data pointer */
199 int ccb_datalen; /* transfered data counter */
201 /*****************************************
203 *****************************************/
204 u_int ccb_msgoutflag;
205 u_int ccb_omsgoutflag;
207 /*****************************************
208 * Error or Timeout counters
209 *****************************************/
211 #define CCB_INTERNAL 0x0001
212 #define CCB_SENSE 0x0002
213 #define CCB_CLEARQ 0x0004
214 #define CCB_DISCQ 0x0008
215 #define CCB_STARTQ 0x0010
216 #define CCB_POLLED 0x0100 /* polling ccb */
217 #define CCB_NORETRY 0x0200 /* do NOT retry */
218 #define CCB_AUTOSENSE 0x0400 /* do a sence after CA */
219 #define CCB_URGENT 0x0800 /* an urgent ccb */
220 #define CCB_NOSDONE 0x1000 /* do not call an os done routine */
221 #define CCB_SCSIIO 0x2000 /* a normal scsi io coming from upper layer */
222 #define CCB_SILENT 0x4000 /* no terminate messages */
226 int ccb_rcnt; /* retry counter */
227 int ccb_selrcnt; /* selection retry counter */
228 int ccb_tc; /* timer counter */
229 int ccb_tcmax; /* max timeout */
231 /*****************************************
233 *****************************************/
234 u_int8_t ccb_scsi_cmd[12];
235 scsi_low_osdep_sense_data_t ccb_sense;
238 /*************************************************
240 *************************************************/
241 GENERIC_CCB_ASSERT(scsi_low, slccb)
243 /*************************************************
244 * Target and Lun structures
245 *************************************************/
246 struct scsi_low_softc;
247 LIST_HEAD(scsi_low_softc_tab, scsi_low_softc);
248 TAILQ_HEAD(targ_info_tab, targ_info);
249 LIST_HEAD(lun_info_tab, lun_info);
252 struct scsi_low_osdep_lun_interface li_sloi;
255 struct targ_info *li_ti; /* my target */
257 LIST_ENTRY(lun_info) lun_chain; /* targ_info link */
259 struct slccbtab li_discq; /* disconnect queue */
269 #define SCSI_LOW_MAXNEXUS (sizeof(u_int) * NBBY)
272 #ifdef SCSI_LOW_ALT_QTAG_ALLOCATE
273 u_int8_t li_qtagarray[SCSI_LOW_MAXNEXUS];
275 #endif /* SCSI_LOW_ALT_QTAG_ALLOCATE */
277 #define SCSI_LOW_QFLAG_CA_QCLEAR 0x01
283 #define SCSI_LOW_LUN_SLEEP 0x00
284 #define SCSI_LOW_LUN_START 0x01
285 #define SCSI_LOW_LUN_INQ 0x02
286 #define SCSI_LOW_LUN_MODEQ 0x03
287 #define SCSI_LOW_LUN_OK 0x04
288 u_int li_state; /* target lun state */
293 u_int li_flags_valid; /* valid flags */
294 #define SCSI_LOW_LUN_FLAGS_USER_VALID 0x0001
295 #define SCSI_LOW_LUN_FLAGS_DISK_VALID 0x0002
296 #define SCSI_LOW_LUN_FLAGS_QUIRKS_VALID 0x0004
297 #define SCSI_LOW_LUN_FLAGS_ALL_VALID \
298 (SCSI_LOW_LUN_FLAGS_USER_VALID | \
299 SCSI_LOW_LUN_FLAGS_DISK_VALID | SCSI_LOW_LUN_FLAGS_QUIRKS_VALID)
301 u_int li_flags; /* real lun control flags */
302 u_int li_cfgflags; /* lun control flags given by user */
303 u_int li_diskflags; /* lun control flags given by hardware info */
304 u_int li_quirks; /* lun control flags given by upper layer */
307 struct scsi_low_inq_data {
315 } __attribute__((packed)) li_inq;
318 struct scsi_low_mode_sense_data {
319 u_int8_t sms_header[4];
326 u_int8_t cmp_spare[3];
327 } __attribute__((packed)) sms_cmp;
332 struct scsi_low_msg_log {
336 } slml_msg[SCSI_LOW_MSG_LOG_DATALEN];
340 struct scsi_low_osdep_targ_interface ti_slti;
342 TAILQ_ENTRY(targ_info) ti_chain; /* targ_info link */
344 struct scsi_low_softc *ti_sc; /* our softc */
345 u_int ti_id; /* scsi id */
350 struct lun_info_tab ti_litab; /* lun chain */
353 * total disconnected nexus
362 #define PH_ARBSTART 0x01
363 #define PH_SELSTART 0x02
364 #define PH_SELECTED 0x03
367 #define PH_MSGIN 0x06
368 #define PH_MSGOUT 0x07
371 #define PH_RESEL 0x0a
372 u_int ti_phase; /* scsi phase */
373 u_int ti_ophase; /* old scsi phase */
378 u_int ti_msginptr; /* msgin ptr */
379 u_int ti_msginlen; /* expected msg length */
380 int ti_msgin_parity_error; /* parity error detected */
381 u_int8_t ti_msgin[SCSI_LOW_MAX_MSGLEN]; /* msgin buffer */
386 u_int ti_msgflags; /* msgs to be asserted */
387 u_int ti_omsgflags; /* msgs asserted */
388 u_int ti_emsgflags; /* a msg currently asserted */
389 #define SCSI_LOW_MSG_RESET 0x00000001
390 #define SCSI_LOW_MSG_REJECT 0x00000002
391 #define SCSI_LOW_MSG_PARITY 0x00000004
392 #define SCSI_LOW_MSG_ERROR 0x00000008
393 #define SCSI_LOW_MSG_IDENTIFY 0x00000010
394 #define SCSI_LOW_MSG_ABORT 0x00000020
395 #define SCSI_LOW_MSG_TERMIO 0x00000040
396 #define SCSI_LOW_MSG_SIMPLE_QTAG 0x00000080
397 #define SCSI_LOW_MSG_ORDERED_QTAG 0x00000100
398 #define SCSI_LOW_MSG_HEAD_QTAG 0x00000200
399 #define SCSI_LOW_MSG_ABORT_QTAG 0x00000400
400 #define SCSI_LOW_MSG_CLEAR_QTAG 0x00000800
401 #define SCSI_LOW_MSG_WIDE 0x00001000
402 #define SCSI_LOW_MSG_SYNCH 0x00002000
403 #define SCSI_LOW_MSG_NOOP 0x00004000
404 #define SCSI_LOW_MSG_LAST 0x00008000
405 #define SCSI_LOW_MSG_ALL 0xffffffff
408 u_int8_t ti_msgoutstr[SCSI_LOW_MAX_MSGLEN]; /* scsi msgout */
409 u_int ti_msgoutlen; /* msgout strlen */
412 * target initialize msgout
414 u_int ti_setup_msg; /* setup msgout requests */
415 u_int ti_setup_msg_done;
418 * synch and wide data info
420 u_int ti_flags_valid; /* valid flags */
421 #define SCSI_LOW_TARG_FLAGS_USER_VALID 0x0001
422 #define SCSI_LOW_TARG_FLAGS_DISK_VALID 0x0002
423 #define SCSI_LOW_TARG_FLAGS_QUIRKS_VALID 0x0004
424 #define SCSI_LOW_TARG_FLAGS_ALL_VALID \
425 (SCSI_LOW_TARG_FLAGS_USER_VALID | \
426 SCSI_LOW_TARG_FLAGS_DISK_VALID | SCSI_LOW_TARG_FLAGS_QUIRKS_VALID)
428 u_int ti_diskflags; /* given target disk flags */
429 u_int ti_quirks; /* given target quirk */
434 } ti_osynch, ti_maxsynch; /* synch data */
436 #define SCSI_LOW_BUS_WIDTH_8 0
437 #define SCSI_LOW_BUS_WIDTH_16 1
438 #define SCSI_LOW_BUS_WIDTH_32 2
439 u_int ti_owidth, ti_width;
446 #ifdef SCSI_LOW_DIAGNOSTIC
447 struct scsi_low_msg_log ti_log_msgout;
448 struct scsi_low_msg_log ti_log_msgin;
449 #endif /* SCSI_LOW_DIAGNOSTIC */
452 /*************************************************
453 * COMMON HEADER STRUCTURE
454 *************************************************/
455 struct scsi_low_softc;
457 typedef struct scsi_low_softc *sc_low_t;
459 #define SCSI_LOW_START_OK 0
460 #define SCSI_LOW_START_FAIL 1
461 #define SCSI_LOW_INFO_ALLOC 0
462 #define SCSI_LOW_INFO_REVOKE 1
463 #define SCSI_LOW_INFO_DEALLOC 2
464 #define SCSI_LOW_POWDOWN 1
465 #define SCSI_LOW_ENGAGE 2
467 #define SC_LOW_INIT_T (int (*) (sc_low_t, int))
468 #define SC_LOW_BUSRST_T (void (*) (sc_low_t))
469 #define SC_LOW_TARG_INIT_T (int (*) (sc_low_t, struct targ_info *, int))
470 #define SC_LOW_LUN_INIT_T (int (*) (sc_low_t, struct targ_info *, struct lun_info *, int))
471 #define SC_LOW_SELECT_T (int (*) (sc_low_t, struct slccb *))
472 #define SC_LOW_ATTEN_T (void (*) (sc_low_t))
473 #define SC_LOW_NEXUS_T (int (*) (sc_low_t))
474 #define SC_LOW_MSG_T (int (*) (sc_low_t, struct targ_info *, u_int))
475 #define SC_LOW_POLL_T (int (*) (void *))
476 #define SC_LOW_POWER_T (int (*) (sc_low_t, u_int))
477 #define SC_LOW_TIMEOUT_T (int (*) (sc_low_t))
479 struct scsi_low_funcs {
480 int (*scsi_low_init) (sc_low_t, int);
481 void (*scsi_low_bus_reset) (sc_low_t);
482 int (*scsi_low_targ_init) (sc_low_t, struct targ_info *, int);
483 int (*scsi_low_lun_init) (sc_low_t, struct targ_info *, struct lun_info *, int);
484 int (*scsi_low_start_bus) (sc_low_t, struct slccb *);
485 int (*scsi_low_establish_lun_nexus) (sc_low_t);
486 int (*scsi_low_establish_ccb_nexus) (sc_low_t);
487 void (*scsi_low_attention) (sc_low_t);
488 int (*scsi_low_msg) (sc_low_t, struct targ_info *, u_int);
489 int (*scsi_low_timeout) (sc_low_t);
490 int (*scsi_low_poll) (void *);
491 int (*scsi_low_power) (sc_low_t, u_int);
492 int (*scsi_low_ioctl) (sc_low_t, u_long, caddr_t, int, struct proc *);
495 struct scsi_low_softc {
496 /* os depend structure */
497 struct scsi_low_osdep_interface sl_si;
498 #define sl_dev sl_si.si_dev
499 struct scsi_low_osdep_funcs *sl_osdep_fp;
503 LIST_ENTRY(scsi_low_softc) sl_chain;
506 struct targ_info *sl_ti[SCSI_LOW_NTARGETS];
507 struct targ_info_tab sl_titab;
509 /* current active T_L_Q nexus */
510 struct targ_info *sl_Tnexus; /* Target nexus */
511 struct lun_info *sl_Lnexus; /* Lun nexus */
512 struct slccb *sl_Qnexus; /* Qtag nexus */
515 /* ccb start queue */
516 struct slccbtab sl_start;
518 /* retry limit and phase change counter */
521 int sl_timeout_count;
523 /* selection & total num disconnect targets */
527 struct slccb *sl_selid;
530 int sl_atten; /* ATN asserted */
531 int sl_clear_atten; /* negate ATN required */
533 /* scsi phase suggested by scsi msg */
535 #define MSGPH_NULL 0x00 /* no msg */
536 #define MSGPH_DISC 0x01 /* disconnect msg */
537 #define MSGPH_CMDC 0x02 /* cmd complete msg */
538 #define MSGPH_ABORT 0x03 /* abort seq */
539 #define MSGPH_TERM 0x04 /* current io terminate */
540 #define MSGPH_LCTERM 0x05 /* cmd link terminated */
541 #define MSGPH_RESET 0x06 /* reset target */
544 u_int sl_error; /* error flags */
545 #define FATALIO 0x0001 /* generic io error & retry io */
546 #define ABORTIO 0x0002 /* generic io error & terminate io */
547 #define TIMEOUTIO 0x0004 /* watch dog timeout */
548 #define SELTIMEOUTIO 0x0008 /* selection timeout */
549 #define PDMAERR 0x0010 /* dma xfer error */
550 #define MSGERR 0x0020 /* msgsys error */
551 #define PARITYERR 0x0040 /* parity error */
552 #define BUSYERR 0x0080 /* target busy error */
553 #define STATERR 0x0100 /* status error */
554 #define UACAERR 0x0200 /* target CA state, no sense check */
555 #define SENSEIO 0x1000 /* cmd not excuted but sense data ok */
556 #define SENSEERR 0x2000 /* cmd not excuted and sense data bad */
557 #define UBFERR 0x4000 /* unexpected bus free */
558 #define PENDINGIO 0x8000 /* ccb start not yet */
559 #define SCSI_LOW_ERRORBITS "\020\017ubferr\016senseerr\015senseio\012uacaerr\011staterr\010busy\007parity\006msgerr\005pdmaerr\004seltimeout\003timeout\002abort\001fatal"
561 /* current scsi data pointer */
565 u_int sl_active; /* host is busy state */
566 int sl_powc; /* power down timer counter */
567 u_int sl_rstep; /* resume step */
569 /* configuration flags */
571 #define HW_POWDOWN 0x0001
572 #define HW_RESUME 0x0002
573 #define HW_PDMASTART 0x0004
574 #define HW_INACTIVE 0x0008
575 #define HW_POWERCTRL 0x0010
576 #define HW_INITIALIZING 0x0020
577 #define HW_READ_PADDING 0x1000
578 #define HW_WRITE_PADDING 0x2000
581 #define CFG_NODISC 0x0001
582 #define CFG_NOPARITY 0x0002
583 #define CFG_NOATTEN 0x0004
584 #define CFG_ASYNC 0x0008
585 #define CFG_NOQTAG 0x0010
588 #define SHOW_SYNCH_NEG 0x0001
589 #define SHOW_WIDE_NEG 0x0002
590 #define SHOW_CALCF_RES 0x0010
591 #define SHOW_PROBE_RES 0x0020
592 #define SHOW_ALL_NEG -1
594 /* host informations */
600 /* interface functions */
601 struct scsi_low_funcs *sl_funcs;
606 #if defined(i386) || defined(__i386__)
607 u_int sl_irq; /* XXX */
611 /*************************************************
612 * SCSI LOW service functions
613 *************************************************/
615 * Scsi low attachment function.
617 int scsi_low_attach (struct scsi_low_softc *, int, int, int, int, int);
618 int scsi_low_dettach (struct scsi_low_softc *);
621 * Scsi low interface activate or deactivate functions
623 int scsi_low_is_busy (struct scsi_low_softc *);
624 int scsi_low_activate (struct scsi_low_softc *);
625 int scsi_low_deactivate (struct scsi_low_softc *);
628 * Scsi phase "bus service" functions.
629 * These functions are corresponding to each scsi bus phaeses.
631 /* bus idle phase (other initiators or targets release bus) */
632 void scsi_low_bus_idle (struct scsi_low_softc *);
634 /* arbitration and selection phase */
635 void scsi_low_arbit_fail (struct scsi_low_softc *, struct slccb *);
636 static __inline void scsi_low_arbit_win (struct scsi_low_softc *);
639 #define SCSI_LOW_MSGOUT_INIT 0x00000001
640 #define SCSI_LOW_MSGOUT_UNIFY 0x00000002
641 int scsi_low_msgout (struct scsi_low_softc *, struct targ_info *, u_int);
644 #define SCSI_LOW_DATA_PE 0x80000000
645 int scsi_low_msgin (struct scsi_low_softc *, struct targ_info *, u_int);
648 static __inline int scsi_low_statusin (struct scsi_low_softc *, struct targ_info *, u_int);
651 int scsi_low_data (struct scsi_low_softc *, struct targ_info *, struct buf **, int);
652 static __inline void scsi_low_data_finish (struct scsi_low_softc *);
655 int scsi_low_cmd (struct scsi_low_softc *, struct targ_info *);
657 /* reselection phase */
658 struct targ_info *scsi_low_reselected (struct scsi_low_softc *, u_int);
660 /* disconnection phase */
661 int scsi_low_disconnected (struct scsi_low_softc *, struct targ_info *);
664 * Scsi bus restart function.
665 * Canncel all established nexuses => scsi system initialized => restart jobs.
667 #define SCSI_LOW_RESTART_HARD 1
668 #define SCSI_LOW_RESTART_SOFT 0
669 int scsi_low_restart (struct scsi_low_softc *, int, u_char *);
672 * Scsi utility fucntions
674 /* print current status */
675 void scsi_low_print (struct scsi_low_softc *, struct targ_info *);
677 /* bus reset utility */
678 void scsi_low_bus_reset (struct scsi_low_softc *);
680 /*************************************************
682 *************************************************/
683 #define SCSI_LOW_SETUP_PHASE(ti, phase) \
685 (ti)->ti_ophase = ti->ti_phase; \
686 (ti)->ti_phase = (phase); \
689 #define SCSI_LOW_SETUP_MSGPHASE(slp, PHASE) \
691 (slp)->sl_msgphase = (PHASE); \
694 #define SCSI_LOW_ASSERT_ATN(slp) \
696 (slp)->sl_atten = 1; \
699 #define SCSI_LOW_DEASSERT_ATN(slp) \
701 (slp)->sl_atten = 0; \
704 /*************************************************
706 *************************************************/
707 static __inline void scsi_low_attention (struct scsi_low_softc *);
708 static __inline int scsi_low_is_msgout_continue (struct targ_info *, u_int);
709 static __inline int scsi_low_assert_msg (struct scsi_low_softc *, struct targ_info *, u_int, int);
710 static __inline int scsi_low_is_disconnect_ok (struct slccb *);
713 scsi_low_is_msgout_continue(ti, mask)
714 struct targ_info *ti;
718 return ((ti->ti_msgflags & (~mask)) != 0);
722 scsi_low_is_disconnect_ok(cb)
726 return ((cb->li->li_flags & SCSI_LOW_DISC) != 0 &&
727 (cb->ccb_flags & (CCB_SENSE | CCB_CLEARQ)) == 0);
731 scsi_low_attention(slp)
732 struct scsi_low_softc *slp;
735 if (slp->sl_atten != 0)
738 (*slp->sl_funcs->scsi_low_attention) (slp);
739 SCSI_LOW_ASSERT_ATN(slp);
743 scsi_low_assert_msg(slp, ti, msg, now)
744 struct scsi_low_softc *slp;
745 struct targ_info *ti;
750 ti->ti_msgflags |= msg;
752 scsi_low_attention(slp);
757 scsi_low_arbit_win(slp)
758 struct scsi_low_softc *slp;
761 slp->sl_selid = NULL;
765 scsi_low_data_finish(slp)
766 struct scsi_low_softc *slp;
769 if (slp->sl_Qnexus != NULL)
771 slp->sl_Qnexus->ccb_datalen = slp->sl_scp.scp_datalen;
776 scsi_low_statusin(slp, ti, c)
777 struct scsi_low_softc *slp;
778 struct targ_info *ti;
783 if ((c & SCSI_LOW_DATA_PE) != 0)
785 scsi_low_assert_msg(slp, ti, SCSI_LOW_MSG_ERROR, 0);
788 slp->sl_scp.scp_status = (u_int8_t) c;
792 /*************************************************
794 *************************************************/
795 /* XXX: use scsi_message.h */
797 #define ST_CHKCOND 0x02
800 #define ST_INTERGOOD 0x10
801 #define ST_INTERMET 0x14
802 #define ST_CONFLICT 0x18
803 #define ST_CMDTERM 0x22
804 #define ST_QUEFULL 0x28
805 #define ST_UNKNOWN 0xff
807 #define MSG_COMP 0x00
808 #define MSG_EXTEND 0x01
810 #define MKMSG_EXTEND(XLEN, XCODE) ((((u_int)(XLEN)) << NBBY) | ((u_int)(XCODE)))
811 #define MSG_EXTEND_MDPCODE 0x00
812 #define MSG_EXTEND_MDPLEN 0x05
813 #define MSG_EXTEND_SYNCHCODE 0x01
814 #define MSG_EXTEND_SYNCHLEN 0x03
815 #define MSG_EXTEND_WIDECODE 0x03
816 #define MSG_EXTEND_WIDELEN 0x02
818 #define MSG_SAVESP 0x02
819 #define MSG_RESTORESP 0x03
820 #define MSG_DISCON 0x04
821 #define MSG_I_ERROR 0x05
822 #define MSG_ABORT 0x06
823 #define MSG_REJECT 0x07
824 #define MSG_NOOP 0x08
825 #define MSG_PARITY 0x09
826 #define MSG_LCOMP 0x0a
827 #define MSG_LCOMP_F 0x0b
828 #define MSG_RESET 0x0c
829 #define MSG_ABORT_QTAG 0x0d
830 #define MSG_CLEAR_QTAG 0x0e
831 #define MSG_TERM_IO 0x11
832 #define MSG_SIMPLE_QTAG 0x20
833 #define MSG_HEAD_QTAG 0x21
834 #define MSG_ORDERED_QTAG 0x22
835 #define MSG_IDENTIFY 0x80
836 #define MSG_IDENTIFY_DISCPRIV 0x40
837 #endif /* !_SCSI_LOW_H_ */