xref: /original-bsd/sys/news3400/iodev/scsireg.h (revision dc4562f1)
1 /*
2  * Copyright (c) 1992 The Regents of the University of California.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Sony Corp. and Kazumasa Utashiro of Software Research Associates, Inc.
7  *
8  * %sccs.include.redist.c%
9  *
10  * from: $Hdr: scsireg.h,v 4.300 91/06/09 06:38:12 root Rel41 $ SONY
11  *
12  *	@(#)scsireg.h	7.2 (Berkeley) 12/17/92
13  */
14 
15 /*
16  *	scsireg.h
17  */
18 
19 #ifndef __SCSIREG__
20 #define __SCSIREG__ 1
21 
22 #include <machine/fix_machine_type.h>
23 
24 /*
25  *	initiator status byte bit image
26  */
27 #define	INST_EP		0x80		/* End of Process */
28 #define INST_WR		0x40		/* Waiting Reselection */
29 #define	INST_IP		0x20		/* In Process */
30 #define	INST_WAIT	0x10		/* Waiting Bus free */
31 #define	INST_LB		0x8		/* Loss of BUSY */
32 #define	INST_TO		0x4		/* Time Out */
33 #define	INST_PRE	0x2		/* PaRameter Error */
34 #define	INST_HE		0x1		/* Hard Error */
35 
36 #define	INSTERMASK	0x7
37 
38 
39 /*
40  *	target status byte bit image
41  */
42 #define	VENDOR		0x61
43 #define	TGSTMASK	0x1e
44 #define	TGST_RSVCFLCT	0x18
45 #define	TGST_INTERMED	0x10
46 #define	TGST_BUSY	0x8
47 #define	TGST_CC		0x2
48 #define	TGST_GOOD	0x0
49 
50 #define	TS_MAPPED_PIO	0x01		/* program I/O with map */
51 #define	TS_CONTR_ON	0x02		/* contiguous transfer on */
52 #define	TS_CONTR_OFF	0x04		/* contiguous transfer off */
53 #define	TS_BYTE_DMA	0x08		/* DMA transfer(byte access) */
54 #define	TS_LONG_DMA	0x10		/* DMA transfer(long access) */
55 
56 
57 /*
58  *	message byte
59  */
60 #define MSG_IDENT	0x80
61 #define MSG_RESELEN	0x40
62 #define MSG_CCOMP	0
63 #define	MSG_EXTND	1
64 #define MSG_SDP		2
65 #define MSG_RDP		3
66 #define MSG_DCNT	4
67 #define MSG_IDE		5
68 #define MSG_ABORT	6
69 #define MSG_MREJ	7
70 #define MSG_NOP		8
71 #define MSG_PERROR	9
72 
73 
74 /*
75  *	message identify byte bit image
76  */
77 #define	IDT_DISCON	0x40
78 #define	IDT_DRMASK	0x7
79 
80 
81 /*
82  *	scsi command opcodes
83  */
84 #define SCOP_TST	0x00
85 #define SCOP_REZERO	0x01
86 #define	SCOP_REWIND	0x01
87 #define SCOP_RSENSE	0x03
88 #define SCOP_FMT	0x04
89 #define SCOP_RBLIM	0x05
90 #define SCOP_SPARAM	0x06
91 #define SCOP_RASBLK	0x07
92 #define SCOP_READ	0x08
93 #define SCOP_MOERASE	0x09
94 #define SCOP_WRITE	0x0a
95 #define SCOP_SEEK	0x0b
96 #define	SCOP_MERASE	0x0e
97 #define	SCOP_WFMARK	0x10
98 #define	SCOP_SPACE	0x11
99 #define SCOP_INQUIRY	0x12
100 #define	SCOP_SVERIFY	0x13
101 #define	SCOP_RBDATA	0x14
102 #define SCOP_MSELECT	0x15
103 #define	SCOP_ERASE	0x19
104 #define SCOP_MSENSE	0x1a
105 #define SCOP_STST	0x1b
106 #define	SCOP_LOAD	0x1b
107 #define SCOP_RECDIAG	0x1c
108 #define SCOP_SNDDIAG	0x1d
109 #define	SCOP_MEDRMV	0x1e
110 #define SCOP_RCAP	0x25
111 #define SCOP_EREAD	0x28
112 #define SCOP_EWRITE	0x2a
113 #define	SCOP_BSSRCH	0x2c
114 #define	SCOP_WSSRCH	0x2d
115 #define	SCOP_WRTVRFY	0x2e
116 #define SCOP_VERIFY	0x2f
117 #define SCOP_RDL	0x37
118 #define SCOP_WBUF	0x3b
119 #define SCOP_RBUF	0x3c
120 #define SCOP_EJECT	0xc0
121 #define SCOP_EESENSE	0xc1
122 #define SCOP_READTOC	0xc1
123 #define SCOP_READID	0xc2
124 #define SCOP_ADP	0xc2
125 #define SCOP_READQ	0xc2
126 #define SCOP_BLANKS	0xc3
127 #define SCOP_READHEAD	0xc3
128 #define SCOP_PBSTS	0xc4
129 #define SCOP_RCVDISK	0xc4
130 #define SCOP_PAUSE	0xc5
131 #define SCOP_PLAYTRACK	0xc6
132 #define SCOP_PLAYMSF	0xc7
133 #define SCOP_PLAYAUDIO	0xc8
134 #define SCOP_ERASED	0xe7
135 #define SCOP_RESET	0xff
136 
137 
138 /*
139  *	other definition
140  */
141 #define	ON	1
142 #define	OFF	0
143 
144 
145 /*
146  *	scsi internal parameter block
147  */
148 struct scsi {
149 /*00*/	u_char	sc_istatus;
150 /*01*/	u_char	sc_tstatus;
151 /*02*/	u_char	sc_identify;
152 /*03*/	u_char	sc_message;
153 /*04*/	u_int	sc_mpages;
154 /*08*/	u_int	sc_bytesec;
155 /*0c*/	u_char	*sc_cpoint;
156 /*10*/	u_int	sc_ctrnscnt;
157 /*14*/	struct sc_map *sc_map;
158 	union {
159 		struct	un_type0 {
160 /*18*/			u_int		t0_opcode : 8;
161 /*19*/			u_int		t0_lun	  : 3;
162 /*19*/			u_int		t0_lad    : 21;
163 /*1c*/			u_char		t0_count;
164 /*1d*/			u_char		t0_ctrl;
165 /*1e*/
166 		} un_type0;
167 		struct	un_tuio {
168 /*18*/			u_char		tu_opcode;
169 /*19*/			u_char		tu_lun	  : 3;
170 /*19*/			u_char		tu_resved : 3;
171 /*19*/			u_char		tu_code	  : 2;
172 /*1a*/			u_char		tu_count1;
173 /*1b*/			u_char		tu_count2;
174 /*1c*/			u_char		tu_count3;
175 /*1d*/			u_char		tu_ctrl;
176 /*1e*/
177 		} un_tuio;
178 		struct	un_mtio {
179 /*18*/			u_char		mt_opcode;
180 /*19*/			u_char		mt_lun	  : 3;
181 /*19*/			u_char		mt_resvd  : 2;
182 /*19*/			u_char		mt_st	  : 1;
183 /*19*/			u_char		mt_code	  : 2;
184 /*1a*/			u_char		mt_len1;
185 /*1b*/			u_char		mt_len2;
186 /*1c*/			u_char		mt_len3;
187 /*1d*/			u_char		mt_ctrl;
188 /*1e*/
189 		} un_mtio;
190 		struct	un_type1 {
191 /*18*/			u_char		t1_opcode;
192 /*19*/			u_char		t1_lun    : 3;
193 /*19*/			u_char		t1_rsvd   : 4;
194 /*19*/			u_char		t1_relat  : 1;
195 /*1a*/			u_short		t1_ladhi;
196 /*1c*/			u_short		t1_ladlo;
197 /*1e*/			u_char		t1_p1;
198 /*1f*/			u_char		t1_p2;
199 /*20*/			u_char		t1_p3;
200 /*21*/			u_char		t1_ctrl;
201 /*22*/
202 		} un_type1;
203 /*18*/		u_char	un_reserved[12];
204 /*24*/
205 	} sc_cdb;
206 /*24*/	u_char sc_param[20];
207 /*38*/	int	sc_hbinfo;		/* Copy of the hb_ctlr->hm_hbinfo */
208 /*3c*/	u_int	sc_ctag;
209 /*40*/	u_int	sc_coffset;
210 /*44*/
211 };
212 
213 
214 #define	sc_opcode	sc_cdb.un_type0.t0_opcode
215 #define	sc_lun		sc_cdb.un_type0.t0_lun
216 #define	sc_lad		sc_cdb.un_type0.t0_lad
217 #define	sc_count	sc_cdb.un_type0.t0_count
218 #define	sc_nsect	sc_cdb.un_type0.t0_count
219 #define	sc_switch	sc_cdb.un_type0.t0_count
220 #define	sc_ctrl		sc_cdb.un_type0.t0_ctrl
221 
222 #define	sc_tucode	sc_cdb.un_tuio.tu_code
223 #define	sc_tucount1	sc_cdb.un_tuio.tu_count1
224 #define	sc_tucount2	sc_cdb.un_tuio.tu_count2
225 #define	sc_tucount3	sc_cdb.un_tuio.tu_count3
226 #define	sc_tunsect1	sc_cdb.un_tuio.tu_count1
227 #define	sc_tunsect2	sc_cdb.un_tuio.tu_count2
228 #define	sc_tunsect3	sc_cdb.un_tuio.tu_count3
229 
230 #define	sc_mtst		sc_cdb.un_mtio.mt_st
231 #define	sc_mtcode	sc_cdb.un_mtio.mt_code
232 #define	sc_mtlen1	sc_cdb.un_mtio.mt_len1
233 #define	sc_mtlen2	sc_cdb.un_mtio.mt_len2
234 #define	sc_mtlen3	sc_cdb.un_mtio.mt_len3
235 #define	sc_mtcount1	sc_cdb.un_mtio.mt_len1
236 #define	sc_mtcount2	sc_cdb.un_mtio.mt_len2
237 #define	sc_mtcount3	sc_cdb.un_mtio.mt_len3
238 #define	sc_mtnsect1	sc_cdb.un_mtio.mt_len1
239 #define	sc_mtnsect2	sc_cdb.un_mtio.mt_len2
240 #define	sc_mtnsect3	sc_cdb.un_mtio.mt_len3
241 #define	sc_mtctrl	sc_cdb.un_mtio.mt_ctrl
242 #define	sc_mtfxd	sc_mtcode
243 #define	sc_mtimm	sc_mtcode
244 #define	sc_mtlng	sc_mtcode
245 
246 #define	sc_ladhi	sc_cdb.un_type1.t1_ladhi
247 #define	sc_ladlo	sc_cdb.un_type1.t1_ladlo
248 #define	sc_pmi		sc_cdb.un_type1.t1_p3
249 
250 #define	scop_load(a,b,c,d,e)	scop_stst(a,b,c,d,e)
251 
252 
253 /*
254  *	tape unit space operation code definitions
255  */
256 #define	SCSC_DATA	0
257 #define	SCSC_FM		1
258 #define	SCSC_SQFM	2
259 #define	SCSC_EOD	3
260 
261 
262 /*
263  *	scsi map table format
264  */
265 #if defined(news800) || defined(news1800)
266 #define	NSCMAP	510
267 #endif /* defined(news800) || defined(news1800) */
268 
269 #if defined(news1200) || defined(news1700)
270 #define	NSCMAP	129
271 #endif /* news1200 || news1700 */
272 
273 #ifdef news3400
274 #define	NSCMAP	120
275 #endif /* news3400 */
276 
277 #ifdef news3800
278 #define	NSCMAP	129
279 #endif /* news3800 */
280 
281 struct sc_map {
282 /*000*/	unsigned	mp_offset;
283 /*004*/	unsigned	mp_pages;
284 /*008*/	unsigned	mp_addr[NSCMAP];
285 #if defined(news800) || defined(news1800)
286 /*800*/
287 #endif /* defined(news800) || defined(news1800) */
288 #if defined(news1200) || defined(news1700)
289 /*20c*/
290 #endif /* news1200 || news1700 */
291 };
292 
293 
294 /*
295  *	scsi nonextended sense data
296  */
297 struct sc_nextnd {
298 /*00*/	u_int		scn_advalid : 1;
299 /*00*/	u_int		scn_ecode   : 7;
300 /*01*/	u_int		scn_resvd   : 3;
301 /*01*/	u_int		scn_secno   : 21;
302 /*04*/
303 };
304 
305 
306 /*
307  *	scsi extended sense data
308  */
309 struct sc_extnd {
310 /*00*/	u_char		sce_advalid : 1;
311 /*00*/	u_char		sce_extend  : 7;
312 /*01*/	u_char		sce_segno;
313 /*02*/	u_char		sce_fm	    : 1;
314 /*02*/	u_char		sce_eom	    : 1;
315 /*02*/	u_char		sce_ili	    : 1;
316 /*02*/	u_char		sce_resvd   : 1;
317 /*02*/	u_char		sce_skey    : 4;
318 /*03*/	u_char		sce_infob1;
319 /*04*/	u_char		sce_infob2;
320 /*05*/	u_char		sce_infob3;
321 /*06*/	u_char		sce_infob4;
322 /*07*/	u_char		sce_addlen;
323 	union {
324 		struct un_ehd {
325 /*08*/			u_short		ehd_resvd1;
326 /*0a*/			u_short		ehd_resvd2;
327 /*0c*/			u_char		ehd_ecode;
328 /*0d*/			u_char		ehd_resvd3;
329 /*0e*/			u_char		ehd_fru;
330 /*0f*/			u_char		ehd_fpv	   : 1;
331 /*0f*/			u_char		ehd_cd	   : 1;
332 /*0f*/			u_char		ehd_resvd4 : 2;
333 /*0f*/			u_char		ehd_bpv	   : 1;
334 /*0f*/			u_char		ehd_bitpnt : 3;
335 /*10*/			u_short		ehd_fldpnt;
336 /*12*/
337 		} un_ehd;
338 		struct un_etu {
339 /*08*/			u_char		etu_ecode;
340 /*09*/			u_char		etu_nerrhi;
341 /*0a*/			u_char		etu_nerrlo;
342 /*0b*/
343 		} un_etu;
344 		struct un_emt {
345 /*08*/			u_short		emt_estat;
346 /*0a*/			u_char		emt_resvd1;
347 /*0b*/			u_char		emt_totlrtry;
348 /*0c*/			u_short		emt_resvd2;
349 /*0e*/			u_short		emt_resvd3;
350 /*10*/			u_char		emt_resvd4;
351 /*11*/			u_char		emt_ecode;
352 /*12*/
353 		} un_emt;
354 		struct un_ewo {
355 /*08*/			u_char		ewo_resvd1;
356 /*09*/			u_char		ewo_resvd2;
357 /*0a*/			u_char		ewo_resvd3;
358 /*0b*/			u_char		ewo_sadvalid : 1;
359 /*0b*/			u_char		ewo_secode   : 7;
360 /*0c*/			u_char		ewo_saddr1;
361 /*0d*/			u_char		ewo_saddr2;
362 /*0e*/			u_char		ewo_saddr3;
363 /*0f*/			u_char		ewo_saddr4;
364 /*10*/			u_char		ewo_resvd4;
365 /*11*/			u_char		ewo_dadvalid : 1;
366 /*11*/			u_char		ewo_decode   : 7;
367 /*12*/			u_char		ewo_daddr1;
368 /*13*/			u_char		ewo_daddr2;
369 /*14*/			u_char		ewo_daddr3;
370 /*15*/			u_char		ewo_daddr4;
371 /*16*/
372 		} un_ewo;
373 		struct un_eod {
374 /*08*/			u_char		eod_resvd1;
375 /*09*/			u_char		eod_resvd2;
376 /*0a*/			u_char		eod_resvd3;
377 /*0b*/			u_char		eod_resvd4;
378 /*0c*/			u_char		eod_ecode;
379 /*0d*/			u_char		eod_resvd5;
380 /*0e*/			u_char		eod_resvd6;
381 /*0f*/			u_char		eod_resvd7;
382 /*10*/			u_char		eod_resvd8;
383 /*11*/			u_char		eod_resvd9;
384 /*12*/
385 		} un_eod;
386 /*08*/		u_char un_data[24];
387 /*20*/
388 	} sce_add;
389 /*20*/
390 };
391 
392 #define	sce_hdecode	sce_add.un_ehd.ehd_ecode
393 
394 #define	sce_tuecode	sce_add.un_etu.etu_ecode
395 #define	sce_tunerrhi	sce_add.un_etu.etu_nerrhi
396 #define	sce_tunerrlo	sce_add.un_etu.etu_nerrlo
397 
398 #define	sce_mtestat	sce_add.un_emt.emt_estat
399 #define	sce_mtecode	sce_add.un_emt.emt_ecode
400 
401 #define	sce_odecode	sce_add.un_eod.eod_ecode
402 
403 #define	sce_ascq	sce_add.un_ehd.ehd_resvd3
404 #define	sce_sksv	sce_add.un_ehd.ehd_fpv
405 #define	sce_actretry	sce_add.un_ehd.ehd_fldpnt
406 
407 /*
408  *	scsi inquiry response data
409  */
410 struct sc_inq {
411 /*00*/	u_char		sci_devtype;
412 /*01*/	u_char		sci_qual;
413 /*02*/	u_char		sci_version;
414 /*03*/	u_char		sci_resvd1;
415 /*04*/	u_char		sci_ninfo;
416 /*05*/	u_char		sci_drinfo;
417 /*06*/	u_char		sci_firmrev;
418 /*07*/	u_char		sci_ready;
419 /*08*/	u_char		sci_vendid[8];
420 /*10*/	u_char		sci_prodid[16];
421 /*20*/	u_char		sci_revision[4];
422 /*24*/
423 };
424 
425 
426 /*
427  *	scsi read capacity data
428  */
429 struct sc_rcap {
430 /*00*/	u_int		scr_nblock;
431 /*04*/	u_int		scr_blocklen;
432 /*08*/
433 };
434 
435 
436 /*
437  *	scsi mode sense/select data
438  */
439 struct sc_mdata {
440 /*00*/	u_char	scm_len;
441 /*01*/	u_char	scm_type;
442 /*02*/	u_char	scm_flags1;
443 /*03*/	u_char	scm_dlen;
444 /*04*/	u_int	scm_dens	: 8;
445 /*05*/	u_int	scm_nblock	: 24;
446 /*08*/	u_int	scm_resvd1	: 8;
447 /*09*/	u_int	scm_bsize	: 24;
448 /*0c*/	u_char	scm_flags2;
449 /*0d*/	u_char	scm_resvd2;
450 /*0e*/	u_char	scm_resvd3;
451 /*0f*/	u_char	scm_maxrtry;
452 /*10*/
453 };
454 
455 #define	scm_tdens	scm_flags2
456 
457 
458 /*
459  *	bits of scm_flags1
460  */
461 #define	SCM1_WRP	0x80
462 #define	SCM1_BUFM	0x10
463 #define	SCM1_SPD90	0x02
464 
465 
466 /*
467  *	scm_type
468  */
469 #define	SCMT_DEFAULT	0x0
470 #define	SCMT_150_600	0x80
471 #define	SCMT_300_450	0x81
472 
473 
474 /*
475  *	scm_dens
476  */
477 #define	SCMD_QIC_24_9	0x0	/* This may be 0x5 */
478 #define	SCMD_QIC_11_4	0x4
479 #define	SCMD_QIC_11_9	0x84
480 #define	SCMD_QIC_120_15	0xf
481 #define	SCMD_QIC_150_18	0x10
482 
483 #define	SCMD_DEFAULT	0x00
484 #define	SCMD_800_BPI	0x01
485 #define	SCMD_1600_BPI	0x02
486 #define	SCMD_6250_BPI	0x03
487 #define	SCMD_3200_BPI	0x06
488 #define	SCMD_NEWTAPE	0x80
489 #define	SCMD_NOTAPE	0xff
490 
491 
492 /*
493  *	bits of scm_flags2
494  */
495 #define	SCM2_DEA	0x04
496 #define	SCM2_AUI	0x02
497 #define	SCM2_SEC	0x01
498 
499 
500 /*
501  *	scsi reassign block perameter list
502  */
503 struct sc_rab {
504 /*00*/	u_short	sca_resved;
505 /*02*/	u_short	sca_dllen;
506 /*04*/	u_int	sca_dlad[4];
507 /*14*/
508 };
509 
510 
511 #ifdef CPU_DOUBLE
512 
513 # ifdef mips
514 #  define	ipc_phys(x)	(caddr_t)K0_TT0(x)
515 # else
516 #  define	ipc_phys(x)	(caddr_t)((int)(x) & ~0x80000000)
517 # endif
518 
519 # ifdef news800
520 #  define	splsc		spl3
521 #  define	splscon		spl2
522 # endif
523 
524 # ifdef news1800
525 #  define	splsc		spl5
526 #  define	splscon		spl4
527 # endif
528 
529 # ifdef news3800
530 #  define	splsc		spl4
531 #  define	splscon		spl3
532 # endif
533 
534 #endif /* CPU_DOUBLE */
535 
536 #ifdef CPU_SINGLE
537 # define	ipc_phys(x)	(caddr_t)(x)
538 # ifdef news3400
539 #  define	splsc		spl3
540 #  define	splscon		spl2
541 # else
542 #  define	splsc		spl4
543 #  define	splscon		spl3
544 # endif
545 #endif /* CPU_SINGLE */
546 
547 #define	SCSI_INTEN	1
548 #define	SCSI_INTDIS	0
549 
550 
551 struct scintsw {
552 /*00*/	int	(*sci_inthandler)();	/* pointer to interrupt handler */
553 /*04*/	int	sci_ctlr;		/* controller number */
554 /*08*/
555 };
556 
557 
558 struct sc_data {
559 /*00*/	caddr_t	scd_scaddr;		/* pointer to struct scsi */
560 /*04*/	caddr_t	scd_vaddr;		/* pointer to buffer address */
561 /*08*/	int	scd_count;		/* buffer size */
562 /*0c*/	int	scd_rw;			/* R/W flag see buf.h */
563 /*10*/	struct proc *scd_procp;		/* user prrocess */
564 /*14*/
565 };
566 
567 #endif /* !__SCSIREG__ */
568