summaryrefslogtreecommitdiffstats
path: root/sys/cam/scsi/scsi_cd.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cam/scsi/scsi_cd.h')
-rw-r--r--sys/cam/scsi/scsi_cd.h497
1 files changed, 497 insertions, 0 deletions
diff --git a/sys/cam/scsi/scsi_cd.h b/sys/cam/scsi/scsi_cd.h
index 284c710..b055202 100644
--- a/sys/cam/scsi/scsi_cd.h
+++ b/sys/cam/scsi/scsi_cd.h
@@ -1,3 +1,29 @@
+/*-
+ * Copyright (c) 2000 Kenneth D. Merry
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions, and the following disclaimer,
+ * without modification, immediately at the beginning of the file.
+ * 2. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
/*
* Written by Julian Elischer (julian@tfs.com)
* for TRW Financial Systems.
@@ -144,6 +170,71 @@ struct scsi_read_cd_capacity
u_int8_t control;
};
+struct scsi_report_key
+{
+ u_int8_t opcode;
+ u_int8_t reserved0;
+ u_int8_t lba[4];
+ u_int8_t reserved1[2];
+ u_int8_t alloc_len[2];
+ u_int8_t agid_keyformat;
+#define RK_KF_AGID_MASK 0xc0
+#define RK_KF_AGID_SHIFT 6
+#define RK_KF_KEYFORMAT_MASK 0x3f
+#define RK_KF_AGID 0x00
+#define RK_KF_CHALLENGE 0x01
+#define RF_KF_KEY1 0x02
+#define RK_KF_KEY2 0x03
+#define RF_KF_TITLE 0x04
+#define RF_KF_ASF 0x05
+#define RK_KF_RPC_SET 0x06
+#define RF_KF_RPC_REPORT 0x08
+#define RF_KF_INV_AGID 0x3f
+ u_int8_t control;
+};
+
+/*
+ * See the report key structure for key format and AGID definitions.
+ */
+struct scsi_send_key
+{
+ u_int8_t opcode;
+ u_int8_t reserved[7];
+ u_int8_t param_len[2];
+ u_int8_t agid_keyformat;
+ u_int8_t control;
+};
+
+struct scsi_read_dvd_structure
+{
+ u_int8_t opcode;
+ u_int8_t reserved;
+ u_int8_t address[4];
+ u_int8_t layer_number;
+ u_int8_t format;
+#define RDS_FORMAT_PHYSICAL 0x00
+#define RDS_FORMAT_COPYRIGHT 0x01
+#define RDS_FORMAT_DISC_KEY 0x02
+#define RDS_FORMAT_BCA 0x03
+#define RDS_FORMAT_MANUFACTURER 0x04
+#define RDS_FORMAT_CMGS_CPM 0x05
+#define RDS_FORMAT_PROT_DISCID 0x06
+#define RDS_FORMAT_DISC_KEY_BLOCK 0x07
+#define RDS_FORMAT_DDS 0x08
+#define RDS_FORMAT_DVDRAM_MEDIA_STAT 0x09
+#define RDS_FORMAT_SPARE_AREA 0x0a
+#define RDS_FORMAT_RMD_BORDEROUT 0x0c
+#define RDS_FORMAT_RMD 0x0d
+#define RDS_FORMAT_LEADIN 0x0e
+#define RDS_FORMAT_DISC_ID 0x0f
+#define RDS_FORMAT_DCB 0x30
+#define RDS_FORMAT_WRITE_PROT 0xc0
+#define RDS_FORMAT_STRUCTURE_LIST 0xff
+ u_int8_t alloc_len[2];
+ u_int8_t agid;
+ u_int8_t control;
+};
+
/*
* Opcodes
*/
@@ -156,10 +247,391 @@ struct scsi_read_cd_capacity
#define PLAY_TRACK 0x48 /* cdrom play track/index mode */
#define PLAY_TRACK_REL 0x49 /* cdrom play track/index mode */
#define PAUSE 0x4b /* cdrom pause in 'play audio' mode */
+#define SEND_KEY 0xa3 /* dvd send key command */
+#define REPORT_KEY 0xa4 /* dvd report key command */
#define PLAY_12 0xa5 /* cdrom pause in 'play audio' mode */
#define PLAY_TRACK_REL_BIG 0xa9 /* cdrom play track/index mode */
+#define READ_DVD_STRUCTURE 0xad /* read dvd structure */
+struct scsi_report_key_data_header
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+};
+
+struct scsi_report_key_data_agid
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[5];
+ u_int8_t agid;
+#define RKD_AGID_MASK 0xc0
+#define RKD_AGID_SHIFT 6
+};
+
+struct scsi_report_key_data_challenge
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved0[2];
+ u_int8_t challenge_key[10];
+ u_int8_t reserved1[2];
+};
+struct scsi_report_key_data_key1_key2
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved0[2];
+ u_int8_t key1[5];
+ u_int8_t reserved1[3];
+};
+
+struct scsi_report_key_data_title
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved0[2];
+ u_int8_t byte0;
+#define RKD_TITLE_CPM 0x80
+#define RKD_TITLE_CPM_SHIFT 7
+#define RKD_TITLE_CP_SEC 0x40
+#define RKD_TITLE_CP_SEC_SHIFT 6
+#define RKD_TITLE_CMGS_MASK 0x30
+#define RKD_TITLE_CMGS_SHIFT 4
+#define RKD_TITLE_CMGS_NO_RST 0x00
+#define RKD_TITLE_CMGS_RSVD 0x10
+#define RKD_TITLE_CMGS_1_GEN 0x20
+#define RKD_TITLE_CMGS_NO_COPY 0x30
+ u_int8_t title_key[5];
+ u_int8_t reserved1[2];
+};
+
+struct scsi_report_key_data_asf
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[5];
+ u_int8_t success;
+#define RKD_ASF_SUCCESS 0x01
+};
+
+struct scsi_report_key_data_rpc
+{
+ u_int8_t data_len[2];
+ u_int8_t rpc_scheme0;
+#define RKD_RPC_SCHEME_UNKNOWN 0x00
+#define RKD_RPC_SCHEME_PHASE_II 0x01
+ u_int8_t reserved0;
+ u_int8_t byte4;
+#define RKD_RPC_TYPE_MASK 0xC0
+#define RKD_RPC_TYPE_SHIFT 6
+#define RKD_RPC_TYPE_NONE 0x00
+#define RKD_RPC_TYPE_SET 0x40
+#define RKD_RPC_TYPE_LAST_CHANCE 0x80
+#define RKD_RPC_TYPE_PERM 0xC0
+#define RKD_RPC_VENDOR_RESET_MASK 0x38
+#define RKD_RPC_VENDOR_RESET_SHIFT 3
+#define RKD_RPC_USER_RESET_MASK 0x07
+#define RKD_RPC_USER_RESET_SHIFT 0
+ u_int8_t region_mask;
+ u_int8_t rpc_scheme1;
+ u_int8_t reserved1;
+};
+
+struct scsi_send_key_data_rpc
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved0[2];
+ u_int8_t region_code;
+ u_int8_t reserved1[3];
+};
+
+/*
+ * Common header for the return data from the READ DVD STRUCTURE command.
+ */
+struct scsi_read_dvd_struct_data_header
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+};
+
+struct scsi_read_dvd_struct_data_layer_desc
+{
+ u_int8_t book_type_version;
+#define RDSD_BOOK_TYPE_DVD_ROM 0x00
+#define RDSD_BOOK_TYPE_DVD_RAM 0x10
+#define RDSD_BOOK_TYPE_DVD_R 0x20
+#define RDSD_BOOK_TYPE_DVD_RW 0x30
+#define RDSD_BOOK_TYPE_DVD_PRW 0x90
+#define RDSD_BOOK_TYPE_MASK 0xf0
+#define RDSD_BOOK_TYPE_SHIFT 4
+#define RDSD_BOOK_VERSION_MASK 0x0f
+ /*
+ * The lower 4 bits of this field is referred to as the "minimum
+ * rate" field in MMC2, and the "maximum rate" field in MMC3. Ugh.
+ */
+ u_int8_t disc_size_max_rate;
+#define RDSD_DISC_SIZE_120MM 0x00
+#define RDSD_DISC_SIZE_80MM 0x10
+#define RDSD_DISC_SIZE_MASK 0xf0
+#define RDSD_DISC_SIZE_SHIFT 4
+#define RDSD_MAX_RATE_0252 0x00
+#define RDSD_MAX_RATE_0504 0x01
+#define RDSD_MAX_RATE_1008 0x02
+#define RDSD_MAX_RATE_NOT_SPEC 0x0f
+#define RDSD_MAX_RATE_MASK 0x0f
+ u_int8_t layer_info;
+#define RDSD_NUM_LAYERS_MASK 0x60
+#define RDSD_NUM_LAYERS_SHIFT 5
+#define RDSD_NL_ONE_LAYER 0x00
+#define RDSD_NL_TWO_LAYERS 0x20
+#define RDSD_TRACK_PATH_MASK 0x10
+#define RDSD_TRACK_PATH_SHIFT 4
+#define RDSD_TP_PTP 0x00
+#define RDSD_TP_OTP 0x10
+#define RDSD_LAYER_TYPE_RO 0x01
+#define RDSD_LAYER_TYPE_RECORD 0x02
+#define RDSD_LAYER_TYPE_RW 0x04
+#define RDSD_LAYER_TYPE_MASK 0x0f
+ u_int8_t density;
+#define RDSD_LIN_DENSITY_0267 0x00
+#define RDSD_LIN_DENSITY_0293 0x10
+#define RDSD_LIN_DENSITY_0409_0435 0x20
+#define RDSD_LIN_DENSITY_0280_0291 0x40
+/* XXX MMC2 uses 0.176um/bit instead of 0.353 as in MMC3 */
+#define RDSD_LIN_DENSITY_0353 0x80
+#define RDSD_LIN_DENSITY_MASK 0xf0
+#define RDSD_LIN_DENSITY_SHIFT 4
+#define RDSD_TRACK_DENSITY_074 0x00
+#define RDSD_TRACK_DENSITY_080 0x01
+#define RDSD_TRACK_DENSITY_0615 0x02
+#define RDSD_TRACK_DENSITY_MASK 0x0f
+ u_int8_t zeros0;
+ u_int8_t main_data_start[3];
+#define RDSD_MAIN_DATA_START_DVD_RO 0x30000
+#define RDSD_MAIN_DATA_START_DVD_RW 0x31000
+ u_int8_t zeros1;
+ u_int8_t main_data_end[3];
+ u_int8_t zeros2;
+ u_int8_t end_sector_layer0[3];
+ u_int8_t bca;
+#define RDSD_BCA 0x80
+#define RDSD_BCA_MASK 0x80
+#define RDSD_BCA_SHIFT 7
+ u_int8_t media_specific[2031];
+};
+
+struct scsi_read_dvd_struct_data_physical
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ struct scsi_read_dvd_struct_data_layer_desc layer_desc;
+};
+
+struct scsi_read_dvd_struct_data_copyright
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved0[2];
+ u_int8_t cps_type;
+#define RDSD_CPS_NOT_PRESENT 0x00
+#define RDSD_CPS_DATA_EXISTS 0x01
+ u_int8_t region_info;
+ u_int8_t reserved1[2];
+};
+
+struct scsi_read_dvd_struct_data_disc_key
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ u_int8_t disc_key[2048];
+};
+
+struct scsi_read_dvd_struct_data_bca
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ u_int8_t bca_info[188]; /* XXX 12-188 bytes */
+};
+
+struct scsi_read_dvd_struct_data_manufacturer
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ u_int8_t manuf_info[2048];
+};
+
+struct scsi_read_dvd_struct_data_copy_manage
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved0[2];
+ u_int8_t byte4;
+#define RDSD_CPM_NO_COPYRIGHT 0x00
+#define RDSD_CPM_HAS_COPYRIGHT 0x80
+#define RDSD_CPM_MASK 0x80
+#define RDSD_CMGS_COPY_ALLOWED 0x00
+#define RDSD_CMGS_ONE_COPY 0x20
+#define RDSD_CMGS_NO_COPIES 0x30
+#define RDSD_CMGS_MASK 0x30
+ u_int8_t reserved1[3];
+};
+
+struct scsi_read_dvd_struct_data_prot_discid
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ u_int8_t prot_discid_data[16];
+};
+
+struct scsi_read_dvd_struct_data_disc_key_blk
+{
+ /*
+ * Length is 0x6ffe == 28670 for CPRM, 0x3002 == 12990 for CSS2.
+ */
+ u_int8_t data_len[2];
+ u_int8_t reserved;
+ u_int8_t total_packs;
+ u_int8_t disc_key_pack_data[28668];
+};
+struct scsi_read_dvd_struct_data_dds
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ u_int8_t dds_info[2048];
+};
+
+struct scsi_read_dvd_struct_data_medium_status
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved0[2];
+ u_int8_t byte4;
+#define RDSD_MS_CARTRIDGE 0x80
+#define RDSD_MS_OUT 0x40
+#define RDSD_MS_MSWI 0x08
+#define RDSD_MS_CWP 0x04
+#define RDSD_MS_PWP 0x02
+ u_int8_t disc_type_id;
+#define RDSD_DT_NEED_CARTRIDGE 0x00
+#define RDSD_DT_NO_CART_NEEDED 0x01
+ u_int8_t reserved1;
+ u_int8_t ram_swi_info;
+#define RDSD_SWI_NO_BARE 0x01
+#define RDSD_SWI_UNSPEC 0xff
+};
+
+struct scsi_read_dvd_struct_data_spare_area
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ u_int8_t unused_primary[4];
+ u_int8_t unused_supl[4];
+ u_int8_t allocated_supl[4];
+};
+
+struct scsi_read_dvd_struct_data_rmd_borderout
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ u_int8_t rmd[30720]; /* maximum is 30720 bytes */
+};
+
+struct scsi_read_dvd_struct_data_rmd
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ u_int8_t last_sector_num[4];
+ u_int8_t rmd_bytes[32768]; /* This is the maximum */
+};
+
+/*
+ * XXX KDM this is the MMC2 version of the structure.
+ * The variable positions have changed (in a semi-conflicting way) in the
+ * MMC3 spec, although the overall length of the structure is the same.
+ */
+struct scsi_read_dvd_struct_data_leadin
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved0[2];
+ u_int8_t field_id_1;
+ u_int8_t app_code;
+ u_int8_t disc_physical_data;
+ u_int8_t last_addr[3];
+ u_int8_t reserved1[2];
+ u_int8_t field_id_2;
+ u_int8_t rwp;
+ u_int8_t rwp_wavelength;
+ u_int8_t optimum_write_strategy;
+ u_int8_t reserved2[4];
+ u_int8_t field_id_3;
+ u_int8_t manuf_id_17_12[6];
+ u_int8_t reserved3;
+ u_int8_t field_id_4;
+ u_int8_t manuf_id_11_6[6];
+ u_int8_t reserved4;
+ u_int8_t field_id_5;
+ u_int8_t manuf_id_5_0[6];
+ u_int8_t reserved5[25];
+};
+
+struct scsi_read_dvd_struct_data_disc_id
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[4];
+ u_int8_t random_num[2];
+ u_int8_t year[4];
+ u_int8_t month[2];
+ u_int8_t day[2];
+ u_int8_t hour[2];
+ u_int8_t minute[2];
+ u_int8_t second[2];
+};
+
+struct scsi_read_dvd_struct_data_generic_dcb
+{
+ u_int8_t content_desc[4];
+#define SCSI_RCB
+ u_int8_t unknown_desc_actions[4];
+#define RDSD_ACTION_RECORDING 0x0001
+#define RDSD_ACTION_READING 0x0002
+#define RDSD_ACTION_FORMAT 0x0004
+#define RDSD_ACTION_MODIFY_DCB 0x0008
+ u_int8_t vendor_id[32];
+ u_int8_t dcb_data[32728];
+};
+
+struct scsi_read_dvd_struct_data_dcb
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ struct scsi_read_dvd_struct_data_generic_dcb dcb;
+};
+
+struct read_dvd_struct_write_prot
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved0[2];
+ u_int8_t write_prot_status;
+#define RDSD_WPS_MSWI 0x08
+#define RDSD_WPS_CWP 0x04
+#define RDSD_WPS_PWP 0x02
+#define RDSD_WPS_SWPP 0x01
+ u_int8_t reserved[3];
+};
+
+struct read_dvd_struct_list_entry
+{
+ u_int8_t format_code;
+ u_int8_t sds_rds;
+#define RDSD_SDS_NOT_WRITEABLE 0x00
+#define RDSD_SDS_WRITEABLE 0x80
+#define RDSD_SDS_MASK 0x80
+#define RDSD_RDS_NOT_READABLE 0x00
+#define RDSD_RDS_READABLE 0x40
+#define RDSD_RDS_MASK 0x40
+ u_int8_t struct_len[2];
+};
+
+struct read_dvd_struct_data_list
+{
+ u_int8_t data_len[2];
+ u_int8_t reserved[2];
+ struct read_dvd_struct_list_entry entries[0];
+};
struct scsi_read_cd_cap_data
{
@@ -213,5 +685,30 @@ struct cd_mode_data
struct scsi_mode_blk_desc blk_desc;
union cd_pages page;
};
+
+__BEGIN_DECLS
+void scsi_report_key(struct ccb_scsiio *csio, u_int32_t retries,
+ void (*cbfcnp)(struct cam_periph *, union ccb *),
+ u_int8_t tag_action, u_int32_t lba, u_int8_t agid,
+ u_int8_t key_format, u_int8_t *data_ptr,
+ u_int32_t dxfer_len, u_int8_t sense_len,
+ u_int32_t timeout);
+
+void scsi_send_key(struct ccb_scsiio *csio, u_int32_t retries,
+ void (*cbfcnp)(struct cam_periph *, union ccb *),
+ u_int8_t tag_action, u_int8_t agid, u_int8_t key_format,
+ u_int8_t *data_ptr, u_int32_t dxfer_len, u_int8_t sense_len,
+ u_int32_t timeout);
+
+void scsi_read_dvd_structure(struct ccb_scsiio *csio, u_int32_t retries,
+ void (*cbfcnp)(struct cam_periph *, union ccb *),
+ u_int8_t tag_action, u_int32_t address,
+ u_int8_t layer_number, u_int8_t format,
+ u_int8_t agid, u_int8_t *data_ptr,
+ u_int32_t dxfer_len, u_int8_t sense_len,
+ u_int32_t timeout);
+
+__END_DECLS
+
#endif /*_SCSI_SCSI_CD_H*/
OpenPOWER on IntegriCloud