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.4 2007/11/24 02:36:13 pavalos 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 struct scsi_read_cd_capacity 162 { 163 u_int8_t op_code; 164 u_int8_t byte2; 165 u_int8_t addr_3; /* Most Significant */ 166 u_int8_t addr_2; 167 u_int8_t addr_1; 168 u_int8_t addr_0; /* Least Significant */ 169 u_int8_t unused[3]; 170 u_int8_t control; 171 }; 172 173 struct scsi_set_speed 174 { 175 u_int8_t opcode; 176 u_int8_t byte2; 177 u_int8_t readspeed[2]; 178 u_int8_t writespeed[2]; 179 u_int8_t reserved[5]; 180 u_int8_t control; 181 }; 182 183 struct scsi_report_key 184 { 185 u_int8_t opcode; 186 u_int8_t reserved0; 187 u_int8_t lba[4]; 188 u_int8_t reserved1[2]; 189 u_int8_t alloc_len[2]; 190 u_int8_t agid_keyformat; 191 #define RK_KF_AGID_MASK 0xc0 192 #define RK_KF_AGID_SHIFT 6 193 #define RK_KF_KEYFORMAT_MASK 0x3f 194 #define RK_KF_AGID 0x00 195 #define RK_KF_CHALLENGE 0x01 196 #define RF_KF_KEY1 0x02 197 #define RK_KF_KEY2 0x03 198 #define RF_KF_TITLE 0x04 199 #define RF_KF_ASF 0x05 200 #define RK_KF_RPC_SET 0x06 201 #define RF_KF_RPC_REPORT 0x08 202 #define RF_KF_INV_AGID 0x3f 203 u_int8_t control; 204 }; 205 206 /* 207 * See the report key structure for key format and AGID definitions. 208 */ 209 struct scsi_send_key 210 { 211 u_int8_t opcode; 212 u_int8_t reserved[7]; 213 u_int8_t param_len[2]; 214 u_int8_t agid_keyformat; 215 u_int8_t control; 216 }; 217 218 struct scsi_read_dvd_structure 219 { 220 u_int8_t opcode; 221 u_int8_t reserved; 222 u_int8_t address[4]; 223 u_int8_t layer_number; 224 u_int8_t format; 225 #define RDS_FORMAT_PHYSICAL 0x00 226 #define RDS_FORMAT_COPYRIGHT 0x01 227 #define RDS_FORMAT_DISC_KEY 0x02 228 #define RDS_FORMAT_BCA 0x03 229 #define RDS_FORMAT_MANUFACTURER 0x04 230 #define RDS_FORMAT_CMGS_CPM 0x05 231 #define RDS_FORMAT_PROT_DISCID 0x06 232 #define RDS_FORMAT_DISC_KEY_BLOCK 0x07 233 #define RDS_FORMAT_DDS 0x08 234 #define RDS_FORMAT_DVDRAM_MEDIA_STAT 0x09 235 #define RDS_FORMAT_SPARE_AREA 0x0a 236 #define RDS_FORMAT_RMD_BORDEROUT 0x0c 237 #define RDS_FORMAT_RMD 0x0d 238 #define RDS_FORMAT_LEADIN 0x0e 239 #define RDS_FORMAT_DISC_ID 0x0f 240 #define RDS_FORMAT_DCB 0x30 241 #define RDS_FORMAT_WRITE_PROT 0xc0 242 #define RDS_FORMAT_STRUCTURE_LIST 0xff 243 u_int8_t alloc_len[2]; 244 u_int8_t agid; 245 u_int8_t control; 246 }; 247 248 /* 249 * Opcodes 250 */ 251 #define READ_CD_CAPACITY 0x25 /* slightly different from disk */ 252 #define READ_SUBCHANNEL 0x42 /* cdrom read Subchannel */ 253 #define READ_TOC 0x43 /* cdrom read TOC */ 254 #define READ_HEADER 0x44 /* cdrom read header */ 255 #define PLAY_10 0x45 /* cdrom play 'play audio' mode */ 256 #define PLAY_MSF 0x47 /* cdrom play Min,Sec,Frames mode */ 257 #define PLAY_TRACK 0x48 /* cdrom play track/index mode */ 258 #define PLAY_TRACK_REL 0x49 /* cdrom play track/index mode */ 259 #define PAUSE 0x4b /* cdrom pause in 'play audio' mode */ 260 #define SEND_KEY 0xa3 /* dvd send key command */ 261 #define REPORT_KEY 0xa4 /* dvd report key command */ 262 #define PLAY_12 0xa5 /* cdrom pause in 'play audio' mode */ 263 #define PLAY_TRACK_REL_BIG 0xa9 /* cdrom play track/index mode */ 264 #define READ_DVD_STRUCTURE 0xad /* read dvd structure */ 265 #define SET_CD_SPEED 0xbb /* set c/dvd speed */ 266 267 struct scsi_report_key_data_header 268 { 269 u_int8_t data_len[2]; 270 u_int8_t reserved[2]; 271 }; 272 273 struct scsi_report_key_data_agid 274 { 275 u_int8_t data_len[2]; 276 u_int8_t reserved[5]; 277 u_int8_t agid; 278 #define RKD_AGID_MASK 0xc0 279 #define RKD_AGID_SHIFT 6 280 }; 281 282 struct scsi_report_key_data_challenge 283 { 284 u_int8_t data_len[2]; 285 u_int8_t reserved0[2]; 286 u_int8_t challenge_key[10]; 287 u_int8_t reserved1[2]; 288 }; 289 290 struct scsi_report_key_data_key1_key2 291 { 292 u_int8_t data_len[2]; 293 u_int8_t reserved0[2]; 294 u_int8_t key1[5]; 295 u_int8_t reserved1[3]; 296 }; 297 298 struct scsi_report_key_data_title 299 { 300 u_int8_t data_len[2]; 301 u_int8_t reserved0[2]; 302 u_int8_t byte0; 303 #define RKD_TITLE_CPM 0x80 304 #define RKD_TITLE_CPM_SHIFT 7 305 #define RKD_TITLE_CP_SEC 0x40 306 #define RKD_TITLE_CP_SEC_SHIFT 6 307 #define RKD_TITLE_CMGS_MASK 0x30 308 #define RKD_TITLE_CMGS_SHIFT 4 309 #define RKD_TITLE_CMGS_NO_RST 0x00 310 #define RKD_TITLE_CMGS_RSVD 0x10 311 #define RKD_TITLE_CMGS_1_GEN 0x20 312 #define RKD_TITLE_CMGS_NO_COPY 0x30 313 u_int8_t title_key[5]; 314 u_int8_t reserved1[2]; 315 }; 316 317 struct scsi_report_key_data_asf 318 { 319 u_int8_t data_len[2]; 320 u_int8_t reserved[5]; 321 u_int8_t success; 322 #define RKD_ASF_SUCCESS 0x01 323 }; 324 325 struct scsi_report_key_data_rpc 326 { 327 u_int8_t data_len[2]; 328 u_int8_t rpc_scheme0; 329 #define RKD_RPC_SCHEME_UNKNOWN 0x00 330 #define RKD_RPC_SCHEME_PHASE_II 0x01 331 u_int8_t reserved0; 332 u_int8_t byte4; 333 #define RKD_RPC_TYPE_MASK 0xC0 334 #define RKD_RPC_TYPE_SHIFT 6 335 #define RKD_RPC_TYPE_NONE 0x00 336 #define RKD_RPC_TYPE_SET 0x40 337 #define RKD_RPC_TYPE_LAST_CHANCE 0x80 338 #define RKD_RPC_TYPE_PERM 0xC0 339 #define RKD_RPC_VENDOR_RESET_MASK 0x38 340 #define RKD_RPC_VENDOR_RESET_SHIFT 3 341 #define RKD_RPC_USER_RESET_MASK 0x07 342 #define RKD_RPC_USER_RESET_SHIFT 0 343 u_int8_t region_mask; 344 u_int8_t rpc_scheme1; 345 u_int8_t reserved1; 346 }; 347 348 struct scsi_send_key_data_rpc 349 { 350 u_int8_t data_len[2]; 351 u_int8_t reserved0[2]; 352 u_int8_t region_code; 353 u_int8_t reserved1[3]; 354 }; 355 356 /* 357 * Common header for the return data from the READ DVD STRUCTURE command. 358 */ 359 struct scsi_read_dvd_struct_data_header 360 { 361 u_int8_t data_len[2]; 362 u_int8_t reserved[2]; 363 }; 364 365 struct scsi_read_dvd_struct_data_layer_desc 366 { 367 u_int8_t book_type_version; 368 #define RDSD_BOOK_TYPE_DVD_ROM 0x00 369 #define RDSD_BOOK_TYPE_DVD_RAM 0x10 370 #define RDSD_BOOK_TYPE_DVD_R 0x20 371 #define RDSD_BOOK_TYPE_DVD_RW 0x30 372 #define RDSD_BOOK_TYPE_DVD_PRW 0x90 373 #define RDSD_BOOK_TYPE_MASK 0xf0 374 #define RDSD_BOOK_TYPE_SHIFT 4 375 #define RDSD_BOOK_VERSION_MASK 0x0f 376 /* 377 * The lower 4 bits of this field is referred to as the "minimum 378 * rate" field in MMC2, and the "maximum rate" field in MMC3. Ugh. 379 */ 380 u_int8_t disc_size_max_rate; 381 #define RDSD_DISC_SIZE_120MM 0x00 382 #define RDSD_DISC_SIZE_80MM 0x10 383 #define RDSD_DISC_SIZE_MASK 0xf0 384 #define RDSD_DISC_SIZE_SHIFT 4 385 #define RDSD_MAX_RATE_0252 0x00 386 #define RDSD_MAX_RATE_0504 0x01 387 #define RDSD_MAX_RATE_1008 0x02 388 #define RDSD_MAX_RATE_NOT_SPEC 0x0f 389 #define RDSD_MAX_RATE_MASK 0x0f 390 u_int8_t layer_info; 391 #define RDSD_NUM_LAYERS_MASK 0x60 392 #define RDSD_NUM_LAYERS_SHIFT 5 393 #define RDSD_NL_ONE_LAYER 0x00 394 #define RDSD_NL_TWO_LAYERS 0x20 395 #define RDSD_TRACK_PATH_MASK 0x10 396 #define RDSD_TRACK_PATH_SHIFT 4 397 #define RDSD_TP_PTP 0x00 398 #define RDSD_TP_OTP 0x10 399 #define RDSD_LAYER_TYPE_RO 0x01 400 #define RDSD_LAYER_TYPE_RECORD 0x02 401 #define RDSD_LAYER_TYPE_RW 0x04 402 #define RDSD_LAYER_TYPE_MASK 0x0f 403 u_int8_t density; 404 #define RDSD_LIN_DENSITY_0267 0x00 405 #define RDSD_LIN_DENSITY_0293 0x10 406 #define RDSD_LIN_DENSITY_0409_0435 0x20 407 #define RDSD_LIN_DENSITY_0280_0291 0x40 408 /* XXX MMC2 uses 0.176um/bit instead of 0.353 as in MMC3 */ 409 #define RDSD_LIN_DENSITY_0353 0x80 410 #define RDSD_LIN_DENSITY_MASK 0xf0 411 #define RDSD_LIN_DENSITY_SHIFT 4 412 #define RDSD_TRACK_DENSITY_074 0x00 413 #define RDSD_TRACK_DENSITY_080 0x01 414 #define RDSD_TRACK_DENSITY_0615 0x02 415 #define RDSD_TRACK_DENSITY_MASK 0x0f 416 u_int8_t zeros0; 417 u_int8_t main_data_start[3]; 418 #define RDSD_MAIN_DATA_START_DVD_RO 0x30000 419 #define RDSD_MAIN_DATA_START_DVD_RW 0x31000 420 u_int8_t zeros1; 421 u_int8_t main_data_end[3]; 422 u_int8_t zeros2; 423 u_int8_t end_sector_layer0[3]; 424 u_int8_t bca; 425 #define RDSD_BCA 0x80 426 #define RDSD_BCA_MASK 0x80 427 #define RDSD_BCA_SHIFT 7 428 u_int8_t media_specific[2031]; 429 }; 430 431 struct scsi_read_dvd_struct_data_physical 432 { 433 u_int8_t data_len[2]; 434 u_int8_t reserved[2]; 435 struct scsi_read_dvd_struct_data_layer_desc layer_desc; 436 }; 437 438 struct scsi_read_dvd_struct_data_copyright 439 { 440 u_int8_t data_len[2]; 441 u_int8_t reserved0[2]; 442 u_int8_t cps_type; 443 #define RDSD_CPS_NOT_PRESENT 0x00 444 #define RDSD_CPS_DATA_EXISTS 0x01 445 u_int8_t region_info; 446 u_int8_t reserved1[2]; 447 }; 448 449 struct scsi_read_dvd_struct_data_disc_key 450 { 451 u_int8_t data_len[2]; 452 u_int8_t reserved[2]; 453 u_int8_t disc_key[2048]; 454 }; 455 456 struct scsi_read_dvd_struct_data_bca 457 { 458 u_int8_t data_len[2]; 459 u_int8_t reserved[2]; 460 u_int8_t bca_info[188]; /* XXX 12-188 bytes */ 461 }; 462 463 struct scsi_read_dvd_struct_data_manufacturer 464 { 465 u_int8_t data_len[2]; 466 u_int8_t reserved[2]; 467 u_int8_t manuf_info[2048]; 468 }; 469 470 struct scsi_read_dvd_struct_data_copy_manage 471 { 472 u_int8_t data_len[2]; 473 u_int8_t reserved0[2]; 474 u_int8_t byte4; 475 #define RDSD_CPM_NO_COPYRIGHT 0x00 476 #define RDSD_CPM_HAS_COPYRIGHT 0x80 477 #define RDSD_CPM_MASK 0x80 478 #define RDSD_CMGS_COPY_ALLOWED 0x00 479 #define RDSD_CMGS_ONE_COPY 0x20 480 #define RDSD_CMGS_NO_COPIES 0x30 481 #define RDSD_CMGS_MASK 0x30 482 u_int8_t reserved1[3]; 483 }; 484 485 struct scsi_read_dvd_struct_data_prot_discid 486 { 487 u_int8_t data_len[2]; 488 u_int8_t reserved[2]; 489 u_int8_t prot_discid_data[16]; 490 }; 491 492 struct scsi_read_dvd_struct_data_disc_key_blk 493 { 494 /* 495 * Length is 0x6ffe == 28670 for CPRM, 0x3002 == 12990 for CSS2. 496 */ 497 u_int8_t data_len[2]; 498 u_int8_t reserved; 499 u_int8_t total_packs; 500 u_int8_t disc_key_pack_data[28668]; 501 }; 502 struct scsi_read_dvd_struct_data_dds 503 { 504 u_int8_t data_len[2]; 505 u_int8_t reserved[2]; 506 u_int8_t dds_info[2048]; 507 }; 508 509 struct scsi_read_dvd_struct_data_medium_status 510 { 511 u_int8_t data_len[2]; 512 u_int8_t reserved0[2]; 513 u_int8_t byte4; 514 #define RDSD_MS_CARTRIDGE 0x80 515 #define RDSD_MS_OUT 0x40 516 #define RDSD_MS_MSWI 0x08 517 #define RDSD_MS_CWP 0x04 518 #define RDSD_MS_PWP 0x02 519 u_int8_t disc_type_id; 520 #define RDSD_DT_NEED_CARTRIDGE 0x00 521 #define RDSD_DT_NO_CART_NEEDED 0x01 522 u_int8_t reserved1; 523 u_int8_t ram_swi_info; 524 #define RDSD_SWI_NO_BARE 0x01 525 #define RDSD_SWI_UNSPEC 0xff 526 }; 527 528 struct scsi_read_dvd_struct_data_spare_area 529 { 530 u_int8_t data_len[2]; 531 u_int8_t reserved[2]; 532 u_int8_t unused_primary[4]; 533 u_int8_t unused_supl[4]; 534 u_int8_t allocated_supl[4]; 535 }; 536 537 struct scsi_read_dvd_struct_data_rmd_borderout 538 { 539 u_int8_t data_len[2]; 540 u_int8_t reserved[2]; 541 u_int8_t rmd[30720]; /* maximum is 30720 bytes */ 542 }; 543 544 struct scsi_read_dvd_struct_data_rmd 545 { 546 u_int8_t data_len[2]; 547 u_int8_t reserved[2]; 548 u_int8_t last_sector_num[4]; 549 u_int8_t rmd_bytes[32768]; /* This is the maximum */ 550 }; 551 552 /* 553 * XXX KDM this is the MMC2 version of the structure. 554 * The variable positions have changed (in a semi-conflicting way) in the 555 * MMC3 spec, although the overall length of the structure is the same. 556 */ 557 struct scsi_read_dvd_struct_data_leadin 558 { 559 u_int8_t data_len[2]; 560 u_int8_t reserved0[2]; 561 u_int8_t field_id_1; 562 u_int8_t app_code; 563 u_int8_t disc_physical_data; 564 u_int8_t last_addr[3]; 565 u_int8_t reserved1[2]; 566 u_int8_t field_id_2; 567 u_int8_t rwp; 568 u_int8_t rwp_wavelength; 569 u_int8_t optimum_write_strategy; 570 u_int8_t reserved2[4]; 571 u_int8_t field_id_3; 572 u_int8_t manuf_id_17_12[6]; 573 u_int8_t reserved3; 574 u_int8_t field_id_4; 575 u_int8_t manuf_id_11_6[6]; 576 u_int8_t reserved4; 577 u_int8_t field_id_5; 578 u_int8_t manuf_id_5_0[6]; 579 u_int8_t reserved5[25]; 580 }; 581 582 struct scsi_read_dvd_struct_data_disc_id 583 { 584 u_int8_t data_len[2]; 585 u_int8_t reserved[4]; 586 u_int8_t random_num[2]; 587 u_int8_t year[4]; 588 u_int8_t month[2]; 589 u_int8_t day[2]; 590 u_int8_t hour[2]; 591 u_int8_t minute[2]; 592 u_int8_t second[2]; 593 }; 594 595 struct scsi_read_dvd_struct_data_generic_dcb 596 { 597 u_int8_t content_desc[4]; 598 #define SCSI_RCB 599 u_int8_t unknown_desc_actions[4]; 600 #define RDSD_ACTION_RECORDING 0x0001 601 #define RDSD_ACTION_READING 0x0002 602 #define RDSD_ACTION_FORMAT 0x0004 603 #define RDSD_ACTION_MODIFY_DCB 0x0008 604 u_int8_t vendor_id[32]; 605 u_int8_t dcb_data[32728]; 606 }; 607 608 struct scsi_read_dvd_struct_data_dcb 609 { 610 u_int8_t data_len[2]; 611 u_int8_t reserved[2]; 612 struct scsi_read_dvd_struct_data_generic_dcb dcb; 613 }; 614 615 struct read_dvd_struct_write_prot 616 { 617 u_int8_t data_len[2]; 618 u_int8_t reserved0[2]; 619 u_int8_t write_prot_status; 620 #define RDSD_WPS_MSWI 0x08 621 #define RDSD_WPS_CWP 0x04 622 #define RDSD_WPS_PWP 0x02 623 #define RDSD_WPS_SWPP 0x01 624 u_int8_t reserved[3]; 625 }; 626 627 struct read_dvd_struct_list_entry 628 { 629 u_int8_t format_code; 630 u_int8_t sds_rds; 631 #define RDSD_SDS_NOT_WRITEABLE 0x00 632 #define RDSD_SDS_WRITEABLE 0x80 633 #define RDSD_SDS_MASK 0x80 634 #define RDSD_RDS_NOT_READABLE 0x00 635 #define RDSD_RDS_READABLE 0x40 636 #define RDSD_RDS_MASK 0x40 637 u_int8_t struct_len[2]; 638 }; 639 640 struct read_dvd_struct_data_list 641 { 642 u_int8_t data_len[2]; 643 u_int8_t reserved[2]; 644 struct read_dvd_struct_list_entry entries[0]; 645 }; 646 647 struct scsi_read_cd_cap_data 648 { 649 u_int8_t addr_3; /* Most significant */ 650 u_int8_t addr_2; 651 u_int8_t addr_1; 652 u_int8_t addr_0; /* Least significant */ 653 u_int8_t length_3; /* Most significant */ 654 u_int8_t length_2; 655 u_int8_t length_1; 656 u_int8_t length_0; /* Least significant */ 657 }; 658 659 struct cd_audio_page 660 { 661 u_int8_t page_code; 662 #define CD_PAGE_CODE 0x3F 663 #define AUDIO_PAGE 0x0e 664 #define CD_PAGE_PS 0x80 665 u_int8_t param_len; 666 u_int8_t flags; 667 #define CD_PA_SOTC 0x02 668 #define CD_PA_IMMED 0x04 669 u_int8_t unused[2]; 670 u_int8_t format_lba; 671 #define CD_PA_FORMAT_LBA 0x0F 672 #define CD_PA_APR_VALID 0x80 673 u_int8_t lb_per_sec[2]; 674 struct port_control 675 { 676 u_int8_t channels; 677 #define CHANNEL 0x0F 678 #define CHANNEL_0 1 679 #define CHANNEL_1 2 680 #define CHANNEL_2 4 681 #define CHANNEL_3 8 682 #define LEFT_CHANNEL CHANNEL_0 683 #define RIGHT_CHANNEL CHANNEL_1 684 u_int8_t volume; 685 } port[4]; 686 #define LEFT_PORT 0 687 #define RIGHT_PORT 1 688 }; 689 690 union cd_pages 691 { 692 struct cd_audio_page audio; 693 }; 694 695 struct cd_mode_data_10 696 { 697 struct scsi_mode_header_10 header; 698 struct scsi_mode_blk_desc blk_desc; 699 union cd_pages page; 700 }; 701 702 struct cd_mode_data 703 { 704 struct scsi_mode_header_6 header; 705 struct scsi_mode_blk_desc blk_desc; 706 union cd_pages page; 707 }; 708 709 union cd_mode_data_6_10 710 { 711 struct cd_mode_data mode_data_6; 712 struct cd_mode_data_10 mode_data_10; 713 }; 714 715 struct cd_mode_params 716 { 717 STAILQ_ENTRY(cd_mode_params) links; 718 int cdb_size; 719 int alloc_len; 720 u_int8_t *mode_buf; 721 }; 722 723 __BEGIN_DECLS 724 void scsi_report_key(struct ccb_scsiio *csio, u_int32_t retries, 725 void (*cbfcnp)(struct cam_periph *, union ccb *), 726 u_int8_t tag_action, u_int32_t lba, u_int8_t agid, 727 u_int8_t key_format, u_int8_t *data_ptr, 728 u_int32_t dxfer_len, u_int8_t sense_len, 729 u_int32_t timeout); 730 731 void scsi_send_key(struct ccb_scsiio *csio, u_int32_t retries, 732 void (*cbfcnp)(struct cam_periph *, union ccb *), 733 u_int8_t tag_action, u_int8_t agid, u_int8_t key_format, 734 u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len, 735 u_int32_t timeout); 736 737 void scsi_read_dvd_structure(struct ccb_scsiio *csio, u_int32_t retries, 738 void (*cbfcnp)(struct cam_periph *, union ccb *), 739 u_int8_t tag_action, u_int32_t address, 740 u_int8_t layer_number, u_int8_t format, 741 u_int8_t agid, u_int8_t *data_ptr, 742 u_int32_t dxfer_len, u_int8_t sense_len, 743 u_int32_t timeout); 744 745 __END_DECLS 746 747 #endif /*_SCSI_SCSI_CD_H*/ 748 749