summaryrefslogtreecommitdiff
path: root/sys/dev/scsipi/scsipi_cd.h
blob: 2aacc228da46d46a909154bedd48d73acb83b434 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
/*	$NetBSD: scsipi_cd.h,v 1.21 2009/04/01 12:19:04 reinoud Exp $	*/

/*
 * Written by Julian Elischer (julian@tfs.com)
 * for TRW Financial Systems.
 *
 * TRW Financial Systems, in accordance with their agreement with Carnegie
 * Mellon University, makes this software available to CMU to distribute
 * or use in any manner that they see fit as long as this message is kept with
 * the software. For this reason TFS also grants any other persons or
 * organisations permission to use or modify this software.
 *
 * TFS supplies this software to be publicly redistributed
 * on the understanding that TFS is not responsible for the correct
 * functioning of this software in any circumstances.
 *
 * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
 */

/*
 *	Define two bits always in the same place in byte 2 (flag byte)
 */
#define	CD_RELADDR	0x01
#define	CD_MSF		0x02

/*
 * SCSI and SCSI-like command format
 */

#define	LOAD_UNLOAD	0xa6
struct scsipi_load_unload {
	u_int8_t opcode;
	u_int8_t unused1[3];
	u_int8_t options;
	u_int8_t unused2[3];
	u_int8_t slot;
	u_int8_t unused3[3];
} __packed;

#define PAUSE			0x4b	/* cdrom pause in 'play audio' mode */
struct scsipi_pause {
	u_int8_t opcode;
	u_int8_t byte2;
	u_int8_t unused[6];
	u_int8_t resume;
	u_int8_t control;
} __packed;
#define	PA_PAUSE	0x00
#define PA_RESUME	0x01

#define PLAY_MSF		0x47	/* cdrom play Min,Sec,Frames mode */
struct scsipi_play_msf {
	u_int8_t opcode;
	u_int8_t byte2;
	u_int8_t unused;
	u_int8_t start_m;
	u_int8_t start_s;
	u_int8_t start_f;
	u_int8_t end_m;
	u_int8_t end_s;
	u_int8_t end_f;
	u_int8_t control;
} __packed;

#define PLAY			0x45	/* cdrom play  'play audio' mode */
struct scsipi_play {
	u_int8_t opcode;
	u_int8_t byte2;
	u_int8_t blk_addr[4];
	u_int8_t unused;
	u_int8_t xfer_len[2];
	u_int8_t control;
} __packed;

#define READ_HEADER		0x44	/* cdrom read header */
struct scsipi_read_header {
	u_int8_t opcode;
	u_int8_t byte2;
	u_int8_t blk_addr[4];
	u_int8_t unused;
	u_int8_t data_len[2];
	u_int8_t control;
} __packed;

#define READ_SUBCHANNEL		0x42	/* cdrom read Subchannel */
struct scsipi_read_subchannel {
	u_int8_t opcode;
	u_int8_t byte2;
	u_int8_t byte3;
#define	SRS_SUBQ	0x40
	u_int8_t subchan_format;
	u_int8_t unused[2];
	u_int8_t track;
	u_int8_t data_len[2];
	u_int8_t control;
} __packed;

#define READ_TOC		0x43	/* cdrom read TOC */
struct scsipi_read_toc {
	u_int8_t opcode;
	u_int8_t addr_mode;
	u_int8_t resp_format;
	u_int8_t unused[3];
	u_int8_t from_track;		/* session nr in format 2 */
	u_int8_t data_len[2];
	u_int8_t control;
} __packed;

struct scsipi_toc_header {
	uint8_t	 length[2];
	uint8_t  first;			/* track or session */
	uint8_t  last;
} __packed;

/* read TOC form 0 result entries */
struct scsipi_toc_formatted {
	uint8_t  unused1;
	uint8_t  adrcontrol;
	uint8_t  tracknr;
	uint8_t  unused2;
	uint8_t	 msf_lba[4];		/* union msf_lba from cdio.h */
} __packed;

/* read TOC form 1 result entries */
struct scsipi_toc_msinfo {
	uint8_t  unused1;
	uint8_t  adrcontol;
	uint8_t  tracknr;		/* first track last compl. session */
	uint8_t  unused2;
	uint8_t	 msf_lba[4];		/* union msf_lba from cdio.h */
} __packed;

/* read TOC form 2 result entries */
struct scsipi_toc_rawtoc {
	uint8_t  sessionnr;
	uint8_t  adrcontrol;
	uint8_t  tno;
	uint8_t  point;
	uint8_t  min;
	uint8_t  sec;
	uint8_t  frame;
	uint8_t  zero;			/* zero/unused */
	uint8_t  pmin;
	uint8_t  psec;
	uint8_t  pframe;
} __packed;

/* read TOC form 3, 4 and 5 obmitted yet */

#define GET_CONFIGURATION	0x46	/* Get configuration */
#define GET_CONF_NO_FEATURES_LEN 8
struct scsipi_get_configuration {
	uint8_t  opcode;
	uint8_t  request_type;
	uint8_t  start_at_feature[2];
	uint8_t  unused[3];
	uint8_t  data_len[2];
	uint8_t  control;
} __packed;

struct scsipi_get_conf_data {
	uint8_t  data_len[4];
	uint8_t  unused[2];
	uint8_t  mmc_profile[2];	/* current mmc profile for disk */
	uint8_t  feature_desc[1];	/* feature descriptors follow	*/
} __packed;

