|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26: /*
27: * File: scsi_rom.c
28: * Author: Alessandro Forin, Carnegie Mellon University
29: * Date: 10/90
30: *
31: * Middle layer of the SCSI driver: SCSI protocol implementation
32: *
33: * This file contains code for SCSI commands for CD-ROM devices.
34: */
35:
36: #include <mach/std_types.h>
37: #include <scsi/compat_30.h>
38:
39: #include <scsi/scsi.h>
40: #include <scsi/scsi2.h>
41: #include <scsi/scsi_defs.h>
42:
43: #if (NSCSI > 0)
44:
45: char *sccdrom_name(
46: boolean_t internal)
47: {
48: return internal ? "rz" : "CD-ROM";
49: }
50:
51: int scsi_pause_resume(
52: target_info_t *tgt,
53: boolean_t stop_it,
54: io_req_t ior)
55: {
56: scsi_cmd_pausres_t *cmd;
57:
58: cmd = (scsi_cmd_pausres_t*) (tgt->cmd_ptr);
59: cmd->scsi_cmd_code = SCSI_CMD_PAUSE_RESUME;
60: cmd->scsi_cmd_lun_and_relbit = 0;
61: cmd->scsi_cmd_lba1 = 0;
62: cmd->scsi_cmd_lba2 = 0;
63: cmd->scsi_cmd_lba3 = 0;
64: cmd->scsi_cmd_lba4 = 0;
65: cmd->scsi_cmd_xxx = 0;
66: cmd->scsi_cmd_xfer_len_1 = 0;
67: cmd->scsi_cmd_pausres_res = stop_it ? 0 : SCSI_CMD_PAUSRES_RESUME;
68: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */
69:
70: tgt->cur_cmd = SCSI_CMD_PAUSE_RESUME;
71:
72: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
73:
74: return tgt->done;
75: }
76:
77: scsi_play_audio(
78: target_info_t *tgt,
79: unsigned int start,
80: unsigned int len,
81: boolean_t relative_address,
82: io_req_t ior)
83: {
84: scsi_cmd_play_audio_t *cmd;
85:
86: cmd = (scsi_cmd_play_audio_t*) (tgt->cmd_ptr);
87: cmd->scsi_cmd_code = SCSI_CMD_PLAY_AUDIO;
88: cmd->scsi_cmd_lun_and_relbit = relative_address ? SCSI_RELADR : 0;
89: cmd->scsi_cmd_lba1 = start >> 24;
90: cmd->scsi_cmd_lba2 = start >> 16;
91: cmd->scsi_cmd_lba3 = start >> 8;
92: cmd->scsi_cmd_lba4 = start >> 0;
93: cmd->scsi_cmd_xxx = 0;
94: cmd->scsi_cmd_xfer_len_1 = len >> 8;
95: cmd->scsi_cmd_xfer_len_2 = len >> 0;
96: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */
97:
98: tgt->cur_cmd = SCSI_CMD_PLAY_AUDIO;
99:
100: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
101:
102: return tgt->done;
103: }
104:
105: scsi_play_audio_long(
106: target_info_t *tgt,
107: unsigned int start,
108: unsigned int len,
109: boolean_t relative_address,
110: io_req_t ior)
111: {
112: scsi_cmd_play_audio_l_t *cmd;
113:
114: cmd = (scsi_cmd_play_audio_l_t*) (tgt->cmd_ptr);
115: cmd->scsi_cmd_code = SCSI_CMD_PLAY_AUDIO_LONG;
116: cmd->scsi_cmd_lun_and_relbit = relative_address ? SCSI_RELADR : 0;
117: cmd->scsi_cmd_lba1 = start >> 24;
118: cmd->scsi_cmd_lba2 = start >> 16;
119: cmd->scsi_cmd_lba3 = start >> 8;
120: cmd->scsi_cmd_lba4 = start >> 0;
121: cmd->scsi_cmd_xfer_len_1 = len >> 24;
122: cmd->scsi_cmd_xfer_len_2 = len >> 16;
123: cmd->scsi_cmd_xfer_len_3 = len >> 8;
124: cmd->scsi_cmd_xfer_len_4 = len >> 0;
125: cmd->scsi_cmd_xxx1 = 0;
126: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */
127:
128: tgt->cur_cmd = SCSI_CMD_PLAY_AUDIO_LONG;
129:
130: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
131:
132: return tgt->done;
133: }
134:
135: scsi_play_audio_msf(
136: target_info_t *tgt,
137: int sm,
138: int ss,
139: int sf,
140: int em,
141: int es,
142: int ef,
143: io_req_t ior)
144: {
145: scsi_cmd_play_audio_msf_t *cmd;
146:
147: cmd = (scsi_cmd_play_audio_msf_t*) (tgt->cmd_ptr);
148: cmd->scsi_cmd_code = SCSI_CMD_PLAY_AUDIO_MSF;
149: cmd->scsi_cmd_lun_and_relbit = 0;
150: cmd->scsi_cmd_lba1 = 0;
151: cmd->scsi_cmd_pamsf_startM = sm;
152: cmd->scsi_cmd_pamsf_startS = ss;
153: cmd->scsi_cmd_pamsf_startF = sf;
154: cmd->scsi_cmd_pamsf_endM = em;
155: cmd->scsi_cmd_pamsf_endS = es;
156: cmd->scsi_cmd_pamsf_endF = ef;
157: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */
158:
159: tgt->cur_cmd = SCSI_CMD_PLAY_AUDIO_MSF;
160:
161: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
162:
163: return tgt->done;
164: }
165:
166: scsi_play_audio_track_index(
167: target_info_t *tgt,
168: int st,
169: int si,
170: int et,
171: int ei,
172: io_req_t ior)
173: {
174: scsi_cmd_play_audio_ti_t *cmd;
175:
176: cmd = (scsi_cmd_play_audio_ti_t*) (tgt->cmd_ptr);
177: cmd->scsi_cmd_code = SCSI_CMD_PLAY_AUDIO_TI;
178: cmd->scsi_cmd_lun_and_relbit = 0;
179: cmd->scsi_cmd_lba1 = 0;
180: cmd->scsi_cmd_lba2 = 0;
181: cmd->scsi_cmd_pati_startT = st;
182: cmd->scsi_cmd_pati_startI = si;
183: cmd->scsi_cmd_xxx = 0;
184: cmd->scsi_cmd_pati_endT = et;
185: cmd->scsi_cmd_pati_endI = ei;
186: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */
187:
188: tgt->cur_cmd = SCSI_CMD_PLAY_AUDIO_TI;
189:
190: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
191:
192: return tgt->done;
193: }
194:
195: scsi_play_audio_track_relative(
196: target_info_t *tgt,
197: unsigned int lba,
198: int st,
199: unsigned int len,
200: io_req_t ior)
201: {
202: scsi_cmd_play_audio_tr_t *cmd;
203:
204: cmd = (scsi_cmd_play_audio_tr_t*) (tgt->cmd_ptr);
205: cmd->scsi_cmd_code = SCSI_CMD_PLAY_AUDIO_TR;
206: cmd->scsi_cmd_lun_and_relbit = 0;
207: cmd->scsi_cmd_lba1 = lba >> 24;
208: cmd->scsi_cmd_lba2 = lba >> 16;
209: cmd->scsi_cmd_lba3 = lba >> 8;
210: cmd->scsi_cmd_lba4 = lba >> 0;
211: cmd->scsi_cmd_patr_startT = st;
212: cmd->scsi_cmd_xfer_len_1 = len >> 8;
213: cmd->scsi_cmd_xfer_len_2 = len >> 0;
214: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */
215:
216: tgt->cur_cmd = SCSI_CMD_PLAY_AUDIO_TR;
217:
218: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
219:
220: return tgt->done;
221: }
222:
223: scsi_play_audio_track_relative_long(
224: target_info_t *tgt,
225: unsigned int lba,
226: int st,
227: unsigned int len,
228: io_req_t ior)
229: {
230: scsi_cmd_play_audio_tr_l_t *cmd;
231:
232: cmd = (scsi_cmd_play_audio_tr_l_t*) (tgt->cmd_ptr);
233: cmd->scsi_cmd_code = SCSI_CMD_PLAY_AUDIO_TR_LONG;
234: cmd->scsi_cmd_lun_and_relbit = 0;
235: cmd->scsi_cmd_lba1 = lba >> 24;
236: cmd->scsi_cmd_lba2 = lba >> 16;
237: cmd->scsi_cmd_lba3 = lba >> 8;
238: cmd->scsi_cmd_lba4 = lba >> 0;
239: cmd->scsi_cmd_xfer_len_1 = len >> 24;
240: cmd->scsi_cmd_xfer_len_2 = len >> 16;
241: cmd->scsi_cmd_xfer_len_3 = len >> 8;
242: cmd->scsi_cmd_xfer_len_4 = len >> 0;
243: cmd->scsi_cmd_patrl_startT = st;
244: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */
245:
246: tgt->cur_cmd = SCSI_CMD_PLAY_AUDIO_TR_LONG;
247:
248: scsi_go_and_wait(tgt, sizeof(*cmd), 0, ior);
249:
250: return tgt->done;
251: }
252:
253: scsi_read_header(
254: target_info_t *tgt,
255: boolean_t msf_format,
256: unsigned int lba,
257: unsigned int allocsize,
258: io_req_t ior)
259: {
260: scsi_cmd_read_header_t *cmd;
261:
262: cmd = (scsi_cmd_read_header_t*) (tgt->cmd_ptr);
263: cmd->scsi_cmd_code = SCSI_CMD_READ_HEADER;
264: cmd->scsi_cmd_lun_and_relbit = msf_format ? SCSI_CMD_CD_MSF : 0;
265: cmd->scsi_cmd_lba1 = lba >> 24;
266: cmd->scsi_cmd_lba2 = lba >> 16;
267: cmd->scsi_cmd_lba3 = lba >> 8;
268: cmd->scsi_cmd_lba4 = lba >> 0;
269: cmd->scsi_cmd_xxx = 0;
270: cmd->scsi_cmd_xfer_len_1 = allocsize >> 8;
271: cmd->scsi_cmd_xfer_len_2 = allocsize >> 0;
272: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */
273:
274: tgt->cur_cmd = SCSI_CMD_READ_HEADER;
275:
276: scsi_go_and_wait(tgt, sizeof(*cmd), allocsize, ior);
277:
278: return tgt->done;
279: }
280:
281: scsi_read_subchannel(
282: target_info_t *tgt,
283: boolean_t msf_format,
284: unsigned int data_format,
285: unsigned int trackno,
286: io_req_t ior)
287: {
288: scsi_cmd_read_subch_t *cmd;
289: int allocsize;
290:
291: switch (data_format) {
292: case SCSI_CMD_RS_FMT_SUBQ:
293: allocsize = sizeof(cdrom_chan_data_t);
294: trackno = 0; break;
295: case SCSI_CMD_RS_FMT_CURPOS:
296: allocsize = sizeof(cdrom_chan_curpos_t);
297: trackno = 0; break;
298: case SCSI_CMD_RS_FMT_CATALOG:
299: allocsize = sizeof(cdrom_chan_catalog_t);
300: trackno = 0; break;
301: case SCSI_CMD_RS_FMT_ISRC:
302: allocsize = sizeof(cdrom_chan_isrc_t); break;
303: }
304:
305: cmd = (scsi_cmd_read_subch_t*) (tgt->cmd_ptr);
306: cmd->scsi_cmd_code = SCSI_CMD_READ_SUBCH;
307: cmd->scsi_cmd_lun_and_relbit = msf_format ? SCSI_CMD_CD_MSF : 0;
308: cmd->scsi_cmd_lba1 = SCSI_CMD_RS_SUBQ;
309: cmd->scsi_cmd_rs_format = data_format;
310: cmd->scsi_cmd_lba3 = 0;
311: cmd->scsi_cmd_lba4 = 0;
312: cmd->scsi_cmd_rs_trackno = trackno;
313: cmd->scsi_cmd_xfer_len_1 = allocsize >> 8;
314: cmd->scsi_cmd_xfer_len_2 = allocsize >> 0;
315: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */
316:
317: tgt->cur_cmd = SCSI_CMD_READ_SUBCH;
318:
319: scsi_go_and_wait(tgt, sizeof(*cmd), allocsize, ior);
320:
321: return tgt->done;
322: }
323:
324: scsi_read_toc(
325: target_info_t *tgt,
326: boolean_t msf_format,
327: int trackno,
328: int allocsize,
329: io_req_t ior)
330: {
331: scsi_cmd_read_toc_t *cmd;
332:
333: cmd = (scsi_cmd_read_toc_t*) (tgt->cmd_ptr);
334: cmd->scsi_cmd_code = SCSI_CMD_READ_TOC;
335: cmd->scsi_cmd_lun_and_relbit = msf_format ? SCSI_CMD_CD_MSF : 0;
336: cmd->scsi_cmd_lba1 = 0;
337: cmd->scsi_cmd_lba2 = 0;
338: cmd->scsi_cmd_lba3 = 0;
339: cmd->scsi_cmd_lba4 = 0;
340: cmd->scsi_cmd_rtoc_startT = trackno;
341: cmd->scsi_cmd_xfer_len_1 = allocsize >> 8;
342: cmd->scsi_cmd_xfer_len_2 = allocsize >> 0;
343: cmd->scsi_cmd_ctrl_byte = 0; /* not linked */
344:
345: tgt->cur_cmd = SCSI_CMD_READ_TOC;
346:
347: scsi_go_and_wait(tgt, sizeof(*cmd), allocsize, ior);
348:
349: return tgt->done;
350: }
351:
352: /* move elsewhere ifworks */
353: scsi2_mode_select(
354: target_info_t *tgt,
355: boolean_t save,
356: unsigned char *page,
357: int pagesize,
358: io_req_t ior)
359: {
360: scsi_cmd_mode_select_t *cmd;
361: scsi2_mode_param_t *parm;
362:
363: bzero(tgt->cmd_ptr, sizeof(*cmd) + sizeof(*parm));
364: cmd = (scsi_cmd_mode_select_t*) (tgt->cmd_ptr);
365: cmd->scsi_cmd_code = SCSI_CMD_MODE_SELECT;
366: cmd->scsi_cmd_lun_and_lba1 = SCSI_CMD_MSL_PF | (save ? SCSI_CMD_MSL_SP : 0);
367: cmd->scsi_cmd_xfer_len = pagesize;
368:
369: parm = (scsi2_mode_param_t*) (cmd + 1);
370:
371: bcopy(page, parm, pagesize);
372:
373: tgt->cur_cmd = SCSI_CMD_MODE_SELECT;
374:
375: scsi_go_and_wait(tgt, sizeof(*cmd) + pagesize, 0, ior);
376:
377: return tgt->done;
378: }
379:
380: /*
381: * obnoxious
382: */
383: cdrom_vendor_specific(
384: target_info_t *tgt,
385: scsi_command_group_2 *cmd,
386: unsigned char *params,
387: int paramlen,
388: int retlen,
389: io_req_t ior)
390: {
391: bcopy(cmd, tgt->cmd_ptr, sizeof(*cmd));
392: if (paramlen)
393: bcopy(params, tgt->cmd_ptr + sizeof(*cmd), paramlen);
394:
395: tgt->cur_cmd = cmd->scsi_cmd_code;
396:
397: scsi_go_and_wait(tgt, sizeof(*cmd) + paramlen, retlen, ior);
398:
399: return tgt->done;
400: }
401: #endif /* NSCSI > 0 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.