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