160422Sken/*- 2111206Sken * Copyright (c) 2000, 2002 Kenneth D. Merry 360422Sken * All rights reserved. 460422Sken * 560422Sken * Redistribution and use in source and binary forms, with or without 660422Sken * modification, are permitted provided that the following conditions 760422Sken * are met: 860422Sken * 1. Redistributions of source code must retain the above copyright 960422Sken * notice, this list of conditions, and the following disclaimer, 1060422Sken * without modification, immediately at the beginning of the file. 1160422Sken * 2. The name of the author may not be used to endorse or promote products 1260422Sken * derived from this software without specific prior written permission. 1360422Sken * 1460422Sken * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1560422Sken * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1660422Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1760422Sken * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR 1860422Sken * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1960422Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2060422Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2160422Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2260422Sken * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2360422Sken * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2460422Sken * SUCH DAMAGE. 2560422Sken * 2660422Sken */ 2739213Sgibbs/* 2839213Sgibbs * Written by Julian Elischer (julian@tfs.com) 2939213Sgibbs * for TRW Financial Systems. 3039213Sgibbs * 3139213Sgibbs * TRW Financial Systems, in accordance with their agreement with Carnegie 3239213Sgibbs * Mellon University, makes this software available to CMU to distribute 3339213Sgibbs * or use in any manner that they see fit as long as this message is kept with 3439213Sgibbs * the software. For this reason TFS also grants any other persons or 3539213Sgibbs * organisations permission to use or modify this software. 3639213Sgibbs * 3739213Sgibbs * TFS supplies this software to be publicly redistributed 3839213Sgibbs * on the understanding that TFS is not responsible for the correct 3939213Sgibbs * functioning of this software in any circumstances. 4039213Sgibbs * 4139213Sgibbs * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 4239213Sgibbs * 4339213Sgibbs * from: scsi_cd.h,v 1.10 1997/02/22 09:44:28 peter Exp $ 4459874Speter * $FreeBSD$ 4539213Sgibbs */ 4639213Sgibbs#ifndef _SCSI_SCSI_CD_H 4739213Sgibbs#define _SCSI_SCSI_CD_H 1 4839213Sgibbs 4939213Sgibbs/* 5039213Sgibbs * Define two bits always in the same place in byte 2 (flag byte) 5139213Sgibbs */ 5239213Sgibbs#define CD_RELADDR 0x01 5339213Sgibbs#define CD_MSF 0x02 5439213Sgibbs 5539213Sgibbs/* 5639213Sgibbs * SCSI command format 5739213Sgibbs */ 5839213Sgibbs 5939213Sgibbsstruct scsi_pause 6039213Sgibbs{ 6139531Sken u_int8_t op_code; 6239531Sken u_int8_t byte2; 6339531Sken u_int8_t unused[6]; 6439531Sken u_int8_t resume; 6539531Sken u_int8_t control; 6639213Sgibbs}; 6739213Sgibbs#define PA_PAUSE 1 6839213Sgibbs#define PA_RESUME 0 6939213Sgibbs 7039213Sgibbsstruct scsi_play_msf 7139213Sgibbs{ 7239531Sken u_int8_t op_code; 7339531Sken u_int8_t byte2; 7439531Sken u_int8_t unused; 7539531Sken u_int8_t start_m; 7639531Sken u_int8_t start_s; 7739531Sken u_int8_t start_f; 7839531Sken u_int8_t end_m; 7939531Sken u_int8_t end_s; 8039531Sken u_int8_t end_f; 8139531Sken u_int8_t control; 8239213Sgibbs}; 8339213Sgibbs 8439213Sgibbsstruct scsi_play_track 8539213Sgibbs{ 8639531Sken u_int8_t op_code; 8739531Sken u_int8_t byte2; 8839531Sken u_int8_t unused[2]; 8939531Sken u_int8_t start_track; 9039531Sken u_int8_t start_index; 9139531Sken u_int8_t unused1; 9239531Sken u_int8_t end_track; 9339531Sken u_int8_t end_index; 9439531Sken u_int8_t control; 9539213Sgibbs}; 9639213Sgibbs 9739531Skenstruct scsi_play_10 9839213Sgibbs{ 9939531Sken u_int8_t op_code; 10039531Sken u_int8_t byte2; 10139531Sken u_int8_t blk_addr[4]; 10239531Sken u_int8_t unused; 10339531Sken u_int8_t xfer_len[2]; 10439531Sken u_int8_t control; 10539213Sgibbs}; 10639213Sgibbs 10739531Skenstruct scsi_play_12 10839213Sgibbs{ 10939531Sken u_int8_t op_code; 11039531Sken u_int8_t byte2; /* same as above */ 11139531Sken u_int8_t blk_addr[4]; 11239531Sken u_int8_t xfer_len[4]; 11339531Sken u_int8_t unused; 11439531Sken u_int8_t control; 11539213Sgibbs}; 11639213Sgibbs 11739531Skenstruct scsi_play_rel_12 11839213Sgibbs{ 11939531Sken u_int8_t op_code; 12039531Sken u_int8_t byte2; /* same as above */ 12139531Sken u_int8_t blk_addr[4]; 12239531Sken u_int8_t xfer_len[4]; 12339531Sken u_int8_t track; 12439531Sken u_int8_t control; 12539213Sgibbs}; 12639213Sgibbs 12739213Sgibbsstruct scsi_read_header 12839213Sgibbs{ 12939531Sken u_int8_t op_code; 13039531Sken u_int8_t byte2; 13139531Sken u_int8_t blk_addr[4]; 13239531Sken u_int8_t unused; 13339531Sken u_int8_t data_len[2]; 13439531Sken u_int8_t control; 13539213Sgibbs}; 13639213Sgibbs 13739213Sgibbsstruct scsi_read_subchannel 13839213Sgibbs{ 13939531Sken u_int8_t op_code; 14039531Sken u_int8_t byte1; 14139531Sken u_int8_t byte2; 14239213Sgibbs#define SRS_SUBQ 0x40 14339531Sken u_int8_t subchan_format; 14439531Sken u_int8_t unused[2]; 14539531Sken u_int8_t track; 14639531Sken u_int8_t data_len[2]; 14739531Sken u_int8_t control; 14839213Sgibbs}; 14939213Sgibbs 15039213Sgibbsstruct scsi_read_toc 15139213Sgibbs{ 15239531Sken u_int8_t op_code; 15339531Sken u_int8_t byte2; 15439531Sken u_int8_t unused[4]; 15539531Sken u_int8_t from_track; 15639531Sken u_int8_t data_len[2]; 15739531Sken u_int8_t control; 15839213Sgibbs}; 15939213Sgibbs 16039213Sgibbsstruct scsi_read_cd_capacity 16139213Sgibbs{ 16239531Sken u_int8_t op_code; 16339531Sken u_int8_t byte2; 16439531Sken u_int8_t addr_3; /* Most Significant */ 16539531Sken u_int8_t addr_2; 16639531Sken u_int8_t addr_1; 16739531Sken u_int8_t addr_0; /* Least Significant */ 16839531Sken u_int8_t unused[3]; 16939531Sken u_int8_t control; 17039213Sgibbs}; 17139213Sgibbs 172105421Snjlstruct scsi_set_speed 173105421Snjl{ 174105421Snjl u_int8_t opcode; 175105421Snjl u_int8_t byte2; 176105421Snjl u_int8_t readspeed[2]; 177105421Snjl u_int8_t writespeed[2]; 178105421Snjl u_int8_t reserved[5]; 179105421Snjl u_int8_t control; 180105421Snjl}; 181105421Snjl 18260422Skenstruct scsi_report_key 18360422Sken{ 18460422Sken u_int8_t opcode; 18560422Sken u_int8_t reserved0; 18660422Sken u_int8_t lba[4]; 18760422Sken u_int8_t reserved1[2]; 18860422Sken u_int8_t alloc_len[2]; 18960422Sken u_int8_t agid_keyformat; 19060422Sken#define RK_KF_AGID_MASK 0xc0 19160422Sken#define RK_KF_AGID_SHIFT 6 19260422Sken#define RK_KF_KEYFORMAT_MASK 0x3f 19360422Sken#define RK_KF_AGID 0x00 19460422Sken#define RK_KF_CHALLENGE 0x01 19560422Sken#define RF_KF_KEY1 0x02 19660422Sken#define RK_KF_KEY2 0x03 19760422Sken#define RF_KF_TITLE 0x04 19860422Sken#define RF_KF_ASF 0x05 19960422Sken#define RK_KF_RPC_SET 0x06 20060422Sken#define RF_KF_RPC_REPORT 0x08 20160422Sken#define RF_KF_INV_AGID 0x3f 20260422Sken u_int8_t control; 20360422Sken}; 20460422Sken 20539213Sgibbs/* 20660422Sken * See the report key structure for key format and AGID definitions. 20760422Sken */ 20860422Skenstruct scsi_send_key 20960422Sken{ 21060422Sken u_int8_t opcode; 21160422Sken u_int8_t reserved[7]; 21260422Sken u_int8_t param_len[2]; 21360422Sken u_int8_t agid_keyformat; 21460422Sken u_int8_t control; 21560422Sken}; 21660422Sken 21760422Skenstruct scsi_read_dvd_structure 21860422Sken{ 21960422Sken u_int8_t opcode; 22060422Sken u_int8_t reserved; 22160422Sken u_int8_t address[4]; 22260422Sken u_int8_t layer_number; 22360422Sken u_int8_t format; 22460422Sken#define RDS_FORMAT_PHYSICAL 0x00 22560422Sken#define RDS_FORMAT_COPYRIGHT 0x01 22660422Sken#define RDS_FORMAT_DISC_KEY 0x02 22760422Sken#define RDS_FORMAT_BCA 0x03 22860422Sken#define RDS_FORMAT_MANUFACTURER 0x04 22960422Sken#define RDS_FORMAT_CMGS_CPM 0x05 23060422Sken#define RDS_FORMAT_PROT_DISCID 0x06 23160422Sken#define RDS_FORMAT_DISC_KEY_BLOCK 0x07 23260422Sken#define RDS_FORMAT_DDS 0x08 23360422Sken#define RDS_FORMAT_DVDRAM_MEDIA_STAT 0x09 23460422Sken#define RDS_FORMAT_SPARE_AREA 0x0a 23560422Sken#define RDS_FORMAT_RMD_BORDEROUT 0x0c 23660422Sken#define RDS_FORMAT_RMD 0x0d 23760422Sken#define RDS_FORMAT_LEADIN 0x0e 23860422Sken#define RDS_FORMAT_DISC_ID 0x0f 23960422Sken#define RDS_FORMAT_DCB 0x30 24060422Sken#define RDS_FORMAT_WRITE_PROT 0xc0 24160422Sken#define RDS_FORMAT_STRUCTURE_LIST 0xff 24260422Sken u_int8_t alloc_len[2]; 24360422Sken u_int8_t agid; 24460422Sken u_int8_t control; 24560422Sken}; 24660422Sken 24760422Sken/* 24839213Sgibbs * Opcodes 24939213Sgibbs */ 25039213Sgibbs#define READ_CD_CAPACITY 0x25 /* slightly different from disk */ 25139213Sgibbs#define READ_SUBCHANNEL 0x42 /* cdrom read Subchannel */ 25239213Sgibbs#define READ_TOC 0x43 /* cdrom read TOC */ 25339213Sgibbs#define READ_HEADER 0x44 /* cdrom read header */ 25439531Sken#define PLAY_10 0x45 /* cdrom play 'play audio' mode */ 25539213Sgibbs#define PLAY_MSF 0x47 /* cdrom play Min,Sec,Frames mode */ 25639213Sgibbs#define PLAY_TRACK 0x48 /* cdrom play track/index mode */ 25739213Sgibbs#define PLAY_TRACK_REL 0x49 /* cdrom play track/index mode */ 25839213Sgibbs#define PAUSE 0x4b /* cdrom pause in 'play audio' mode */ 25960422Sken#define SEND_KEY 0xa3 /* dvd send key command */ 26060422Sken#define REPORT_KEY 0xa4 /* dvd report key command */ 26139531Sken#define PLAY_12 0xa5 /* cdrom pause in 'play audio' mode */ 26239213Sgibbs#define PLAY_TRACK_REL_BIG 0xa9 /* cdrom play track/index mode */ 26360422Sken#define READ_DVD_STRUCTURE 0xad /* read dvd structure */ 264105421Snjl#define SET_CD_SPEED 0xbb /* set c/dvd speed */ 26539213Sgibbs 26660422Skenstruct scsi_report_key_data_header 26760422Sken{ 26860422Sken u_int8_t data_len[2]; 26960422Sken u_int8_t reserved[2]; 27060422Sken}; 27139213Sgibbs 27260422Skenstruct scsi_report_key_data_agid 27360422Sken{ 27460422Sken u_int8_t data_len[2]; 27560422Sken u_int8_t reserved[5]; 27660422Sken u_int8_t agid; 27760422Sken#define RKD_AGID_MASK 0xc0 27860422Sken#define RKD_AGID_SHIFT 6 27960422Sken}; 28039213Sgibbs 28160422Skenstruct scsi_report_key_data_challenge 28260422Sken{ 28360422Sken u_int8_t data_len[2]; 28460422Sken u_int8_t reserved0[2]; 28560422Sken u_int8_t challenge_key[10]; 28660422Sken u_int8_t reserved1[2]; 28760422Sken}; 28860422Sken 28960422Skenstruct scsi_report_key_data_key1_key2 29060422Sken{ 29160422Sken u_int8_t data_len[2]; 29260422Sken u_int8_t reserved0[2]; 29360422Sken u_int8_t key1[5]; 29460422Sken u_int8_t reserved1[3]; 29560422Sken}; 29660422Sken 29760422Skenstruct scsi_report_key_data_title 29860422Sken{ 29960422Sken u_int8_t data_len[2]; 30060422Sken u_int8_t reserved0[2]; 30160422Sken u_int8_t byte0; 30260422Sken#define RKD_TITLE_CPM 0x80 30360422Sken#define RKD_TITLE_CPM_SHIFT 7 30460422Sken#define RKD_TITLE_CP_SEC 0x40 30560422Sken#define RKD_TITLE_CP_SEC_SHIFT 6 30660422Sken#define RKD_TITLE_CMGS_MASK 0x30 30760422Sken#define RKD_TITLE_CMGS_SHIFT 4 30860422Sken#define RKD_TITLE_CMGS_NO_RST 0x00 30960422Sken#define RKD_TITLE_CMGS_RSVD 0x10 31060422Sken#define RKD_TITLE_CMGS_1_GEN 0x20 31160422Sken#define RKD_TITLE_CMGS_NO_COPY 0x30 31260422Sken u_int8_t title_key[5]; 31360422Sken u_int8_t reserved1[2]; 31460422Sken}; 31560422Sken 31660422Skenstruct scsi_report_key_data_asf 31760422Sken{ 31860422Sken u_int8_t data_len[2]; 31960422Sken u_int8_t reserved[5]; 32060422Sken u_int8_t success; 32160422Sken#define RKD_ASF_SUCCESS 0x01 32260422Sken}; 32360422Sken 32460422Skenstruct scsi_report_key_data_rpc 32560422Sken{ 32660422Sken u_int8_t data_len[2]; 32760422Sken u_int8_t rpc_scheme0; 32860422Sken#define RKD_RPC_SCHEME_UNKNOWN 0x00 32960422Sken#define RKD_RPC_SCHEME_PHASE_II 0x01 33060422Sken u_int8_t reserved0; 33160422Sken u_int8_t byte4; 33260422Sken#define RKD_RPC_TYPE_MASK 0xC0 33360422Sken#define RKD_RPC_TYPE_SHIFT 6 33460422Sken#define RKD_RPC_TYPE_NONE 0x00 33560422Sken#define RKD_RPC_TYPE_SET 0x40 33660422Sken#define RKD_RPC_TYPE_LAST_CHANCE 0x80 33760422Sken#define RKD_RPC_TYPE_PERM 0xC0 33860422Sken#define RKD_RPC_VENDOR_RESET_MASK 0x38 33960422Sken#define RKD_RPC_VENDOR_RESET_SHIFT 3 34060422Sken#define RKD_RPC_USER_RESET_MASK 0x07 34160422Sken#define RKD_RPC_USER_RESET_SHIFT 0 34260422Sken u_int8_t region_mask; 34360422Sken u_int8_t rpc_scheme1; 34460422Sken u_int8_t reserved1; 34560422Sken}; 34660422Sken 34760422Skenstruct scsi_send_key_data_rpc 34860422Sken{ 34960422Sken u_int8_t data_len[2]; 35060422Sken u_int8_t reserved0[2]; 35160422Sken u_int8_t region_code; 35260422Sken u_int8_t reserved1[3]; 35360422Sken}; 35460422Sken 35560422Sken/* 35660422Sken * Common header for the return data from the READ DVD STRUCTURE command. 35760422Sken */ 35860422Skenstruct scsi_read_dvd_struct_data_header 35960422Sken{ 36060422Sken u_int8_t data_len[2]; 36160422Sken u_int8_t reserved[2]; 36260422Sken}; 36360422Sken 36460422Skenstruct scsi_read_dvd_struct_data_layer_desc 36560422Sken{ 36660422Sken u_int8_t book_type_version; 36760422Sken#define RDSD_BOOK_TYPE_DVD_ROM 0x00 36860422Sken#define RDSD_BOOK_TYPE_DVD_RAM 0x10 36960422Sken#define RDSD_BOOK_TYPE_DVD_R 0x20 37060422Sken#define RDSD_BOOK_TYPE_DVD_RW 0x30 37160422Sken#define RDSD_BOOK_TYPE_DVD_PRW 0x90 37260422Sken#define RDSD_BOOK_TYPE_MASK 0xf0 37360422Sken#define RDSD_BOOK_TYPE_SHIFT 4 37460422Sken#define RDSD_BOOK_VERSION_MASK 0x0f 37560422Sken /* 37660422Sken * The lower 4 bits of this field is referred to as the "minimum 37760422Sken * rate" field in MMC2, and the "maximum rate" field in MMC3. Ugh. 37860422Sken */ 37960422Sken u_int8_t disc_size_max_rate; 38060422Sken#define RDSD_DISC_SIZE_120MM 0x00 38160422Sken#define RDSD_DISC_SIZE_80MM 0x10 38260422Sken#define RDSD_DISC_SIZE_MASK 0xf0 38360422Sken#define RDSD_DISC_SIZE_SHIFT 4 38460422Sken#define RDSD_MAX_RATE_0252 0x00 38560422Sken#define RDSD_MAX_RATE_0504 0x01 38660422Sken#define RDSD_MAX_RATE_1008 0x02 38760422Sken#define RDSD_MAX_RATE_NOT_SPEC 0x0f 38860422Sken#define RDSD_MAX_RATE_MASK 0x0f 38960422Sken u_int8_t layer_info; 39060422Sken#define RDSD_NUM_LAYERS_MASK 0x60 39160422Sken#define RDSD_NUM_LAYERS_SHIFT 5 39260422Sken#define RDSD_NL_ONE_LAYER 0x00 39360422Sken#define RDSD_NL_TWO_LAYERS 0x20 39460422Sken#define RDSD_TRACK_PATH_MASK 0x10 39560422Sken#define RDSD_TRACK_PATH_SHIFT 4 39660422Sken#define RDSD_TP_PTP 0x00 39760422Sken#define RDSD_TP_OTP 0x10 39860422Sken#define RDSD_LAYER_TYPE_RO 0x01 39960422Sken#define RDSD_LAYER_TYPE_RECORD 0x02 40060422Sken#define RDSD_LAYER_TYPE_RW 0x04 40160422Sken#define RDSD_LAYER_TYPE_MASK 0x0f 40260422Sken u_int8_t density; 40360422Sken#define RDSD_LIN_DENSITY_0267 0x00 40460422Sken#define RDSD_LIN_DENSITY_0293 0x10 40560422Sken#define RDSD_LIN_DENSITY_0409_0435 0x20 40660422Sken#define RDSD_LIN_DENSITY_0280_0291 0x40 40760422Sken/* XXX MMC2 uses 0.176um/bit instead of 0.353 as in MMC3 */ 40860422Sken#define RDSD_LIN_DENSITY_0353 0x80 40960422Sken#define RDSD_LIN_DENSITY_MASK 0xf0 41060422Sken#define RDSD_LIN_DENSITY_SHIFT 4 41160422Sken#define RDSD_TRACK_DENSITY_074 0x00 41260422Sken#define RDSD_TRACK_DENSITY_080 0x01 41360422Sken#define RDSD_TRACK_DENSITY_0615 0x02 41460422Sken#define RDSD_TRACK_DENSITY_MASK 0x0f 41560422Sken u_int8_t zeros0; 41660422Sken u_int8_t main_data_start[3]; 41760422Sken#define RDSD_MAIN_DATA_START_DVD_RO 0x30000 41860422Sken#define RDSD_MAIN_DATA_START_DVD_RW 0x31000 41960422Sken u_int8_t zeros1; 42060422Sken u_int8_t main_data_end[3]; 42160422Sken u_int8_t zeros2; 42260422Sken u_int8_t end_sector_layer0[3]; 42360422Sken u_int8_t bca; 42460422Sken#define RDSD_BCA 0x80 42560422Sken#define RDSD_BCA_MASK 0x80 42660422Sken#define RDSD_BCA_SHIFT 7 42760422Sken u_int8_t media_specific[2031]; 42860422Sken}; 42960422Sken 43060422Skenstruct scsi_read_dvd_struct_data_physical 43160422Sken{ 43260422Sken u_int8_t data_len[2]; 43360422Sken u_int8_t reserved[2]; 43460422Sken struct scsi_read_dvd_struct_data_layer_desc layer_desc; 43560422Sken}; 43660422Sken 43760422Skenstruct scsi_read_dvd_struct_data_copyright 43860422Sken{ 43960422Sken u_int8_t data_len[2]; 44060422Sken u_int8_t reserved0[2]; 44160422Sken u_int8_t cps_type; 44260422Sken#define RDSD_CPS_NOT_PRESENT 0x00 44360422Sken#define RDSD_CPS_DATA_EXISTS 0x01 44460422Sken u_int8_t region_info; 44560422Sken u_int8_t reserved1[2]; 44660422Sken}; 44760422Sken 44860422Skenstruct scsi_read_dvd_struct_data_disc_key 44960422Sken{ 45060422Sken u_int8_t data_len[2]; 45160422Sken u_int8_t reserved[2]; 45260422Sken u_int8_t disc_key[2048]; 45360422Sken}; 45460422Sken 45560422Skenstruct scsi_read_dvd_struct_data_bca 45660422Sken{ 45760422Sken u_int8_t data_len[2]; 45860422Sken u_int8_t reserved[2]; 45960422Sken u_int8_t bca_info[188]; /* XXX 12-188 bytes */ 46060422Sken}; 46160422Sken 46260422Skenstruct scsi_read_dvd_struct_data_manufacturer 46360422Sken{ 46460422Sken u_int8_t data_len[2]; 46560422Sken u_int8_t reserved[2]; 46660422Sken u_int8_t manuf_info[2048]; 46760422Sken}; 46860422Sken 46960422Skenstruct scsi_read_dvd_struct_data_copy_manage 47060422Sken{ 47160422Sken u_int8_t data_len[2]; 47260422Sken u_int8_t reserved0[2]; 47360422Sken u_int8_t byte4; 47460422Sken#define RDSD_CPM_NO_COPYRIGHT 0x00 47560422Sken#define RDSD_CPM_HAS_COPYRIGHT 0x80 47660422Sken#define RDSD_CPM_MASK 0x80 47760422Sken#define RDSD_CMGS_COPY_ALLOWED 0x00 47860422Sken#define RDSD_CMGS_ONE_COPY 0x20 47960422Sken#define RDSD_CMGS_NO_COPIES 0x30 48060422Sken#define RDSD_CMGS_MASK 0x30 48160422Sken u_int8_t reserved1[3]; 48260422Sken}; 48360422Sken 48460422Skenstruct scsi_read_dvd_struct_data_prot_discid 48560422Sken{ 48660422Sken u_int8_t data_len[2]; 48760422Sken u_int8_t reserved[2]; 48860422Sken u_int8_t prot_discid_data[16]; 48960422Sken}; 49060422Sken 49160422Skenstruct scsi_read_dvd_struct_data_disc_key_blk 49260422Sken{ 49360422Sken /* 49460422Sken * Length is 0x6ffe == 28670 for CPRM, 0x3002 == 12990 for CSS2. 49560422Sken */ 49660422Sken u_int8_t data_len[2]; 49760422Sken u_int8_t reserved; 49860422Sken u_int8_t total_packs; 49960422Sken u_int8_t disc_key_pack_data[28668]; 50060422Sken}; 50160422Skenstruct scsi_read_dvd_struct_data_dds 50260422Sken{ 50360422Sken u_int8_t data_len[2]; 50460422Sken u_int8_t reserved[2]; 50560422Sken u_int8_t dds_info[2048]; 50660422Sken}; 50760422Sken 50860422Skenstruct scsi_read_dvd_struct_data_medium_status 50960422Sken{ 51060422Sken u_int8_t data_len[2]; 51160422Sken u_int8_t reserved0[2]; 51260422Sken u_int8_t byte4; 51360422Sken#define RDSD_MS_CARTRIDGE 0x80 51460422Sken#define RDSD_MS_OUT 0x40 51560422Sken#define RDSD_MS_MSWI 0x08 51660422Sken#define RDSD_MS_CWP 0x04 51760422Sken#define RDSD_MS_PWP 0x02 51860422Sken u_int8_t disc_type_id; 51960422Sken#define RDSD_DT_NEED_CARTRIDGE 0x00 52060422Sken#define RDSD_DT_NO_CART_NEEDED 0x01 52160422Sken u_int8_t reserved1; 52260422Sken u_int8_t ram_swi_info; 52360422Sken#define RDSD_SWI_NO_BARE 0x01 52460422Sken#define RDSD_SWI_UNSPEC 0xff 52560422Sken}; 52660422Sken 52760422Skenstruct scsi_read_dvd_struct_data_spare_area 52860422Sken{ 52960422Sken u_int8_t data_len[2]; 53060422Sken u_int8_t reserved[2]; 53160422Sken u_int8_t unused_primary[4]; 53260422Sken u_int8_t unused_supl[4]; 53360422Sken u_int8_t allocated_supl[4]; 53460422Sken}; 53560422Sken 53660422Skenstruct scsi_read_dvd_struct_data_rmd_borderout 53760422Sken{ 53860422Sken u_int8_t data_len[2]; 53960422Sken u_int8_t reserved[2]; 54060422Sken u_int8_t rmd[30720]; /* maximum is 30720 bytes */ 54160422Sken}; 54260422Sken 54360422Skenstruct scsi_read_dvd_struct_data_rmd 54460422Sken{ 54560422Sken u_int8_t data_len[2]; 54660422Sken u_int8_t reserved[2]; 54760422Sken u_int8_t last_sector_num[4]; 54860422Sken u_int8_t rmd_bytes[32768]; /* This is the maximum */ 54960422Sken}; 55060422Sken 55160422Sken/* 55260422Sken * XXX KDM this is the MMC2 version of the structure. 55360422Sken * The variable positions have changed (in a semi-conflicting way) in the 55460422Sken * MMC3 spec, although the overall length of the structure is the same. 55560422Sken */ 55660422Skenstruct scsi_read_dvd_struct_data_leadin 55760422Sken{ 55860422Sken u_int8_t data_len[2]; 55960422Sken u_int8_t reserved0[2]; 56060422Sken u_int8_t field_id_1; 56160422Sken u_int8_t app_code; 56260422Sken u_int8_t disc_physical_data; 56360422Sken u_int8_t last_addr[3]; 56460422Sken u_int8_t reserved1[2]; 56560422Sken u_int8_t field_id_2; 56660422Sken u_int8_t rwp; 56760422Sken u_int8_t rwp_wavelength; 56860422Sken u_int8_t optimum_write_strategy; 56960422Sken u_int8_t reserved2[4]; 57060422Sken u_int8_t field_id_3; 57160422Sken u_int8_t manuf_id_17_12[6]; 57260422Sken u_int8_t reserved3; 57360422Sken u_int8_t field_id_4; 57460422Sken u_int8_t manuf_id_11_6[6]; 57560422Sken u_int8_t reserved4; 57660422Sken u_int8_t field_id_5; 57760422Sken u_int8_t manuf_id_5_0[6]; 57860422Sken u_int8_t reserved5[25]; 57960422Sken}; 58060422Sken 58160422Skenstruct scsi_read_dvd_struct_data_disc_id 58260422Sken{ 58360422Sken u_int8_t data_len[2]; 58460422Sken u_int8_t reserved[4]; 58560422Sken u_int8_t random_num[2]; 58660422Sken u_int8_t year[4]; 58760422Sken u_int8_t month[2]; 58860422Sken u_int8_t day[2]; 58960422Sken u_int8_t hour[2]; 59060422Sken u_int8_t minute[2]; 59160422Sken u_int8_t second[2]; 59260422Sken}; 59360422Sken 59460422Skenstruct scsi_read_dvd_struct_data_generic_dcb 59560422Sken{ 59660422Sken u_int8_t content_desc[4]; 59760422Sken#define SCSI_RCB 59860422Sken u_int8_t unknown_desc_actions[4]; 59960422Sken#define RDSD_ACTION_RECORDING 0x0001 60060422Sken#define RDSD_ACTION_READING 0x0002 60160422Sken#define RDSD_ACTION_FORMAT 0x0004 60260422Sken#define RDSD_ACTION_MODIFY_DCB 0x0008 60360422Sken u_int8_t vendor_id[32]; 60460422Sken u_int8_t dcb_data[32728]; 60560422Sken}; 60660422Sken 60760422Skenstruct scsi_read_dvd_struct_data_dcb 60860422Sken{ 60960422Sken u_int8_t data_len[2]; 61060422Sken u_int8_t reserved[2]; 61160422Sken struct scsi_read_dvd_struct_data_generic_dcb dcb; 61260422Sken}; 61360422Sken 61460422Skenstruct read_dvd_struct_write_prot 61560422Sken{ 61660422Sken u_int8_t data_len[2]; 61760422Sken u_int8_t reserved0[2]; 61860422Sken u_int8_t write_prot_status; 61960422Sken#define RDSD_WPS_MSWI 0x08 62060422Sken#define RDSD_WPS_CWP 0x04 62160422Sken#define RDSD_WPS_PWP 0x02 62260422Sken#define RDSD_WPS_SWPP 0x01 62360422Sken u_int8_t reserved[3]; 62460422Sken}; 62560422Sken 62660422Skenstruct read_dvd_struct_list_entry 62760422Sken{ 62860422Sken u_int8_t format_code; 62960422Sken u_int8_t sds_rds; 63060422Sken#define RDSD_SDS_NOT_WRITEABLE 0x00 63160422Sken#define RDSD_SDS_WRITEABLE 0x80 63260422Sken#define RDSD_SDS_MASK 0x80 63360422Sken#define RDSD_RDS_NOT_READABLE 0x00 63460422Sken#define RDSD_RDS_READABLE 0x40 63560422Sken#define RDSD_RDS_MASK 0x40 63660422Sken u_int8_t struct_len[2]; 63760422Sken}; 63860422Sken 63960422Skenstruct read_dvd_struct_data_list 64060422Sken{ 64160422Sken u_int8_t data_len[2]; 64260422Sken u_int8_t reserved[2]; 64360422Sken struct read_dvd_struct_list_entry entries[0]; 64460422Sken}; 64560422Sken 64639213Sgibbsstruct scsi_read_cd_cap_data 64739213Sgibbs{ 64839531Sken u_int8_t addr_3; /* Most significant */ 64939531Sken u_int8_t addr_2; 65039531Sken u_int8_t addr_1; 65139531Sken u_int8_t addr_0; /* Least significant */ 65239531Sken u_int8_t length_3; /* Most significant */ 65339531Sken u_int8_t length_2; 65439531Sken u_int8_t length_1; 65539531Sken u_int8_t length_0; /* Least significant */ 65639213Sgibbs}; 65739213Sgibbs 658111206Skenstruct cd_audio_page 65939213Sgibbs{ 660111206Sken u_int8_t page_code; 661111206Sken#define CD_PAGE_CODE 0x3F 662111206Sken#define AUDIO_PAGE 0x0e 663111206Sken#define CD_PAGE_PS 0x80 664111206Sken u_int8_t param_len; 665111206Sken u_int8_t flags; 666111206Sken#define CD_PA_SOTC 0x02 667111206Sken#define CD_PA_IMMED 0x04 668111206Sken u_int8_t unused[2]; 669111206Sken u_int8_t format_lba; 670111206Sken#define CD_PA_FORMAT_LBA 0x0F 671111206Sken#define CD_PA_APR_VALID 0x80 672111206Sken u_int8_t lb_per_sec[2]; 673111206Sken struct port_control 67439213Sgibbs { 675111206Sken u_int8_t channels; 676111206Sken#define CHANNEL 0x0F 677111206Sken#define CHANNEL_0 1 678111206Sken#define CHANNEL_1 2 679111206Sken#define CHANNEL_2 4 680111206Sken#define CHANNEL_3 8 681111206Sken#define LEFT_CHANNEL CHANNEL_0 682111206Sken#define RIGHT_CHANNEL CHANNEL_1 683111206Sken u_int8_t volume; 684111206Sken } port[4]; 685111206Sken#define LEFT_PORT 0 686111206Sken#define RIGHT_PORT 1 68739213Sgibbs}; 68839213Sgibbs 689111206Skenunion cd_pages 690111206Sken{ 691111206Sken struct cd_audio_page audio; 692111206Sken}; 693111206Sken 694111206Skenstruct cd_mode_data_10 695111206Sken{ 696111206Sken struct scsi_mode_header_10 header; 697111206Sken struct scsi_mode_blk_desc blk_desc; 698111206Sken union cd_pages page; 699111206Sken}; 700111206Sken 70139213Sgibbsstruct cd_mode_data 70239213Sgibbs{ 70339213Sgibbs struct scsi_mode_header_6 header; 70439213Sgibbs struct scsi_mode_blk_desc blk_desc; 70539213Sgibbs union cd_pages page; 70639213Sgibbs}; 70760422Sken 708111206Skenunion cd_mode_data_6_10 709111206Sken{ 710111206Sken struct cd_mode_data mode_data_6; 711111206Sken struct cd_mode_data_10 mode_data_10; 712111206Sken}; 713111206Sken 714111206Skenstruct cd_mode_params 715111206Sken{ 716111206Sken STAILQ_ENTRY(cd_mode_params) links; 717111206Sken int cdb_size; 718111206Sken int alloc_len; 719111206Sken u_int8_t *mode_buf; 720111206Sken}; 721111206Sken 72260422Sken__BEGIN_DECLS 72360422Skenvoid scsi_report_key(struct ccb_scsiio *csio, u_int32_t retries, 72460422Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 72560422Sken u_int8_t tag_action, u_int32_t lba, u_int8_t agid, 72660422Sken u_int8_t key_format, u_int8_t *data_ptr, 72760422Sken u_int32_t dxfer_len, u_int8_t sense_len, 72860422Sken u_int32_t timeout); 72960422Sken 73060422Skenvoid scsi_send_key(struct ccb_scsiio *csio, u_int32_t retries, 73160422Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 73260422Sken u_int8_t tag_action, u_int8_t agid, u_int8_t key_format, 73360422Sken u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len, 73460422Sken u_int32_t timeout); 73560422Sken 73660422Skenvoid scsi_read_dvd_structure(struct ccb_scsiio *csio, u_int32_t retries, 73760422Sken void (*cbfcnp)(struct cam_periph *, union ccb *), 73860422Sken u_int8_t tag_action, u_int32_t address, 73960422Sken u_int8_t layer_number, u_int8_t format, 74060422Sken u_int8_t agid, u_int8_t *data_ptr, 74160422Sken u_int32_t dxfer_len, u_int8_t sense_len, 74260422Sken u_int32_t timeout); 74360422Sken 74460422Sken__END_DECLS 74560422Sken 74639213Sgibbs#endif /*_SCSI_SCSI_CD_H*/ 74739213Sgibbs 748