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