Home | History | Annotate | Line # | Download | only in dev
      1 /*	$NetBSD: scsireg.h,v 1.14 2022/06/12 16:22:37 andvar Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1992, 1993
      5  *	The Regents of the University of California.  All rights reserved.
      6  *
      7  * This code is derived from software contributed to Berkeley by
      8  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  * 1. Redistributions of source code must retain the above copyright
     14  *    notice, this list of conditions and the following disclaimer.
     15  * 2. Redistributions in binary form must reproduce the above copyright
     16  *    notice, this list of conditions and the following disclaimer in the
     17  *    documentation and/or other materials provided with the distribution.
     18  * 3. Neither the name of the University nor the names of its contributors
     19  *    may be used to endorse or promote products derived from this software
     20  *    without specific prior written permission.
     21  *
     22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     32  * SUCH DAMAGE.
     33  *
     34  * from: $Hdr: scsireg.h,v 4.300 91/06/09 06:38:12 root Rel41 $ SONY
     35  *
     36  *	@(#)scsireg.h	8.1 (Berkeley) 6/11/93
     37  */
     38 
     39 /*
     40  *	scsireg.h
     41  */
     42 
     43 #ifndef __SCSIREG__
     44 #define __SCSIREG__ 1
     45 
     46 /*
     47  *	initiator status byte bit image
     48  */
     49 #define	INST_EP		0x80		/* End of Process */
     50 #define INST_WR		0x40		/* Waiting Reselection */
     51 #define	INST_IP		0x20		/* In Process */
     52 #define	INST_WAIT	0x10		/* Waiting Bus free */
     53 #define	INST_LB		0x8		/* Loss of BUSY */
     54 #define	INST_TO		0x4		/* Time Out */
     55 #define	INST_PRE	0x2		/* PaRameter Error */
     56 #define	INST_HE		0x1		/* Hard Error */
     57 
     58 #define	INSTERMASK	0x7
     59 
     60 
     61 /*
     62  *	target status byte bit image
     63  */
     64 #define	VENDOR		0x61
     65 #define	TGSTMASK	0x1e
     66 #define	TGST_RSVCFLCT	0x18
     67 #define	TGST_INTERMED	0x10
     68 #define	TGST_BUSY	0x8
     69 #define	TGST_CC		0x2
     70 #define	TGST_GOOD	0x0
     71 
     72 #define	TS_MAPPED_PIO	0x01		/* program I/O with map */
     73 #define	TS_CONTR_ON	0x02		/* contiguous transfer on */
     74 #define	TS_CONTR_OFF	0x04		/* contiguous transfer off */
     75 #define	TS_BYTE_DMA	0x08		/* DMA transfer(byte access) */
     76 #define	TS_LONG_DMA	0x10		/* DMA transfer(long access) */
     77 
     78 
     79 /*
     80  *	message byte
     81  */
     82 #define MSG_IDENT	0x80
     83 #define MSG_RESELEN	0x40
     84 #define MSG_CCOMP	0
     85 #define	MSG_EXTND	1
     86 #define MSG_SDP		2
     87 #define MSG_RDP		3
     88 #define MSG_DCNT	4
     89 #define MSG_IDE		5
     90 /*#define MSG_ABORT	6*/
     91 #define MSG_MREJ	7
     92 #define MSG_NOP		8
     93 #define MSG_PERROR	9
     94 
     95 
     96 /*
     97  *	message identify byte bit image
     98  */
     99 #define	IDT_DISCON	0x40
    100 #define	IDT_DRMASK	0x7
    101 
    102 
    103 /*
    104  *	scsi command opcodes
    105  */
    106 #define SCOP_TST	0x00
    107 #define SCOP_REZERO	0x01
    108 #define	SCOP_REWIND	0x01
    109 #define SCOP_RSENSE	0x03
    110 #define SCOP_FMT	0x04
    111 #define SCOP_RBLIM	0x05
    112 #define SCOP_SPARAM	0x06
    113 #define SCOP_RASBLK	0x07
    114 #define SCOP_READ	0x08
    115 #define SCOP_MOERASE	0x09
    116 #define SCOP_WRITE	0x0a
    117 #define SCOP_SEEK	0x0b
    118 #define	SCOP_MERASE	0x0e
    119 #define	SCOP_WFMARK	0x10
    120 #define	SCOP_SPACE	0x11
    121 #define SCOP_INQUIRY	0x12
    122 #define	SCOP_SVERIFY	0x13
    123 #define	SCOP_RBDATA	0x14
    124 #define SCOP_MSELECT	0x15
    125 #define	SCOP_ERASE	0x19
    126 #define SCOP_MSENSE	0x1a
    127 #define SCOP_STST	0x1b
    128 #define	SCOP_LOAD	0x1b
    129 #define SCOP_RECDIAG	0x1c
    130 #define SCOP_SNDDIAG	0x1d
    131 #define	SCOP_MEDRMV	0x1e
    132 #define SCOP_RCAP	0x25
    133 #define SCOP_EREAD	0x28
    134 #define SCOP_EWRITE	0x2a
    135 #define	SCOP_BSSRCH	0x2c
    136 #define	SCOP_WSSRCH	0x2d
    137 #define	SCOP_WRTVRFY	0x2e
    138 #define SCOP_VERIFY	0x2f
    139 #define SCOP_RDL	0x37
    140 #define SCOP_WBUF	0x3b
    141 #define SCOP_RBUF	0x3c
    142 #define SCOP_EJECT	0xc0
    143 #define SCOP_EESENSE	0xc1
    144 #define SCOP_READTOC	0xc1
    145 #define SCOP_READID	0xc2
    146 #define SCOP_ADP	0xc2
    147 #define SCOP_READQ	0xc2
    148 #define SCOP_BLANKS	0xc3
    149 #define SCOP_READHEAD	0xc3
    150 #define SCOP_PBSTS	0xc4
    151 #define SCOP_RCVDISK	0xc4
    152 #define SCOP_PAUSE	0xc5
    153 #define SCOP_PLAYTRACK	0xc6
    154 #define SCOP_PLAYMSF	0xc7
    155 #define SCOP_PLAYAUDIO	0xc8
    156 #define SCOP_ERASED	0xe7
    157 #define SCOP_RESET	0xff
    158 
    159 
    160 #ifdef CPU_DOUBLE
    161 # ifdef __mips__
    162 #  define	ipc_phys(x)	(void *)K0_TT0(x)
    163 # else
    164 #  define	ipc_phys(x)	(void *)((int)(x) & ~0x80000000)
    165 # endif
    166 # ifdef news3800
    167 #  define	splsc		spl4
    168 #  define	splscon		spl3
    169 # endif
    170 #endif /* CPU_DOUBLE */
    171 
    172 #ifdef CPU_SINGLE
    173 # define	ipc_phys(x)	(void *)(x)
    174 # ifdef news3400
    175 #  define	splsc		splbio		/* Lite2 used spl3 */
    176 #  define	splscon		spl2 XXX not used
    177 # else
    178 #  define	splsc		spl4
    179 #  define	splscon		spl3
    180 # endif
    181 #endif /* CPU_SINGLE */
    182 
    183 #define	SCSI_INTEN	1
    184 #define	SCSI_INTDIS	0
    185 
    186 
    187 /*
    188  *	other definition
    189  */
    190 #define	ON	1
    191 #define	OFF	0
    192 
    193 
    194 /*
    195  *	scsi map table format
    196  */
    197 #if defined(news3400)
    198 #define NSCMAP 120
    199 #endif
    200 
    201 #if defined(news3800)
    202 #define NSCMAP 129
    203 #endif
    204 
    205 struct sc_map {
    206 	volatile uint32_t	mp_offset;
    207 	volatile uint32_t	mp_pages;
    208 	volatile uint32_t	mp_addr[NSCMAP];	/* page number */
    209 };
    210 
    211 struct sc_chan_stat {
    212 	struct sc_chan_stat *wb_next;	/* wait bus channel queue */
    213 	struct sc_scb	*scb;		/* scsi struct address */
    214 	u_int		stcnt;		/* save transfer count */
    215 	uint8_t		*spoint;	/* save transfer point */
    216 	u_int		stag;		/* save tag register */
    217 	u_int		soffset;	/* save offset register */
    218 	int		chan_num;	/* channel NO. */
    219 	uint8_t		comflg;		/* flag for save command pointer */
    220 	uint8_t		intr_flg;	/* interrupt flag. SCSI_INTEN/INTDIS */
    221 };
    222 
    223 struct sc_scb {
    224 	TAILQ_ENTRY(sc_scb) chain;
    225 	struct scsipi_xfer *xs;
    226 	int	flags;
    227 
    228 	struct sc_softc *scb_softc;
    229 	struct sc_map *sc_map;
    230 	uint8_t	*sc_cpoint;		/* pointer to buffer address */
    231 	u_int	sc_ctrnscnt;		/* transfer count */
    232 	u_int	sc_ctag;
    233 	u_int	sc_coffset;
    234 
    235 	uint8_t	istatus;
    236 	uint8_t	tstatus;
    237 	uint8_t	identify;
    238 	uint8_t	message;
    239 	uint8_t	msgbuf[20];
    240 };
    241 
    242 #define	NTARGET 8
    243 
    244 struct sc_softc {
    245 	device_t sc_dev;
    246 	struct scsipi_channel sc_channel;
    247 	struct scsipi_adapter sc_adapter;
    248 
    249 	TAILQ_HEAD(scb_list, sc_scb) ready_list, free_list;
    250 	struct sc_scb sc_scb[3 * NTARGET];
    251 
    252 	int inuse[NTARGET];
    253 	struct sc_map sc_map[NTARGET];
    254 	struct sc_chan_stat chan_stat[NTARGET];	/* SCSI channel status */
    255 	int sel_stat[NTARGET];			/* target select status */
    256 
    257 	int scsi_1185AQ;
    258 	int pad_start;
    259 
    260 	int	wbc;	/* # of channel that is waiting for scsi bus free */
    261 	int	wrc;	/* # of channel that is waiting for reselection */
    262 	struct sc_chan_stat *ip;
    263 			/* In progress channel. Same as ISTAT.IP */
    264 	int	ipc;		/* number of in progress channel. */
    265 	int	dma_stat;	/* OFF = DMAC is not used */
    266 #define SC_DMAC_RD	1
    267 #define SC_DMAC_WR	2
    268 
    269 	struct sc_chan_stat *wbq_actf;		/* forward active pointer */
    270 	struct sc_chan_stat *wbq_actl;		/* last active pointer */
    271 
    272 	uint8_t	*act_cmd_pointer;
    273 	uint8_t	*min_point[NTARGET];
    274 	int pad_cnt[NTARGET];
    275 	int8_t min_cnt[NTARGET];
    276 	uint8_t sync_tr[NTARGET];			/* sync/async flag */
    277 	uint8_t mout_flag[NTARGET];
    278 	uint8_t perr_flag[NTARGET];
    279 	uint8_t int_stat1;
    280 	uint8_t int_stat2;
    281 	int min_flag;
    282 	int lastcmd;
    283 };
    284 
    285 /*
    286  * sel_stat values
    287  */
    288 #define	SEL_WAIT	0
    289 #define	SEL_START	1
    290 #define	SEL_TIMEOUT	2
    291 #define	SEL_ARBF	3
    292 #define	SEL_SUCCESS	4
    293 #define	SEL_RSLD	5
    294 #define	SEL_RSL_WAIT	6
    295 
    296 /*
    297  * mout_flag values
    298  */
    299 #define MOUT_IDENTIFY	1
    300 #define MOUT_SYNC_TR	2
    301 
    302 
    303 struct scintsw {
    304 /*00*/	int	(*sci_inthandler)(int);	/* pointer to interrupt handler */
    305 /*04*/	int	sci_ctlr;		/* controller number */
    306 /*08*/
    307 };
    308 
    309 #endif /* !__SCSIREG__ */
    310