1 /*- 2 * Copyright (c) 2000, 2002 Kenneth D. Merry 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions, and the following disclaimer, 10 * without modification, immediately at the beginning of the file. 11 * 2. The name of the author may not be used to endorse or promote products 12 * derived from this software without specific prior written permission. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 18 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 */ 27 /* 28 * Written by Julian Elischer (julian@tfs.com) 29 * for TRW Financial Systems. 30 * 31 * TRW Financial Systems, in accordance with their agreement with Carnegie 32 * Mellon University, makes this software available to CMU to distribute 33 * or use in any manner that they see fit as long as this message is kept with 34 * the software. For this reason TFS also grants any other persons or 35 * organisations permission to use or modify this software. 36 * 37 * TFS supplies this software to be publicly redistributed 38 * on the understanding that TFS is not responsible for the correct 39 * functioning of this software in any circumstances. 40 * 41 * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 42 * 43 * from: scsi_cd.h,v 1.10 1997/02/22 09:44:28 peter Exp $ 44 * $FreeBSD: src/sys/cam/scsi/scsi_cd.h,v 1.2.6.3 2003/08/24 03:26:38 ken Exp $ 45 * $DragonFly: src/sys/bus/cam/scsi/scsi_cd.h,v 1.3 2003/12/29 06:42:10 dillon Exp $ 46 */ 47 #ifndef _SCSI_SCSI_CD_H 48 #define _SCSI_SCSI_CD_H 1 49 50 /* 51 * Define two bits always in the same place in byte 2 (flag byte) 52 */ 53 #define CD_RELADDR 0x01 54 #define CD_MSF 0x02 55 56 /* 57 * SCSI command format 58 */ 59 60 struct scsi_pause 61 { 62 u_int8_t op_code; 63 u_int8_t byte2; 64 u_int8_t unused[6]; 65 u_int8_t resume; 66 u_int8_t control; 67 }; 68 #define PA_PAUSE 1 69 #define PA_RESUME 0 70 71 struct scsi_play_msf 72 { 73 u_int8_t op_code; 74 u_int8_t byte2; 75 u_int8_t unused; 76 u_int8_t start_m; 77 u_int8_t start_s; 78 u_int8_t start_f; 79 u_int8_t end_m; 80 u_int8_t end_s; 81 u_int8_t end_f; 82 u_int8_t control; 83 }; 84 85 struct scsi_play_track 86 { 87 u_int8_t op_code; 88 u_int8_t byte2; 89 u_int8_t unused[2]; 90 u_int8_t start_track; 91 u_int8_t start_index; 92 u_int8_t unused1; 93 u_int8_t end_track; 94 u_int8_t end_index; 95 u_int8_t control; 96 }; 97 98 struct scsi_play_10 99 { 100 u_int8_t op_code; 101 u_int8_t byte2; 102 u_int8_t blk_addr[4]; 103 u_int8_t unused; 104 u_int8_t xfer_len[2]; 105 u_int8_t control; 106 }; 107 108 struct scsi_play_12 109 { 110 u_int8_t op_code; 111 u_int8_t byte2; /* same as above */ 112 u_int8_t blk_addr[4]; 113 u_int8_t xfer_len[4]; 114 u_int8_t unused; 115 u_int8_t control; 116 }; 117 118 struct scsi_play_rel_12 119 { 120 u_int8_t op_code; 121 u_int8_t byte2; /* same as above */ 122 u_int8_t blk_addr[4]; 123 u_int8_t xfer_len[4]; 124 u_int8_t track; 125 u_int8_t control; 126 }; 127 128 struct scsi_read_header 129 { 130 u_int8_t op_code; 131 u_int8_t byte2; 132 u_int8_t blk_addr[4]; 133 u_int8_t unused; 134 u_int8_t data_len[2]; 135 u_int8_t control; 136 }; 137 138 struct scsi_read_subchannel 139 { 140 u_int8_t op_code; 141 u_int8_t byte1; 142 u_int8_t byte2; 143 #define SRS_SUBQ 0x40 144 u_int8_t subchan_format; 145 u_int8_t unused[2]; 146 u_int8_t track; 147 u_int8_t data_len[2]; 148 u_int8_t control; 149 }; 150 151 struct scsi_read_toc 152 { 153 u_int8_t op_code; 154 u_int8_t byte2; 155 u_int8_t unused[4]; 156 u_int8_t from_track; 157 u_int8_t data_len[2]; 158 u_int8_t control; 159 }; 160 ; 161 162 struct scsi_read_cd_capacity 163 { 164 u_int8_t op_code; 165 u_int8_t byte2; 166 u_int8_t addr_3; /* Most Significant */ 167 u_int8_t addr_2; 168 u_int8_t addr_1; 169 u_int8_t addr_0; /* Least Significant */ 170 u_int8_t unused[3]; 171 u_int8_t control; 172 }; 173 174 struct scsi_set_speed 175 { 176 u_int8_t opcode; 177 u_int8_t byte2; 178 u_int8_t readspeed[2]; 179 u_int8_t writespeed[2]; 180 u_int8_t reserved[5]; 181 u_int8_t control; 182 }; 183 184 struct scsi_report_key 185 { 186 u_int8_t opcode; 187 u_int8_t reserved0; 188 u_int8_t lba[4]; 189 u_int8_t reserved1[2]; 190 u_int8_t alloc_len[2]; 191 u_int8_t agid_keyformat; 192 #define RK_KF_AGID_MASK 0xc0 193 #define RK_KF_AGID_SHIFT 6 194 #define RK_KF_KEYFORMAT_MASK 0x3f 195 #define RK_KF_AGID 0x00 196 #define RK_KF_CHALLENGE 0x01 197 #define RF_KF_KEY1 0x02 198 #define RK_KF_KEY2 0x03 199 #define RF_KF_TITLE 0x04 200 #define RF_KF_ASF 0x05 201 #define RK_KF_RPC_SET 0x06 202 #define RF_KF_RPC_REPORT 0x08 203 #define RF_KF_INV_AGID 0x3f 204 u_int8_t control; 205 }; 206 207 /* 208 * See the report key structure for key format and AGID definitions. 209 */ 210 struct scsi_send_key 211 { 212 u_int8_t opcode; 213 u_int8_t reserved[7]; 214 u_int8_t param_len[2]; 215 u_int8_t agid_keyformat; 216 u_int8_t control; 217 }; 218 219 struct scsi_read_dvd_structure 220 { 221 u_int8_t opcode; 222 u_int8_t reserved; 223 u_int8_t address[4]; 224 u_int8_t layer_number; 225 u_int8_t format; 226 #define RDS_FORMAT_PHYSICAL 0x00 227 #define RDS_FORMAT_COPYRIGHT 0x01 228 #define RDS_FORMAT_DISC_KEY 0x02 229 #define RDS_FORMAT_BCA 0x03 230 #define RDS_FORMAT_MANUFACTURER 0x04 231 #define RDS_FORMAT_CMGS_CPM 0x05 232 #define RDS_FORMAT_PROT_DISCID 0x06 233 #define RDS_FORMAT_DISC_KEY_BLOCK 0x07 234 #define RDS_FORMAT_DDS 0x08 235 #define RDS_FORMAT_DVDRAM_MEDIA_STAT 0x09 236 #define RDS_FORMAT_SPARE_AREA 0x0a 237 #define RDS_FORMAT_RMD_BORDEROUT 0x0c 238 #define RDS_FORMAT_RMD 0x0d 239 #define RDS_FORMAT_LEADIN 0x0e 240 #define RDS_FORMAT_DISC_ID 0x0f 241 #define RDS_FORMAT_DCB 0x30 242 #define RDS_FORMAT_WRITE_PROT 0xc0 243 #define RDS_FORMAT_STRUCTURE_LIST 0xff 244 u_int8_t alloc_len[2]; 245 u_int8_t agid; 246 u_int8_t control; 247 }; 248 249 /* 250 * Opcodes 251 */ 252 #define READ_CD_CAPACITY 0x25 /* slightly different from disk */ 253 #define READ_SUBCHANNEL 0x42 /* cdrom read Subchannel */ 254 #define READ_TOC 0x43 /* cdrom read TOC */ 255 #define READ_HEADER 0x44 /* cdrom read header */ 256 #define PLAY_10 0x45 /* cdrom play 'play audio' mode */ 257 #define PLAY_MSF 0x47 /* cdrom play Min,Sec,Frames mode */ 258 #define PLAY_TRACK 0x48 /* cdrom play track/index mode */ 259 #define PLAY_TRACK_REL 0x49 /* cdrom play track/index mode */ 260 #define PAUSE 0x4b /* cdrom pause in 'play audio' mode */ 261 #define SEND_KEY 0xa3 /* dvd send key command */ 262 #define REPORT_KEY 0xa4 /* dvd report key command */ 263 #define PLAY_12 0xa5 /* cdrom pause in 'play audio' mode */ 264 #define PLAY_TRACK_REL_BIG 0xa9 /* cdrom play track/index mode */ 265 #define READ_DVD_STRUCTURE 0xad /* read dvd structure */ 266 #define SET_CD_SPEED 0xbb /* set c/dvd speed */ 267 268 struct scsi_report_key_data_header 269 { 270 u_int8_t data_len[2]; 271 u_int8_t reserved[2]; 272 }; 273 274 struct scsi_report_key_data_agid 275 { 276 u_int8_t data_len[2]; 277 u_int8_t reserved[5]; 278 u_int8_t agid; 279 #define RKD_AGID_MASK 0xc0 280 #define RKD_AGID_SHIFT 6 281 }; 282 283 struct scsi_report_key_data_challenge 284 { 285 u_int8_t data_len[2]; 286 u_int8_t reserved0[2]; 287 u_int8_t challenge_key[10]; 288 u_int8_t reserved1[2]; 289 }; 290 291 struct scsi_report_key_data_key1_key2 292 { 293 u_int8_t data_len[2]; 294 u_int8_t reserved0[2]; 295 u_int8_t key1[5]; 296 u_int8_t reserved1[3]; 297 }; 298 299 struct scsi_report_key_data_title 300 { 301 u_int8_t data_len[2]; 302 u_int8_t reserved0[2]; 303 u_int8_t byte0; 304 #define RKD_TITLE_CPM 0x80 305 #define RKD_TITLE_CPM_SHIFT 7 306 #define RKD_TITLE_CP_SEC 0x40 307 #define RKD_TITLE_CP_SEC_SHIFT 6 308 #define RKD_TITLE_CMGS_MASK 0x30 309 #define RKD_TITLE_CMGS_SHIFT 4 310 #define RKD_TITLE_CMGS_NO_RST 0x00 311 #define RKD_TITLE_CMGS_RSVD 0x10 312 #define RKD_TITLE_CMGS_1_GEN 0x20 313 #define RKD_TITLE_CMGS_NO_COPY 0x30 314 u_int8_t title_key[5]; 315 u_int8_t reserved1[2]; 316 }; 317 318 struct scsi_report_key_data_asf 319 { 320 u_int8_t data_len[2]; 321 u_int8_t reserved[5]; 322 u_int8_t success; 323 #define RKD_ASF_SUCCESS 0x01 324 }; 325 326 struct scsi_report_key_data_rpc 327 { 328 u_int8_t data_len[2]; 329 u_int8_t rpc_scheme0; 330 #define RKD_RPC_SCHEME_UNKNOWN 0x00 331 #define RKD_RPC_SCHEME_PHASE_II 0x01 332 u_int8_t reserved0; 333 u_int8_t byte4; 334 #define RKD_RPC_TYPE_MASK 0xC0 335 #define RKD_RPC_TYPE_SHIFT 6 336 #define RKD_RPC_TYPE_NONE 0x00 337 #define RKD_RPC_TYPE_SET 0x40 338 #define RKD_RPC_TYPE_LAST_CHANCE 0x80 339 #define RKD_RPC_TYPE_PERM 0xC0 340 #define RKD_RPC_VENDOR_RESET_MASK 0x38 341 #define RKD_RPC_VENDOR_RESET_SHIFT 3 342 #define RKD_RPC_USER_RESET_MASK 0x07 343 #define RKD_RPC_USER_RESET_SHIFT 0 344 u_int8_t region_mask; 345 u_int8_t rpc_scheme1; 346 u_int8_t reserved1; 347 }; 348 349 struct scsi_send_key_data_rpc 350 { 351 u_int8_t data_len[2]; 352 u_int8_t reserved0[2]; 353 u_int8_t region_code; 354 u_int8_t reserved1[3]; 355 }; 356 357 /* 358 * Common header for the return data from the READ DVD STRUCTURE command. 359 */ 360 struct scsi_read_dvd_struct_data_header 361 { 362 u_int8_t data_len[2]; 363 u_int8_t reserved[2]; 364 }; 365 366 struct scsi_read_dvd_struct_data_layer_desc 367 { 368 u_int8_t book_type_version; 369 #define RDSD_BOOK_TYPE_DVD_ROM 0x00 370 #define RDSD_BOOK_TYPE_DVD_RAM 0x10 371 #define RDSD_BOOK_TYPE_DVD_R 0x20 372 #define RDSD_BOOK_TYPE_DVD_RW 0x30 373 #define RDSD_BOOK_TYPE_DVD_PRW 0x90 374 #define RDSD_BOOK_TYPE_MASK 0xf0 375 #define RDSD_BOOK_TYPE_SHIFT 4 376 #define RDSD_BOOK_VERSION_MASK 0x0f 377 /* 378 * The lower 4 bits of this field is referred to as the "minimum 379 * rate" field in MMC2, and the "maximum rate" field in MMC3. Ugh. 380 */ 381 u_int8_t disc_size_max_rate; 382 #define RDSD_DISC_SIZE_120MM 0x00 383 #define RDSD_DISC_SIZE_80MM 0x10 384 #define RDSD_DISC_SIZE_MASK 0xf0 385 #define RDSD_DISC_SIZE_SHIFT 4 386 #define RDSD_MAX_RATE_0252 0x00 387 #define RDSD_MAX_RATE_0504 0x01 388 #define RDSD_MAX_RATE_1008 0x02 389 #define RDSD_MAX_RATE_NOT_SPEC 0x0f 390 #define RDSD_MAX_RATE_MASK 0x0f 391 u_int8_t layer_info; 392 #define RDSD_NUM_LAYERS_MASK 0x60 393 #define RDSD_NUM_LAYERS_SHIFT 5 394 #define RDSD_NL_ONE_LAYER 0x00 395 #define RDSD_NL_TWO_LAYERS 0x20 396 #define RDSD_TRACK_PATH_MASK 0x10 397 #define RDSD_TRACK_PATH_SHIFT 4 398 #define RDSD_TP_PTP 0x00 399 #define RDSD_TP_OTP 0x10 400 #define RDSD_LAYER_TYPE_RO 0x01 401 #define RDSD_LAYER_TYPE_RECORD 0x02 402 #define RDSD_LAYER_TYPE_RW 0x04 403 #define RDSD_LAYER_TYPE_MASK 0x0f 404 u_int8_t density; 405 #define RDSD_LIN_DENSITY_0267 0x00 406 #define RDSD_LIN_DENSITY_0293 0x10 407 #define RDSD_LIN_DENSITY_0409_0435 0x20 408 #define RDSD_LIN_DENSITY_0280_0291 0x40 409 /* XXX MMC2 uses 0.176um/bit instead of 0.353 as in MMC3 */ 410 #define RDSD_LIN_DENSITY_0353 0x80 411 #define RDSD_LIN_DENSITY_MASK 0xf0 412 #define RDSD_LIN_DENSITY_SHIFT 4 413 #define RDSD_TRACK_DENSITY_074 0x00 414 #define RDSD_TRACK_DENSITY_080 0x01 415 #define RDSD_TRACK_DENSITY_0615 0x02 416 #define RDSD_TRACK_DENSITY_MASK 0x0f 417 u_int8_t zeros0; 418 u_int8_t main_data_start[3]; 419 #define RDSD_MAIN_DATA_START_DVD_RO 0x30000 420 #define RDSD_MAIN_DATA_START_DVD_RW 0x31000 421 u_int8_t zeros1; 422 u_int8_t main_data_end[3]; 423 u_int8_t zeros2; 424 u_int8_t end_sector_layer0[3]; 425 u_int8_t bca; 426 #define RDSD_BCA 0x80 427 #define RDSD_BCA_MASK 0x80 428 #define RDSD_BCA_SHIFT 7 429 u_int8_t media_specific[2031]; 430 }; 431 432 struct scsi_read_dvd_struct_data_physical 433 { 434 u_int8_t data_len[2]; 435 u_int8_t reserved[2]; 436 struct scsi_read_dvd_struct_data_layer_desc layer_desc; 437 }; 438 439 struct scsi_read_dvd_struct_data_copyright 440 { 441 u_int8_t data_len[2]; 442 u_int8_t reserved0[2]; 443 u_int8_t cps_type; 444 #define RDSD_CPS_NOT_PRESENT 0x00 445 #define RDSD_CPS_DATA_EXISTS 0x01 446 u_int8_t region_info; 447 u_int8_t reserved1[2]; 448 }; 449 450 struct scsi_read_dvd_struct_data_disc_key 451 { 452 u_int8_t data_len[2]; 453 u_int8_t reserved[2]; 454 u_int8_t disc_key[2048]; 455 }; 456 457 struct scsi_read_dvd_struct_data_bca 458 { 459 u_int8_t data_len[2]; 460 u_int8_t reserved[2]; 461 u_int8_t bca_info[188]; /* XXX 12-188 bytes */ 462 }; 463 464 struct scsi_read_dvd_struct_data_manufacturer 465 { 466 u_int8_t data_len[2]; 467 u_int8_t reserved[2]; 468 u_int8_t manuf_info[2048]; 469 }; 470 471 struct scsi_read_dvd_struct_data_copy_manage 472 { 473 u_int8_t data_len[2]; 474 u_int8_t reserved0[2]; 475 u_int8_t byte4; 476 #define RDSD_CPM_NO_COPYRIGHT 0x00 477 #define RDSD_CPM_HAS_COPYRIGHT 0x80 478 #define RDSD_CPM_MASK 0x80 479 #define RDSD_CMGS_COPY_ALLOWED 0x00 480 #define RDSD_CMGS_ONE_COPY 0x20 481 #define RDSD_CMGS_NO_COPIES 0x30 482 #define RDSD_CMGS_MASK 0x30 483 u_int8_t reserved1[3]; 484 }; 485 486 struct scsi_read_dvd_struct_data_prot_discid 487 { 488 u_int8_t data_len[2]; 489 u_int8_t reserved[2]; 490 u_int8_t prot_discid_data[16]; 491 }; 492 493 struct scsi_read_dvd_struct_data_disc_key_blk 494 { 495 /* 496 * Length is 0x6ffe == 28670 for CPRM, 0x3002 == 12990 for CSS2. 497 */ 498 u_int8_t data_len[2]; 499 u_int8_t reserved; 500 u_int8_t total_packs; 501 u_int8_t disc_key_pack_data[28668]; 502 }; 503 struct scsi_read_dvd_struct_data_dds 504 { 505 u_int8_t data_len[2]; 506 u_int8_t reserved[2]; 507 u_int8_t dds_info[2048]; 508 }; 509 510 struct scsi_read_dvd_struct_data_medium_status 511 { 512 u_int8_t data_len[2]; 513 u_int8_t reserved0[2]; 514 u_int8_t byte4; 515 #define RDSD_MS_CARTRIDGE 0x80 516 #define RDSD_MS_OUT 0x40 517 #define RDSD_MS_MSWI 0x08 518 #define RDSD_MS_CWP 0x04 519 #define RDSD_MS_PWP 0x02 520 u_int8_t disc_type_id; 521 #define RDSD_DT_NEED_CARTRIDGE 0x00 522 #define RDSD_DT_NO_CART_NEEDED 0x01 523 u_int8_t reserved1; 524 u_int8_t ram_swi_info; 525 #define RDSD_SWI_NO_BARE 0x01 526 #define RDSD_SWI_UNSPEC 0xff 527 }; 528 529 struct scsi_read_dvd_struct_data_spare_area 530 { 531 u_int8_t data_len[2]; 532 u_int8_t reserved[2]; 533 u_int8_t unused_primary[4]; 534 u_int8_t unused_supl[4]; 535 u_int8_t allocated_supl[4]; 536 }; 537 538 struct scsi_read_dvd_struct_data_rmd_borderout 539 { 540 u_int8_t data_len[2]; 541 u_int8_t reserved[2]; 542 u_int8_t rmd[30720]; /* maximum is 30720 bytes */ 543 }; 544 545 struct scsi_read_dvd_struct_data_rmd 546 { 547 u_int8_t data_len[2]; 548 u_int8_t reserved[2]; 549 u_int8_t last_sector_num[4]; 550 u_int8_t rmd_bytes[32768]; /* This is the maximum */ 551 }; 552 553 /* 554 * XXX KDM this is the MMC2 version of the structure. 555 * The variable positions have changed (in a semi-conflicting way) in the 556 * MMC3 spec, although the overall length of the structure is the same. 557 */ 558 struct scsi_read_dvd_struct_data_leadin 559 { 560 u_int8_t data_len[2]; 561 u_int8_t reserved0[2]; 562 u_int8_t field_id_1; 563 u_int8_t app_code; 564 u_int8_t disc_physical_data; 565 u_int8_t last_addr[3]; 566 u_int8_t reserved1[2]; 567 u_int8_t field_id_2; 568 u_int8_t rwp; 569 u_int8_t rwp_wavelength; 570 u_int8_t optimum_write_strategy; 571 u_int8_t reserved2[4]; 572 u_int8_t field_id_3; 573 u_int8_t manuf_id_17_12[6]; 574 u_int8_t reserved3; 575 u_int8_t field_id_4; 576 u_int8_t manuf_id_11_6[6]; 577 u_int8_t reserved4; 578 u_int8_t field_id_5; 579 u_int8_t manuf_id_5_0[6]; 580 u_int8_t reserved5[25]; 581 }; 582 583 struct scsi_read_dvd_struct_data_disc_id 584 { 585 u_int8_t data_len[2]; 586 u_int8_t reserved[4]; 587 u_int8_t random_num[2]; 588 u_int8_t year[4]; 589 u_int8_t month[2]; 590 u_int8_t day[2]; 591 u_int8_t hour[2]; 592 u_int8_t minute[2]; 593 u_int8_t second[2]; 594 }; 595 596 struct scsi_read_dvd_struct_data_generic_dcb 597 { 598 u_int8_t content_desc[4]; 599 #define SCSI_RCB 600 u_int8_t unknown_desc_actions[4]; 601 #define RDSD_ACTION_RECORDING 0x0001 602 #define RDSD_ACTION_READING 0x0002 603 #define RDSD_ACTION_FORMAT 0x0004 604 #define RDSD_ACTION_MODIFY_DCB 0x0008 605 u_int8_t vendor_id[32]; 606 u_int8_t dcb_data[32728]; 607 }; 608 609 struct scsi_read_dvd_struct_data_dcb 610 { 611 u_int8_t data_len[2]; 612 u_int8_t reserved[2]; 613 struct scsi_read_dvd_struct_data_generic_dcb dcb; 614 }; 615 616 struct read_dvd_struct_write_prot 617 { 618 u_int8_t data_len[2]; 619 u_int8_t reserved0[2]; 620 u_int8_t write_prot_status; 621 #define RDSD_WPS_MSWI 0x08 622 #define RDSD_WPS_CWP 0x04 623 #define RDSD_WPS_PWP 0x02 624 #define RDSD_WPS_SWPP 0x01 625 u_int8_t reserved[3]; 626 }; 627 628 struct read_dvd_struct_list_entry 629 { 630 u_int8_t format_code; 631 u_int8_t sds_rds; 632 #define RDSD_SDS_NOT_WRITEABLE 0x00 633 #define RDSD_SDS_WRITEABLE 0x80 634 #define RDSD_SDS_MASK 0x80 635 #define RDSD_RDS_NOT_READABLE 0x00 636 #define RDSD_RDS_READABLE 0x40 637 #define RDSD_RDS_MASK 0x40 638 u_int8_t struct_len[2]; 639 }; 640 641 struct read_dvd_struct_data_list 642 { 643 u_int8_t data_len[2]; 644 u_int8_t reserved[2]; 645 struct read_dvd_struct_list_entry entries[0]; 646 }; 647 648 struct scsi_read_cd_cap_data 649 { 650 u_int8_t addr_3; /* Most significant */ 651 u_int8_t addr_2; 652 u_int8_t addr_1; 653 u_int8_t addr_0; /* Least significant */ 654 u_int8_t length_3; /* Most significant */ 655 u_int8_t length_2; 656 u_int8_t length_1; 657 u_int8_t length_0; /* Least significant */ 658 }; 659 660 struct cd_audio_page 661 { 662 u_int8_t page_code; 663 #define CD_PAGE_CODE 0x3F 664 #define AUDIO_PAGE 0x0e 665 #define CD_PAGE_PS 0x80 666 u_int8_t param_len; 667 u_int8_t flags; 668 #define CD_PA_SOTC 0x02 669 #define CD_PA_IMMED 0x04 670 u_int8_t unused[2]; 671 u_int8_t format_lba; 672 #define CD_PA_FORMAT_LBA 0x0F 673 #define CD_PA_APR_VALID 0x80 674 u_int8_t lb_per_sec[2]; 675 struct port_control 676 { 677 u_int8_t channels; 678 #define CHANNEL 0x0F 679 #define CHANNEL_0 1 680 #define CHANNEL_1 2 681 #define CHANNEL_2 4 682 #define CHANNEL_3 8 683 #define LEFT_CHANNEL CHANNEL_0 684 #define RIGHT_CHANNEL CHANNEL_1 685 u_int8_t volume; 686 } port[4]; 687 #define LEFT_PORT 0 688 #define RIGHT_PORT 1 689 }; 690 691 union cd_pages 692 { 693 struct cd_audio_page audio; 694 }; 695 696 struct cd_mode_data_10 697 { 698 struct scsi_mode_header_10 header; 699 struct scsi_mode_blk_desc blk_desc; 700 union cd_pages page; 701 }; 702 703 struct cd_mode_data 704 { 705 struct scsi_mode_header_6 header; 706 struct scsi_mode_blk_desc blk_desc; 707 union cd_pages page; 708 }; 709 710 union cd_mode_data_6_10 711 { 712 struct cd_mode_data mode_data_6; 713 struct cd_mode_data_10 mode_data_10; 714 }; 715 716 struct cd_mode_params 717 { 718 STAILQ_ENTRY(cd_mode_params) links; 719 int cdb_size; 720 int alloc_len; 721 u_int8_t *mode_buf; 722 }; 723 724 __BEGIN_DECLS 725 void scsi_report_key(struct ccb_scsiio *csio, u_int32_t retries, 726 void (*cbfcnp)(struct cam_periph *, union ccb *), 727 u_int8_t tag_action, u_int32_t lba, u_int8_t agid, 728 u_int8_t key_format, u_int8_t *data_ptr, 729 u_int32_t dxfer_len, u_int8_t sense_len, 730 u_int32_t timeout); 731 732 void scsi_send_key(struct ccb_scsiio *csio, u_int32_t retries, 733 void (*cbfcnp)(struct cam_periph *, union ccb *), 734 u_int8_t tag_action, u_int8_t agid, u_int8_t key_format, 735 u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len, 736 u_int32_t timeout); 737 738 void scsi_read_dvd_structure(struct ccb_scsiio *csio, u_int32_t retries, 739 void (*cbfcnp)(struct cam_periph *, union ccb *), 740 u_int8_t tag_action, u_int32_t address, 741 u_int8_t layer_number, u_int8_t format, 742 u_int8_t agid, u_int8_t *data_ptr, 743 u_int32_t dxfer_len, u_int8_t sense_len, 744 u_int32_t timeout); 745 746 __END_DECLS 747 748 #endif /*_SCSI_SCSI_CD_H*/ 749 750