2 * Copyright (c) 2000, 2002 Kenneth D. Merry
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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
28 * Written by Julian Elischer (julian@tfs.com)
29 * for TRW Financial Systems.
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.
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.
41 * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
43 * from: scsi_cd.h,v 1.10 1997/02/22 09:44:28 peter Exp $
46 #ifndef _SCSI_SCSI_CD_H
47 #define _SCSI_SCSI_CD_H 1
50 * Define two bits always in the same place in byte 2 (flag byte)
52 #define CD_RELADDR 0x01
59 struct scsi_get_config
63 #define SGC_RT_ALL 0x00
64 #define SGC_RT_CURRENT 0x01
65 #define SGC_RT_SPECIFIC 0x02
66 #define SGC_RT_MASK 0x03
67 uint8_t starting_feature[2];
73 struct scsi_get_config_header
75 uint8_t data_length[4];
77 uint8_t current_profile[2];
80 struct scsi_get_config_feature
82 uint8_t feature_code[2];
84 #define SGC_F_CURRENT 0x01
85 #define SGC_F_PERSISTENT 0x02
86 #define SGC_F_VERSION_MASK 0x2C
87 #define SGC_F_VERSION_SHIFT 2
89 uint8_t feature_data[];
92 struct scsi_get_event_status
96 #define SGESN_POLLED 1
104 struct scsi_get_event_status_header
106 uint8_t descr_length[4];
108 #define SGESN_NEA 0x80
109 uint8_t supported_class;
112 struct scsi_get_event_status_descr
115 uint8_t event_info[];
118 struct scsi_mechanism_status
127 struct scsi_mechanism_status_header
133 uint8_t slots_length[2];
161 struct scsi_play_track
166 u_int8_t start_track;
167 u_int8_t start_index;
178 u_int8_t blk_addr[4];
180 u_int8_t xfer_len[2];
187 u_int8_t byte2; /* same as above */
188 u_int8_t blk_addr[4];
189 u_int8_t xfer_len[4];
194 struct scsi_play_rel_12
197 u_int8_t byte2; /* same as above */
198 u_int8_t blk_addr[4];
199 u_int8_t xfer_len[4];
204 struct scsi_read_header
208 u_int8_t blk_addr[4];
210 u_int8_t data_len[2];
214 struct scsi_read_subchannel
219 #define SRS_SUBQ 0x40
220 u_int8_t subchan_format;
223 u_int8_t data_len[2];
234 u_int8_t data_len[2];
238 struct scsi_read_toc_hdr
240 uint8_t data_length[2];
245 struct scsi_read_toc_type01_descr
249 uint8_t track_number;
251 uint8_t track_start[4];
254 struct scsi_read_cd_capacity
258 u_int8_t addr_3; /* Most Significant */
261 u_int8_t addr_0; /* Least Significant */
266 struct scsi_set_speed
270 u_int8_t readspeed[2];
271 u_int8_t writespeed[2];
272 u_int8_t reserved[5];
276 struct scsi_report_key
281 u_int8_t reserved1[2];
282 u_int8_t alloc_len[2];
283 u_int8_t agid_keyformat;
284 #define RK_KF_AGID_MASK 0xc0
285 #define RK_KF_AGID_SHIFT 6
286 #define RK_KF_KEYFORMAT_MASK 0x3f
287 #define RK_KF_AGID 0x00
288 #define RK_KF_CHALLENGE 0x01
289 #define RF_KF_KEY1 0x02
290 #define RK_KF_KEY2 0x03
291 #define RF_KF_TITLE 0x04
292 #define RF_KF_ASF 0x05
293 #define RK_KF_RPC_SET 0x06
294 #define RF_KF_RPC_REPORT 0x08
295 #define RF_KF_INV_AGID 0x3f
300 * See the report key structure for key format and AGID definitions.
305 u_int8_t reserved[7];
306 u_int8_t param_len[2];
307 u_int8_t agid_keyformat;
311 struct scsi_read_dvd_structure
316 u_int8_t layer_number;
318 #define RDS_FORMAT_PHYSICAL 0x00
319 #define RDS_FORMAT_COPYRIGHT 0x01
320 #define RDS_FORMAT_DISC_KEY 0x02
321 #define RDS_FORMAT_BCA 0x03
322 #define RDS_FORMAT_MANUFACTURER 0x04
323 #define RDS_FORMAT_CMGS_CPM 0x05
324 #define RDS_FORMAT_PROT_DISCID 0x06
325 #define RDS_FORMAT_DISC_KEY_BLOCK 0x07
326 #define RDS_FORMAT_DDS 0x08
327 #define RDS_FORMAT_DVDRAM_MEDIA_STAT 0x09
328 #define RDS_FORMAT_SPARE_AREA 0x0a
329 #define RDS_FORMAT_RMD_BORDEROUT 0x0c
330 #define RDS_FORMAT_RMD 0x0d
331 #define RDS_FORMAT_LEADIN 0x0e
332 #define RDS_FORMAT_DISC_ID 0x0f
333 #define RDS_FORMAT_DCB 0x30
334 #define RDS_FORMAT_WRITE_PROT 0xc0
335 #define RDS_FORMAT_STRUCTURE_LIST 0xff
336 u_int8_t alloc_len[2];
344 #define READ_CD_CAPACITY 0x25 /* slightly different from disk */
345 #define READ_SUBCHANNEL 0x42 /* cdrom read Subchannel */
346 #define READ_TOC 0x43 /* cdrom read TOC */
347 #define READ_HEADER 0x44 /* cdrom read header */
348 #define PLAY_10 0x45 /* cdrom play 'play audio' mode */
349 #define GET_CONFIGURATION 0x46 /* Get device configuration */
350 #define PLAY_MSF 0x47 /* cdrom play Min,Sec,Frames mode */
351 #define PLAY_TRACK 0x48 /* cdrom play track/index mode */
352 #define PLAY_TRACK_REL 0x49 /* cdrom play track/index mode */
353 #define GET_EVENT_STATUS 0x4a /* Get event status notification */
354 #define PAUSE 0x4b /* cdrom pause in 'play audio' mode */
355 #define SEND_KEY 0xa3 /* dvd send key command */
356 #define REPORT_KEY 0xa4 /* dvd report key command */
357 #define PLAY_12 0xa5 /* cdrom pause in 'play audio' mode */
358 #define PLAY_TRACK_REL_BIG 0xa9 /* cdrom play track/index mode */
359 #define READ_DVD_STRUCTURE 0xad /* read dvd structure */
360 #define SET_CD_SPEED 0xbb /* set c/dvd speed */
361 #define MECHANISM_STATUS 0xbd /* get status of c/dvd mechanics */
363 struct scsi_report_key_data_header
365 u_int8_t data_len[2];
366 u_int8_t reserved[2];
369 struct scsi_report_key_data_agid
371 u_int8_t data_len[2];
372 u_int8_t reserved[5];
374 #define RKD_AGID_MASK 0xc0
375 #define RKD_AGID_SHIFT 6
378 struct scsi_report_key_data_challenge
380 u_int8_t data_len[2];
381 u_int8_t reserved0[2];
382 u_int8_t challenge_key[10];
383 u_int8_t reserved1[2];
386 struct scsi_report_key_data_key1_key2
388 u_int8_t data_len[2];
389 u_int8_t reserved0[2];
391 u_int8_t reserved1[3];
394 struct scsi_report_key_data_title
396 u_int8_t data_len[2];
397 u_int8_t reserved0[2];
399 #define RKD_TITLE_CPM 0x80
400 #define RKD_TITLE_CPM_SHIFT 7
401 #define RKD_TITLE_CP_SEC 0x40
402 #define RKD_TITLE_CP_SEC_SHIFT 6
403 #define RKD_TITLE_CMGS_MASK 0x30
404 #define RKD_TITLE_CMGS_SHIFT 4
405 #define RKD_TITLE_CMGS_NO_RST 0x00
406 #define RKD_TITLE_CMGS_RSVD 0x10
407 #define RKD_TITLE_CMGS_1_GEN 0x20
408 #define RKD_TITLE_CMGS_NO_COPY 0x30
409 u_int8_t title_key[5];
410 u_int8_t reserved1[2];
413 struct scsi_report_key_data_asf
415 u_int8_t data_len[2];
416 u_int8_t reserved[5];
418 #define RKD_ASF_SUCCESS 0x01
421 struct scsi_report_key_data_rpc
423 u_int8_t data_len[2];
424 u_int8_t rpc_scheme0;
425 #define RKD_RPC_SCHEME_UNKNOWN 0x00
426 #define RKD_RPC_SCHEME_PHASE_II 0x01
429 #define RKD_RPC_TYPE_MASK 0xC0
430 #define RKD_RPC_TYPE_SHIFT 6
431 #define RKD_RPC_TYPE_NONE 0x00
432 #define RKD_RPC_TYPE_SET 0x40
433 #define RKD_RPC_TYPE_LAST_CHANCE 0x80
434 #define RKD_RPC_TYPE_PERM 0xC0
435 #define RKD_RPC_VENDOR_RESET_MASK 0x38
436 #define RKD_RPC_VENDOR_RESET_SHIFT 3
437 #define RKD_RPC_USER_RESET_MASK 0x07
438 #define RKD_RPC_USER_RESET_SHIFT 0
439 u_int8_t region_mask;
440 u_int8_t rpc_scheme1;
444 struct scsi_send_key_data_rpc
446 u_int8_t data_len[2];
447 u_int8_t reserved0[2];
448 u_int8_t region_code;
449 u_int8_t reserved1[3];
453 * Common header for the return data from the READ DVD STRUCTURE command.
455 struct scsi_read_dvd_struct_data_header
457 u_int8_t data_len[2];
458 u_int8_t reserved[2];
461 struct scsi_read_dvd_struct_data_layer_desc
463 u_int8_t book_type_version;
464 #define RDSD_BOOK_TYPE_DVD_ROM 0x00
465 #define RDSD_BOOK_TYPE_DVD_RAM 0x10
466 #define RDSD_BOOK_TYPE_DVD_R 0x20
467 #define RDSD_BOOK_TYPE_DVD_RW 0x30
468 #define RDSD_BOOK_TYPE_DVD_PRW 0x90
469 #define RDSD_BOOK_TYPE_MASK 0xf0
470 #define RDSD_BOOK_TYPE_SHIFT 4
471 #define RDSD_BOOK_VERSION_MASK 0x0f
473 * The lower 4 bits of this field is referred to as the "minimum
474 * rate" field in MMC2, and the "maximum rate" field in MMC3. Ugh.
476 u_int8_t disc_size_max_rate;
477 #define RDSD_DISC_SIZE_120MM 0x00
478 #define RDSD_DISC_SIZE_80MM 0x10
479 #define RDSD_DISC_SIZE_MASK 0xf0
480 #define RDSD_DISC_SIZE_SHIFT 4
481 #define RDSD_MAX_RATE_0252 0x00
482 #define RDSD_MAX_RATE_0504 0x01
483 #define RDSD_MAX_RATE_1008 0x02
484 #define RDSD_MAX_RATE_NOT_SPEC 0x0f
485 #define RDSD_MAX_RATE_MASK 0x0f
487 #define RDSD_NUM_LAYERS_MASK 0x60
488 #define RDSD_NUM_LAYERS_SHIFT 5
489 #define RDSD_NL_ONE_LAYER 0x00
490 #define RDSD_NL_TWO_LAYERS 0x20
491 #define RDSD_TRACK_PATH_MASK 0x10
492 #define RDSD_TRACK_PATH_SHIFT 4
493 #define RDSD_TP_PTP 0x00
494 #define RDSD_TP_OTP 0x10
495 #define RDSD_LAYER_TYPE_RO 0x01
496 #define RDSD_LAYER_TYPE_RECORD 0x02
497 #define RDSD_LAYER_TYPE_RW 0x04
498 #define RDSD_LAYER_TYPE_MASK 0x0f
500 #define RDSD_LIN_DENSITY_0267 0x00
501 #define RDSD_LIN_DENSITY_0293 0x10
502 #define RDSD_LIN_DENSITY_0409_0435 0x20
503 #define RDSD_LIN_DENSITY_0280_0291 0x40
504 /* XXX MMC2 uses 0.176um/bit instead of 0.353 as in MMC3 */
505 #define RDSD_LIN_DENSITY_0353 0x80
506 #define RDSD_LIN_DENSITY_MASK 0xf0
507 #define RDSD_LIN_DENSITY_SHIFT 4
508 #define RDSD_TRACK_DENSITY_074 0x00
509 #define RDSD_TRACK_DENSITY_080 0x01
510 #define RDSD_TRACK_DENSITY_0615 0x02
511 #define RDSD_TRACK_DENSITY_MASK 0x0f
513 u_int8_t main_data_start[3];
514 #define RDSD_MAIN_DATA_START_DVD_RO 0x30000
515 #define RDSD_MAIN_DATA_START_DVD_RW 0x31000
517 u_int8_t main_data_end[3];
519 u_int8_t end_sector_layer0[3];
521 #define RDSD_BCA 0x80
522 #define RDSD_BCA_MASK 0x80
523 #define RDSD_BCA_SHIFT 7
524 u_int8_t media_specific[2031];
527 struct scsi_read_dvd_struct_data_physical
529 u_int8_t data_len[2];
530 u_int8_t reserved[2];
531 struct scsi_read_dvd_struct_data_layer_desc layer_desc;
534 struct scsi_read_dvd_struct_data_copyright
536 u_int8_t data_len[2];
537 u_int8_t reserved0[2];
539 #define RDSD_CPS_NOT_PRESENT 0x00
540 #define RDSD_CPS_DATA_EXISTS 0x01
541 u_int8_t region_info;
542 u_int8_t reserved1[2];
545 struct scsi_read_dvd_struct_data_disc_key
547 u_int8_t data_len[2];
548 u_int8_t reserved[2];
549 u_int8_t disc_key[2048];
552 struct scsi_read_dvd_struct_data_bca
554 u_int8_t data_len[2];
555 u_int8_t reserved[2];
556 u_int8_t bca_info[188]; /* XXX 12-188 bytes */
559 struct scsi_read_dvd_struct_data_manufacturer
561 u_int8_t data_len[2];
562 u_int8_t reserved[2];
563 u_int8_t manuf_info[2048];
566 struct scsi_read_dvd_struct_data_copy_manage
568 u_int8_t data_len[2];
569 u_int8_t reserved0[2];
571 #define RDSD_CPM_NO_COPYRIGHT 0x00
572 #define RDSD_CPM_HAS_COPYRIGHT 0x80
573 #define RDSD_CPM_MASK 0x80
574 #define RDSD_CMGS_COPY_ALLOWED 0x00
575 #define RDSD_CMGS_ONE_COPY 0x20
576 #define RDSD_CMGS_NO_COPIES 0x30
577 #define RDSD_CMGS_MASK 0x30
578 u_int8_t reserved1[3];
581 struct scsi_read_dvd_struct_data_prot_discid
583 u_int8_t data_len[2];
584 u_int8_t reserved[2];
585 u_int8_t prot_discid_data[16];
588 struct scsi_read_dvd_struct_data_disc_key_blk
591 * Length is 0x6ffe == 28670 for CPRM, 0x3002 == 12990 for CSS2.
593 u_int8_t data_len[2];
595 u_int8_t total_packs;
596 u_int8_t disc_key_pack_data[28668];
598 struct scsi_read_dvd_struct_data_dds
600 u_int8_t data_len[2];
601 u_int8_t reserved[2];
602 u_int8_t dds_info[2048];
605 struct scsi_read_dvd_struct_data_medium_status
607 u_int8_t data_len[2];
608 u_int8_t reserved0[2];
610 #define RDSD_MS_CARTRIDGE 0x80
611 #define RDSD_MS_OUT 0x40
612 #define RDSD_MS_MSWI 0x08
613 #define RDSD_MS_CWP 0x04
614 #define RDSD_MS_PWP 0x02
615 u_int8_t disc_type_id;
616 #define RDSD_DT_NEED_CARTRIDGE 0x00
617 #define RDSD_DT_NO_CART_NEEDED 0x01
619 u_int8_t ram_swi_info;
620 #define RDSD_SWI_NO_BARE 0x01
621 #define RDSD_SWI_UNSPEC 0xff
624 struct scsi_read_dvd_struct_data_spare_area
626 u_int8_t data_len[2];
627 u_int8_t reserved[2];
628 u_int8_t unused_primary[4];
629 u_int8_t unused_supl[4];
630 u_int8_t allocated_supl[4];
633 struct scsi_read_dvd_struct_data_rmd_borderout
635 u_int8_t data_len[2];
636 u_int8_t reserved[2];
637 u_int8_t rmd[30720]; /* maximum is 30720 bytes */
640 struct scsi_read_dvd_struct_data_rmd
642 u_int8_t data_len[2];
643 u_int8_t reserved[2];
644 u_int8_t last_sector_num[4];
645 u_int8_t rmd_bytes[32768]; /* This is the maximum */
649 * XXX KDM this is the MMC2 version of the structure.
650 * The variable positions have changed (in a semi-conflicting way) in the
651 * MMC3 spec, although the overall length of the structure is the same.
653 struct scsi_read_dvd_struct_data_leadin
655 u_int8_t data_len[2];
656 u_int8_t reserved0[2];
659 u_int8_t disc_physical_data;
660 u_int8_t last_addr[3];
661 u_int8_t reserved1[2];
664 u_int8_t rwp_wavelength;
665 u_int8_t optimum_write_strategy;
666 u_int8_t reserved2[4];
668 u_int8_t manuf_id_17_12[6];
671 u_int8_t manuf_id_11_6[6];
674 u_int8_t manuf_id_5_0[6];
675 u_int8_t reserved5[25];
678 struct scsi_read_dvd_struct_data_disc_id
680 u_int8_t data_len[2];
681 u_int8_t reserved[4];
682 u_int8_t random_num[2];
691 struct scsi_read_dvd_struct_data_generic_dcb
693 u_int8_t content_desc[4];
695 u_int8_t unknown_desc_actions[4];
696 #define RDSD_ACTION_RECORDING 0x0001
697 #define RDSD_ACTION_READING 0x0002
698 #define RDSD_ACTION_FORMAT 0x0004
699 #define RDSD_ACTION_MODIFY_DCB 0x0008
700 u_int8_t vendor_id[32];
701 u_int8_t dcb_data[32728];
704 struct scsi_read_dvd_struct_data_dcb
706 u_int8_t data_len[2];
707 u_int8_t reserved[2];
708 struct scsi_read_dvd_struct_data_generic_dcb dcb;
711 struct read_dvd_struct_write_prot
713 u_int8_t data_len[2];
714 u_int8_t reserved0[2];
715 u_int8_t write_prot_status;
716 #define RDSD_WPS_MSWI 0x08
717 #define RDSD_WPS_CWP 0x04
718 #define RDSD_WPS_PWP 0x02
719 #define RDSD_WPS_SWPP 0x01
720 u_int8_t reserved[3];
723 struct read_dvd_struct_list_entry
725 u_int8_t format_code;
727 #define RDSD_SDS_NOT_WRITEABLE 0x00
728 #define RDSD_SDS_WRITEABLE 0x80
729 #define RDSD_SDS_MASK 0x80
730 #define RDSD_RDS_NOT_READABLE 0x00
731 #define RDSD_RDS_READABLE 0x40
732 #define RDSD_RDS_MASK 0x40
733 u_int8_t struct_len[2];
736 struct read_dvd_struct_data_list
738 u_int8_t data_len[2];
739 u_int8_t reserved[2];
740 struct read_dvd_struct_list_entry entries[0];
743 struct scsi_read_cd_cap_data
745 u_int8_t addr_3; /* Most significant */
748 u_int8_t addr_0; /* Least significant */
749 u_int8_t length_3; /* Most significant */
752 u_int8_t length_0; /* Least significant */
758 #define CD_PAGE_CODE 0x3F
759 #define AUDIO_PAGE 0x0e
760 #define CD_PAGE_PS 0x80
763 #define CD_PA_SOTC 0x02
764 #define CD_PA_IMMED 0x04
767 #define CD_PA_FORMAT_LBA 0x0F
768 #define CD_PA_APR_VALID 0x80
769 u_int8_t lb_per_sec[2];
778 #define LEFT_CHANNEL CHANNEL_0
779 #define RIGHT_CHANNEL CHANNEL_1
786 struct scsi_cddvd_capabilities_page_sd {
788 uint8_t rotation_control;
789 uint8_t write_speed_supported[2];
792 struct scsi_cddvd_capabilities_page {
794 #define SMS_CDDVD_CAPS_PAGE 0x2a
803 uint8_t nvol_levels[2];
804 uint8_t buffer_size[2];
805 uint8_t obsolete2[2];
809 uint8_t copy_management;
811 uint8_t rotation_control;
812 uint8_t cur_write_speed;
813 uint8_t num_speed_descr;
814 struct scsi_cddvd_capabilities_page_sd speed_descr[];
819 struct cd_audio_page audio;
822 struct cd_mode_data_10
824 struct scsi_mode_header_10 header;
825 struct scsi_mode_blk_desc blk_desc;
831 struct scsi_mode_header_6 header;
832 struct scsi_mode_blk_desc blk_desc;
836 union cd_mode_data_6_10
838 struct cd_mode_data mode_data_6;
839 struct cd_mode_data_10 mode_data_10;
842 struct cd_mode_params
844 STAILQ_ENTRY(cd_mode_params) links;
851 void scsi_report_key(struct ccb_scsiio *csio, u_int32_t retries,
852 void (*cbfcnp)(struct cam_periph *, union ccb *),
853 u_int8_t tag_action, u_int32_t lba, u_int8_t agid,
854 u_int8_t key_format, u_int8_t *data_ptr,
855 u_int32_t dxfer_len, u_int8_t sense_len,
858 void scsi_send_key(struct ccb_scsiio *csio, u_int32_t retries,
859 void (*cbfcnp)(struct cam_periph *, union ccb *),
860 u_int8_t tag_action, u_int8_t agid, u_int8_t key_format,
861 u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len,
864 void scsi_read_dvd_structure(struct ccb_scsiio *csio, u_int32_t retries,
865 void (*cbfcnp)(struct cam_periph *, union ccb *),
866 u_int8_t tag_action, u_int32_t address,
867 u_int8_t layer_number, u_int8_t format,
868 u_int8_t agid, u_int8_t *data_ptr,
869 u_int32_t dxfer_len, u_int8_t sense_len,
874 #endif /*_SCSI_SCSI_CD_H*/