struct scsipi_get_conf_feature {	/* feature descriptor */
	uint8_t  featurecode[2];
	uint8_t  flags;
	uint8_t  additional_length;	/* length of feature dependent  */
	uint8_t  feature_dependent[256];
} __packed;
#define FEATUREFLAG_CURRENT    1
#define FEATUREFLAG_PERSISTENT 2


#define READ_DISCINFO 0x51
struct scsipi_read_discinfo {
	uint8_t  opcode;
	uint8_t  unused[6];
	uint8_t  data_len[2];
	uint8_t  control;
} __packed;

#define READ_DISCINFO_SMALLSIZE  12
#define READ_DISCINFO_BIGSIZE    34	/* + entries */
struct scsipi_read_discinfo_data {
	uint8_t  data_len[2];
	uint8_t  disc_state;
	uint8_t  first_track;
	uint8_t  num_sessions_lsb;
	uint8_t  first_track_last_session_lsb;
	uint8_t  last_track_last_session_lsb;
	uint8_t  disc_state2;
	uint8_t  disc_type;
	uint8_t  num_sessions_msb;
	uint8_t  first_track_last_session_msb;
	uint8_t  last_track_last_session_msb;
	uint8_t  discid[4];
	uint8_t  last_session_leadin_hmsf[4];
	uint8_t  last_possible_start_leadout_hmsf[4];
	uint8_t  disc_bar_code[8];
	uint8_t  application_code;
	uint8_t  num_opc_table_entries;
	uint8_t  opc_table_entries[1];	/* opc table entries follow	*/
} __packed;


#define READ_TRACKINFO 0x52
struct scsipi_read_trackinfo {
	uint8_t  opcode;
	uint8_t  addr_type;
	uint8_t  address[4];
	uint8_t  nothing;
	uint8_t  data_len[2];
	uint8_t  control;
} __packed;
#define READ_TRACKINFO_ADDR_LBA    0
#define READ_TRACKINFO_ADDR_TRACK  1
#define READ_TRACKINFO_ADDR_SESS   2

struct scsipi_read_trackinfo_data {
	uint8_t  data_len[2];
	uint8_t  track_lsb;
	uint8_t  session_lsb;
	uint8_t  unused1;
	uint8_t  track_info_1;
	uint8_t  track_info_2;
	uint8_t  data_valid;
	uint8_t  track_start[4];
	uint8_t  next_writable[4];
	uint8_t  free_blocks[4];
	uint8_t  packet_size[4];
	uint8_t  track_size[4];
	uint8_t  last_recorded[4];
	uint8_t  track_msb;
	uint8_t  session_msb;
	uint8_t  unused2[2];
} __packed;
#define READ_TRACKINFO_RETURNSIZE 36


#define CLOSE_TRACKSESSION 0x5B
struct scsipi_close_tracksession {
	uint8_t  opcode;
	uint8_t  addr_type;		/* bit 1 holds immediate */
	uint8_t  function;		/* bits 2,1,0 */
	uint8_t  unused1;
	uint8_t  tracksessionnr[2];
	uint8_t  unused2[3];
	uint8_t  control;
} __packed;


#define RESERVE_TRACK 0x53
struct scsipi_reserve_track {
	uint8_t  opcode;
	uint8_t  reserved[4];
	uint8_t  reservation_size[4];
	uint8_t  control;
} __packed;


#define REPAIR_TRACK 0x58
struct scsipi_repair_track {
	uint8_t  opcode;
	uint8_t  reserved1;		/* bit 1 holds immediate */
	uint8_t  reserved2[2];
	uint8_t  tracknr[2];		/* logical track nr */
	uint8_t  reserved3[3];
	uint8_t  control;
} __packed;


#define READ_CD_CAPACITY	0x25	/* slightly different from disk */
struct scsipi_read_cd_capacity {
	u_int8_t opcode;
	u_int8_t byte2;
	u_int8_t addr[4];
	u_int8_t unused[3];
	u_int8_t control;
} __packed;

struct scsipi_read_cd_cap_data {
	u_int8_t addr[4];
	u_int8_t length[4];
} __packed;


/* mod pages common to scsi and atapi */
struct cd_audio_page {
	u_int8_t pg_code;
#define		AUDIO_PAGE	0x0e
	u_int8_t pg_length;
	u_int8_t flags;
#define		CD_PA_SOTC	0x02
#define		CD_PA_IMMED	0x04
	u_int8_t unused[2];
	u_int8_t format_lba; /* valid only for SCSI CDs */
#define		CD_PA_FORMAT_LBA 0x0F
#define		CD_PA_APR_VALID	0x80
	u_int8_t lb_per_sec[2];
	struct port_control {
		u_int8_t channels;
#define	CHANNEL 0x0F
#define	CHANNEL_0 1
#define	CHANNEL_1 2
#define	CHANNEL_2 4
#define	CHANNEL_3 8
#define		LEFT_CHANNEL	CHANNEL_0
#define		RIGHT_CHANNEL	CHANNEL_1
#define		MUTE_CHANNEL	0x0
#define		BOTH_CHANNEL	LEFT_CHANNEL | RIGHT_CHANNEL
		u_int8_t volume;
	} port[4];
#define	LEFT_PORT	0
#define	RIGHT_PORT	1
};