1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef	_MISC_SCSI_H
27#define	_MISC_SCSI_H
28
29#pragma ident	"%Z%%M%	%I%	%E% SMI"
30
31#ifdef	__cplusplus
32extern "C" {
33#endif
34
35#include "device.h"
36
37struct track_info {
38	uint32_t ti_flags;		/* flags, see below */
39	int ti_track_no;		/* Track number */
40	int ti_session_no;		/* session no. 0 if cannot find that */
41	uchar_t ti_track_mode;		/* track ctrl nibble, see READ TOC */
42	uchar_t ti_data_mode;		/* Mode 0,1,2 or FF */
43	uint32_t ti_start_address;	/* Start LBA */
44	uint32_t ti_track_size;		/* Size in blocks */
45	uint32_t ti_packet_size;	/* If a packet written track */
46	uint32_t ti_free_blocks;	/* For an incomplete track */
47	uint32_t ti_lra;		/* LBA of Last written user datablock */
48	uint32_t ti_nwa;		/* Next writable address */
49};
50
51/*
52 * track_info_flags
53 */
54#define	TI_FIXED_PACKET		1
55#define	TI_PACKET_MODE		2
56#define	TI_BLANK_TRACK		4
57#define	TI_RESERVED_TRACK	8
58#define	TI_COPY			0x10
59#define	TI_DAMAGED_TRACK	0x20
60#define	TI_NWA_VALID		0x100
61#define	TI_LRA_VALID		0x200
62#define	TI_SESSION_NO_VALID	0x1000
63#define	TI_FREE_BLOCKS_VALID	0x2000
64
65/*
66 * Track mode nibble
67 */
68#define	TRACK_MODE_DATA		0x06
69#define	TRACK_MODE_AUDIO	0x02
70
71/* 74 minutes, each second is 75 blocks */
72#define	MAX_CD_BLKS		(74*60*75)
73#define	MAX_DVD_BLKS		2295100
74
75/*
76 * Macros to translate between a bandwidth ("RATE") and a Speed ("X")
77 * for CDs.  Eg, "1X == 176,400 bytes/second".
78 *
79 * Some devices just multiply speed by 176. But more accurate ones
80 * multiply speed by 176.4.
81 */
82#define	CD_RATE_TO_X(r) ((r) % 176 ? ((uint_t)(((double)(r)*10)/1764 + 0.5)) :\
83		(r) / 176)
84#define	CD_X_TO_RATE(s)	((((s)*1764)+5)/10)
85
86/*
87 * Macros to translate between a bandwidth ("RATE") and a Speed ("X")
88 * for DVDs. Eg, "1X == 1,385,000 bytes/second".
89 */
90#define	DVD_RATE_TO_X(r)	(((ulong_t)(r)*1000)/1385000)
91#define	DVD_X_TO_RATE(s)	(((s)*1385000)/1000)
92
93
94#define	FINALIZE_TIMEOUT		(6 * 12)	/* Six minutes */
95
96uint32_t read_scsi32(void *addr);
97uint16_t read_scsi16(void *addr);
98void load_scsi32(void *addr, uint32_t val);
99void load_scsi16(void *addr, uint16_t val);
100
101int get_mode_page(int fd, int page_no, int pc, int buf_len, uchar_t *buffer);
102int set_mode_page(int fd, uchar_t *buffer);
103int build_track_info(cd_device *dev, int trackno, struct track_info *t_info);
104uchar_t get_data_mode(int fd, uint32_t lba);
105int prepare_for_write(cd_device *dev, int track_mode, int test_write,
106    int keep_disc_open);
107int finalize(cd_device *dev);
108uint32_t get_last_possible_lba(cd_device *dev);
109int read_audio_through_read_cd(cd_device *dev, uint_t start_lba, uint_t nblks,
110    uchar_t *buf);
111int eject_media(cd_device *dev);
112int cd_speed_ctrl(cd_device *dev, int cmd, int speed);
113int rt_streaming_ctrl(cd_device *dev, int cmd, int speed);
114
115void tao_init(int mode);
116void tao_fini(void);
117void write_init(int mode);
118void write_fini(void);
119
120#ifdef	__cplusplus
121}
122#endif
123
124#endif /* _MISC_SCSI_H */
125