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