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